X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fstdlib%2Fstrtoimax.c;h=671aa287d68dcf345ce2ec5af1f8785384ebc8ed;hb=c5ec5b2ce93bd87eb3dbf966d8bf279089f8a35d;hp=aeb0397f9ef944c0a0204da44f2853e7104567a3;hpb=c247ebdd989365d20da3ce41fdeb2002e0a1ba13;p=musl diff --git a/src/stdlib/strtoimax.c b/src/stdlib/strtoimax.c index aeb0397f..671aa287 100644 --- a/src/stdlib/strtoimax.c +++ b/src/stdlib/strtoimax.c @@ -1,25 +1,38 @@ #include #include #include +#include "intparse.h" intmax_t strtoimax(const char *s1, char **p, int base) { - const unsigned char *s = (const void *)s1; - int sign = 0; - uintmax_t x; + const unsigned char *s = (void *)s1; + struct intparse ip = {0}; + + if (p) *p = (char *)s1; + + if (base && base-2U > 34) { + errno = EINVAL; + return 0; + } - /* Initial whitespace */ for (; isspace(*s); s++); - /* Optional sign */ - if (*s == '-') sign = *s++; - else if (*s == '+') s++; + ip.base = base; + __intparse(&ip, s, SIZE_MAX); + + if (p && ip.err != EINVAL) + *p = (char *)s + ip.cnt; + + if (ip.err) { + errno = ip.err; + if (ip.err == EINVAL) return 0; + return ip.neg ? INTMAX_MIN : INTMAX_MAX; + } - x = strtoumax((const void *)s, p, base); - if (x > INTMAX_MAX) { - if (!sign || -x != INTMAX_MIN) + if (ip.val > INTMAX_MAX) { + if (!ip.neg || -ip.val != INTMAX_MIN) errno = ERANGE; - return sign ? INTMAX_MIN : INTMAX_MAX; + return ip.neg ? INTMAX_MIN : INTMAX_MAX; } - return sign ? -x : x; + return ip.neg ? -ip.val : ip.val; }