diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-07-14 22:11:00 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-07-14 22:11:00 -0400 |
commit | 47d027ee1a44829819c345287623fe75374893ab (patch) | |
tree | 6a44b7e7c915496ea8bbefa66c91c4db5e97afa0 /src/stdlib/wcstoimax.c | |
parent | d3fd192523db544e6005051f224a2d7bafabedd9 (diff) | |
download | musl-47d027ee1a44829819c345287623fe75374893ab.tar.gz musl-47d027ee1a44829819c345287623fe75374893ab.tar.xz musl-47d027ee1a44829819c345287623fe75374893ab.zip |
fix various bugs in new integer parser framework
1. my interpretation of subject sequence definition was wrong. adjust parser to conform to the standard. 2. some code for handling tail overflow case was missing (forgot to finish writing it). 3. typo (= instead of ==) caused ERANGE to wrongly behave like EINVAL
Diffstat (limited to 'src/stdlib/wcstoimax.c')
-rw-r--r-- | src/stdlib/wcstoimax.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/stdlib/wcstoimax.c b/src/stdlib/wcstoimax.c index 50647f62..344fe3a3 100644 --- a/src/stdlib/wcstoimax.c +++ b/src/stdlib/wcstoimax.c @@ -6,6 +6,7 @@ intmax_t wcstoimax(const wchar_t *s, wchar_t **p, int base) { + const wchar_t *s1 = s; struct intparse ip = {0}; if (p) *p = (wchar_t *)s; @@ -21,11 +22,11 @@ intmax_t wcstoimax(const wchar_t *s, wchar_t **p, int base) for (; __intparse(&ip, (char[]){(*s&-(*s<128U))}, 1); s++); if (p && ip.err != EINVAL) - *p = (wchar_t *)s; + *p = (wchar_t *)s1 + ip.cnt; if (ip.err) { errno = ip.err; - if (ip.err = EINVAL) return 0; + if (ip.err == EINVAL) return 0; return ip.neg ? INTMAX_MIN : INTMAX_MAX; } |