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_LINE_SEPARATOR_PATTERN L".*(\r\n|[\u000A\n\r\u2028\u2029\u0085])|.+$"
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, r = 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;
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, pFile);
101 if (readCnt < fileSize)
103 int ret = ferror(pFile);
104 SysTryCatch(NID_BASE_UTIL, ret != 0, r = E_IO, E_IO, "[E_IO] Failed to perform read operation.");
107 __pParseStr = converter.ConvertToUcharN(buffer, fileSize);
108 SysTryCatch(NID_BASE_UTIL, __pParseStr != null, r = E_IO, E_IO , "[E_IO] charcater conversion failed.");
109 __isAllocatedOnHeap = true;
127 bool _ScannerImpl::HasNextToken(void)
129 String pattern(ANY_PATTERN);
130 return HasNextToken(pattern);
133 bool _ScannerImpl::HasNextToken(const RegularExpression& pattern)
135 String patStr(pattern.GetPattern());
136 return HasNextToken(patStr);
139 bool _ScannerImpl::HasNextToken(const String& pattern)
141 result r = E_SUCCESS;
145 r = GetNextToken(pattern, token, length);
146 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] Can not get the next token");
152 result _ScannerImpl::GetNextToken(String& nextStr)
154 result r = E_SUCCESS;
155 String pattern(ANY_PATTERN);
158 r = GetNextToken(pattern, nextStr, length);
159 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Can not get the next token");
161 __position = __position + length;
166 result _ScannerImpl::GetNextToken(const RegularExpression& pattern, String& nextStr)
168 String patStr(pattern.GetPattern());
169 return GetNextToken(patStr, nextStr);
172 result _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
174 result r = E_SUCCESS;
179 String anyPattern(ANY_PATTERN);
181 r = GetNextToken(anyPattern, str1, length);
182 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
184 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
186 r = GetNextToken(pattern, str2, length);
187 SysTryReturnResult(NID_BASE_UTIL, ((r != E_SUCCESS) && (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH,
188 "[E_DATA_NOT_ENOUGH] Input has no remaining tokens");
190 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
195 __position = __position + length;
201 result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
203 return GetNextSignedChar(nextSignedChar, __radix);
206 result _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
208 result r = E_SUCCESS;
212 String pattern(ANY_PATTERN);
214 r = GetNextToken(pattern, out, length);
215 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
217 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
218 /* if(out.GetLength() > 1)
220 return E_OPERATION_FAILED;
223 r = Int8::Parse(out, radix, ch);
224 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
226 nextSignedChar = static_cast<signed char>(ch);
227 __position = __position + length;
232 bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(void)
234 return IsNextTokenConvertibleToSignedChar(__radix);
237 bool _ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
239 result r = E_SUCCESS;
242 String pattern(ANY_PATTERN);
245 r = GetNextToken(pattern, out, length);
246 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get the next token as signed char");
248 /* if(out.GetLength() > 1)
250 return E_OPERATION_FAILED;
253 r = Int8::Parse(out, radix, ch);
254 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not parse the token to signed char");
259 result _ScannerImpl::GetNextInt(int& nextInt)
261 return GetNextInt(nextInt, __radix);
264 result _ScannerImpl::GetNextInt(int& nextInt, int radix)
266 result r = E_SUCCESS;
269 String pattern(ANY_PATTERN);
271 r = GetNextToken(pattern, out, length);
272 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
274 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
276 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
277 r = Integer::Parse(out, radix, nextInt);
278 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
280 __position = __position + length;
285 bool _ScannerImpl::IsNextTokenConvertibleToInt(void)
287 return IsNextTokenConvertibleToInt(__radix);
290 bool _ScannerImpl::IsNextTokenConvertibleToInt(int radix)
292 result r = E_SUCCESS;
296 String pattern(ANY_PATTERN);
298 r = GetNextToken(pattern, out, length);
299 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get the next token as integer");
301 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
302 r = Integer::Parse(out, radix, val);
303 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next Integer");
308 result _ScannerImpl::GetNextShort(short& nextShort)
310 return GetNextShort(nextShort, __radix);
313 result _ScannerImpl::GetNextShort(short& nextShort, int radix)
315 result r = E_SUCCESS;
318 String pattern(ANY_PATTERN);
320 r = GetNextToken(pattern, out, length);
321 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
323 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
325 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
326 r = Short::Parse(out, radix, nextShort);
327 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
329 __position = __position + length;
334 bool _ScannerImpl::IsNextTokenConvertibleToShort(void)
336 return IsNextTokenConvertibleToShort(__radix);
339 bool _ScannerImpl::IsNextTokenConvertibleToShort(int radix)
341 result r = E_SUCCESS;
345 String pattern(ANY_PATTERN);
347 r = GetNextToken(pattern, out, length);
348 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as short");
350 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
351 r = Short::Parse(out, radix, val);
352 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next short");
357 result _ScannerImpl::GetNextLongLong(long long& nextLongLong)
359 result r = E_SUCCESS;
362 String pattern(ANY_PATTERN);
364 r = GetNextToken(pattern, out, length);
365 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
367 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
369 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
370 r = LongLong::Parse(out, nextLongLong);
371 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
373 __position = __position + length;
378 bool _ScannerImpl::IsNextTokenConvertibleToLongLong(void)
380 result r = E_SUCCESS;
384 String pattern(ANY_PATTERN);
386 r = GetNextToken(pattern, out, length);
387 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as long long");
389 r = LongLong::Parse(out, val);
390 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next long long");
395 result _ScannerImpl::GetNextFloat(float& nextFloat)
397 result r = E_SUCCESS;
400 String pattern(ANY_PATTERN);
402 r = GetNextToken(pattern, out, length);
403 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
405 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
407 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
408 r = Float::Parse(out, nextFloat);
409 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
411 __position = __position + length;
417 bool _ScannerImpl::IsNextTokenConvertibleToFloat(void)
419 result r = E_SUCCESS;
421 RegularExpression re;
424 String pattern(ANY_PATTERN);
426 r = GetNextToken(pattern, out, length);
427 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as float");
429 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
430 r = Float::Parse(out, val);
431 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next float");
436 result _ScannerImpl::GetNextDouble(double& nextDouble)
438 result r = E_SUCCESS;
441 String pattern(ANY_PATTERN);
443 r = GetNextToken(pattern, out, length);
444 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
446 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
448 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
449 r = Double::Parse(out, nextDouble);
450 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
452 __position = __position + length;
457 bool _ScannerImpl::IsNextTokenConvertibleToDouble(void)
459 result r = E_SUCCESS;
463 String pattern(ANY_PATTERN);
465 r = GetNextToken(pattern, out, length);
466 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as double");
468 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
469 r = Double::Parse(out, val);
470 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token");
475 result _ScannerImpl::GetNextBool(bool& nextBool)
477 result r = E_SUCCESS;
480 String pattern(ANY_PATTERN);
482 r = GetNextToken(pattern, out, length);
483 SysTryReturnResult(NID_BASE_UTIL, ((r == E_SUCCESS) || (r == E_DATA_NOT_ENOUGH)), E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
485 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to bool");
488 r = out.ToUpper(temp);
489 SysTryReturnResult(NID_BASE_UTIL, (r == E_SUCCESS), E_NUM_FORMAT, "Can not get next bool");
491 if(!temp.CompareTo(L"TRUE"))
494 __position = __position + length;
496 else if(!temp.CompareTo(L"FALSE"))
499 __position = __position + length;
509 bool _ScannerImpl::IsNextTokenConvertibleToBool(void)
511 result r = E_SUCCESS;
515 String pattern(ANY_PATTERN);
517 r = GetNextToken(pattern, out, length);
518 SysTryReturn(NID_BASE_UTIL, (r == E_SUCCESS), false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as bool");
522 if((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")))
534 bool _ScannerImpl::HasNextLine(void)
536 result r = E_SUCCESS;
537 String pattern(DEFAULT_LINE_SEPARATOR_PATTERN);
538 RegularExpression regex;
539 ArrayList matchedStrList;
542 r = regex.Construct(pattern, REGEX_UNICODE);
543 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[E_DATA_NOT_ENOUGH] Regular expression construction failed");
545 r = matchedStrList.Construct();
546 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[E_DATA_NOT_ENOUGH] Arraylist construction failed");
548 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
549 SysTryReturn(NID_BASE_UTIL, (res == true), false, E_DATA_NOT_ENOUGH, "[E_DATA_NOT_ENOUGH] Match Failed");
555 result _ScannerImpl::GetNextLine(String& nextLine)
557 result r = E_SUCCESS;
558 String pattern(COMPLETE_LINE_PATTERN);
559 RegularExpression regex;
560 ArrayList matchedStrList;
564 r = regex.Construct(pattern, REGEX_UNICODE);
565 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Regular expression construction failed");
567 r = matchedStrList.Construct();
568 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Arraylist construction failed");
570 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
571 SysTryReturnResult(NID_BASE_UTIL, (res == true), E_DATA_NOT_ENOUGH, "Match Failed");
573 matches = matchedStrList.GetCount();
576 String temp = *(String *)matchedStrList.GetAt(0);
577 __position = __position + temp.GetLength();
579 RegularExpression re;
580 r = re.Construct(DEFAULT_LINE_SEPARATOR_PATTERN, REGEX_UNICODE);
581 re.Replace(temp, L"", true);
584 matchedStrList.RemoveAll();
591 result _ScannerImpl::FindInLine(const String& str, String& MatchedStr)
593 result r = E_SUCCESS;
594 _RegularExpressionImpl regex;
595 ArrayList matchedStrList;
599 r = regex.Construct(str, REGEX_UNICODE);
600 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
602 r = matchedStrList.Construct();
603 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
605 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
606 SysTryReturnResult(NID_BASE_UTIL, (res == true), E_DATA_NOT_FOUND, "Match Failed");
608 matches = matchedStrList.GetCount();
611 MatchedStr = *(String *)matchedStrList.GetAt(0);
612 int matchEnd = regex.GetLastMatchEnd();
613 __position = __position + matchEnd;
614 matchedStrList.RemoveAll();
620 result _ScannerImpl::FindInLine(const RegularExpression& pattern, String& MatchedStr)
622 String patStr(pattern.GetPattern());
623 return FindInLine(patStr, MatchedStr);
626 void _ScannerImpl::Skip(const String& str)
628 result r = E_SUCCESS;
629 RegularExpression regex;
630 ArrayList matchedStrList;
634 r = regex.Construct(str, REGEX_UNICODE);
635 SysTryCatch(NID_BASE_UTIL, r == E_SUCCESS, , r, "[%s] Regular expression construction failed", GetErrorMessage(r));
637 r = matchedStrList.Construct();
638 SysTryCatch(NID_BASE_UTIL, r == E_SUCCESS, , r, "[%s] ArrayList construction failed", GetErrorMessage(r));
640 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
641 SysTryCatch(NID_BASE_UTIL, res == true, , E_SYSTEM, "[%s] Regular expression match failed", GetErrorMessage(E_SYSTEM));
643 matches = matchedStrList.GetCount();
646 String temp = *(String *)matchedStrList.GetAt(0);
647 int length = temp.GetLength();
648 const wchar_t* wstr1 = temp.GetPointer();
649 const wchar_t* wstr2 = __pParseStr + __position;
652 while(*wstr1 != 0x0000)
654 if(*wstr1++ != *wstr2++)
662 __position = __position + length;
664 matchedStrList.RemoveAll();
666 //Skip if there is any delimiters before the next token
667 RegularExpression re;
668 r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
669 res = re.Match(String(__pParseStr + __position), false, &matchedStrList);
670 matches = matchedStrList.GetCount();
673 String temp = *(String *)matchedStrList.GetAt(0);
674 int length = temp.GetLength();
675 __position = __position + length;
676 matchedStrList.RemoveAll();
685 void _ScannerImpl::Skip(const RegularExpression& pattern)
687 String patStr(pattern.GetPattern());
691 int _ScannerImpl::GetRadix(void)
696 String _ScannerImpl::GetDelimiter(void)
701 void _ScannerImpl::SetDelimiter(const String& delimiter)
703 __delimiter = delimiter;
706 void _ScannerImpl::SetDelimiter(const RegularExpression& pattern)
708 __delimiter = pattern.GetPattern();
711 void _ScannerImpl::SetRadix(int radix)
713 if(((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
714 (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)))
720 result _ScannerImpl::GetNextToken(const String& pattern, String& ret, int& length)
722 result r = E_SUCCESS;
723 SysTryReturnResult(NID_BASE_UTIL, __pParseStr != null, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
724 SysTryReturnResult(NID_BASE_UTIL, *__pParseStr != 0x0000, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
726 RegularExpression regex;
727 ArrayList matchedStrList;
730 String regPattern(pattern);
732 regPattern.Append(__delimiter);
734 r = regex.Construct(regPattern, REGEX_UNICODE);
735 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
737 r = matchedStrList.Construct();
738 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
740 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
741 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
743 matches = matchedStrList.GetCount();
746 String temp = *(String *)matchedStrList.GetAt(0);
747 length = temp.GetLength();
748 RegularExpression re;
749 r = re.Construct(__delimiter, REGEX_UNICODE);
750 re.Replace(temp, L"", true);
752 matchedStrList.RemoveAll();
758 result _ScannerImpl::GetNextMatchingString(const String& pattern, String& ret, int& length)
760 result r = E_SUCCESS;
761 RegularExpression regex;
762 ArrayList matchedStrList;
769 String strPat(ANY_PATTERN);
770 strPat.Append(DEFAULT_DELIMITER_PATTERN);
772 r = regex.Construct(strPat, REGEX_UNICODE);
773 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
775 r = matchedStrList.Construct();
776 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
778 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
780 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
782 matches = matchedStrList.GetCount();
785 nextToken = *(String *)matchedStrList.GetAt(0);
786 matchedStrList.RemoveAll();
790 strPat.Append(DEFAULT_DELIMITER_PATTERN);
791 r = regex.Construct(strPat, REGEX_UNICODE);
792 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Regular expression construction failed");
794 r = matchedStrList.Construct();
795 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_OPERATION_FAILED, "Arraylist construction failed");
797 res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
798 SysTryReturnResult(NID_BASE_UTIL, res == true, E_OPERATION_FAILED, "Match Failed");
800 matches = matchedStrList.GetCount();
803 matchToken = *(String *)matchedStrList.GetAt(0);
804 matchedStrList.RemoveAll();
806 if((nextToken == matchToken) == true)
808 length = matchToken.GetLength();
809 RegularExpression re;
810 r = re.Construct(DEFAULT_DELIMITER_PATTERN, REGEX_UNICODE);
811 re.Replace(matchToken, L"", true);
816 r = E_OPERATION_FAILED;
823 }}} // Osp::Base::Utility