Skip to content

Commit bbfd10a

Browse files
Bugfix Mathlib::isNullValue for hexadecimal numbers (danmar#2517)
1 parent cef0674 commit bbfd10a

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

lib/mathlib.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1342,11 +1342,14 @@ bool MathLib::isNullValue(const std::string &str)
13421342
if (str.empty() || (!std::isdigit(static_cast<unsigned char>(str[0])) && (str[0] != '.' && str[0] != '-' && str[0] != '+')))
13431343
return false; // Has to be a number
13441344

1345+
bool isHex = isIntHex(str) || isFloatHex(str);
13451346
for (char i : str) {
13461347
if (std::isdigit(static_cast<unsigned char>(i)) && i != '0') // May not contain digits other than 0
13471348
return false;
1348-
if (i == 'E' || i == 'e')
1349+
if (i == 'p' || i == 'P' || (!isHex && (i == 'E' || i == 'e')))
13491350
return true;
1351+
if (isHex && isxdigit(i) && i != '0')
1352+
return false;
13501353
}
13511354
return true;
13521355
}

test/testmathlib.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,8 @@ class TestMathLib : public TestFixture {
946946
ASSERT_EQUALS(true, MathLib::isNullValue("0x0"));
947947
ASSERT_EQUALS(true, MathLib::isNullValue("+0x0"));
948948
ASSERT_EQUALS(true, MathLib::isNullValue("-0x0"));
949+
ASSERT_EQUALS(true, MathLib::isNullValue("+0X0"));
950+
ASSERT_EQUALS(true, MathLib::isNullValue("-0X0"));
949951
// unsigned integer zero value
950952
ASSERT_EQUALS(true, MathLib::isNullValue("0U"));
951953
ASSERT_EQUALS(true, MathLib::isNullValue("+0U"));
@@ -1004,6 +1006,8 @@ class TestMathLib : public TestFixture {
10041006
ASSERT_EQUALS(true, MathLib::isNullValue("0E0"));
10051007
ASSERT_EQUALS(true, MathLib::isNullValue("+0E0"));
10061008
ASSERT_EQUALS(true, MathLib::isNullValue("-0E0"));
1009+
ASSERT_EQUALS(true, MathLib::isNullValue("+0e0"));
1010+
ASSERT_EQUALS(true, MathLib::isNullValue("-0e0"));
10071011
// integer scientific notation
10081012
ASSERT_EQUALS(true, MathLib::isNullValue("0E1"));
10091013
ASSERT_EQUALS(true, MathLib::isNullValue("+0E1"));
@@ -1066,6 +1070,7 @@ class TestMathLib : public TestFixture {
10661070
ASSERT_EQUALS(true, MathLib::isNullValue("-0.f"));
10671071
// floating point scientific notation (suffix f)
10681072
ASSERT_EQUALS(true, MathLib::isNullValue("0.0f"));
1073+
ASSERT_EQUALS(true, MathLib::isNullValue("0.0F"));
10691074
ASSERT_EQUALS(true, MathLib::isNullValue("+0.0f"));
10701075
ASSERT_EQUALS(true, MathLib::isNullValue("-0.0f"));
10711076
// floating point scientific notation (suffix f)
@@ -1080,6 +1085,12 @@ class TestMathLib : public TestFixture {
10801085
ASSERT_EQUALS(true, MathLib::isNullValue("00.00E+1f"));
10811086
ASSERT_EQUALS(true, MathLib::isNullValue("+00.00E+1f"));
10821087
ASSERT_EQUALS(true, MathLib::isNullValue("-00.00E+1f"));
1088+
// hex float
1089+
ASSERT_EQUALS(true, MathLib::isNullValue("0x0p3"));
1090+
ASSERT_EQUALS(true, MathLib::isNullValue("0X0P3"));
1091+
ASSERT_EQUALS(true, MathLib::isNullValue("0X0p-3"));
1092+
ASSERT_EQUALS(true, MathLib::isNullValue("-0x0p3"));
1093+
ASSERT_EQUALS(true, MathLib::isNullValue("+0x0p3"));
10831094

10841095
// binary numbers
10851096
ASSERT_EQUALS(true, MathLib::isNullValue("0b00"));
@@ -1093,6 +1104,18 @@ class TestMathLib : public TestFixture {
10931104
ASSERT_EQUALS(false, MathLib::isNullValue("0.1"));
10941105
ASSERT_EQUALS(false, MathLib::isNullValue("1.0"));
10951106
ASSERT_EQUALS(false, MathLib::isNullValue("0.01"));
1107+
ASSERT_EQUALS(false, MathLib::isNullValue("0xF"));
1108+
ASSERT_EQUALS(false, MathLib::isNullValue("0XFF"));
1109+
ASSERT_EQUALS(false, MathLib::isNullValue("0b01"));
1110+
ASSERT_EQUALS(false, MathLib::isNullValue("0B01"));
1111+
ASSERT_EQUALS(false, MathLib::isNullValue("0x1p0"));
1112+
ASSERT_EQUALS(false, MathLib::isNullValue("0x1P0"));
1113+
ASSERT_EQUALS(false, MathLib::isNullValue("0xap0"));
1114+
ASSERT_EQUALS(false, MathLib::isNullValue("0xbp0"));
1115+
ASSERT_EQUALS(false, MathLib::isNullValue("0xcp0"));
1116+
ASSERT_EQUALS(false, MathLib::isNullValue("0xdp0"));
1117+
ASSERT_EQUALS(false, MathLib::isNullValue("0xep0"));
1118+
ASSERT_EQUALS(false, MathLib::isNullValue("0xfp0"));
10961119
ASSERT_EQUALS(false, MathLib::isNullValue("-00.01e-12"));
10971120
ASSERT_EQUALS(false, MathLib::isNullValue("-00.01e+12"));
10981121
ASSERT_EQUALS(false, MathLib::isNullValue(""));

0 commit comments

Comments
 (0)