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 COMPLETE_LINE_PATTERN L".*(\r\n|[\u000A\n\r\u2028\u2029\u0085])|.+$"
27 #define DEFAULT_LINE_SEPARATOR_PATTERN L"[\u000A\n\r\u2028\u2029\u0085]*"
30 #define DEFAULT_GROUP_SEPARATOR L","
31 #define DEFAULT_DECIMAL_SEPARATOR L"."
32 #define DEFAULT_NEGATIVE_PREFIX L"-"
34 using namespace Tizen::Base::Collection;
35 using namespace Tizen::Base::Utility;
36 using namespace Tizen::Base;
38 namespace Tizen { namespace Base { namespace Utility
40 _ScannerImpl::_ScannerImpl(void)
42 __delimiter(DEFAULT_DELIMITER_PATTERN),
44 __isAllocatedOnHeap(false),
50 _ScannerImpl::~_ScannerImpl()
52 if(__isAllocatedOnHeap == true)
59 result _ScannerImpl::Construct(const String& str)
62 __pParseStr = str.GetPointer();
66 result _ScannerImpl::Construct(const String& filePath, const String& encodingScheme)
70 char* pFilePath = null;
72 _ICUConverter converter;
79 pFilePath = _StringConverter::CopyToCharArrayN(filePath);
80 SysTryReturnResult(NID_BASE_UTIL, pFilePath != null, GetLastResult(), "File path length < 0 or E_OUT_OF_MEMORY");
82 res = converter.OpenConverter(encodingScheme);
84 SysTryCatch(NID_BASE_UTIL, res == true, , r, "[%s] Encoding scheme not supported", GetErrorMessage(r));
86 pFile = fopen(pFilePath, "r");
87 SysTryCatch(NID_BASE_UTIL, pFile != null, r = E_FILE_NOT_FOUND, E_FILE_NOT_FOUND,
88 "[%s] Failed to open the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
90 retVal = stat(pFilePath, &st);
91 SysTryCatch(NID_BASE_UTIL, retVal == 0, r = E_IO, E_IO,
92 "[%s] Failed to get information about the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
94 fileSize = st.st_size + 1; // +1 for null-terminated string
96 buffer = static_cast<char*>(calloc(fileSize, sizeof(char)));
97 SysTryCatch(NID_BASE_UTIL, buffer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
98 readCnt = fread(buffer, 1, fileSize - 1, pFile);
100 if (readCnt < fileSize)
102 int ret = ferror(pFile);
103 SysTryCatch(NID_BASE_UTIL, ret == 0, r = E_IO, E_IO, "[%s] Failed to perform read operation.", GetErrorMessage(E_IO));
106 __pParseStr = converter.ConvertToUcharN(buffer, fileSize);
107 SysTryCatch(NID_BASE_UTIL, __pParseStr != null, r = E_IO, E_IO , "[%s] charcater conversion failed.", GetErrorMessage(E_IO));
108 __isAllocatedOnHeap = true;
126 bool _ScannerImpl::HasNextToken(void)
128 String pattern(ANY_PATTERN);
129 return HasNextToken(pattern);
132 bool _ScannerImpl::HasNextToken(const RegularExpression& pattern)
134 String patStr(pattern.GetPattern());
135 return HasNextToken(patStr);
138 bool _ScannerImpl::HasNextToken(const String& pattern)
140 result r = E_SUCCESS;
144 r = GetNextToken(pattern, token, length);
145 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_FOUND, "[%s] Can not get the next token", GetErrorMessage(E_DATA_NOT_FOUND));
151 result _ScannerImpl::GetNextToken(String& nextStr)
153 result r = E_SUCCESS;
154 String pattern(ANY_PATTERN);
157 r = GetNextToken(pattern, nextStr, length);
158 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Can not get the next token");
160 __position = __position + length;
165 result _ScannerImpl::GetNextToken(const RegularExpression& pattern, String& nextStr)
167 String patStr(pattern.GetPattern());
168 return GetNextToken(patStr, nextStr);
171 result _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
173 result r = E_SUCCESS;
179 String anyPattern(ANY_PATTERN);
183 r = GetNextToken(anyPattern, str1, length1);
184 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
185 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
187 r = GetNextToken(pattern, str2, length2);
188 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
189 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
194 __position = __position + length2;
200 __position = __position + length1;
207 result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
209 return GetNextSignedChar(nextSignedChar, __radix);
212 result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
214 result r = E_SUCCESS;
218 String pattern(ANY_PATTERN);
220 r = GetNextToken(pattern, out, length);
221 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
222 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
224 r = Int8::Parse(out, radix, ch);
225 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
227 nextSignedChar = static_cast<signed char>(ch);
228 __position = __position + length;
233 bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(void)
235 return IsNextTokenConvertibleToSignedChar(__radix);
238 bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
240 result r = E_SUCCESS;
243 String pattern(ANY_PATTERN);
246 r = GetNextToken(pattern, out, length);
247 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));
249 r = Int8::Parse(out, radix, ch);
250 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not parse the token to signed char", GetErrorMessage(E_NUM_FORMAT));
255 result _ScannerImpl::GetNextInt(int& nextInt)
257 return GetNextInt(nextInt, __radix);
260 result _ScannerImpl::GetNextInt(int& nextInt, int radix)
262 result r = E_SUCCESS;
265 String pattern(ANY_PATTERN);
267 r = GetNextToken(pattern, 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)
287 result r = E_SUCCESS;
291 String pattern(ANY_PATTERN);
293 r = GetNextToken(pattern, out, length);
294 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get the next token as integer", GetErrorMessage(E_NUM_FORMAT));
296 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
297 r = Integer::Parse(out, radix, val);
298 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next Integer", GetErrorMessage(E_NUM_FORMAT));
303 result _ScannerImpl::GetNextShort(short& nextShort)
305 return GetNextShort(nextShort, __radix);
308 result _ScannerImpl::GetNextShort(short& nextShort, int radix)
310 result r = E_SUCCESS;
313 String pattern(ANY_PATTERN);
315 r = GetNextToken(pattern, out, length);
316 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
317 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
319 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
320 r = Short::Parse(out, radix, nextShort);
321 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
323 __position = __position + length;
328 bool _ScannerImpl::IsNextTokenConvertibleToShort(void)
330 return IsNextTokenConvertibleToShort(__radix);
333 bool _ScannerImpl::IsNextTokenConvertibleToShort(int radix)
335 result r = E_SUCCESS;
339 String pattern(ANY_PATTERN);
341 r = GetNextToken(pattern, out, length);
342 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as short", GetErrorMessage(E_NUM_FORMAT));
344 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
345 r = Short::Parse(out, radix, val);
346 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next short", GetErrorMessage(E_NUM_FORMAT));
351 result _ScannerImpl::GetNextLongLong(long long& nextLongLong)
353 return GetNextLongLong(nextLongLong, __radix);
356 result _ScannerImpl::GetNextLongLong(long long& nextLongLong, int radix)
358 result r = E_SUCCESS;
361 String pattern(ANY_PATTERN);
363 r = GetNextToken(pattern, out, length);
364 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
365 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
367 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
368 r = LongLong::Parse(out, radix, nextLongLong);
369 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
371 __position = __position + length;
376 bool _ScannerImpl::IsNextTokenConvertibleToLongLong(void)
378 result r = E_SUCCESS;
382 String pattern(ANY_PATTERN);
384 r = GetNextToken(pattern, out, length);
385 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as long long");
387 r = LongLong::Parse(out, val);
388 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next long long");
393 result _ScannerImpl::GetNextFloat(float& nextFloat)
395 result r = E_SUCCESS;
398 String pattern(ANY_PATTERN);
400 r = GetNextToken(pattern, out, length);
401 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
402 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
404 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
405 r = Float::Parse(out, nextFloat);
406 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
408 __position = __position + length;
414 bool _ScannerImpl::IsNextTokenConvertibleToFloat(void)
416 result r = E_SUCCESS;
418 RegularExpression re;
421 String pattern(ANY_PATTERN);
423 r = GetNextToken(pattern, out, length);
424 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as float", GetErrorMessage(E_NUM_FORMAT));
426 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
427 r = Float::Parse(out, val);
428 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next float", GetErrorMessage(E_NUM_FORMAT));
433 result _ScannerImpl::GetNextDouble(double& nextDouble)
435 result r = E_SUCCESS;
438 String pattern(ANY_PATTERN);
440 r = GetNextToken(pattern, out, length);
441 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
442 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
444 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
445 r = Double::Parse(out, nextDouble);
446 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
448 __position = __position + length;
453 bool _ScannerImpl::IsNextTokenConvertibleToDouble(void)
455 result r = E_SUCCESS;
459 String pattern(ANY_PATTERN);
461 r = GetNextToken(pattern, out, length);
462 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as double", GetErrorMessage(E_NUM_FORMAT));
464 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
465 r = Double::Parse(out, val);
466 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token", GetErrorMessage(E_NUM_FORMAT));
471 result _ScannerImpl::GetNextBool(bool& nextBool)
473 result r = E_SUCCESS;
476 String pattern(ANY_PATTERN);
478 r = GetNextToken(pattern, out, length);
479 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
480 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to bool");
483 r = out.ToUpper(temp);
484 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not get next bool");
486 if(!temp.CompareTo(L"TRUE"))
489 __position = __position + length;
491 else if(!temp.CompareTo(L"FALSE"))
494 __position = __position + length;
504 bool _ScannerImpl::IsNextTokenConvertibleToBool(void)
506 result r = E_SUCCESS;
510 String pattern(ANY_PATTERN);
512 r = GetNextToken(pattern, out, length);
513 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as bool", GetErrorMessage(E_NUM_FORMAT));
517 if((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")))
529 bool _ScannerImpl::HasNextLine(void)
531 result r = E_SUCCESS;
532 String pattern(DEFAULT_LINE_SEPARATOR_PATTERN);
533 RegularExpression regex;
534 ArrayList matchedStrList;
537 r = regex.Construct(pattern, REGEX_UNICODE);
538 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Regular expression construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
540 r = matchedStrList.Construct();
541 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Arraylist construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
543 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
544 SysTryReturn(NID_BASE_UTIL, res == true, false, E_DATA_NOT_ENOUGH, "[%s] Match Failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
550 result _ScannerImpl::GetNextLine(String& nextLine)
552 result r = E_SUCCESS;
553 String pattern(COMPLETE_LINE_PATTERN);
554 RegularExpression regex;
555 ArrayList matchedStrList;
559 r = regex.Construct(pattern, REGEX_UNICODE);
560 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Regular expression construction failed");
562 r = matchedStrList.Construct();
563 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Arraylist construction failed");
565 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
566 SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_ENOUGH, "Match Failed");
568 matches = matchedStrList.GetCount();
571 String temp = *(String *)matchedStrList.GetAt(0);
572 __position = __position + temp.GetLength();
574 RegularExpression re;
575 r = re.Construct(DEFAULT_LINE_SEPARATOR_PATTERN, REGEX_UNICODE);
576 re.Replace(temp, L"", true);
579 matchedStrList.RemoveAll();
586 result _ScannerImpl::FindInLine(const String& str, String& MatchedStr)
588 result r = E_SUCCESS;
589 _RegularExpressionImpl regex;
590 ArrayList matchedStrList;
594 r = regex.Construct(str, REGEX_UNICODE);
595 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
597 r = matchedStrList.Construct();
598 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
600 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
601 SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_FOUND, "Match Failed");
603 matches = matchedStrList.GetCount();
606 MatchedStr = *(String *)matchedStrList.GetAt(0);
607 int matchEnd = regex.GetLastMatchEnd();
608 __position = __position + matchEnd;
609 matchedStrList.RemoveAll();
615 result _ScannerImpl::FindInLine(const RegularExpression& pattern, String& MatchedStr)
617 String patStr(pattern.GetPattern());
618 return FindInLine(patStr, MatchedStr);
621 void _ScannerImpl::Skip(const String& str)
623 result r = E_SUCCESS;
624 RegularExpression regex;
625 ArrayList matchedStrList;
629 r = regex.Construct(str, REGEX_UNICODE);
630 SysTryCatch(NID_BASE_UTIL, r == E_SUCCESS, , r, "[%s] Regular expression construction failed", GetErrorMessage(r));
632 r = matchedStrList.Construct();
633 SysTryCatch(NID_BASE_UTIL, r == E_SUCCESS, , r, "[%s] ArrayList construction failed", GetErrorMessage(r));
635 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
636 SysTryCatch(NID_BASE_UTIL, res == true, , E_SYSTEM, "[%s] Regular expression match failed", GetErrorMessage(E_SYSTEM));
638 matches = matchedStrList.GetCount();
641 String temp = *(String *)matchedStrList.GetAt(0);
642 int length = temp.GetLength();
643 const wchar_t* wstr1 = temp.GetPointer();
644 const wchar_t* wstr2 = __pParseStr + __position;
647 while(*wstr1 != 0x0000)
649 if(*wstr1++ != *wstr2++)
657 __position = __position + length;
659 matchedStrList.RemoveAll();
661 //Skip if there is any delimiters before the next token
662 RegularExpression re;
663 r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
664 res = re.Match(String(__pParseStr + __position), false, &matchedStrList);
665 matches = matchedStrList.GetCount();
668 String temp = *(String *)matchedStrList.GetAt(0);
669 int length = temp.GetLength();
670 __position = __position + length;
671 matchedStrList.RemoveAll();
680 void _ScannerImpl::Skip(const RegularExpression& pattern)
682 String patStr(pattern.GetPattern());
686 int _ScannerImpl::GetRadix(void)
691 String _ScannerImpl::GetDelimiter(void)
696 void _ScannerImpl::SetDelimiter(const String& delimiter)
698 __delimiter = delimiter;
701 void _ScannerImpl::SetDelimiter(const RegularExpression& pattern)
703 __delimiter = pattern.GetPattern();
706 void _ScannerImpl::SetRadix(int radix)
708 if(((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
709 (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)))
715 result _ScannerImpl::GetNextToken(const String& pattern, String& ret, int& length)
717 result r = E_SUCCESS;
718 SysTryReturnResult(NID_BASE_UTIL, __pParseStr + __position != null, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
719 SysTryReturnResult(NID_BASE_UTIL, *(__pParseStr + __position) != 0x0000, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
721 RegularExpression regex;
722 ArrayList matchedStrList;
725 String regPattern(pattern);
727 regPattern.Append(__delimiter);
729 r = regex.Construct(regPattern, REGEX_UNICODE);
730 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
732 r = matchedStrList.Construct();
733 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
735 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
736 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
738 matches = matchedStrList.GetCount();
741 String temp = *(String *)matchedStrList.GetAt(0);
742 length = temp.GetLength();
743 RegularExpression re;
744 r = re.Construct(__delimiter, REGEX_UNICODE);
745 re.Replace(temp, L"", true);
747 matchedStrList.RemoveAll();
753 result _ScannerImpl::GetNextMatchingString(const String& pattern, String& ret, int& length)
755 result r = E_SUCCESS;
756 RegularExpression regex;
757 ArrayList matchedStrList;
764 String strPat(ANY_PATTERN);
765 strPat.Append(DEFAULT_DELIMITER_PATTERN);
767 r = regex.Construct(strPat, REGEX_UNICODE);
768 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
770 r = matchedStrList.Construct();
771 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
773 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
775 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
777 matches = matchedStrList.GetCount();
780 nextToken = *(String *)matchedStrList.GetAt(0);
781 matchedStrList.RemoveAll();
785 strPat.Append(DEFAULT_DELIMITER_PATTERN);
786 r = regex.Construct(strPat, REGEX_UNICODE);
787 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
789 r = matchedStrList.Construct();
790 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
792 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
793 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
795 matches = matchedStrList.GetCount();
798 matchToken = *(String *)matchedStrList.GetAt(0);
799 matchedStrList.RemoveAll();
801 if((nextToken == matchToken) == true)
803 length = matchToken.GetLength();
804 RegularExpression re;
805 r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
806 re.Replace(matchToken, L"", true);
811 r = E_OPERATION_FAILED;
818 }}} // Osp::Base::Utility