6 #include <FBaseCharacter.h>
8 #include <FBaseInteger.h>
9 #include <FBaseShort.h>
10 #include <FBaseLong.h>
11 #include <FBaseLongLong.h>
12 #include <FBaseFloat.h>
13 #include <FBaseDouble.h>
14 #include <FBaseResult.h>
15 #include "FBaseUtil_ScannerImpl.h"
16 #include "FBaseUtilRegularExpression.h"
17 #include <FBaseColArrayList.h>
18 #include <FBaseSysLog.h>
19 #include "FBaseUtil_RegularExpressionImpl.h"
20 #include "FBase_StringConverter.h"
21 #include "FBaseUtil_IcuConverter.h"
22 #include "FBase_NativeError.h"
24 #define ANY_PATTERN L"\\s*[^\\s]*"
25 #define DEFAULT_DELIMITER_PATTERN L"\\s+"
26 #define DEFAULT_DELIMITER_PATTERN_ZERO_OR_MORE L"\\s*"
27 #define COMPLETE_LINE_PATTERN L".*(\r\n|[\u000A\n\r\u2028\u2029\u0085])|.+$"
28 #define DEFAULT_LINE_SEPARATOR_PATTERN L"[\u000A\n\r\u2028\u2029\u0085]*"
31 #define DEFAULT_GROUP_SEPARATOR L","
32 #define DEFAULT_DECIMAL_SEPARATOR L"."
33 #define DEFAULT_NEGATIVE_PREFIX L"-"
35 using namespace Tizen::Base::Collection;
36 using namespace Tizen::Base::Utility;
37 using namespace Tizen::Base;
39 namespace Tizen { namespace Base { namespace Utility
41 _ScannerImpl::_ScannerImpl(void)
43 __delimiter(DEFAULT_DELIMITER_PATTERN),
45 __isAllocatedOnHeap(false),
51 _ScannerImpl::~_ScannerImpl()
53 if(__isAllocatedOnHeap == true)
60 result _ScannerImpl::Construct(const String& str)
63 __pParseStr = str.GetPointer();
67 result _ScannerImpl::Construct(const String& filePath, const String& encodingScheme)
71 char* pFilePath = null;
73 _ICUConverter converter;
80 pFilePath = _StringConverter::CopyToCharArrayN(filePath);
81 SysTryReturnResult(NID_BASE_UTIL, pFilePath != null, GetLastResult(), "File path length < 0 or E_OUT_OF_MEMORY");
83 res = converter.OpenConverter(encodingScheme);
85 SysTryCatch(NID_BASE_UTIL, res == true, , r, "[%s] Encoding scheme not supported", GetErrorMessage(r));
87 pFile = fopen(pFilePath, "r");
88 SysTryCatch(NID_BASE_UTIL, pFile != null, r = E_FILE_NOT_FOUND, E_FILE_NOT_FOUND,
89 "[%s] Failed to open the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
91 retVal = stat(pFilePath, &st);
92 SysTryCatch(NID_BASE_UTIL, retVal == 0, r = E_IO, E_IO,
93 "[%s] Failed to get information about the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
95 fileSize = st.st_size + 1; // +1 for null-terminated string
97 buffer = static_cast<char*>(calloc(fileSize, sizeof(char)));
98 SysTryCatch(NID_BASE_UTIL, buffer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
99 readCnt = fread(buffer, 1, fileSize - 1, pFile);
101 if (readCnt < fileSize)
103 int ret = ferror(pFile);
104 SysTryCatch(NID_BASE_UTIL, ret == 0, r = E_IO, E_IO, "[%s] Failed to perform read operation.", GetErrorMessage(E_IO));
107 __pParseStr = converter.ConvertToUcharN(buffer, fileSize);
108 SysTryCatch(NID_BASE_UTIL, __pParseStr != null, r = E_IO, E_IO , "[%s] charcater conversion failed.", GetErrorMessage(E_IO));
109 __isAllocatedOnHeap = true;
127 bool _ScannerImpl::HasNextToken(void)
132 result r = GetNextTokenWithoutPattern(token, length);
133 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Can not get the next token");
138 bool _ScannerImpl::HasNextToken(const RegularExpression& pattern)
140 String patStr(pattern.GetPattern());
141 return HasNextToken(patStr);
144 bool _ScannerImpl::HasNextToken(const String& pattern)
146 RegularExpression regex;
147 ArrayList matchedStrList;
151 result r = GetNextTokenWithoutPattern(out, length);
152 SysTryLogReturn(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, false, "Input has no remaining tokens");
154 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "The next token does not match to the pattern");
156 r = regex.Construct(pattern, REGEX_UNICODE);
157 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Regular expression construction failed");
159 r = matchedStrList.Construct();
160 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Arraylist construction failed");
162 bool res = regex.Match(out, true, &matchedStrList);
163 SysTryLogReturn(NID_BASE_UTIL, res, res, "Match Failed");
169 result _ScannerImpl::GetNextToken(String& nextStr)
173 result r = GetNextTokenWithoutPattern(nextStr, length);
174 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Can not get the next token");
176 __position = __position + length;
181 result _ScannerImpl::GetNextToken(const RegularExpression& pattern, String& nextStr)
183 String patStr(pattern.GetPattern());
184 return GetNextToken(patStr, nextStr);
187 result _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
189 RegularExpression regex;
190 ArrayList matchedStrList;
194 result r = GetNextTokenWithoutPattern(out, length);
195 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
197 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
199 r = regex.Construct(pattern, REGEX_UNICODE);
200 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
202 r = matchedStrList.Construct();
203 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
205 bool res = regex.Match(out, true, &matchedStrList);
206 SysTryReturnResult(NID_BASE_UTIL, res, E_DATA_NOT_FOUND, "Match Failed");
209 __position = __position + length;
213 result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
215 return GetNextSignedChar(nextSignedChar, __radix);
218 result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
224 result r = GetNextTokenWithoutPattern(out, length);
225 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
226 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
228 r = Int8::Parse(out, radix, ch);
229 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
231 nextSignedChar = static_cast<signed char>(ch);
232 __position = __position + length;
237 bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(void)
239 return IsNextTokenConvertibleToSignedChar(__radix);
242 bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
248 result r = GetNextTokenWithoutPattern(out, length);
249 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));
251 r = Int8::Parse(out, radix, ch);
252 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not parse the token to signed char", GetErrorMessage(E_NUM_FORMAT));
257 result _ScannerImpl::GetNextInt(int& nextInt)
259 return GetNextInt(nextInt, __radix);
262 result _ScannerImpl::GetNextInt(int& nextInt, int radix)
267 result r = GetNextTokenWithoutPattern(out, length);
268 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
269 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
271 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
272 r = Integer::Parse(out, radix, nextInt);
273 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
275 __position = __position + length;
280 bool _ScannerImpl::IsNextTokenConvertibleToInt(void)
282 return IsNextTokenConvertibleToInt(__radix);
285 bool _ScannerImpl::IsNextTokenConvertibleToInt(int radix)
291 result r = GetNextTokenWithoutPattern(out, length);
292 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get the next token as integer", GetErrorMessage(E_NUM_FORMAT));
294 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
295 r = Integer::Parse(out, radix, val);
296 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next Integer", GetErrorMessage(E_NUM_FORMAT));
301 result _ScannerImpl::GetNextShort(short& nextShort)
303 return GetNextShort(nextShort, __radix);
306 result _ScannerImpl::GetNextShort(short& nextShort, int radix)
311 result r = GetNextTokenWithoutPattern(out, length);
312 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
313 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
315 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
316 r = Short::Parse(out, radix, nextShort);
317 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
319 __position = __position + length;
324 bool _ScannerImpl::IsNextTokenConvertibleToShort(void)
326 return IsNextTokenConvertibleToShort(__radix);
329 bool _ScannerImpl::IsNextTokenConvertibleToShort(int radix)
335 result r = GetNextTokenWithoutPattern(out, length);
336 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as short", GetErrorMessage(E_NUM_FORMAT));
338 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
339 r = Short::Parse(out, radix, val);
340 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next short", GetErrorMessage(E_NUM_FORMAT));
345 result _ScannerImpl::GetNextLongLong(long long& nextLongLong)
347 return GetNextLongLong(nextLongLong, __radix);
350 result _ScannerImpl::GetNextLongLong(long long& nextLongLong, int radix)
355 result r = GetNextTokenWithoutPattern(out, length);
356 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
357 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
359 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
360 r = LongLong::Parse(out, radix, nextLongLong);
361 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
363 __position = __position + length;
368 bool _ScannerImpl::IsNextTokenConvertibleToLongLong(void)
374 result r = GetNextTokenWithoutPattern(out, length);
375 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as long long");
377 r = LongLong::Parse(out, val);
378 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next long long");
383 result _ScannerImpl::GetNextFloat(float& nextFloat)
388 result r = GetNextTokenWithoutPattern(out, length);
389 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
390 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
392 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
393 r = Float::Parse(out, nextFloat);
394 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
396 __position = __position + length;
402 bool _ScannerImpl::IsNextTokenConvertibleToFloat(void)
405 RegularExpression re;
409 result r = GetNextTokenWithoutPattern(out, length);
410 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as float", GetErrorMessage(E_NUM_FORMAT));
412 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
413 r = Float::Parse(out, val);
414 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next float", GetErrorMessage(E_NUM_FORMAT));
419 result _ScannerImpl::GetNextDouble(double& nextDouble)
424 result r = GetNextTokenWithoutPattern(out, length);
425 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
426 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
428 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
429 r = Double::Parse(out, nextDouble);
430 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
432 __position = __position + length;
437 bool _ScannerImpl::IsNextTokenConvertibleToDouble(void)
443 result r = GetNextTokenWithoutPattern(out, length);
444 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as double", GetErrorMessage(E_NUM_FORMAT));
446 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
447 r = Double::Parse(out, val);
448 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token", GetErrorMessage(E_NUM_FORMAT));
453 result _ScannerImpl::GetNextBool(bool& nextBool)
458 result r = GetNextTokenWithoutPattern(out, length);
459 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
460 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to bool");
463 r = out.ToUpper(temp);
464 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not get next bool");
466 if(!temp.CompareTo(L"TRUE"))
469 __position = __position + length;
471 else if(!temp.CompareTo(L"FALSE"))
474 __position = __position + length;
484 bool _ScannerImpl::IsNextTokenConvertibleToBool(void)
489 result r = GetNextTokenWithoutPattern(out, length);
490 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as bool", GetErrorMessage(E_NUM_FORMAT));
494 return ((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")));
497 bool _ScannerImpl::HasNextLine(void)
499 String pattern(DEFAULT_LINE_SEPARATOR_PATTERN);
500 RegularExpression regex;
501 ArrayList matchedStrList;
503 result r = regex.Construct(pattern, REGEX_UNICODE);
504 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Regular expression construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
506 r = matchedStrList.Construct();
507 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Arraylist construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
509 bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
510 SysTryReturn(NID_BASE_UTIL, res == true, false, E_DATA_NOT_ENOUGH, "[%s] Match Failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
516 result _ScannerImpl::GetNextLine(String& nextLine)
518 String pattern(COMPLETE_LINE_PATTERN);
519 RegularExpression regex;
520 ArrayList matchedStrList;
522 result r = regex.Construct(pattern, REGEX_UNICODE);
523 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Regular expression construction failed");
525 r = matchedStrList.Construct();
526 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Arraylist construction failed");
528 bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
529 SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_ENOUGH, "Match Failed");
531 int matches = matchedStrList.GetCount();
532 SysTryReturnResult(NID_BASE_UTIL,matches > 0, E_DATA_NOT_FOUND, "Match Failed");
534 String temp = *(String *)matchedStrList.GetAt(0);
535 __position = __position + temp.GetLength();
537 RegularExpression re;
538 r = re.Construct(DEFAULT_LINE_SEPARATOR_PATTERN, REGEX_UNICODE);
539 re.Replace(temp, L"", true);
541 matchedStrList.RemoveAll();
546 result _ScannerImpl::FindInLine(const String& str, String& MatchedStr)
548 _RegularExpressionImpl regex;
549 ArrayList matchedStrList;
551 result r = regex.Construct(str, REGEX_UNICODE);
552 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
554 r = matchedStrList.Construct();
555 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
557 bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
558 SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_FOUND, "Match Failed");
560 int matches = matchedStrList.GetCount();
561 SysTryReturnResult(NID_BASE_UTIL,matches > 0, E_DATA_NOT_FOUND, "Match Failed");
563 MatchedStr = *(String *)matchedStrList.GetAt(0);
564 int matchEnd = regex.GetLastMatchEnd();
565 __position = __position + matchEnd;
566 matchedStrList.RemoveAll();
571 result _ScannerImpl::FindInLine(const RegularExpression& pattern, String& MatchedStr)
573 String patStr(pattern.GetPattern());
574 return FindInLine(patStr, MatchedStr);
577 void _ScannerImpl::Skip(const String& str)
579 RegularExpression regex;
580 ArrayList matchedStrList;
581 String inputStr(__pParseStr + __position);
583 result r = regex.Construct(str, REGEX_UNICODE);
584 SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r,"Regular expression construction failed");
586 r = matchedStrList.Construct();
587 SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r, "ArrayList construction failed");
589 bool res = regex.Match(inputStr, false, &matchedStrList);
590 SysTryReturnVoidResult(NID_BASE_UTIL, res == true, E_SYSTEM, "Regular expression match failed");
592 int matches = matchedStrList.GetCount();
593 SysTryReturnVoidResult(NID_BASE_UTIL, matches > 0, E_SYSTEM,"Regular expression construction failed");
595 String skipToken = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
596 int length = skipToken.GetLength();
597 const wchar_t* wstr1 = skipToken.GetPointer();
598 const wchar_t* wstr2 = __pParseStr + __position;
601 while (*wstr1 != 0x0000)
603 if (*wstr1++ != *wstr2++)
611 __position = __position + length;
613 matchedStrList.RemoveAll();
615 //Skip if there is any delimiters before the next token
616 RegularExpression re;
617 if (__delimiter == DEFAULT_DELIMITER_PATTERN)
619 r = re.Construct(DEFAULT_DELIMITER_PATTERN_ZERO_OR_MORE, REGEX_UNICODE);
623 r = re.Construct(__delimiter, REGEX_UNICODE);
626 res = re.Match(String(__pParseStr + __position), false, &matchedStrList);
627 matches = matchedStrList.GetCount();
630 String temp = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
631 int length = temp.GetLength();
632 __position = __position + length;
633 matchedStrList.RemoveAll();
638 void _ScannerImpl::Skip(const RegularExpression& pattern)
640 String patStr(pattern.GetPattern());
644 int _ScannerImpl::GetRadix(void)
649 String _ScannerImpl::GetDelimiter(void)
654 void _ScannerImpl::SetDelimiter(const String& delimiter)
656 __delimiter = delimiter;
659 void _ScannerImpl::SetDelimiter(const RegularExpression& pattern)
661 __delimiter = pattern.GetPattern();
664 void _ScannerImpl::SetRadix(int radix)
666 if(((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
667 (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)))
674 result _ScannerImpl::GetNextTokenWithoutPattern(String& ret, int& length)
676 SysTryReturnResult(NID_BASE_UTIL, ((__pParseStr + __position) != null) && ((*(__pParseStr + __position) != 0x0000)),
677 E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
679 RegularExpression regDelim;
680 result r = regDelim.Construct(__delimiter, REGEX_UNICODE);
681 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
683 ArrayList matchedStrList;
684 r = matchedStrList.Construct();
685 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
687 String inputStr(__pParseStr + __position);
688 bool res = regDelim.Match(inputStr, false, &matchedStrList);
690 int matches = matchedStrList.GetCount();
693 String delimiter1 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
695 if (!delimiter1.IsEmpty()) // 1st delimiter is not empty
697 int delimLength1 = delimiter1.GetLength();
699 inputStr.IndexOf(delimiter1, 0, index1);
701 // When the delimiter exists in first position, find the 2nd delimiter
702 if ((index1 == 0) && (__position == 0))
704 length += delimLength1;
705 String tmpStr(__pParseStr + length);
707 matchedStrList.RemoveAll();
708 res = regDelim.Match(tmpStr, false, &matchedStrList);
709 matches = matchedStrList.GetCount();
712 String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
714 // If the 2nd delimiter is empty, the token will be one character followed by 1st delimiter.
715 if (delimiter2.IsEmpty())
718 ret.Append(*(__pParseStr + length));
720 // 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.
721 matchedStrList.RemoveAll();
722 String tmpStr1(__pParseStr + length);
723 res = regDelim.Match(tmpStr1, false, &matchedStrList);
724 matches = matchedStrList.GetCount();
725 SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_SUCCESS, "It's a last token.");
727 String delimiter3 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
729 tmpStr1.IndexOf(delimiter3, 0, index3);
730 if (!delimiter3.IsEmpty() && index3 == 0)
732 length += delimiter3.GetLength();
737 int delimLength2 = delimiter2.GetLength();
739 tmpStr.IndexOf(delimiter2, 0, index2);
740 tmpStr.SubString(0, index2, ret); // Extract the string in between first and second delimiter
741 length += index2 + delimLength2;
747 inputStr.SubString(0, index1, ret);
748 length = index1 + delimLength1;
751 else // 1st delimiter is empty
753 // Find 2nd delimiter from "__pParseStr + __position + 1"
754 String tmpStr(__pParseStr + __position + 1);
755 if (tmpStr == null) // When InputStr is last token, extract the token.
758 ret.Append(__pParseStr + __position);
759 length = ret.GetLength();
763 matchedStrList.RemoveAll();
764 res = regDelim.Match(tmpStr, false, &matchedStrList);
765 matches = matchedStrList.GetCount();
768 String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
769 if (delimiter2.IsEmpty()) // If the 2nd delimiter is also empty, the token will be one character followed by 1st delimiter.
772 ret.Append(*(__pParseStr + __position));
777 int delimLength2 = delimiter2.GetLength();
779 inputStr.IndexOf(delimiter2, 0, index2);
780 inputStr.SubString(0, index2, ret);
781 length = index2 + delimLength2;
787 else //There are no delimiters
790 ret.Append(__pParseStr + __position);
791 length = ret.GetLength();
794 return E_DATA_NOT_FOUND;
801 result _ScannerImpl::GetNextMatchingString(const String& pattern, String& ret, int& length)
803 result r = E_SUCCESS;
804 RegularExpression regex;
805 ArrayList matchedStrList;
812 String strPat(ANY_PATTERN);
813 strPat.Append(DEFAULT_DELIMITER_PATTERN);
815 r = regex.Construct(strPat, REGEX_UNICODE);
816 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
818 r = matchedStrList.Construct();
819 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
821 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
823 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
825 matches = matchedStrList.GetCount();
828 nextToken = *(String *)matchedStrList.GetAt(0);
829 matchedStrList.RemoveAll();
833 strPat.Append(DEFAULT_DELIMITER_PATTERN);
834 r = regex.Construct(strPat, REGEX_UNICODE);
835 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
837 r = matchedStrList.Construct();
838 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
840 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
841 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
843 matches = matchedStrList.GetCount();
846 matchToken = *(String *)matchedStrList.GetAt(0);
847 matchedStrList.RemoveAll();
849 if((nextToken == matchToken) == true)
851 length = matchToken.GetLength();
852 RegularExpression re;
853 r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
854 re.Replace(matchToken, L"", true);
859 r = E_OPERATION_FAILED;
866 }}} // Osp::Base::Utility