minor fixes
[ia32rtools.git] / tools / masm_tools.h
CommitLineData
e27467d0 1#include <errno.h>
2#include <stdint.h>
3
4static 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