#include "FBase_NativeError.h"
#define ANY_PATTERN L"\\s*[^\\s]*"
-#define DEFAULT_DELIMITER_PATTERN L"\\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]*"
bool _ScannerImpl::HasNextToken(void)
{
- String pattern(ANY_PATTERN);
- return HasNextToken(pattern);
+ String token;
+ int length = 0;
+
+ result r = GetNextTokenWithoutPattern(token, length);
+ SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Can not get the next token");
+
+ return true;
}
bool _ScannerImpl::HasNextToken(const RegularExpression& pattern)
bool _ScannerImpl::HasNextToken(const String& pattern)
{
- result r = E_SUCCESS;
- String token;
+ RegularExpression regex;
+ ArrayList matchedStrList;
int length = 0;
+ String out;
- r = GetNextToken(pattern, token, length);
- SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_FOUND, "[%s] Can not get the next token", GetErrorMessage(E_DATA_NOT_FOUND));
+ result r = GetNextTokenWithoutPattern(out, length);
+ SysTryLogReturn(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, false, "Input has no remaining tokens");
+
+ SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "The next token does not match to the pattern");
+
+ r = regex.Construct(pattern, REGEX_UNICODE);
+ SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Regular expression construction failed");
+
+ r = matchedStrList.Construct();
+ SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Arraylist construction failed");
+
+ bool res = regex.Match(out, true, &matchedStrList);
+ SysTryLogReturn(NID_BASE_UTIL, res, res, "Match Failed");
return true;
}
result _ScannerImpl::GetNextToken(String& nextStr)
{
- result r = E_SUCCESS;
- String pattern(ANY_PATTERN);
int length = 0;
- r = GetNextToken(pattern, nextStr, length);
+ 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;
result _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
{
- result r = E_SUCCESS;
- int length1 = 0;
- int length2 = 0;
+ RegularExpression regex;
+ ArrayList matchedStrList;
+ int length = 0;
+ String out;
- String str1;
- String str2;
- String anyPattern(ANY_PATTERN);
+ result r = GetNextTokenWithoutPattern(out, length);
+ SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
- while (true)
- {
- r = GetNextToken(anyPattern, str1, length1);
- SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
+ SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
- r = GetNextToken(pattern, str2, length2);
- SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
+ r = regex.Construct(pattern, REGEX_UNICODE);
+ SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
- if(str1 == str2)
- {
- nextStr = str1;
- __position = __position + length2;
- break;
- }
- else
- {
- nextStr = L"";
- __position = __position + length1;
- }
- }
+ r = matchedStrList.Construct();
+ SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
- return r;
+ bool res = regex.Match(out, true, &matchedStrList);
+ SysTryReturnResult(NID_BASE_UTIL, res, E_DATA_NOT_FOUND, "Match Failed");
+
+ nextStr = out;
+ __position = __position + length;
+ return E_SUCCESS;
}
result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
{
- result r = E_SUCCESS;
String out;
int length = 0;
char ch = 0x00;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
char ch = 0;
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get the next token as signed char", GetErrorMessage(E_NUM_FORMAT));
r = Int8::Parse(out, radix, ch);
result _ScannerImpl::GetNextInt(int& nextInt, int radix)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
bool _ScannerImpl::IsNextTokenConvertibleToInt(int radix)
{
- result r = E_SUCCESS;
String out;
int val = 0;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get the next token as integer", GetErrorMessage(E_NUM_FORMAT));
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
result _ScannerImpl::GetNextShort(short& nextShort, int radix)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
bool _ScannerImpl::IsNextTokenConvertibleToShort(int radix)
{
- result r = E_SUCCESS;
String out;
short val = 0;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as short", GetErrorMessage(E_NUM_FORMAT));
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
result _ScannerImpl::GetNextLongLong(long long& nextLongLong, int radix)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
bool _ScannerImpl::IsNextTokenConvertibleToLongLong(void)
{
- result r = E_SUCCESS;
String out;
long long val = 0;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as long long");
r = LongLong::Parse(out, val);
result _ScannerImpl::GetNextFloat(float& nextFloat)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
bool _ScannerImpl::IsNextTokenConvertibleToFloat(void)
{
- result r = E_SUCCESS;
String out;
RegularExpression re;
float val = 0.0f;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as float", GetErrorMessage(E_NUM_FORMAT));
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
result _ScannerImpl::GetNextDouble(double& nextDouble)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
bool _ScannerImpl::IsNextTokenConvertibleToDouble(void)
{
- result r = E_SUCCESS;
String out;
double val = 0.0f;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as double", GetErrorMessage(E_NUM_FORMAT));
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
result _ScannerImpl::GetNextBool(bool& nextBool)
{
- result r = E_SUCCESS;
String out;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to bool");
bool _ScannerImpl::IsNextTokenConvertibleToBool(void)
{
- result r = E_SUCCESS;
String out;
- bool ret = false;
int length = 0;
- String pattern(ANY_PATTERN);
- r = GetNextToken(pattern, out, length);
+ result r = GetNextTokenWithoutPattern(out, length);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as bool", GetErrorMessage(E_NUM_FORMAT));
String temp;
out.ToUpper(temp);
- if((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")))
- {
- ret = true;
- }
- else
- {
- ret = false;
- }
-
- return ret;
+ return ((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")));
}
bool _ScannerImpl::HasNextLine(void)
{
- result r = E_SUCCESS;
String pattern(DEFAULT_LINE_SEPARATOR_PATTERN);
RegularExpression regex;
ArrayList matchedStrList;
- bool res = false;
- r = regex.Construct(pattern, REGEX_UNICODE);
+ 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));
r = matchedStrList.Construct();
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Arraylist construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
+ bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
SysTryReturn(NID_BASE_UTIL, res == true, false, E_DATA_NOT_ENOUGH, "[%s] Match Failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
return res;
result _ScannerImpl::GetNextLine(String& nextLine)
{
- result r = E_SUCCESS;
String pattern(COMPLETE_LINE_PATTERN);
RegularExpression regex;
ArrayList matchedStrList;
- bool res = false;
- int matches = 0;
- r = regex.Construct(pattern, REGEX_UNICODE);
+ result r = regex.Construct(pattern, REGEX_UNICODE);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Regular expression construction failed");
r = matchedStrList.Construct();
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Arraylist construction failed");
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
+ bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_ENOUGH, "Match Failed");
- matches = matchedStrList.GetCount();
- if(matches > 0)
- {
- 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;
+ int matches = matchedStrList.GetCount();
+ SysTryReturnResult(NID_BASE_UTIL,matches > 0, E_DATA_NOT_FOUND, "Match Failed");
+
+ String temp = *(String *)matchedStrList.GetAt(0);
+ __position = __position + temp.GetLength();
- matchedStrList.RemoveAll();
- }
-
- return r;
+ 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 r = E_SUCCESS;
_RegularExpressionImpl regex;
ArrayList matchedStrList;
- bool res = false;
- int matches = 0;
- r = regex.Construct(str, REGEX_UNICODE);
+ result r = regex.Construct(str, REGEX_UNICODE);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
r = matchedStrList.Construct();
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
+ bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_FOUND, "Match Failed");
- matches = matchedStrList.GetCount();
- if(matches > 0)
- {
- MatchedStr = *(String *)matchedStrList.GetAt(0);
- int matchEnd = regex.GetLastMatchEnd();
- __position = __position + matchEnd;
- matchedStrList.RemoveAll();
- }
- return r;
+ int matches = matchedStrList.GetCount();
+ SysTryReturnResult(NID_BASE_UTIL,matches > 0, E_DATA_NOT_FOUND, "Match Failed");
+
+ 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)
void _ScannerImpl::Skip(const String& str)
{
- result r = E_SUCCESS;
RegularExpression regex;
ArrayList matchedStrList;
- bool res = false;
- int matches = 0;
+ String inputStr(__pParseStr + __position);
- r = regex.Construct(str, REGEX_UNICODE);
- SysTryCatch(NID_BASE_UTIL, r == E_SUCCESS, , r, "[%s] Regular expression construction failed", GetErrorMessage(r));
+ result r = regex.Construct(str, REGEX_UNICODE);
+ SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r,"Regular expression construction failed");
r = matchedStrList.Construct();
- SysTryCatch(NID_BASE_UTIL, r == E_SUCCESS, , r, "[%s] ArrayList construction failed", GetErrorMessage(r));
+ SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r, "ArrayList construction failed");
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
- SysTryCatch(NID_BASE_UTIL, res == true, , E_SYSTEM, "[%s] Regular expression match failed", GetErrorMessage(E_SYSTEM));
+ bool res = regex.Match(inputStr, false, &matchedStrList);
+ SysTryReturnVoidResult(NID_BASE_UTIL, res == true, E_SYSTEM, "Regular expression match failed");
- matches = matchedStrList.GetCount();
- if(matches > 0)
- {
- String temp = *(String *)matchedStrList.GetAt(0);
- int length = temp.GetLength();
- const wchar_t* wstr1 = temp.GetPointer();
- const wchar_t* wstr2 = __pParseStr + __position;
- bool isSame = true;
-
- while(*wstr1 != 0x0000)
- {
- if(*wstr1++ != *wstr2++)
- {
- isSame = false;
- break;
- }
- }
- if(isSame == true)
- {
- __position = __position + length;
- }
- matchedStrList.RemoveAll();
+ int matches = matchedStrList.GetCount();
+ SysTryReturnVoidResult(NID_BASE_UTIL, matches > 0, E_SYSTEM,"Regular expression construction failed");
- //Skip if there is any delimiters before the next token
- RegularExpression re;
- r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
- res = re.Match(String(__pParseStr + __position), false, &matchedStrList);
- matches = matchedStrList.GetCount();
- if(matches > 0)
- {
- String temp = *(String *)matchedStrList.GetAt(0);
- int length = temp.GetLength();
- __position = __position + length;
- matchedStrList.RemoveAll();
- }
-
- }
+ String skipToken = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
+ int length = skipToken.GetLength();
+ const wchar_t* wstr1 = skipToken.GetPointer();
+ const wchar_t* wstr2 = __pParseStr + __position;
+ bool isSame = true;
+
+ while (*wstr1 != 0x0000)
+ {
+ if (*wstr1++ != *wstr2++)
+ {
+ isSame = false;
+ break;
+ }
+ }
+ if (isSame)
+ {
+ __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();
+ }
-CATCH:
- return;
}
void _ScannerImpl::Skip(const RegularExpression& pattern)
}
}
-result _ScannerImpl::GetNextToken(const String& pattern, String& ret, int& length)
+
+result _ScannerImpl::GetNextTokenWithoutPattern(String& ret, int& length)
{
- result r = E_SUCCESS;
- SysTryReturnResult(NID_BASE_UTIL, __pParseStr + __position != null, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
- SysTryReturnResult(NID_BASE_UTIL, *(__pParseStr + __position) != 0x0000, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
+ SysTryReturnResult(NID_BASE_UTIL, ((__pParseStr + __position) != null) && ((*(__pParseStr + __position) != 0x0000)),
+ 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");
- RegularExpression regex;
ArrayList matchedStrList;
- bool res = false;
- int matches = 0;
- String regPattern(pattern);
+ r = matchedStrList.Construct();
+ SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
- regPattern.Append(__delimiter);
+ String inputStr(__pParseStr + __position);
+ bool res = regDelim.Match(inputStr, false, &matchedStrList);
- r = regex.Construct(regPattern, REGEX_UNICODE);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
+ int matches = matchedStrList.GetCount();
+ if (matches > 0)
+ {
+ String delimiter1 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
- r = matchedStrList.Construct();
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
+ if (!delimiter1.IsEmpty()) // 1st delimiter is not empty
+ {
+ int delimLength1 = delimiter1.GetLength();
+ int index1 = 0;
+ inputStr.IndexOf(delimiter1, 0, index1);
- res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
- SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
+ // When the delimiter exists in first position, find the 2nd delimiter
+ if ((index1 == 0) && (__position == 0))
+ {
+ length += delimLength1;
+ String tmpStr(__pParseStr + length);
- matches = matchedStrList.GetCount();
- if(matches > 0)
+ 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 + 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;
+ }
+ }
+ }
+ else
+ {
+ inputStr.SubString(0, index1, ret);
+ length = index1 + delimLength1;
+ }
+ }
+ else // 1st delimiter is empty
+ {
+ // Find 2nd delimiter from "__pParseStr + __position + 1"
+ String tmpStr(__pParseStr + __position + 1);
+ if (tmpStr == null) // When InputStr is last token, extract the token.
+ {
+ ret.Clear();
+ ret.Append(__pParseStr + __position);
+ length = ret.GetLength();
+ }
+ else
+ {
+ matchedStrList.RemoveAll();
+ res = regDelim.Match(tmpStr, false, &matchedStrList);
+ matches = matchedStrList.GetCount();
+ if (matches > 0)
+ {
+ 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;
+ }
+ }
+ }
+ }
+ }
+ else //There are no delimiters
{
- String temp = *(String *)matchedStrList.GetAt(0);
- length = temp.GetLength();
- RegularExpression re;
- r = re.Construct(__delimiter, REGEX_UNICODE);
- re.Replace(temp, L"", true);
- ret = temp;
- matchedStrList.RemoveAll();
+ ret.Clear();
+ ret.Append(__pParseStr + __position);
+ length = ret.GetLength();
+ if (length <= 0)
+ {
+ return E_DATA_NOT_FOUND;
+ }
}
return r;