X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdlib%2Fwcstoumax.c;h=cee5ff7f5c42410d911165bdd1e9fbb529efb952;hb=8c6fc860a97f79146bf5c092d5cfb90fa6d9355a;hp=456ddedddfb805bb841bfa9220fc4a9b1f93f4bd;hpb=c247ebdd989365d20da3ce41fdeb2002e0a1ba13;p=musl diff --git a/src/stdlib/wcstoumax.c b/src/stdlib/wcstoumax.c index 456ddedd..cee5ff7f 100644 --- a/src/stdlib/wcstoumax.c +++ b/src/stdlib/wcstoumax.c @@ -3,46 +3,33 @@ #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; + const wchar_t *s1 = s; + 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++; + ip.base = base; + for (; __intparse(&ip, (char[]){(*s&-(*s<128U))}, 1); 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) < 0) return 0; - buf[sizeof buf-1]=0; + if (p && ip.err != EINVAL) + *p = (wchar_t *)s1 + ip.cnt; - /* 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'