From 100dd0cf5c65e74cd7821b84610444101aab0040 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Sat, 23 Jan 2010 08:31:15 +0000 Subject: [PATCH] Fixed number with exponent scanner (and simplified that code). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35249 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/shared/ExpressionParser.cpp | 62 ++++++++++++++++++---------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/kits/shared/ExpressionParser.cpp b/src/kits/shared/ExpressionParser.cpp index 7e565d6a52..49f6e09d54 100644 --- a/src/kits/shared/ExpressionParser.cpp +++ b/src/kits/shared/ExpressionParser.cpp @@ -137,29 +137,49 @@ class Tokenizer { BString temp; const char* begin = fCurrentChar; - bool expectE = true; - bool expectPlusOrMinus = false; - while (*fCurrentChar != 0) { - if (!isdigit(*fCurrentChar)) { - if (*fCurrentChar == 'e' || *fCurrentChar == 'E') { - if (!expectE) - break; - expectE = false; - expectPlusOrMinus = true; - } else if (*fCurrentChar == '+' || *fCurrentChar == '-') { - if (!expectPlusOrMinus) - break; - } else if (!(*fCurrentChar == '.' || *fCurrentChar == ',')) - break; - else - expectPlusOrMinus = false; - } - if (*fCurrentChar == ',') - temp << '.'; - else - temp << *fCurrentChar; + + // optional digits before the comma + while (isdigit(*fCurrentChar)) { + temp << *fCurrentChar; fCurrentChar++; } + + // optional post comma part + // (required if there are no digits before the comma) + if (*fCurrentChar == '.' || *fCurrentChar == ',') { + temp << '.'; + fCurrentChar++; + + // optional post comma digits + while (isdigit(*fCurrentChar)) { + temp << *fCurrentChar; + fCurrentChar++; + } + } + + // optional exponent part + if (*fCurrentChar == 'e' || *fCurrentChar == 'E') { + temp << *fCurrentChar; + fCurrentChar++; + + // optional exponent sign + if (*fCurrentChar == '+' || *fCurrentChar == '-') { + temp << *fCurrentChar; + fCurrentChar++; + } + + // required exponent digits + if (!isdigit(*fCurrentChar)) { + throw ParseException("missing exponent in constant", + fCurrentChar - begin); + } + + while (isdigit(*fCurrentChar)) { + temp << *fCurrentChar; + fCurrentChar++; + } + } + int32 length = fCurrentChar - begin; BString test = temp; test << "&_";