cee4d62de69a3a509a71f9e87ff69825685c3943
[ia32rtools.git] / tools / masm_tools.h
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);
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);
34     ret = -ret;
35   }
36   return ret;
37 }
38