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
v->cnt += n;
for (; n; n--, s++) switch (v->state) {
case 0:
v->cnt += n;
for (; n; n--, s++) switch (v->state) {
case 0:
v->state++;
if (*s=='+' || *s=='-') {
v->neg = *s=='-';
v->state++;
if (*s=='+' || *s=='-') {
v->neg = *s=='-';
case 2:
v->state++;
if ((!b || b==16) && (*s|32) == 'x') {
case 2:
v->state++;
if ((!b || b==16) && (*s|32) == 'x') {
v->base = b = 16;
continue;
}
v->base = b = 16;
continue;
}
case 3:
firstdigit:
if (digits[*s] >= b) {
case 3:
firstdigit:
if (digits[*s] >= b) {
- v->err = EINVAL;
- return 0;
v->state++;
case 4:
if (b==10) {
v->state++;
case 4:
if (b==10) {
if (n && digits[*s]<b) {
v->err = ERANGE;
v->val = UINTMAX_MAX;
if (n && digits[*s]<b) {
v->err = ERANGE;
v->val = UINTMAX_MAX;
+ for (; n && digits[*s]<b; n--, s++);
- for (; n && digits[*s]<b; n--, s++);
if (ip.err) {
errno = ip.err;
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;
}
return ip.neg ? INTMAX_MIN : INTMAX_MAX;
}
if (ip.err) {
errno = ip.err;
if (ip.err) {
errno = ip.err;
- if (ip.err = EINVAL) return 0;
+ if (ip.err == EINVAL) return 0;
intmax_t wcstoimax(const wchar_t *s, wchar_t **p, int base)
{
intmax_t wcstoimax(const wchar_t *s, wchar_t **p, int base)
{
struct intparse ip = {0};
if (p) *p = (wchar_t *)s;
struct intparse ip = {0};
if (p) *p = (wchar_t *)s;
for (; __intparse(&ip, (char[]){(*s&-(*s<128U))}, 1); s++);
if (p && ip.err != EINVAL)
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) {
errno = ip.err;
- if (ip.err = EINVAL) return 0;
+ if (ip.err == EINVAL) return 0;
return ip.neg ? INTMAX_MIN : INTMAX_MAX;
}
return ip.neg ? INTMAX_MIN : INTMAX_MAX;
}
uintmax_t wcstoumax(const wchar_t *s, wchar_t **p, int base)
{
uintmax_t wcstoumax(const wchar_t *s, wchar_t **p, int base)
{
struct intparse ip = {0};
if (p) *p = (wchar_t *)s;
struct intparse ip = {0};
if (p) *p = (wchar_t *)s;
for (; __intparse(&ip, (char[]){(*s&-(*s<128U))}, 1); s++);
if (p && ip.err != EINVAL)
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) {
errno = ip.err;
- if (ip.err = EINVAL) return 0;
+ if (ip.err == EINVAL) return 0;