aboutsummaryrefslogtreecommitdiff
path: root/py/parsenum.c
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 /py/parsenum.c
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).
Diffstat (limited to 'py/parsenum.c')
-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;
}