Added function MathLib::isValidSuffix()

This commit is contained in:
orbitcowboy 2014-03-14 11:46:41 +01:00
parent 71ee625aab
commit 74d10cd6d9
2 changed files with 27 additions and 83 deletions

View File

@ -137,7 +137,7 @@ bool MathLib::isPositive(const std::string &s)
**/ **/
bool MathLib::isOct(const std::string& s) bool MathLib::isOct(const std::string& s)
{ {
enum {START, PLUSMINUS, OCTAL_PREFIX, DIGITS, UNSIGNED_SUFFIX, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU} state = START; enum {START, PLUSMINUS, OCTAL_PREFIX, DIGITS} state = START;
for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) { for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) {
switch (state) { switch (state) {
case START: case START:
@ -154,7 +154,6 @@ bool MathLib::isOct(const std::string& s)
else else
return false; return false;
break; break;
case OCTAL_PREFIX: case OCTAL_PREFIX:
if (isOctalDigit(*it)) if (isOctalDigit(*it))
state = DIGITS; state = DIGITS;
@ -164,50 +163,14 @@ bool MathLib::isOct(const std::string& s)
case DIGITS: case DIGITS:
if (isOctalDigit(*it)) if (isOctalDigit(*it))
state = DIGITS; state = DIGITS;
else if (*it == 'u' || *it == 'U')
state = SUFFIX_U;
else if (*it == 'l' || *it == 'L')
state = SUFFIX_L;
else else
return false; return isValidSuffix(it,s.end());
break;
case SUFFIX_U:
if (*it == 'l' || *it == 'L')
state = SUFFIX_UL; // UL
else
return false;
break;
case SUFFIX_UL:
if (*it == 'l' || *it == 'L')
state = SUFFIX_ULL; // ULL
else
return false;
break;
case SUFFIX_L:
if (*it == 'u' || *it == 'U')
state = SUFFIX_LU; // LU
else if (*it == 'l' || *it == 'L')
state = SUFFIX_LL; // LL
else
return false;
break;
case SUFFIX_LU:
return false;
break;
case SUFFIX_LL:
if (*it == 'u' || *it == 'U')
state = SUFFIX_LLU; // LLU
else
return false;
break; break;
default: default:
return false; return false;
} }
} }
return (state == DIGITS) return state == DIGITS;
|| (state == SUFFIX_U) || (state == SUFFIX_L)
|| (state == SUFFIX_UL) || (state == SUFFIX_LU) || (state == SUFFIX_LL)
|| (state == SUFFIX_ULL) || (state == SUFFIX_LLU);
} }
bool MathLib::isHex(const std::string& s) bool MathLib::isHex(const std::string& s)
@ -216,7 +179,7 @@ bool MathLib::isHex(const std::string& s)
if (s.empty()) if (s.empty())
return false; return false;
enum {START, PLUSMINUS, HEX_PREFIX, DIGIT, DIGITS, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU} state = START; enum {START, PLUSMINUS, HEX_PREFIX, DIGIT, DIGITS} state = START;
for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) { for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) {
switch (state) { switch (state) {
case START: case START:
@ -248,7 +211,23 @@ bool MathLib::isHex(const std::string& s)
case DIGITS: case DIGITS:
if (isxdigit(*it)) if (isxdigit(*it))
state = DIGITS; state = DIGITS;
else if (*it == 'u' || *it == 'U') else
return isValidSuffix(it,s.end());
break;
default:
return false;
}
}
return state == DIGITS;
}
bool MathLib::isValidSuffix(std::string::const_iterator it, std::string::const_iterator end)
{
enum {START, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU} state = START;
for (; it != end; ++it) {
switch (state) {
case START:
if (*it == 'u' || *it == 'U')
state = SUFFIX_U; state = SUFFIX_U;
else if (*it == 'l' || *it == 'L') else if (*it == 'l' || *it == 'L')
state = SUFFIX_L; state = SUFFIX_L;
@ -288,8 +267,7 @@ bool MathLib::isHex(const std::string& s)
return false; return false;
} }
} }
return (state == DIGITS) return (state == SUFFIX_U) || (state == SUFFIX_L)
|| (state == SUFFIX_U) || (state == SUFFIX_L)
|| (state == SUFFIX_UL) || (state == SUFFIX_LU) || (state == SUFFIX_LL) || (state == SUFFIX_UL) || (state == SUFFIX_LU) || (state == SUFFIX_LL)
|| (state == SUFFIX_ULL) || (state == SUFFIX_LLU); || (state == SUFFIX_ULL) || (state == SUFFIX_LLU);
} }
@ -305,7 +283,7 @@ bool MathLib::isHex(const std::string& s)
**/ **/
bool MathLib::isBin(const std::string& s) bool MathLib::isBin(const std::string& s)
{ {
enum {START, PLUSMINUS, GNU_BIN_PREFIX, DIGIT, DIGITS, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU} state = START; enum {START, PLUSMINUS, GNU_BIN_PREFIX, DIGIT, DIGITS} state = START;
for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) { for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) {
switch (state) { switch (state) {
case START: case START:
@ -337,50 +315,14 @@ bool MathLib::isBin(const std::string& s)
case DIGITS: case DIGITS:
if (*it == '0' || *it == '1') if (*it == '0' || *it == '1')
state = DIGITS; state = DIGITS;
else if (*it == 'u' || *it == 'U')
state = SUFFIX_U;
else if (*it == 'l' || *it == 'L')
state = SUFFIX_L;
else else
return false; return isValidSuffix(it,s.end());
break;
case SUFFIX_U:
if (*it == 'l' || *it == 'L')
state = SUFFIX_UL; // UL
else
return false;
break;
case SUFFIX_UL:
if (*it == 'l' || *it == 'L')
state = SUFFIX_ULL; // ULL
else
return false;
break;
case SUFFIX_L:
if (*it == 'u' || *it == 'U')
state = SUFFIX_LU; // LU
else if (*it == 'l' || *it == 'L')
state = SUFFIX_LL; // LL
else
return false;
break;
case SUFFIX_LU:
return false;
break;
case SUFFIX_LL:
if (*it == 'u' || *it == 'U')
state = SUFFIX_LLU; // LLU
else
return false;
break; break;
default: default:
return false; return false;
} }
} }
return (state == DIGITS) return state == DIGITS;
|| (state == SUFFIX_U) || (state == SUFFIX_L)
|| (state == SUFFIX_UL) || (state == SUFFIX_LU) || (state == SUFFIX_LL)
|| (state == SUFFIX_ULL) || (state == SUFFIX_LLU);
} }
bool MathLib::isInt(const std::string & s) bool MathLib::isInt(const std::string & s)

View File

@ -50,6 +50,8 @@ public:
static bool isOct(const std::string& str); static bool isOct(const std::string& str);
static bool isBin(const std::string& str); static bool isBin(const std::string& str);
static bool isValidSuffix(std::string::const_iterator it, std::string::const_iterator end);
static std::string add(const std::string & first, const std::string & second); static std::string add(const std::string & first, const std::string & second);
static std::string subtract(const std::string & first, const std::string & second); static std::string subtract(const std::string & first, const std::string & second);
static std::string multiply(const std::string & first, const std::string & second); static std::string multiply(const std::string & first, const std::string & second);