Fix some compiler in MathLib::characterLiteralToLongNumber + some small refactoring
This commit is contained in:
parent
5135bae777
commit
a7ab5ecf08
|
@ -313,6 +313,14 @@ MathLib::biguint MathLib::toULongNumber(const std::string & str)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isOctalDigitString(const std::string& str)
|
||||||
|
{
|
||||||
|
for (std::string::const_iterator it=str.begin(); it!=str.end(); ++it) {
|
||||||
|
if (!MathLib::isOctalDigit(*it))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
MathLib::bigint MathLib::characterLiteralToLongNumber(const std::string& str)
|
MathLib::bigint MathLib::characterLiteralToLongNumber(const std::string& str)
|
||||||
{
|
{
|
||||||
|
@ -330,7 +338,7 @@ MathLib::bigint MathLib::characterLiteralToLongNumber(const std::string& str)
|
||||||
for (std::string::const_iterator it=str.begin()+1; it!=str.end(); ++it) {
|
for (std::string::const_iterator it=str.begin()+1; it!=str.end(); ++it) {
|
||||||
retval = retval<<8 | *it;
|
retval = retval<<8 | *it;
|
||||||
}
|
}
|
||||||
return retval; // str[0] & 0xff;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (str[1]) {
|
switch (str[1]) {
|
||||||
|
@ -383,18 +391,16 @@ MathLib::bigint MathLib::characterLiteralToLongNumber(const std::string& str)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled char constant " + str);
|
throw InternalError(0, "Internal Error. MathLib::toLongNumber: Unhandled char constant " + str);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return c & 0xff;
|
return c & 0xff;
|
||||||
case 2:
|
case 2:
|
||||||
if (isOctalDigit(str[1]) && isOctalDigit(str[2]))
|
case 3: {
|
||||||
return toLongNumber("0" + str.substr(1));
|
const std::string& str1 = str.substr(1);
|
||||||
break;
|
if (isOctalDigitString(str1))
|
||||||
case 3:
|
return toLongNumber("0" + str1);
|
||||||
if (isOctalDigit(str[1]) && isOctalDigit(str[2]) && isOctalDigit(str[3]))
|
|
||||||
return toLongNumber("0" + str.substr(1));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,6 @@ public:
|
||||||
* @return true if given character is octal digit.
|
* @return true if given character is octal digit.
|
||||||
*/
|
*/
|
||||||
static bool isOctalDigit(char c);
|
static bool isOctalDigit(char c);
|
||||||
private:
|
|
||||||
static MathLib::bigint characterLiteralToLongNumber(const std::string& str);
|
static MathLib::bigint characterLiteralToLongNumber(const std::string& str);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -293,6 +293,13 @@ private:
|
||||||
ASSERT_THROW(MathLib::toLongNumber("'\\u9343'"), InternalError);
|
ASSERT_THROW(MathLib::toLongNumber("'\\u9343'"), InternalError);
|
||||||
ASSERT_THROW(MathLib::toLongNumber("'\\U0001f34c'"), InternalError);
|
ASSERT_THROW(MathLib::toLongNumber("'\\U0001f34c'"), InternalError);
|
||||||
|
|
||||||
|
{
|
||||||
|
// some unit-testing for a utility function
|
||||||
|
ASSERT_EQUALS(0, MathLib::characterLiteralToLongNumber(std::string("")));
|
||||||
|
ASSERT_EQUALS(32, MathLib::characterLiteralToLongNumber(std::string(" ")));
|
||||||
|
ASSERT_EQUALS(538976288, MathLib::characterLiteralToLongNumber(std::string(" ")));
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT_EQUALS(-8552249625308161526, MathLib::toLongNumber("0x89504e470d0a1a0a"));
|
ASSERT_EQUALS(-8552249625308161526, MathLib::toLongNumber("0x89504e470d0a1a0a"));
|
||||||
ASSERT_EQUALS(-8481036456200365558, MathLib::toLongNumber("0x8a4d4e470d0a1a0a"));
|
ASSERT_EQUALS(-8481036456200365558, MathLib::toLongNumber("0x8a4d4e470d0a1a0a"));
|
||||||
ASSERT_EQUALS(9894494448401390090ULL, MathLib::toULongNumber("0x89504e470d0a1a0a"));
|
ASSERT_EQUALS(9894494448401390090ULL, MathLib::toULongNumber("0x89504e470d0a1a0a"));
|
||||||
|
|
Loading…
Reference in New Issue