aboutsummaryrefslogtreecommitdiff
path: root/py/parsenum.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-03-01 19:50:50 +0000
committerDamien George <damien.p.george@gmail.com>2014-03-01 19:50:50 +0000
commit06201ff3d6d9485b2657fc9ac4aa8a306884322f (patch)
treeade288601c3afccafa403ee8e7e569b83c1d8443 /py/parsenum.c
parent793838a919c9cb848cb8c3f2d88d8b347bfd6083 (diff)
py: Implement bit-shift and not operations for mpz.
Implement not, shl and shr in mpz library. Add function to create mpzs on the stack, used for memory efficiency when rhs is a small int. Factor out code to parse base-prefix of number into a dedicated function.
Diffstat (limited to 'py/parsenum.c')
-rw-r--r--py/parsenum.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/py/parsenum.c b/py/parsenum.c
index 64594cd1b..8e290da33 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -5,6 +5,7 @@
#include "qstr.h"
#include "nlr.h"
#include "obj.h"
+#include "parsenumbase.h"
#include "parsenum.h"
#if defined(UNIX)
@@ -33,38 +34,15 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
// preced sign
if (c == '+' || c == '-') {
neg = - (c == '-');
- c = *(p++);
- }
-
- // find real radix base, and strip preced '0x', '0o' and '0b'
- // TODO somehow merge with similar code in parse.c
- if ((base == 0 || base == 16) && c == '0') {
- c = *(p++);
- if ((c | 32) == 'x') {
- base = 16;
- } else if (base == 0 && (c | 32) == 'o') {
- base = 8;
- } else if (base == 0 && (c | 32) == 'b') {
- base = 2;
- } else {
- base = 10;
- p -= 2;
- }
- } else if (base == 8 && c == '0') {
- c = *(p++);
- if ((c | 32) != 'o') {
- p -= 2;
- }
- } else if (base == 2 && c == '0') {
- c = *(p++);
- if ((c | 32) != 'b') {
- p -= 2;
- }
} else {
- if (base == 0) base = 10;
p--;
}
+ len -= p - str;
+ int skip = mp_parse_num_base(p, len, &base);
+ p += skip;
+ len -= skip;
+
errno = 0;
found = strtol(p, &num, base);
if (errno) {