Fixed #6274 (MathLib::isFloat doesn't recognize long double literal suffix L or l)
This commit is contained in:
parent
45ff012b2c
commit
7c4a137e14
|
@ -167,7 +167,7 @@ bool MathLib::isFloat(const std::string &s)
|
||||||
if (s.empty())
|
if (s.empty())
|
||||||
return false;
|
return false;
|
||||||
enum State {
|
enum State {
|
||||||
START, BASE_PLUSMINUS, BASE_DIGITS1, LEADING_DECIMAL, TRAILING_DECIMAL, BASE_DIGITS2, E, MANTISSA_PLUSMINUS, MANTISSA_DIGITS, F
|
START, BASE_PLUSMINUS, BASE_DIGITS1, LEADING_DECIMAL, TRAILING_DECIMAL, BASE_DIGITS2, E, MANTISSA_PLUSMINUS, MANTISSA_DIGITS, F, L
|
||||||
} state = START;
|
} 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) {
|
||||||
|
@ -210,6 +210,10 @@ bool MathLib::isFloat(const std::string &s)
|
||||||
case TRAILING_DECIMAL:
|
case TRAILING_DECIMAL:
|
||||||
if (*it=='e' || *it=='E')
|
if (*it=='e' || *it=='E')
|
||||||
state=E;
|
state=E;
|
||||||
|
else if (*it=='f' || *it=='F')
|
||||||
|
state=F;
|
||||||
|
else if (*it=='l' || *it=='L')
|
||||||
|
state=L;
|
||||||
else if (std::isdigit(*it))
|
else if (std::isdigit(*it))
|
||||||
state=BASE_DIGITS2;
|
state=BASE_DIGITS2;
|
||||||
else
|
else
|
||||||
|
@ -220,6 +224,8 @@ bool MathLib::isFloat(const std::string &s)
|
||||||
state=E;
|
state=E;
|
||||||
else if (*it=='f' || *it=='F')
|
else if (*it=='f' || *it=='F')
|
||||||
state=F;
|
state=F;
|
||||||
|
else if (*it=='l' || *it=='L')
|
||||||
|
state=L;
|
||||||
else if (!std::isdigit(*it))
|
else if (!std::isdigit(*it))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
@ -240,14 +246,18 @@ bool MathLib::isFloat(const std::string &s)
|
||||||
case MANTISSA_DIGITS:
|
case MANTISSA_DIGITS:
|
||||||
if (*it=='f' || *it=='F')
|
if (*it=='f' || *it=='F')
|
||||||
state=F;
|
state=F;
|
||||||
|
else if (*it=='l' || *it=='L')
|
||||||
|
state=L;
|
||||||
else if (!std::isdigit(*it))
|
else if (!std::isdigit(*it))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case F:
|
case F:
|
||||||
return false;
|
return false;
|
||||||
|
case L:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (state==BASE_DIGITS2 || state==MANTISSA_DIGITS || state==TRAILING_DECIMAL || state==F);
|
return (state==BASE_DIGITS2 || state==MANTISSA_DIGITS || state==TRAILING_DECIMAL || state==F || state==L);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MathLib::isNegative(const std::string &s)
|
bool MathLib::isNegative(const std::string &s)
|
||||||
|
|
|
@ -552,6 +552,10 @@ private:
|
||||||
ASSERT_EQUALS(false, MathLib::isFloat(" 0"));
|
ASSERT_EQUALS(false, MathLib::isFloat(" 0"));
|
||||||
|
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("0."));
|
ASSERT_EQUALS(true , MathLib::isFloat("0."));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.f"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.F"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.l"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.L"));
|
||||||
ASSERT_EQUALS(false , MathLib::isFloat("0. "));
|
ASSERT_EQUALS(false , MathLib::isFloat("0. "));
|
||||||
ASSERT_EQUALS(false , MathLib::isFloat(" 0. "));
|
ASSERT_EQUALS(false , MathLib::isFloat(" 0. "));
|
||||||
ASSERT_EQUALS(false , MathLib::isFloat(" 0."));
|
ASSERT_EQUALS(false , MathLib::isFloat(" 0."));
|
||||||
|
@ -560,6 +564,10 @@ private:
|
||||||
ASSERT_EQUALS(false , MathLib::isFloat("..0.."));
|
ASSERT_EQUALS(false , MathLib::isFloat("..0.."));
|
||||||
ASSERT_EQUALS(false , MathLib::isFloat("..0"));
|
ASSERT_EQUALS(false , MathLib::isFloat("..0"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("0.0"));
|
ASSERT_EQUALS(true , MathLib::isFloat("0.0"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.0f"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.0F"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.0l"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("0.0L"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("-0."));
|
ASSERT_EQUALS(true , MathLib::isFloat("-0."));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+0."));
|
ASSERT_EQUALS(true , MathLib::isFloat("+0."));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("-0.0"));
|
ASSERT_EQUALS(true , MathLib::isFloat("-0.0"));
|
||||||
|
@ -583,8 +591,14 @@ private:
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+1E+1"));
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+1"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100"));
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100f"));
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100f"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100F"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100l"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+100L"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+1E+007")); // to be sure about #5485
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+007")); // to be sure about #5485
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+1E+001f"));
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+001f"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+001F"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+001l"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+001L"));
|
||||||
ASSERT_EQUALS(false , MathLib::isFloat("+1E+001f2"));
|
ASSERT_EQUALS(false , MathLib::isFloat("+1E+001f2"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("+1E+10000"));
|
ASSERT_EQUALS(true , MathLib::isFloat("+1E+10000"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("-1E+1"));
|
ASSERT_EQUALS(true , MathLib::isFloat("-1E+1"));
|
||||||
|
@ -597,8 +611,14 @@ private:
|
||||||
|
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("0.4"));
|
ASSERT_EQUALS(true , MathLib::isFloat("0.4"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("2352.3f"));
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.3f"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.3F"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.3l"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.3L"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("0.00004"));
|
ASSERT_EQUALS(true , MathLib::isFloat("0.00004"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("2352.00001f"));
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.00001f"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.00001F"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.00001l"));
|
||||||
|
ASSERT_EQUALS(true , MathLib::isFloat("2352.00001L"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat(".4"));
|
ASSERT_EQUALS(true , MathLib::isFloat(".4"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat(".3e2"));
|
ASSERT_EQUALS(true , MathLib::isFloat(".3e2"));
|
||||||
ASSERT_EQUALS(true , MathLib::isFloat("1.0E+1"));
|
ASSERT_EQUALS(true , MathLib::isFloat("1.0E+1"));
|
||||||
|
|
Loading…
Reference in New Issue