*
* ret = scan.IsNextTokenConvertibleToSignedChar(); //ret true
* signed char val;
- * scan.GetNextSignedChar(val); //val 1
+ * scan.GetNextSignedChar(val); //val 1
*
* ret = scan.IsNextTokenConvertibleToShort(10); //ret true
* short shortVal;
- * scan.GetNextShort(shortVal); //shortVal 12
+ * scan.GetNextShort(shortVal); //shortVal 12
*
* ret = scan.IsNextTokenConvertibleToInt(10); //ret false
* ret = scan.IsNextTokenConvertibleToFloat(); //ret true
* float floatVal;
- * scan.GetNextFloat(floatVal); //floatVal 34.5
+ * scan.GetNextFloat(floatVal); //floatVal 34.5
*
* ret = scan.IsNextTokenConvertibleToInt(16); //ret true
* int intVal;
- * scan.GetNextInt(intVal, 16); //intVal 88
+ * scan.GetNextInt(intVal, 16); //intVal 88
*
* ret = scan.IsNextTokenConvertibleToBool(); //ret true
* scan.GetNextBool(ret); //ret false
{
result r = E_SUCCESS;
SysAssertf(__pScannerImpl == null, "Already constructed! Calling Construct() twice or more on a same instance is not allowed for this class.");
- SysTryReturnResult(NID_BASE_UTIL, !inputStr.IsEmpty(), E_INVALID_ARG, "[E_INVALID_ARG] The length of the input data is zero.");
+ SysTryReturnResult(NID_BASE_UTIL, !inputStr.IsEmpty(), E_INVALID_ARG, "[%s] The length of the input data is zero.", GetErrorMessage(E_INVALID_ARG));
__pScannerImpl = new (std::nothrow) _ScannerImpl();
SysTryReturnResult(NID_BASE_UTIL, __pScannerImpl != null, E_OUT_OF_MEMORY, "Memory allocation failed");
{
result r = E_SUCCESS;
SysAssertf(__pScannerImpl == null, "Already constructed! Calling Construct() twice or more on a same instance is not allowed for this class.");
- SysTryReturn(NID_BASE_UTIL, !inputFilePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The length of the file name is zero.");
- SysTryReturn(NID_BASE_UTIL, !encodingScheme.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The length of the encoding scheme is zero.");
+ SysTryReturn(NID_BASE_UTIL, !inputFilePath.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG, "[%s] The length of the file name is zero.", GetErrorMessage(E_INVALID_ARG));
+ SysTryReturn(NID_BASE_UTIL, !encodingScheme.IsEmpty(), r = E_INVALID_ARG, E_INVALID_ARG, "[%s] The length of the encoding scheme is zero.", GetErrorMessage(E_INVALID_ARG));
__pScannerImpl = new (std::nothrow) _ScannerImpl();
- SysTryReturnResult(NID_BASE_UTIL, __pScannerImpl != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed");
+ SysTryReturnResult(NID_BASE_UTIL, __pScannerImpl != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
r = __pScannerImpl->Construct(inputFilePath, encodingScheme);
return r;
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
return __pScannerImpl->GetNextSignedChar(nextSignedChar, radix);
}
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
return __pScannerImpl->IsNextTokenConvertibleToSignedChar(radix);
}
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
return __pScannerImpl->GetNextInt(nextInt, radix);
}
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
return __pScannerImpl->IsNextTokenConvertibleToInt(radix);
}
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
return __pScannerImpl->GetNextShort(nextShort, radix);
}
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
return __pScannerImpl->IsNextTokenConvertibleToShort(radix);
result Scanner::GetNextLongLong(long long& nextLongLong, int radix) const
{
-//This always returns nextLongLong in radix 10. This function will be implemented correctly once LongLong::Parse() is implemnted for different radix
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
SysTryReturnResult(NID_BASE_UTIL, ((radix == Character::RADIX_BINARY) || (radix == Character::RADIX_OCTAL) || (radix == Character::RADIX_DECIMAL) ||
- (radix == Character::RADIX_HEXADECIMAL)),E_NUM_FORMAT,
- "[E_NUM_FORMAT] The radix(%d) MUST be one of 2, 8, 10 and 16.", radix);
- return __pScannerImpl->GetNextLongLong(nextLongLong);
+ (radix == Character::RADIX_HEXADECIMAL)), E_NUM_FORMAT,
+ "[%s] The radix(%d) MUST be one of 2, 8, 10 and 16.", GetErrorMessage(E_NUM_FORMAT), radix);
+
+ return __pScannerImpl->GetNextLongLong(nextLongLong, radix);
}
bool Scanner::IsNextTokenConvertibleToLongLong(void) const
result Scanner::FindInLine(const String& patternStr, String& matchedStr)
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
- SysTryReturnResult(NID_BASE_UTIL, !patternStr.IsEmpty(), E_INVALID_ARG, "[E_INVALID_ARG] The length of the input data is zero.");
+ SysTryReturnResult(NID_BASE_UTIL, !patternStr.IsEmpty(), E_INVALID_ARG, "[%s] The length of the input data is zero.", GetErrorMessage(E_INVALID_ARG));
return __pScannerImpl->FindInLine(patternStr, matchedStr);
}
{
SysAssertf(__pScannerImpl != null, "Not yet constructed! Construct() should be called before use.");
String str(pattern.GetPattern());
- SysTryReturnResult(NID_BASE_UTIL, !str.IsEmpty(), E_INVALID_ARG, "[E_INVALID_ARG] The length of the input data is zero.");
+ SysTryReturnResult(NID_BASE_UTIL, !str.IsEmpty(), E_INVALID_ARG, "[%s] The length of the input data is zero.", GetErrorMessage(E_INVALID_ARG));
return __pScannerImpl->FindInLine(pattern, matchedStr);
}
#define ANY_PATTERN L"\\s*[^\\s]*"
#define DEFAULT_DELIMITER_PATTERN L"\\s*"
-//#define DEFAULT_LINE_SEPARATOR_PATTERN L".*(\r\n|[\u000A\n\r\u2028\u2029\u0085])|.+$"
#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]*"
result _ScannerImpl::GetNextToken(const String& pattern, String& nextStr)
{
result r = E_SUCCESS;
- int length = 0;
+ int length1 = 0;
+ int length2 = 0;
String str1;
String str2;
String anyPattern(ANY_PATTERN);
- r = GetNextToken(anyPattern, str1, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || 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 = GetNextToken(pattern, str2, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || 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");
- if(str1 == str2)
- {
- nextStr = str1;
- __position = __position + length;
+ if(str1 == str2)
+ {
+ nextStr = str1;
+ __position = __position + length2;
+ break;
+ }
+ else
+ {
+ nextStr = L"";
+ __position = __position + length1;
+ }
}
return r;
String pattern(ANY_PATTERN);
r = GetNextToken(pattern, out, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
-/* if(out.GetLength() > 1)
- {
- return E_OPERATION_FAILED;
- }*/
r = Int8::Parse(out, radix, ch);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to signed char");
r = GetNextToken(pattern, 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));
-/* if(out.GetLength() > 1)
- {
- return E_OPERATION_FAILED;
- }*/
-
r = Int8::Parse(out, radix, ch);
SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, false, E_NUM_FORMAT, "[%s] Can not parse the token to signed char", GetErrorMessage(E_NUM_FORMAT));
String pattern(ANY_PATTERN);
r = GetNextToken(pattern, out, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
String pattern(ANY_PATTERN);
r = GetNextToken(pattern, out, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
result _ScannerImpl::GetNextLongLong(long long& nextLongLong)
{
+ return GetNextLongLong(nextLongLong, __radix);
+}
+
+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);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
- r = LongLong::Parse(out, nextLongLong);
+ r = LongLong::Parse(out, radix, nextLongLong);
SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS, E_NUM_FORMAT, "Can not parse the token to long long");
__position = __position + length;
String pattern(ANY_PATTERN);
r = GetNextToken(pattern, out, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
String pattern(ANY_PATTERN);
r = GetNextToken(pattern, out, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
out.Replace(DEFAULT_GROUP_SEPARATOR, L"");
String pattern(ANY_PATTERN);
r = GetNextToken(pattern, out, length);
- SysTryReturnResult(NID_BASE_UTIL, r == E_SUCCESS || r == E_DATA_NOT_ENOUGH, E_DATA_NOT_ENOUGH, "Input has no remaining tokens");
-
+ 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");
String temp;
result _ScannerImpl::GetNextToken(const String& pattern, String& ret, int& length)
{
result r = E_SUCCESS;
- SysTryReturnResult(NID_BASE_UTIL, __pParseStr != null, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
- SysTryReturnResult(NID_BASE_UTIL, *__pParseStr != 0x0000, E_DATA_NOT_ENOUGH, "Input has no remaining tokens.");
+ 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.");
RegularExpression regex;
ArrayList matchedStrList;
}
}
-
return r;
}
+
}}} // Osp::Base::Utility
_ScannerImpl(const _ScannerImpl& scanner);
_ScannerImpl& operator =(const _ScannerImpl& scanner);
virtual ~_ScannerImpl(void);
-// virtual int GetHashCode(void);
result Construct(const String& str);
result Construct(const String& filePath, const String& encodingScheme);
result GetNextShort(short& nextShort);
result GetNextShort(short& nextShort, int radix);
result GetNextLongLong(long long& nextLongLong);
+ result GetNextLongLong(long long& nextLongLong, int radix);
result GetNextFloat(float& nextFloat);
result GetNextDouble(double& nextDouble);
result GetNextBool(bool& nextBool);