X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tools%2Fmasm_tools.h;h=453a038468230d718f3207cf80a441399d4fc459;hb=HEAD;hp=717001ffd964c6dea51974d511031a8d2d4a7eae;hpb=054f95b2d6d035e4ea49601072f5b3d3d162a491;p=ia32rtools.git diff --git a/tools/masm_tools.h b/tools/masm_tools.h index 717001f..453a038 100644 --- a/tools/masm_tools.h +++ b/tools/masm_tools.h @@ -1,13 +1,12 @@ -#if __SIZEOF_LONG__ != 8 -#error fix ret/strtoul to do 64bit -#endif +#include +#include -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; } -