X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fstdlib%2Fwcstoimax.c;h=344fe3a3232e939eacdce33a4abb7db018f216a8;hp=59894f60fe00b0699801397371c5976fa3ee760b;hb=47d027ee1a44829819c345287623fe75374893ab;hpb=c247ebdd989365d20da3ce41fdeb2002e0a1ba13 diff --git a/src/stdlib/wcstoimax.c b/src/stdlib/wcstoimax.c index 59894f60..344fe3a3 100644 --- a/src/stdlib/wcstoimax.c +++ b/src/stdlib/wcstoimax.c @@ -2,24 +2,38 @@ #include #include #include +#include "intparse.h" intmax_t wcstoimax(const wchar_t *s, wchar_t **p, int base) { - int sign = 0; - uintmax_t x; + const wchar_t *s1 = s; + struct intparse ip = {0}; + + if (p) *p = (wchar_t *)s; + + if (base && base-2U > 34) { + errno = EINVAL; + return 0; + } - /* Initial whitespace */ for (; iswspace(*s); s++); - /* Optional sign */ - if (*s == '-') sign = *s++; - else if (*s == '+') s++; + ip.base = base; + for (; __intparse(&ip, (char[]){(*s&-(*s<128U))}, 1); s++); + + if (p && ip.err != EINVAL) + *p = (wchar_t *)s1 + ip.cnt; + + if (ip.err) { + errno = ip.err; + if (ip.err == EINVAL) return 0; + return ip.neg ? INTMAX_MIN : INTMAX_MAX; + } - x = wcstoumax(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; }