-static unsigned long parse_number(const char *number)
+#include <errno.h>
+#include <stdint.h>
+
+static uint64_t parse_number(const char *number, int is64)
{
int len = strlen(number);
const char *p = number;
char *endp = NULL;
- unsigned long ret;
+ uint64_t ret;
int neg = 0;
int bad;
}
if (len > 1 && *p == '0')
p++;
+
+ errno = 0;
if (number[len - 1] == 'h') {
- ret = strtoul(p, &endp, 16);
+ ret = strtouq(p, &endp, 16);
bad = (*endp != 'h');
}
else {
- ret = strtoul(p, &endp, 10);
+ ret = strtouq(p, &endp, 10);
bad = (*endp != 0);
}
- if (bad)
- aerr("number parsing failed (%s)\n", number);
-#if __SIZEOF_LONG__ > 4
+ if (errno != 0 || bad)
+ aerr("number parsing failed (%s): %d\n", number, errno);
// if this happens, callers must be fixed too
- if (ret > 0xfffffffful)
+ if (!is64 && ret > 0xfffffffful)
aerr("number too large? (%s)\n", number);
-#endif
if (neg) {
- if (ret > 0x7fffffff)
+ if (!is64 && ret > 0x7fffffff)
aerr("too large negative? (%s)\n", number);
ret = -ret;
}