Parser now correctly reads floats in scientific notation.
authorWouter van Oortmerssen <wvo@google.com>
Thu, 10 Jul 2014 20:40:55 +0000 (13:40 -0700)
committerWouter van Oortmerssen <wvo@google.com>
Thu, 10 Jul 2014 21:19:46 +0000 (14:19 -0700)
Change-Id: I7abb14a4b6c596674d6aff2b9de6e63603c0d2dc
Tested: on Windows and Linux.

src/idl_parser.cpp
tests/test.cpp

index 47e44c8..4a372b8 100644 (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;
index 5aa8157..9ca4234 100644 (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");