X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/62fa1dac8cf3098d212c0e8f4b3cc2cadaddd4c5..d546887cd6d807f258fc4fb2f47a655310e356ba:/t/testlib.c diff --git a/t/testlib.c b/t/testlib.c index 5c76bb4..41ea1fc 100644 --- a/t/testlib.c +++ b/t/testlib.c @@ -19,12 +19,14 @@ #include #include #include +#include #include #include #include #include "help.h" #include "test.h" +#include "intconv.h" void *realloc_nofail(void *ptr, size_t size) { @@ -44,15 +46,36 @@ void *malloc_nofail(size_t size) return realloc_nofail(NULL, size); } -bool strict_strtoul(unsigned long *val, const char *str, int base) +static unsigned intconv_base(const char **str) { - char *end; + if ((*str)[0] == '0') { + if ((*str)[1] == 'X' || (*str)[1] == 'x') { + *str += 2; + return INTCONV_HEXADECIMAL; + } - errno = 0; - *val = strtoul(str, &end, base); - if (errno != 0 || *end != 0) - return false; + return INTCONV_OCTAL; + } + + return INTCONV_DECIMAL; +} + +bool test_strtoumax(uintmax_t *out, const char *s, uintmax_t limit) +{ + static const char idx[] = "0123456789abcdef0123456789ABCDEF"; + unsigned base = intconv_base(&s); + uintmax_t v; + char *c, d; + + for (v = 0; (d = *s++);) { + if (!(c = strchr(idx, d)) || (d = (c-idx) & 0xf) >= base) + return 0; + + if (!intconv_shift(&v, base, d) || v > limit) + return 0; + } + *out = v; return true; }