more 32bit fixes
authornotaz <notasas@gmail.com>
Fri, 18 Sep 2015 18:48:23 +0000 (21:48 +0300)
committernotaz <notasas@gmail.com>
Fri, 18 Sep 2015 18:48:23 +0000 (21:48 +0300)
need 64bit numbers after all

tools/cvt_data.c
tools/masm_tools.h
tools/translate.c

index 09e7ebc..c71c2f8 100644 (file)
@@ -10,6 +10,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
+#include <inttypes.h>
 
 #include "my_assert.h"
 #include "my_str.h"
@@ -388,6 +390,7 @@ int main(int argc, char *argv[])
   char last_sym[32];
   unsigned long val;
   unsigned long cnt;
+  uint64_t val64;
   const char *sym;
   enum dx_type type;
   char **pub_syms;
@@ -562,7 +565,7 @@ int main(int argc, char *argv[])
         if (header_mode)
           continue;
 
-        val = parse_number(words[1]);
+        val = parse_number(words[1], 0);
         fprintf(fout, "\t\t  .align %d", align_value(val));
         goto fin;
       }
@@ -690,7 +693,7 @@ int main(int argc, char *argv[])
             fprintf(fout, "%s", escape_string(word));
           }
           else {
-            val = parse_number(words[w]);
+            val = parse_number(words[w], 0);
             if (val & ~0xff)
               aerr("bad string trailing byte?\n");
             // unfortunately \xHH is unusable - gas interprets
@@ -704,7 +707,7 @@ int main(int argc, char *argv[])
 
       if (w == wordc - 2) {
         if (IS_START(words[w + 1], "dup(")) {
-          cnt = parse_number(words[w]);
+          cnt = parse_number(words[w], 0);
           p = words[w + 1] + 4;
           p2 = strchr(p, ')');
           if (p2 == NULL)
@@ -714,7 +717,7 @@ int main(int argc, char *argv[])
 
           val = 0;
           if (!IS(word, "?"))
-            val = parse_number(word);
+            val = parse_number(word, 0);
 
           fprintf(fout, ".fill 0x%02lx,%d,0x%02lx",
             cnt, type_size(type), val);
@@ -800,11 +803,11 @@ int main(int argc, char *argv[])
           }
         }
         else {
-          val = parse_number(words[w]);
-          if (val < 10)
-            fprintf(fout, "%ld", val);
+          val64 = parse_number(words[w], 1);
+          if (val64 < 10)
+            fprintf(fout, "%d", (int)val64);
           else
-            fprintf(fout, "0x%lx", val);
+            fprintf(fout, "0x%" PRIx64, val64);
         }
 
         first = 0;
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;
   }
index e8b1ba9..324bc26 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
 #include "my_assert.h"
 #include "my_str.h"
@@ -491,7 +492,7 @@ static int parse_indmode(char *name, int *regmask, int need_c_cvt)
     }
 
     if ('0' <= w[0] && w[0] <= '9') {
-      number = parse_number(w);
+      number = parse_number(w, 0);
       printf_number(d, sizeof(cvtbuf) - (d - cvtbuf), number);
       continue;
     }
@@ -587,8 +588,9 @@ static const char *parse_stack_el(const char *name, char *extra_reg,
     if (len < sizeof(buf) - 1) {
       strncpy(buf, s, len);
       buf[len] = 0;
+      errno = 0;
       val = strtol(buf, &endp, 16);
-      if (val == 0 || *endp != 0) {
+      if (val == 0 || *endp != 0 || errno != 0) {
         aerr("%s num parse fail for '%s'\n", __func__, buf);
         return NULL;
       }
@@ -874,7 +876,7 @@ static int parse_operand(struct parsed_opr *opr,
   else if (('0' <= words[w][0] && words[w][0] <= '9')
     || words[w][0] == '-')
   {
-    number = parse_number(words[w]);
+    number = parse_number(words[w], 0);
     opr->type = OPT_CONST;
     opr->val = number;
     printf_number(opr->name, sizeof(opr->name), number);
@@ -1750,8 +1752,9 @@ static struct parsed_equ *equ_find(struct parsed_op *po, const char *name,
     if (namelen <= 0)
       ferr(po, "equ parse failed for '%s'\n", name);
 
+    errno = 0;
     *extra_offs = strtol(p, &endp, 16);
-    if (*endp != 0)
+    if (*endp != 0 || errno != 0)
       ferr(po, "equ parse failed for '%s'\n", name);
   }
 
@@ -1795,10 +1798,11 @@ static void parse_stack_access(struct parsed_op *po,
     p = name + 4;
     if (IS_START(p, "0x"))
       p += 2;
+    errno = 0;
     offset = strtoul(p, &endp, 16);
     if (name[3] == '-')
       offset = -offset;
-    if (*endp != 0)
+    if (*endp != 0 || errno != 0)
       ferr(po, "ebp- parse of '%s' failed\n", name);
   }
   else {
@@ -1843,8 +1847,9 @@ static int parse_stack_esp_offset(struct parsed_op *po,
     // just plain offset?
     if (!IS_START(name, "esp+"))
       return -1;
+    errno = 0;
     offset = strtol(name + 4, &endp, 0);
-    if (endp == NULL || *endp != 0)
+    if (endp == NULL || *endp != 0 || errno != 0)
       return -1;
     *offset_out = offset;
     return 0;
@@ -8991,7 +8996,7 @@ do_pending_endp:
           if (pd->type == OPT_OFFSET)
             pd->d[pd->count].u.label = strdup(words[i]);
           else
-            pd->d[pd->count].u.val = parse_number(words[i]);
+            pd->d[pd->count].u.val = parse_number(words[i], 0);
           pd->d[pd->count].bt_i = -1;
           pd->count++;
         }
@@ -9170,7 +9175,7 @@ do_pending_endp:
       else
         aerr("bad lmod: '%s'\n", words[2]);
 
-      g_eqs[g_eqcnt].offset = parse_number(words[4]);
+      g_eqs[g_eqcnt].offset = parse_number(words[4], 0);
       g_eqcnt++;
       continue;
     }