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