From 629f6b3aa64481b2fc38220ce3c78db1c2784aef Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Sat, 19 Sep 2015 20:17:35 +0200 Subject: [PATCH] [poincare] Integer can now parse hex and binary numbers --- poincare/src/integer.cpp | 36 +++++++++++++++++++++--------------- poincare/test/integer.cpp | 8 ++++---- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index ebff852a3..e0c2eb732 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -19,6 +19,10 @@ uint8_t log2(native_uint_t v) { return 32; } +static inline native_uint_t digit_from_char(char c) { + return (c > '9' ? (c-'A'+10) : (c-'0')); +} + Integer::Integer(Integer&& other) { // Pilfer other's data m_numberOfDigits = other.m_numberOfDigits; @@ -36,26 +40,28 @@ Integer::Integer(native_uint_t i) { Integer::Integer(const char * string) { int stringLength = strlen(string); - /* - // Only support base 10 for now - if (stringLength > 2 && string[0] == '0') - switch (string[1]) { - case 'x': - base=16; - break; - case 'b': - base = 2; - break; - } - } - */ Integer base = Integer(10); - Integer v = Integer(string[0]-'0'); + 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 v = Integer(digit_from_char(string[0])); for (int i=1; i