From 1d7580cc8c00011604b21221ae23dd4418a056f7 Mon Sep 17 00:00:00 2001 From: hankedan000 Date: Sun, 14 Feb 2021 11:22:35 -0500 Subject: [PATCH] Fixes decimal number parsing bug --- CMakeLists.txt | 3 +++ src/parsing/Tokenizer.cpp | 6 ++++- tests/dbc-files/decimal-scale-1.dbc | 37 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/dbc-files/decimal-scale-1.dbc diff --git a/CMakeLists.txt b/CMakeLists.txt index 08bca68..662c5ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,4 +75,7 @@ if(BUILD_TESTING) add_test(NAME cpc-checkframe-big-endian-3 COMMAND can-parse checkframe 1800 dbc-files/big-endian-1.dbc) + + add_test(NAME cpc-checkframe-decimal-scale-1 + COMMAND can-parse checkframe dbc-files/decimal-scale-1.dbc) endif() \ No newline at end of file diff --git a/src/parsing/Tokenizer.cpp b/src/parsing/Tokenizer.cpp index 9984c87..99cb402 100644 --- a/src/parsing/Tokenizer.cpp +++ b/src/parsing/Tokenizer.cpp @@ -14,6 +14,10 @@ bool isSeparator(char c) { c == ')' || c == '(' || c == ',' || c == ';'; } +bool isAny(char c, const std::string &chars) { + return chars.find(c) != std::string::npos; +} + bool isDigit(char c) { return std::isdigit((unsigned char)c); } @@ -243,7 +247,7 @@ std::string Tokenizer::parseNumber(bool& is_float) { char currentChar = getNextChar(); is_float = false; - while (isDigit(currentChar) && !isEOF(currentChar)) { + while ((isDigit(currentChar) || isAny(currentChar,".e"))&& !isEOF(currentChar)) { result += currentChar; currentChar = getNextChar(); diff --git a/tests/dbc-files/decimal-scale-1.dbc b/tests/dbc-files/decimal-scale-1.dbc new file mode 100644 index 0000000..9c57ed9 --- /dev/null +++ b/tests/dbc-files/decimal-scale-1.dbc @@ -0,0 +1,37 @@ +VERSION "SingleFrame1.dbc" + +NS_ : + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + +BS_: + +BU_: TestNode + +BO_ 1296 TEST_FRAME_1: 2 TestNode + SG_ TEST_SIG_1 : 0|8@1+ (1.0,0) [0|0] "" TestNode + SG_ TEST_SIG_2 : 8|8@1+ (0.1,0) [0|0] "" TestNode \ No newline at end of file