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