e27467d0 |
1 | #include <errno.h> |
2 | #include <stdint.h> |
3 | |
4 | static uint64_t parse_number(const char *number, int is64) |
054f95b2 |
5 | { |
6 | int len = strlen(number); |
7 | const char *p = number; |
8 | char *endp = NULL; |
e27467d0 |
9 | uint64_t ret; |
054f95b2 |
10 | int neg = 0; |
11 | int bad; |
12 | |
13 | if (*p == '-') { |
14 | neg = 1; |
15 | p++; |
16 | } |
17 | if (len > 1 && *p == '0') |
18 | p++; |
e27467d0 |
19 | |
20 | errno = 0; |
054f95b2 |
21 | if (number[len - 1] == 'h') { |
e27467d0 |
22 | ret = strtouq(p, &endp, 16); |
054f95b2 |
23 | bad = (*endp != 'h'); |
24 | } |
25 | else { |
e27467d0 |
26 | ret = strtouq(p, &endp, 10); |
054f95b2 |
27 | bad = (*endp != 0); |
28 | } |
e27467d0 |
29 | if (errno != 0 || bad) |
30 | aerr("number parsing failed (%s): %d\n", number, errno); |
421216a1 |
31 | // if this happens, callers must be fixed too |
e27467d0 |
32 | if (!is64 && ret > 0xfffffffful) |
421216a1 |
33 | aerr("number too large? (%s)\n", number); |
421216a1 |
34 | if (neg) { |
e27467d0 |
35 | if (!is64 && ret > 0x7fffffff) |
421216a1 |
36 | aerr("too large negative? (%s)\n", number); |
054f95b2 |
37 | ret = -ret; |
421216a1 |
38 | } |
054f95b2 |
39 | return ret; |
40 | } |
41 | |