mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-30 04:00:02 +02:00
[poincare] NULL-termination and Integer parsing
Discard non-10 base handling for now Change-Id: I487e85a169c7ae5780c83b0bcf3c40bd3daac0fe
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user