Parser now correctly reads floats in scientific notation.

Change-Id: I7abb14a4b6c596674d6aff2b9de6e63603c0d2dc
Tested: on Windows and Linux.
This commit is contained in:
Wouter van Oortmerssen
2014-07-10 13:40:55 -07:00
parent 2208de0676
commit 93df5697a0
2 changed files with 23 additions and 0 deletions

View File

@@ -200,6 +200,13 @@ void Parser::Next() {
if (*cursor_ == '.') {
cursor_++;
while (isdigit(static_cast<unsigned char>(*cursor_))) cursor_++;
// See if this float has a scientific notation suffix. Both JSON
// and C++ (through strtod() we use) have the same format:
if (*cursor_ == 'e' || *cursor_ == 'E') {
cursor_++;
if (*cursor_ == '+' || *cursor_ == '-') cursor_++;
while (isdigit(static_cast<unsigned char>(*cursor_))) cursor_++;
}
token_ = kTokenFloatConstant;
} else {
token_ = kTokenIntegerConstant;

View File

@@ -481,6 +481,21 @@ void ErrorTest() {
TestError("union Z { X } struct X { Y:int; }", "only tables");
}
// Additional parser testing not covered elsewhere.
void TokenTest() {
flatbuffers::Parser parser;
// Simple schema.
TEST_EQ(parser.Parse("table X { Y:float; } root_type X;"), true);
// Test scientific notation numbers.
TEST_EQ(parser.Parse("{ Y:0.0314159e+2 }"), true);
auto root = flatbuffers::GetRoot<float>(parser.builder_.GetBufferPointer());
// root will point to the table, which is a 32bit vtable offset followed
// by a float:
TEST_EQ(fabs(root[1] - 3.14159) < 0.001, true);
}
int main(int /*argc*/, const char * /*argv*/[]) {
// Run our various test suites:
@@ -495,6 +510,7 @@ int main(int /*argc*/, const char * /*argv*/[]) {
FuzzTest2();
ErrorTest();
TokenTest();
if (!testing_fails) {
TEST_OUTPUT_LINE("ALL TESTS PASSED");