X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fstdlib%2Fwcstoumax.c;h=af7ba3dc9fe1b8deabc5e3009663d44e8f787217;hp=86528ef15715be4952bb950ac6941594d3c84783;hb=d3fd192523db544e6005051f224a2d7bafabedd9;hpb=4095f8338d77cad73a8afbf2d4a0d7987e472bab diff --git a/src/stdlib/wcstoumax.c b/src/stdlib/wcstoumax.c index 86528ef1..af7ba3dc 100644 --- a/src/stdlib/wcstoumax.c +++ b/src/stdlib/wcstoumax.c @@ -3,46 +3,32 @@ #include #include #include +#include "intparse.h" uintmax_t wcstoumax(const wchar_t *s, wchar_t **p, int base) { - /* Large enough for largest value in binary */ - char buf[sizeof(uintmax_t)*8+2]; - int sign = 0, skipped=0; + struct intparse ip = {0}; - if (!p) p = (wchar_t **)&s; + if (p) *p = (wchar_t *)s; - if (base && (unsigned)base-2 > 36-2) { - *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++; - - /* Skip leading zeros but don't allow leading zeros before "0x". */ - for (; s[0]=='0' && s[1]=='0'; s++) skipped=1; - if (skipped && (base==0 || base==16) && (s[1]|32)=='x') { - *p = (wchar_t *)(s+1); - return 0; - } - - /* Convert to normal char string so we can use strtoumax */ - buf[0] = sign; - if (wcstombs(buf+!!sign, s, sizeof buf-1) == -1) return 0; - buf[sizeof buf-1]=0; + ip.base = base; + for (; __intparse(&ip, (char[]){(*s&-(*s<128U))}, 1); s++); - /* Compute final position */ - if (p) { - if ((base==0 || base==16) && s[0]=='0' && (s[1]|32)=='x' && iswxdigit(s[2])) s+=2; - for(;*s&&((unsigned)*s-'0'