2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @File : FBaseUtil_ScannerImpl.cpp
19 * @brief : Implementation for _ScannerImpl Class
27 #include <FBaseCharacter.h>
28 #include <FBaseInt8.h>
29 #include <FBaseInteger.h>
30 #include <FBaseShort.h>
31 #include <FBaseLong.h>
32 #include <FBaseLongLong.h>
33 #include <FBaseFloat.h>
34 #include <FBaseDouble.h>
35 #include <FBaseResult.h>
36 #include "FBaseUtil_ScannerImpl.h"
37 #include "FBaseUtilRegularExpression.h"
38 #include <FBaseColArrayList.h>
39 #include <FBaseSysLog.h>
40 #include "FBaseUtil_RegularExpressionImpl.h"
41 #include "FBase_StringConverter.h"
42 #include "FBaseUtil_IcuConverter.h"
43 #include "FBase_NativeError.h"
45 #define ANY_PATTERN L"\\s*[^\\s]*"
46 #define DEFAULT_DELIMITER_PATTERN L"\\s+"
47 #define COMPLETE_LINE_PATTERN L".*(\r\n|[\u000A\n\r\u2028\u2029\u0085])|.+$"
48 #define DEFAULT_LINE_SEPARATOR_PATTERN L"[\u000A\n\r\u2028\u2029\u0085]*"
50 #define DEFAULT_GROUP_SEPARATOR L","
51 #define DEFAULT_DECIMAL_SEPARATOR L"."
52 #define DEFAULT_NEGATIVE_PREFIX L"-"
54 using namespace Tizen::Base::Collection;
55 using namespace Tizen::Base::Utility;
56 using namespace Tizen::Base;
58 namespace Tizen { namespace Base { namespace Utility
60 _ScannerImpl::_ScannerImpl(void)
62 , __delimiter(DEFAULT_DELIMITER_PATTERN)
64 , __isAllocatedOnHeap(false)
69 _ScannerImpl::~_ScannerImpl()
71 if (__isAllocatedOnHeap)
79 _ScannerImpl::Construct(const String& str)
82 __pParseStr = str.GetPointer();
87 _ScannerImpl::Construct(const String& filePath, const String& encodingScheme)
91 char* pFilePath = null;
93 _ICUConverter converter;
100 pFilePath = _StringConverter::CopyToCharArrayN(filePath);
101 SysTryReturnResult(NID_BASE_UTIL, pFilePath != null, GetLastResult(), "File path length < 0 or E_OUT_OF_MEMORY");
103 res = converter.OpenConverter(encodingScheme);
105 SysTryCatch(NID_BASE_UTIL, res == true, , r, "[%s] Encoding scheme not supported", GetErrorMessage(r));
107 pFile = fopen(pFilePath, "r");
108 SysTryCatch(NID_BASE_UTIL, pFile != null, r = E_FILE_NOT_FOUND, E_FILE_NOT_FOUND,
109 "[%s] Failed to open the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
111 retVal = stat(pFilePath, &st);
112 SysTryCatch(NID_BASE_UTIL, retVal == 0, r = E_IO, E_IO,
113 "[%s] Failed to get information about the file.", GetErrorMessage(__ConvertNativeErrorToResult(errno)));
115 fileSize = st.st_size + 1; // +1 for null-terminated string
117 buffer = static_cast< char* >(calloc(fileSize, sizeof(char)));
118 SysTryCatch(NID_BASE_UTIL, buffer != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY]");
119 readCnt = fread(buffer, 1, fileSize - 1, pFile);
121 if (readCnt < fileSize)
123 int ret = ferror(pFile);
124 SysTryCatch(NID_BASE_UTIL, ret == 0, r = E_IO, E_IO, "[%s] Failed to perform read operation.", GetErrorMessage(E_IO));
127 __pParseStr = converter.ConvertToUcharN(buffer, fileSize);
128 SysTryCatch(NID_BASE_UTIL, __pParseStr != null, r = E_IO, E_IO, "[%s] charcater conversion failed.", GetErrorMessage(E_IO));
129 __isAllocatedOnHeap = true;
148 _ScannerImpl::HasNextToken(void)
153 result r = GetNextTokenWithoutPattern(token, length);
154 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Can not get the next token");
160 _ScannerImpl::HasNextToken(const RegularExpression& pattern)
162 String patStr(pattern.GetPattern());
163 return HasNextToken(patStr);
167 _ScannerImpl::HasNextToken(const String& pattern)
169 RegularExpression regex;
170 ArrayList matchedStrList(SingleObjectDeleter);
174 result r = GetNextTokenWithoutPattern(out, length);
175 SysTryLogReturn(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, false, "Input has no remaining tokens");
177 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "The next token does not match to the pattern");
179 r = regex.Construct(pattern, REGEX_UNICODE);
180 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Regular expression construction failed");
182 r = matchedStrList.Construct();
183 SysTryLogReturn(NID_BASE_UTIL, r == E_SUCCESS, false, "Arraylist construction failed");
185 bool res = regex.Match(out, true, &matchedStrList);
186 SysTryLogReturn(NID_BASE_UTIL, res, res, "Match Failed");
193 _ScannerImpl::GetNextToken(String& nextStr)
197 result r = GetNextTokenWithoutPattern(nextStr, length);
198 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Can not get the next token");
200 __position = __position + length;
206 _ScannerImpl::GetNextToken(const RegularExpression& pattern, String& nextStr)
208 String patStr(pattern.GetPattern());
209 return GetNextToken(patStr, nextStr);
213 _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
215 RegularExpression regex;
216 ArrayList matchedStrList(SingleObjectDeleter);
220 result r = GetNextTokenWithoutPattern(out, length);
221 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
223 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "The next token does not match to the pattern");
225 r = regex.Construct(pattern, REGEX_UNICODE);
226 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
228 r = matchedStrList.Construct();
229 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
231 bool res = regex.Match(out, true, &matchedStrList);
232 SysTryReturnResult(NID_BASE_UTIL, res, E_DATA_NOT_FOUND, "Match Failed");
235 __position = __position + length;
240 _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar)
242 return GetNextSignedChar(nextSignedChar, __radix);
246 _ScannerImpl::GetNextSignedChar(signed char& nextSignedChar, int radix)
252 result r = GetNextTokenWithoutPattern(out, length);
253 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
254 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
256 r = Int8::Parse(out, radix, ch);
257 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
259 nextSignedChar = static_cast< signed char >(ch);
260 __position = __position + length;
266 _ScannerImpl::IsNextTokenConvertibleToSignedChar(void)
268 return IsNextTokenConvertibleToSignedChar(__radix);
272 _ScannerImpl::IsNextTokenConvertibleToSignedChar(int radix)
278 result r = GetNextTokenWithoutPattern(out, length);
279 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));
281 r = Int8::Parse(out, radix, ch);
282 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not parse the token to signed char", GetErrorMessage(E_NUM_FORMAT));
288 _ScannerImpl::GetNextInt(int& nextInt)
290 return GetNextInt(nextInt, __radix);
294 _ScannerImpl::GetNextInt(int& nextInt, int radix)
299 result r = GetNextTokenWithoutPattern(out, length);
300 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
301 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
303 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
304 r = Integer::Parse(out, radix, nextInt);
305 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to integer");
307 __position = __position + length;
313 _ScannerImpl::IsNextTokenConvertibleToInt(void)
315 return IsNextTokenConvertibleToInt(__radix);
319 _ScannerImpl::IsNextTokenConvertibleToInt(int radix)
325 result r = GetNextTokenWithoutPattern(out, length);
326 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get the next token as integer", GetErrorMessage(E_NUM_FORMAT));
328 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
329 r = Integer::Parse(out, radix, val);
330 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next Integer", GetErrorMessage(E_NUM_FORMAT));
336 _ScannerImpl::GetNextShort(short& nextShort)
338 return GetNextShort(nextShort, __radix);
342 _ScannerImpl::GetNextShort(short& nextShort, int radix)
347 result r = GetNextTokenWithoutPattern(out, length);
348 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
349 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
351 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
352 r = Short::Parse(out, radix, nextShort);
353 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to short");
355 __position = __position + length;
361 _ScannerImpl::IsNextTokenConvertibleToShort(void)
363 return IsNextTokenConvertibleToShort(__radix);
367 _ScannerImpl::IsNextTokenConvertibleToShort(int radix)
373 result r = GetNextTokenWithoutPattern(out, length);
374 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as short", GetErrorMessage(E_NUM_FORMAT));
376 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
377 r = Short::Parse(out, radix, val);
378 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next short", GetErrorMessage(E_NUM_FORMAT));
384 _ScannerImpl::GetNextLongLong(long long& nextLongLong)
386 return GetNextLongLong(nextLongLong, __radix);
390 _ScannerImpl::GetNextLongLong(long long& nextLongLong, int radix)
395 result r = GetNextTokenWithoutPattern(out, length);
396 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
397 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
399 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
400 r = LongLong::Parse(out, radix, nextLongLong);
401 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
403 __position = __position + length;
409 _ScannerImpl::IsNextTokenConvertibleToLongLong(void)
415 result r = GetNextTokenWithoutPattern(out, length);
416 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next token as long long");
418 r = LongLong::Parse(out, val);
419 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[E_NUM_FORMAT] Can not get next long long");
425 _ScannerImpl::GetNextFloat(float& nextFloat)
430 result r = GetNextTokenWithoutPattern(out, length);
431 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
432 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
434 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
435 r = Float::Parse(out, nextFloat);
436 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to float");
438 __position = __position + length;
445 _ScannerImpl::IsNextTokenConvertibleToFloat(void)
448 RegularExpression re;
452 result r = GetNextTokenWithoutPattern(out, length);
453 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as float", GetErrorMessage(E_NUM_FORMAT));
455 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
456 r = Float::Parse(out, val);
457 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next float", GetErrorMessage(E_NUM_FORMAT));
463 _ScannerImpl::GetNextDouble(double& nextDouble)
468 result r = GetNextTokenWithoutPattern(out, length);
469 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
470 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
472 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
473 r = Double::Parse(out, nextDouble);
474 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to double");
476 __position = __position + length;
482 _ScannerImpl::IsNextTokenConvertibleToDouble(void)
488 result r = GetNextTokenWithoutPattern(out, length);
489 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as double", GetErrorMessage(E_NUM_FORMAT));
491 out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
492 r = Double::Parse(out, val);
493 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token", GetErrorMessage(E_NUM_FORMAT));
499 _ScannerImpl::GetNextBool(bool& nextBool)
504 result r = GetNextTokenWithoutPattern(out, length);
505 SysTryReturnResult(NID_BASE_UTIL, r != E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
506 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to bool");
509 r = out.ToUpper(temp);
510 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not get next bool");
512 if (!temp.CompareTo(L"TRUE"))
515 __position = __position + length;
517 else if (!temp.CompareTo(L"FALSE"))
520 __position = __position + length;
531 _ScannerImpl::IsNextTokenConvertibleToBool(void)
536 result r = GetNextTokenWithoutPattern(out, length);
537 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not get next token as bool", GetErrorMessage(E_NUM_FORMAT));
541 return ((!temp.CompareTo(L"TRUE")) || (!temp.CompareTo(L"FALSE")));
545 _ScannerImpl::HasNextLine(void)
547 String pattern(DEFAULT_LINE_SEPARATOR_PATTERN);
548 RegularExpression regex;
549 ArrayList matchedStrList(SingleObjectDeleter);
551 result r = regex.Construct(pattern, REGEX_UNICODE);
552 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Regular expression construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
554 r = matchedStrList.Construct();
555 SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_DATA_NOT_ENOUGH, "[%s] Arraylist construction failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
557 bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
558 SysTryReturn(NID_BASE_UTIL, res == true, false, E_DATA_NOT_ENOUGH, "[%s] Match Failed", GetErrorMessage(E_DATA_NOT_ENOUGH));
565 _ScannerImpl::GetNextLine(String& nextLine)
567 String pattern(COMPLETE_LINE_PATTERN);
568 RegularExpression regex;
569 ArrayList matchedStrList(SingleObjectDeleter);
571 result r = regex.Construct(pattern, REGEX_UNICODE);
572 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Regular expression construction failed");
574 r = matchedStrList.Construct();
575 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_ENOUGH, "Arraylist construction failed");
577 bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
578 SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_ENOUGH, "Match Failed");
580 int matches = matchedStrList.GetCount();
581 SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_DATA_NOT_FOUND, "Match Failed");
583 String temp = *(String*) matchedStrList.GetAt(0);
584 __position = __position + temp.GetLength();
586 RegularExpression re;
587 r = re.Construct(DEFAULT_LINE_SEPARATOR_PATTERN, REGEX_UNICODE);
588 re.Replace(temp, L"", true);
595 _ScannerImpl::FindInLine(const String& str, String& MatchedStr)
597 _RegularExpressionImpl regex;
598 ArrayList matchedStrList(SingleObjectDeleter);
600 result r = regex.Construct(str, REGEX_UNICODE);
601 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
603 r = matchedStrList.Construct();
604 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
606 bool res = regex.Match(String(__pParseStr + __position), false, &matchedStrList);
607 SysTryReturnResult(NID_BASE_UTIL, res == true, E_DATA_NOT_FOUND, "Match Failed");
609 int matches = matchedStrList.GetCount();
610 SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_DATA_NOT_FOUND, "Match Failed");
612 MatchedStr = *(String*) matchedStrList.GetAt(0);
613 int matchEnd = regex.GetLastMatchEnd();
614 __position = __position + matchEnd;
620 _ScannerImpl::FindInLine(const RegularExpression& pattern, String& MatchedStr)
622 String patStr(pattern.GetPattern());
623 return FindInLine(patStr, MatchedStr);
627 _ScannerImpl::Skip(const String& str)
629 RegularExpression regex;
630 ArrayList matchedStrList(SingleObjectDeleter);
631 String inputStr(__pParseStr + __position);
633 result r = regex.Construct(str, REGEX_UNICODE);
634 SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r, "Regular expression construction failed");
636 r = matchedStrList.Construct();
637 SysTryReturnVoidResult(NID_BASE_UTIL, r == E_SUCCESS, r, "ArrayList construction failed");
639 bool res = regex.Match(inputStr, false, &matchedStrList);
640 SysTryReturnVoidResult(NID_BASE_UTIL, res == true, E_SYSTEM, "Regular expression match failed");
642 int matches = matchedStrList.GetCount();
643 SysTryReturnVoidResult(NID_BASE_UTIL, matches > 0, E_SYSTEM, "Regular expression construction failed");
645 String skipToken = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
646 int length = skipToken.GetLength();
647 const wchar_t* wstr1 = skipToken.GetPointer();
648 const wchar_t* wstr2 = __pParseStr + __position;
651 while (*wstr1 != 0x0000)
653 if (*wstr1++ != *wstr2++)
661 __position = __position + length;
666 _ScannerImpl::Skip(const RegularExpression& pattern)
668 String patStr(pattern.GetPattern());
673 _ScannerImpl::GetRadix(void)
679 _ScannerImpl::GetDelimiter(void)
685 _ScannerImpl::SetDelimiter(const String& delimiter)
687 __delimiter = delimiter;
691 _ScannerImpl::SetDelimiter(const RegularExpression& pattern)
693 __delimiter = pattern.GetPattern();
697 _ScannerImpl::SetRadix(int radix)
699 if (((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) ||
700 (radix == Character::RADIX_DECIMAL) || (radix == Character::RADIX_HEXADECIMAL)))
708 _ScannerImpl::GetNextTokenWithoutPattern(String& ret, int& length)
710 SysTryReturnResult(NID_BASE_UTIL, ((__pParseStr + __position) != null) && ((*(__pParseStr + __position) != 0x0000)),
711 E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
713 RegularExpression regDelim;
714 result r = regDelim.Construct(__delimiter, REGEX_UNICODE);
715 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Regular expression construction failed");
717 ArrayList matchedStrList(SingleObjectDeleter);
718 r = matchedStrList.Construct();
719 SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_DATA_NOT_FOUND, "Arraylist construction failed");
721 String inputStr(__pParseStr + __position);
722 bool res = regDelim.Match(inputStr, false, &matchedStrList);
724 int matches = matchedStrList.GetCount();
728 String delimiter1 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
730 if (!delimiter1.IsEmpty()) // 1st delimiter is not empty
732 int delimLength1 = delimiter1.GetLength();
734 inputStr.IndexOf(delimiter1, 0, delim1Index);
736 if (delim1Index > 0) // Delimiter1 appears after the token i.e followed by token
738 inputStr.SubString(0, delim1Index, ret); // Extract the string in between first and second delimiter
739 length += delim1Index;
742 // When the delimiter exists in first position, find the 2nd delimiter
743 length += delimLength1;
744 String tmpStr(__pParseStr + __position + length);
745 SysTryReturnResult(NID_BASE_UTIL, tmpStr != null, E_DATA_NOT_FOUND, "There are no more tokens in input string");
747 matchedStrList.RemoveAll();
748 res = regDelim.Match(tmpStr, false, &matchedStrList);
749 matches = matchedStrList.GetCount();
752 String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
753 // If the 2nd delimiter is empty, the token will be one character followed by 1st delimiter.
754 if (delimiter2.IsEmpty())
757 ret.Append(*(__pParseStr + __position + length));
763 tmpStr.IndexOf(delimiter2, 0, index2);
764 tmpStr.SubString(0, index2, ret); // Extract the string in between first and second delimiter
768 else // There are no second delimiters
771 ret.Append(__pParseStr + __position + length);
772 length += ret.GetLength();
773 SysTryReturnResult(NID_BASE_UTIL, length > 0, E_DATA_NOT_FOUND, "There are no more tokens in input string");
777 else // 1st delimiter is empty
779 // Find 2nd delimiter from "__pParseStr + __position + length + 1"
780 String tmpStr(__pParseStr + __position + length + 1);
781 if (tmpStr == null) // When InputStr is last token, extract the token.
784 ret.Append(__pParseStr + __position + length);
785 length = ret.GetLength();
789 matchedStrList.RemoveAll();
790 res = regDelim.Match(tmpStr, false, &matchedStrList);
791 matches = matchedStrList.GetCount();
792 SysTryReturnResult(NID_BASE_UTIL, matches > 0, E_DATA_NOT_FOUND, "There are no more tokens in input string");
794 String delimiter2 = *(dynamic_cast< String* >(matchedStrList.GetAt(0)));
795 if (delimiter2.IsEmpty()) // If the 2nd delimiter is also empty, the token will be one character followed by 1st delimiter.
798 ret.Append(*(__pParseStr + __position));
804 inputStr.IndexOf(delimiter2, 0, index2);
805 inputStr.SubString(0, index2, ret);
811 else //There are no delimiters
814 ret.Append(__pParseStr + __position);
815 length = ret.GetLength();
816 SysTryReturnResult(NID_BASE_UTIL, length > 0, E_DATA_NOT_FOUND, "There are no more tokens in input string");
821 }}} // Tizen::Base::Utility