+//
+// Copyright (c) 2012 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+/**
+ * @File : FBaseUtil_ScannerImpl.cpp
+ * @brief : Implementation for _ScannerImpl Class
+ */
+
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#define ANY_PATTERN L"\\s*[^\\s]*"
#define DEFAULT_DELIMITER_PATTERN L"\\s+"
-#define DEFAULT_DELIMITER_PATTERN_ZERO_OR_MORE L"\\s*"
#define COMPLETE_LINE_PATTERN L".*(\r\n|[\u000A\n\r\u2028\u2029\u0085])|.+$"
#define DEFAULT_LINE_SEPARATOR_PATTERN L"[\u000A\n\r\u2028\u2029\u0085]*"
-
#define DEFAULT_GROUP_SEPARATOR L","
#define DEFAULT_DECIMAL_SEPARATOR L"."
#define DEFAULT_NEGATIVE_PREFIX L"-"
namespace Tizen { namespace Base { namespace Utility
{
_ScannerImpl::_ScannerImpl(void)
- :__radix(10),
- __delimiter(DEFAULT_DELIMITER_PATTERN),
- __pParseStr(null),
- __isAllocatedOnHeap(false),
- __position(0)
+ : __radix(10)
+ , __delimiter(DEFAULT_DELIMITER_PATTERN)
+ , __pParseStr(null)
+ , __isAllocatedOnHeap(false)
+ , __position(0)
{
-
}
_ScannerImpl::~_ScannerImpl()
{
- if(__isAllocatedOnHeap == true)
+ if (__isAllocatedOnHeap)
{
delete[] __pParseStr;
__pParseStr = null;
}
}
-result _ScannerImpl::Construct(const String& str)
+result
+_ScannerImpl::Construct(const String& str)
{
result r = E_SUCCESS;
__pParseStr = str.GetPointer();
return r;
}
-result _ScannerImpl::Construct(const String& filePath, const String& encodingScheme)
+result
+_ScannerImpl::Construct(const String& filePath, const String& encodingScheme)
{
result r = E_SUCCESS;
FILE* pFile = null;
char* pFilePath = null;
- bool res = false;
+ bool res = false;
_ICUConverter converter;
struct stat st;
off_t fileSize = 0;
pFile = fopen(pFilePath, "r");
SysTryCatch(NID_BASE_UTIL, pFile != null, r = E_FILE_NOT_FOUND, E_FILE_NOT_FOUND,
- "[%s] Failed to open the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
+ "[%s] Failed to open the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
retVal = stat(pFilePath, &st);
SysTryCatch(NID_BASE_UTIL, retVal == 0, r = E_IO, E_IO,
- "[%s] Failed to get information about the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
+ "[%s] Failed to get information about the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
fileSize = st.st_size + 1; // +1 for null-terminated string
- buffer = static_cast<char*>(calloc(fileSize, sizeof(char)));
+ buffer = static_cast< char* >(calloc(fileSize, sizeof(char)));
SysTryCatch(NID_BASE_UTIL, buffer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
readCnt = fread(buffer, 1, fileSize - 1, pFile);
}
__pParseStr = converter.ConvertToUcharN(buffer, fileSize);
- SysTryCatch(NID_BASE_UTIL, __pParseStr != null, r = E_IO, E_IO , "[%s] charcater conversion failed.", GetErrorMessage(E_IO));
+ SysTryCatch(NID_BASE_UTIL, __pParseStr != null, r = E_IO, E_IO, "[%s] charcater conversion failed.", GetErrorMessage(E_IO));
__isAllocatedOnHeap = true;
CATCH:
delete[] pFilePath;
pFilePath = null;
- delete[] buffer;
+ free(buffer);
buffer = null;
- if(pFile != null)
+ if (pFile != null)
{
fclose(pFile);
pFile = null;
return r;
}
-bool _ScannerImpl::HasNextToken(void)
+bool
+_ScannerImpl::HasNextToken(void)
{
String token;
int length = 0;
return true;
}
-bool _ScannerImpl::HasNextToken(const RegularExpression& pattern)
+bool
+_ScannerImpl::HasNextToken(const RegularExpression& pattern)
{
String patStr(pattern.GetPattern());
return HasNextToken(patStr);
}
-bool _ScannerImpl::HasNextToken(const String& pattern)
+bool
+_ScannerImpl::HasNextToken(const String& pattern)
{
RegularExpression regex;
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
int length = 0;
String out;
}
-result _ScannerImpl::GetNextToken(String& nextStr)
+result
+_ScannerImpl::GetNextToken(String& nextStr)
{
int length = 0;
result r = GetNextTokenWithoutPattern(nextStr, length);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Can not get the next token");
- __position = __position + length;
+ __position = __position + length;
return r;
}
-result _ScannerImpl::GetNextToken(const RegularExpression& pattern, String& nextStr)
+result
+_ScannerImpl::GetNextToken(const RegularExpression& pattern, String& nextStr)
{
String patStr(pattern.GetPattern());
return GetNextToken(patStr, nextStr);
}
-result _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
+result
+_ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
{
RegularExpression regex;
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
int length = 0;
String out;
SysTryReturnResult(NID_BASE_UTIL, res, E_DATA_NOT_FOUND, "Match Failed");
nextStr = out;
- __position = __position + length;
+ __position = __position + length;
return E_SUCCESS;
}
-result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
+result
+_ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
{
return GetNextSignedChar(nextSignedChar, __radix);
}
-result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
+result
+_ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
{
String out;
int length = 0;
r = Int8::Parse(out, radix, ch);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
- nextSignedChar = static_cast<signed char>(ch);
- __position = __position + length;
+ nextSignedChar = static_cast< signed char >(ch);
+ __position = __position + length;
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToSignedChar(void)
{
return IsNextTokenConvertibleToSignedChar(__radix);
}
-bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
+bool
+_ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
{
String out;
int length = 0;
return true;
}
-result _ScannerImpl::GetNextInt(int& nextInt)
+result
+_ScannerImpl::GetNextInt(int& nextInt)
{
return GetNextInt(nextInt, __radix);
}
-result _ScannerImpl::GetNextInt(int& nextInt, int radix)
+result
+_ScannerImpl::GetNextInt(int& nextInt, int radix)
{
String out;
int length = 0;
r = Integer::Parse(out, radix, nextInt);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
- __position = __position + length;
+ __position = __position + length;
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToInt(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToInt(void)
{
return IsNextTokenConvertibleToInt(__radix);
}
-bool _ScannerImpl::IsNextTokenConvertibleToInt(int radix)
+bool
+_ScannerImpl::IsNextTokenConvertibleToInt(int radix)
{
String out;
int val = 0;
return true;
}
-result _ScannerImpl::GetNextShort(short& nextShort)
+result
+_ScannerImpl::GetNextShort(short& nextShort)
{
return GetNextShort(nextShort, __radix);
}
-result _ScannerImpl::GetNextShort(short& nextShort, int radix)
+result
+_ScannerImpl::GetNextShort(short& nextShort, int radix)
{
String out;
int length = 0;
r = Short::Parse(out, radix, nextShort);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
- __position = __position + length;
+ __position = __position + length;
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToShort(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToShort(void)
{
return IsNextTokenConvertibleToShort(__radix);
}
-bool _ScannerImpl::IsNextTokenConvertibleToShort(int radix)
+bool
+_ScannerImpl::IsNextTokenConvertibleToShort(int radix)
{
String out;
short val = 0;
return true;
}
-result _ScannerImpl::GetNextLongLong(long long& nextLongLong)
+result
+_ScannerImpl::GetNextLongLong(long long& nextLongLong)
{
return GetNextLongLong(nextLongLong, __radix);
}
-result _ScannerImpl::GetNextLongLong(long long& nextLongLong, int radix)
+result
+_ScannerImpl::GetNextLongLong(long long& nextLongLong, int radix)
{
String out;
int length = 0;
r = LongLong::Parse(out, radix, nextLongLong);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
- __position = __position + length;
+ __position = __position + length;
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToLongLong(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToLongLong(void)
{
String out;
long long val = 0;
return true;
}
-result _ScannerImpl::GetNextFloat(float& nextFloat)
+result
+_ScannerImpl::GetNextFloat(float& nextFloat)
{
String out;
int length = 0;
r = Float::Parse(out, nextFloat);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
- __position = __position + length;
+ __position = __position + length;
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToFloat(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToFloat(void)
{
String out;
RegularExpression re;
return true;
}
-result _ScannerImpl::GetNextDouble(double& nextDouble)
+result
+_ScannerImpl::GetNextDouble(double& nextDouble)
{
String out;
int length = 0;
r = Double::Parse(out, nextDouble);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
- __position = __position + length;
+ __position = __position + length;
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToDouble(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToDouble(void)
{
String out;
double val = 0.0f;
return true;
}
-result _ScannerImpl::GetNextBool(bool& nextBool)
+result
+_ScannerImpl::GetNextBool(bool& nextBool)
{
String out;
int length = 0;
r = out.ToUpper(temp);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not get next bool");
- if(!temp.CompareTo(L"TRUE"))
+ if (!temp.CompareTo(L"TRUE"))
{
nextBool = true;
- __position = __position + length;
+ __position = __position + length;
}
- else if(!temp.CompareTo(L"FALSE"))
+ else if (!temp.CompareTo(L"FALSE"))
{
nextBool = false;
- __position = __position + length;
+ __position = __position + length;
}
else
{
- r = E_NUM_FORMAT;
+ r = E_NUM_FORMAT;
}
return r;
}
-bool _ScannerImpl::IsNextTokenConvertibleToBool(void)
+bool
+_ScannerImpl::IsNextTokenConvertibleToBool(void)
{
String out;
int length = 0;
return ((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")));
}
-bool _ScannerImpl::HasNextLine(void)
+bool
+_ScannerImpl::HasNextLine(void)
{
String pattern(DEFAULT_LINE_SEPARATOR_PATTERN);
RegularExpression regex;
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
result r = regex.Construct(pattern, REGEX_UNICODE);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Regular expression construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
}
-result _ScannerImpl::GetNextLine(String& nextLine)
+result
+_ScannerImpl::GetNextLine(String& nextLine)
{
String pattern(COMPLETE_LINE_PATTERN);
RegularExpression regex;
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
result r = regex.Construct(pattern, REGEX_UNICODE);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Regular expression construction failed");
SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_ENOUGH, "Match Failed");
int matches = matchedStrList.GetCount();
- SysTryReturnResult(NID_BASE_UTIL,matches > 0, E_DATA_NOT_FOUND, "Match Failed");
-
- String temp = *(String *)matchedStrList.GetAt(0);
+ SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_DATA_NOT_FOUND, "Match Failed");
+
+ String temp = *(String*) matchedStrList.GetAt(0);
__position = __position + temp.GetLength();
RegularExpression re;
r = re.Construct(DEFAULT_LINE_SEPARATOR_PATTERN, REGEX_UNICODE);
re.Replace(temp, L"", true);
nextLine = temp;
- matchedStrList.RemoveAll();
return E_SUCCESS;
}
-result _ScannerImpl::FindInLine(const String& str, String& MatchedStr)
+result
+_ScannerImpl::FindInLine(const String& str, String& MatchedStr)
{
_RegularExpressionImpl regex;
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
result r = regex.Construct(str, REGEX_UNICODE);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_FOUND, "Match Failed");
int matches = matchedStrList.GetCount();
- SysTryReturnResult(NID_BASE_UTIL,matches > 0, E_DATA_NOT_FOUND, "Match Failed");
+ SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_DATA_NOT_FOUND, "Match Failed");
- MatchedStr = *(String *)matchedStrList.GetAt(0);
+ MatchedStr = *(String*) matchedStrList.GetAt(0);
int matchEnd = regex.GetLastMatchEnd();
__position = __position + matchEnd;
- matchedStrList.RemoveAll();
return E_SUCCESS;
}
-result _ScannerImpl::FindInLine(const RegularExpression& pattern, String& MatchedStr)
+result
+_ScannerImpl::FindInLine(const RegularExpression& pattern, String& MatchedStr)
{
String patStr(pattern.GetPattern());
return FindInLine(patStr, MatchedStr);
}
-void _ScannerImpl::Skip(const String& str)
+void
+_ScannerImpl::Skip(const String& str)
{
RegularExpression regex;
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
String inputStr(__pParseStr + __position);
result r = regex.Construct(str, REGEX_UNICODE);
- SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r,"Regular expression construction failed");
+ SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r, "Regular expression construction failed");
r = matchedStrList.Construct();
SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r, "ArrayList construction failed");
SysTryReturnVoidResult(NID_BASE_UTIL, res == true, E_SYSTEM, "Regular expression match failed");
int matches = matchedStrList.GetCount();
- SysTryReturnVoidResult(NID_BASE_UTIL, matches > 0, E_SYSTEM,"Regular expression construction failed");
+ SysTryReturnVoidResult(NID_BASE_UTIL, matches > 0, E_SYSTEM, "Regular expression construction failed");
String skipToken = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
int length = skipToken.GetLength();
{
if (*wstr1++ != *wstr2++)
{
- isSame = false;
+ isSame = false;
break;
}
}
{
__position = __position + length;
}
- matchedStrList.RemoveAll();
-
- //Skip if there is any delimiters before the next token
- RegularExpression re;
- if (__delimiter == DEFAULT_DELIMITER_PATTERN)
- {
- r = re.Construct(DEFAULT_DELIMITER_PATTERN_ZERO_OR_MORE, REGEX_UNICODE);
- }
- else
- {
- r = re.Construct(__delimiter, REGEX_UNICODE);
- }
-
- res = re.Match(String(__pParseStr + __position), false, &matchedStrList);
- matches = matchedStrList.GetCount();
- if (matches > 0)
- {
- String temp = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
- int length = temp.GetLength();
- __position = __position + length;
- matchedStrList.RemoveAll();
- }
-
}
-void _ScannerImpl::Skip(const RegularExpression& pattern)
+void
+_ScannerImpl::Skip(const RegularExpression& pattern)
{
String patStr(pattern.GetPattern());
return Skip(patStr);
}
-int _ScannerImpl::GetRadix(void)
+int
+_ScannerImpl::GetRadix(void)
{
return __radix;
}
-String _ScannerImpl::GetDelimiter(void)
+String
+_ScannerImpl::GetDelimiter(void)
{
return __delimiter;
}
-void _ScannerImpl::SetDelimiter(const String& delimiter)
+void
+_ScannerImpl::SetDelimiter(const String& delimiter)
{
__delimiter = delimiter;
}
-void _ScannerImpl::SetDelimiter(const RegularExpression& pattern)
+void
+_ScannerImpl::SetDelimiter(const RegularExpression& pattern)
{
__delimiter = pattern.GetPattern();
}
-void _ScannerImpl::SetRadix(int radix)
+void
+_ScannerImpl::SetRadix(int radix)
{
- if(((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
- (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)))
+ if (((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
+ (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)))
{
__radix = radix;
}
}
-result _ScannerImpl::GetNextTokenWithoutPattern(String& ret, int& length)
+result
+_ScannerImpl::GetNextTokenWithoutPattern(String& ret, int& length)
{
SysTryReturnResult(NID_BASE_UTIL, ((__pParseStr + __position) != null) && ((*(__pParseStr + __position) != 0x0000)),
- E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
+ E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
RegularExpression regDelim;
result r = regDelim.Construct(__delimiter, REGEX_UNICODE);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
- ArrayList matchedStrList;
+ ArrayList matchedStrList(SingleObjectDeleter);
r = matchedStrList.Construct();
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
bool res = regDelim.Match(inputStr, false, &matchedStrList);
int matches = matchedStrList.GetCount();
+
if (matches > 0)
{
String delimiter1 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
if (!delimiter1.IsEmpty()) // 1st delimiter is not empty
{
int delimLength1 = delimiter1.GetLength();
- int index1 = 0;
- inputStr.IndexOf(delimiter1, 0, index1);
+ int delim1Index = 0;
+ inputStr.IndexOf(delimiter1, 0, delim1Index);
+ if (delim1Index > 0) // Delimiter1 appears after the token i.e followed by token
+ {
+ inputStr.SubString(0, delim1Index, ret); // Extract the string in between first and second delimiter
+ length += delim1Index;
+ return E_SUCCESS;
+ }
// When the delimiter exists in first position, find the 2nd delimiter
- if ((index1 == 0) && (__position == 0))
+ length += delimLength1;
+ String tmpStr(__pParseStr + __position + length);
+ SysTryReturnResult(NID_BASE_UTIL, tmpStr != null, E_DATA_NOT_FOUND, "There are no more tokens in input string");
+
+ matchedStrList.RemoveAll();
+ res = regDelim.Match(tmpStr, false, &matchedStrList);
+ matches = matchedStrList.GetCount();
+ if (matches > 0)
{
- length += delimLength1;
- String tmpStr(__pParseStr + length);
-
- matchedStrList.RemoveAll();
- res = regDelim.Match(tmpStr, false, &matchedStrList);
- matches = matchedStrList.GetCount();
- if (matches > 0)
+ String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
+ // If the 2nd delimiter is empty, the token will be one character followed by 1st delimiter.
+ if (delimiter2.IsEmpty())
+ {
+ ret.Clear();
+ ret.Append(*(__pParseStr + __position + length));
+ length += 1;
+ }
+ else
{
- String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
-
- // If the 2nd delimiter is empty, the token will be one character followed by 1st delimiter.
- if (delimiter2.IsEmpty())
- {
- ret.Clear();
- ret.Append(*(__pParseStr + length));
- length += 1;
- // Though 2nd delimiter is empty, if 3rd non-empty delimiter exists right after the token, length to be moved should be added by 3rd delimiter.
- matchedStrList.RemoveAll();
- String tmpStr1(__pParseStr + length);
- res = regDelim.Match(tmpStr1, false, &matchedStrList);
- matches = matchedStrList.GetCount();
- SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_SUCCESS, "It's a last token.");
-
- String delimiter3 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
- int index3 = 0;
- tmpStr1.IndexOf(delimiter3, 0, index3);
- if (!delimiter3.IsEmpty() && index3 == 0)
- {
- length += delimiter3.GetLength();
- }
- }
- else
- {
- int delimLength2 = delimiter2.GetLength();
- int index2 = 0;
- tmpStr.IndexOf(delimiter2, 0, index2);
- tmpStr.SubString(0, index2, ret); // Extract the string in between first and second delimiter
- length += index2 + delimLength2;
- }
+ int index2 = 0;
+ tmpStr.IndexOf(delimiter2, 0, index2);
+ tmpStr.SubString(0, index2, ret); // Extract the string in between first and second delimiter
+ length += index2;
}
}
- else
+ else // There are no second delimiters
{
- inputStr.SubString(0, index1, ret);
- length = index1 + delimLength1;
+ ret.Clear();
+ ret.Append(__pParseStr + __position + length);
+ length += ret.GetLength();
+ SysTryReturnResult(NID_BASE_UTIL, length > 0, E_DATA_NOT_FOUND, "There are no more tokens in input string");
}
+
}
else // 1st delimiter is empty
{
- // Find 2nd delimiter from "__pParseStr + __position + 1"
- String tmpStr(__pParseStr + __position + 1);
+ // Find 2nd delimiter from "__pParseStr + __position + length + 1"
+ String tmpStr(__pParseStr + __position + length + 1);
if (tmpStr == null) // When InputStr is last token, extract the token.
{
ret.Clear();
- ret.Append(__pParseStr + __position);
+ ret.Append(__pParseStr + __position + length);
length = ret.GetLength();
}
else
matchedStrList.RemoveAll();
res = regDelim.Match(tmpStr, false, &matchedStrList);
matches = matchedStrList.GetCount();
- if (matches > 0)
+ SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_DATA_NOT_FOUND, "There are no more tokens in input string");
+
+ String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
+ if (delimiter2.IsEmpty()) // If the 2nd delimiter is also empty, the token will be one character followed by 1st delimiter.
+ {
+ ret.Clear();
+ ret.Append(*(__pParseStr + __position));
+ length = 1;
+ }
+ else
{
- String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
- if (delimiter2.IsEmpty()) // If the 2nd delimiter is also empty, the token will be one character followed by 1st delimiter.
- {
- ret.Clear();
- ret.Append(*(__pParseStr + __position));
- length = 1;
- }
- else
- {
- int delimLength2 = delimiter2.GetLength();
- int index2 = 0;
- inputStr.IndexOf(delimiter2, 0, index2);
- inputStr.SubString(0, index2, ret);
- length = index2 + delimLength2;
- }
+ int index2 = 0;
+ inputStr.IndexOf(delimiter2, 0, index2);
+ inputStr.SubString(0, index2, ret);
+ length = index2;
}
}
}
ret.Clear();
ret.Append(__pParseStr + __position);
length = ret.GetLength();
- if (length <= 0)
- {
- return E_DATA_NOT_FOUND;
- }
- }
-
- return r;
-}
-
-result _ScannerImpl::GetNextMatchingString(const String& pattern, String& ret, int& length)
-{
- result r = E_SUCCESS;
- RegularExpression regex;
- ArrayList matchedStrList;
-
- bool res = false;
- int matches = 0;
- String nextToken;
- String matchToken;
-
- String strPat(ANY_PATTERN);
- strPat.Append(DEFAULT_DELIMITER_PATTERN);
-
- r = regex.Construct(strPat, REGEX_UNICODE);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
-
- r = matchedStrList.Construct();
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
-
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
-
- SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
-
- matches = matchedStrList.GetCount();
- if(matches > 0)
- {
- nextToken = *(String *)matchedStrList.GetAt(0);
- matchedStrList.RemoveAll();
- }
-
- strPat = pattern;
- strPat.Append(DEFAULT_DELIMITER_PATTERN);
- r = regex.Construct(strPat, REGEX_UNICODE);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
-
- r = matchedStrList.Construct();
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
-
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
- SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
-
- matches = matchedStrList.GetCount();
- if(matches > 0)
- {
- matchToken = *(String *)matchedStrList.GetAt(0);
- matchedStrList.RemoveAll();
-
- if((nextToken == matchToken) == true)
- {
- length = matchToken.GetLength();
- RegularExpression re;
- r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
- re.Replace(matchToken, L"", true);
- ret = matchToken;
- }
- else
- {
- r = E_OPERATION_FAILED;
- }
+ SysTryReturnResult(NID_BASE_UTIL, length > 0, E_DATA_NOT_FOUND, "There are no more tokens in input string");
}
return r;
}
-
-}}} // Osp::Base::Utility
+}}} // Tizen::Base::Utility