From 596334598103f7cc2966ae869789f25daa1c5b16 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Tue, 20 Dec 2016 17:27:45 +0100 Subject: [PATCH] [poincare] NULL-termination and Integer parsing Discard non-10 base handling for now Change-Id: I487e85a169c7ae5780c83b0bcf3c40bd3daac0fe --- poincare/include/poincare/integer.h | 2 +- poincare/src/expression_parser.y | 2 +- poincare/src/integer.cpp | 49 +++++++++++------------------ poincare/test/integer.cpp | 4 +-- 4 files changed, 22 insertions(+), 35 deletions(-) diff --git a/poincare/include/poincare/integer.h b/poincare/include/poincare/integer.h index 6e4079afb..df8491fa9 100644 --- a/poincare/include/poincare/integer.h +++ b/poincare/include/poincare/integer.h @@ -12,7 +12,7 @@ class Integer : public LeafExpression { public: Integer(native_int_t i); Integer(Integer&& other); // C++11 move constructor - Integer(const char * string); // NULL-terminated + Integer(const char * digits, bool negative = false); // Digits are NOT NULL-terminated Type type() const override; ~Integer(); diff --git a/poincare/src/expression_parser.y b/poincare/src/expression_parser.y index 12234ccb6..77cdc336b 100644 --- a/poincare/src/expression_parser.y +++ b/poincare/src/expression_parser.y @@ -101,7 +101,7 @@ mtxData: | mtxData LEFT_BRACKET lstData RIGHT_BRACKET { $$ = $1; $$->pushListData($3); } exp: - INTEGER { $$ = new Integer($1); } + INTEGER { $$ = new Integer($1, false); } | SYMBOL { $$ = new Symbol($1); } | exp PLUS exp { Expression * terms[2] = {$1,$3}; $$ = new Addition(terms, 2, false); } | exp MINUS exp { Expression * terms[2] = {$1,$3}; $$ = new Subtraction(terms, false); } diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index 948a879b4..6ec14c483 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -46,46 +46,33 @@ Integer::Integer(native_int_t i) { *m_digits = (native_uint_t)(i>0 ? i : -i); } -Integer::Integer(const char * string) { - int stringLength = strlen(string); +/* Caution: string is NOT guaranteed to be NULL-terminated! */ +Integer::Integer(const char * digits, bool negative) { + m_negative = negative; - Integer base = Integer(10); - - m_negative = false; - - if (stringLength > 1 && string[0] == '-') { + if (digits != nullptr && digits[0] == '-') { m_negative = true; - string += 1; - stringLength -= 1; + digits++; } - if (stringLength > 2 && string[0] == '0') { - switch (string[1]) { - case 'x': - base = Integer(16); - string += 2; - stringLength -= 2; - break; - case 'b': - base = Integer(2); - string += 2; - stringLength -= 2; - break; + + Integer result = Integer(0); + + if (digits != nullptr) { + Integer base = Integer(10); + while (*digits >= '0' && *digits <= '9') { + result = result.multiply_by(base); + result = result.add(Integer(*digits-'0')); + digits++; } } - Integer v = Integer(digit_from_char(string[0])); - for (int i=1; i