[poincare] NULL-termination and Integer parsing

Discard non-10 base handling for now

Change-Id: I487e85a169c7ae5780c83b0bcf3c40bd3daac0fe
This commit is contained in:
Romain Goyet
2016-12-20 17:27:45 +01:00
parent dd4a3e618f
commit 5963345981
4 changed files with 22 additions and 35 deletions

View File

@@ -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();

View File

@@ -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); }

View File

@@ -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<stringLength; i++) {
v = v.multiply_by(base);
v = v.add(Integer(digit_from_char(string[i]))); // ASCII encoding
}
// Pilfer v's ivars
m_numberOfDigits = v.m_numberOfDigits;
m_digits = v.m_digits;
m_numberOfDigits = result.m_numberOfDigits;
m_digits = result.m_digits;
// Zero-out v
v.m_numberOfDigits = 0;
v.m_digits = NULL;
result.m_numberOfDigits = 0;
result.m_digits = NULL;
}
Integer::~Integer() {

View File

@@ -8,8 +8,8 @@ QUIZ_CASE(poincare_integer) {
assert(!(Integer("-123") == Integer(123)));
assert(Integer("-123") == Integer(-123));
//assert(Integer("0123") == Integer(123));
assert(Integer("0x2BABE") == Integer(178878));
assert(Integer("0b1011") == Integer(11));
//FIXME: assert(Integer("0x2BABE") == Integer(178878));
//FIXME: assert(Integer("0b1011") == Integer(11));
}
QUIZ_CASE(poincare_integer_compare) {