minor fixes
[ia32rtools.git] / tools / masm_tools.h
index 717001f..453a038 100644 (file)
@@ -1,13 +1,12 @@
-#if __SIZEOF_LONG__ != 8
-#error fix ret/strtoul to do 64bit
-#endif
+#include <errno.h>
+#include <stdint.h>
 
-static unsigned long parse_number(const char *number)
+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;
 
@@ -17,19 +16,26 @@ 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 (neg)
+  if (errno != 0 || bad)
+    aerr("number parsing failed (%s): %d\n", number, errno);
+  // if this happens, callers must be fixed too
+  if (!is64 && ret > 0xfffffffful)
+    aerr("number too large? (%s)\n", number);
+  if (neg) {
+    if (!is64 && ret > 0x7fffffff)
+      aerr("too large negative? (%s)\n", number);
     ret = -ret;
+  }
   return ret;
 }
 
-