summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-12-28 12:02:49 +1100
committerDamien George <damien.p.george@gmail.com>2016-12-28 12:02:49 +1100
commitc2dd494bd989ed1a32bf09816f211c04ad243a8b (patch)
treef357ca026129f4ca334e5e25bea771a1a6c9551b
parent25f44c19f17085a09ad0f857c6ccc0d33d7c0344 (diff)
py/parsenum: Simplify and generalise decoding of digit values.
This function should be able to parse integers with any value for the base, because it is called by int('xxx', base).
-rw-r--r--py/parsenum.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/py/parsenum.c b/py/parsenum.c
index b1c449c9b..0be7453dd 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -81,20 +81,18 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, m
for (; str < top; str++) {
// get next digit as a value
mp_uint_t dig = *str;
- if (unichar_isdigit(dig) && (int)dig - '0' < base) {
- // 0-9 digit
- dig = dig - '0';
- } else if (base == 16) {
- dig |= 0x20;
- if ('a' <= dig && dig <= 'f') {
- // a-f hex digit
- dig = dig - 'a' + 10;
+ if ('0' <= dig && dig <= '9') {
+ dig -= '0';
+ } else {
+ dig |= 0x20; // make digit lower-case
+ if ('a' <= dig && dig <= 'z') {
+ dig -= 'a' - 10;
} else {
// unknown character
break;
}
- } else {
- // unknown character
+ }
+ if (dig >= base) {
break;
}