[poincare] Integer can now parse hex and binary numbers

This commit is contained in:
Romain Goyet
2015-09-19 20:17:35 +02:00
parent 3f2f1f032c
commit 629f6b3aa6
2 changed files with 25 additions and 19 deletions

View File

@@ -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<stringLength; i++) {
v = v * base;
v = v + Integer(string[i]-'0'); // ASCII encoding
v = v + Integer(digit_from_char(string[i])); // ASCII encoding
}
#if 0
*this = v;

View File

@@ -4,6 +4,10 @@
QUIZ_CASE(poincare_integer) {
assert(Integer(123) == Integer(123));
assert(Integer("123") == Integer(123));
//assert(Integer("0123") == Integer(123));
assert(Integer("0x123") == Integer(291));
assert(Integer("0b1011") == Integer(11));
}
QUIZ_CASE(poincare_integer_add) {
@@ -18,10 +22,6 @@ QUIZ_CASE(poincare_integer_multiply) {
assert(Integer("9999999999") * Integer("9999999999") == Integer("99999999980000000001"));
}
QUIZ_CASE(poincare_integer_parse_integer) {
assert(Integer("123") == Integer(123));
}
QUIZ_CASE(poincare_integer_approximate) {
assert(Integer(1).approximate() == 1.0f);
assert(Integer("12345678").approximate() == 12345678.0f);