diff options
author | Damien George <damien.p.george@gmail.com> | 2014-03-01 19:50:50 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-03-01 19:50:50 +0000 |
commit | 06201ff3d6d9485b2657fc9ac4aa8a306884322f (patch) | |
tree | ade288601c3afccafa403ee8e7e569b83c1d8443 /py/parsenum.c | |
parent | 793838a919c9cb848cb8c3f2d88d8b347bfd6083 (diff) | |
download | micropython-06201ff3d6d9485b2657fc9ac4aa8a306884322f.tar.gz micropython-06201ff3d6d9485b2657fc9ac4aa8a306884322f.zip |
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.c | 34 |
1 files changed, 6 insertions, 28 deletions
diff --git a/py/parsenum.c b/py/parsenum.c index 64594cd1b4..8e290da338 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) { |