more 32bit fixes
[ia32rtools.git] / tools / masm_tools.h
index cee4d62..453a038 100644 (file)
@@ -1,9 +1,12 @@
-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;
 
@@ -13,23 +16,23 @@ static unsigned long parse_number(const char *number)
   }
   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;
   }