several bug fixes after test-suite
This commit is contained in:
parent
0bb4c0167c
commit
c8c4c6e7a9
5 changed files with 19 additions and 18 deletions
|
@ -501,6 +501,7 @@ _str_ext_cvt(char *s, char **ss, struct EXTEND *e)
|
||||||
if (c == 'E' || c == 'e') {
|
if (c == 'E' || c == 'e') {
|
||||||
int exp1 = 0;
|
int exp1 = 0;
|
||||||
int sign = 1;
|
int sign = 1;
|
||||||
|
int exp_overflow = 0;
|
||||||
|
|
||||||
switch(*s) {
|
switch(*s) {
|
||||||
case '-':
|
case '-':
|
||||||
|
@ -515,13 +516,16 @@ _str_ext_cvt(char *s, char **ss, struct EXTEND *e)
|
||||||
exp1 = 10 * exp1 + (c - '0');
|
exp1 = 10 * exp1 + (c - '0');
|
||||||
if ((tmp = sign * exp1 + exp) > MAX_EXP ||
|
if ((tmp = sign * exp1 + exp) > MAX_EXP ||
|
||||||
tmp < -MAX_EXP) {
|
tmp < -MAX_EXP) {
|
||||||
errno = ERANGE;
|
exp_overflow = 1;
|
||||||
}
|
}
|
||||||
} while (c = *++s, isdigit(c));
|
} while (c = *++s, isdigit(c));
|
||||||
if (ss) *ss = s;
|
if (ss) *ss = s;
|
||||||
}
|
}
|
||||||
exp += sign * exp1;
|
exp += sign * exp1;
|
||||||
if (errno == ERANGE) exp = sign * MAX_EXP;
|
if (exp_overflow) {
|
||||||
|
exp = sign * MAX_EXP;
|
||||||
|
if (e->m1 != 0 || e->m2 != 0) errno = ERANGE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (e->m1 == 0 && e->m2 == 0) return;
|
if (e->m1 == 0 && e->m2 == 0) return;
|
||||||
e->exp = 63;
|
e->exp = 63;
|
||||||
|
|
|
@ -11,7 +11,6 @@ int
|
||||||
mbtowc(wchar_t *pwc, register const char *s, size_t n)
|
mbtowc(wchar_t *pwc, register const char *s, size_t n)
|
||||||
{
|
{
|
||||||
if (s == (const char *)NULL) return 0;
|
if (s == (const char *)NULL) return 0;
|
||||||
if (*s == '\0') return 0;
|
|
||||||
if (n <= 0) return 0;
|
if (n <= 0) return 0;
|
||||||
if (pwc) *pwc = *s;
|
if (pwc) *pwc = *s;
|
||||||
return (*s != 0);
|
return (*s != 0);
|
||||||
|
|
|
@ -74,14 +74,13 @@ string2long(register const char *nptr, char ** const endptr,
|
||||||
else *endptr = (char *)nptr;
|
else *endptr = (char *)nptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can't represent a negative unsigned long, nor a long that
|
|
||||||
* is smaller than LONG_MIN or larger than LONG_MAX.
|
|
||||||
*/
|
|
||||||
if (!ovfl) {
|
if (!ovfl) {
|
||||||
if (!is_signed)
|
/* Overflow is only possible when converting a signed long.
|
||||||
if (sign < 0 && val != 0)
|
* val is unsigned long, so -LONG_MIN is converted to
|
||||||
ovfl++;
|
* unsigned long.
|
||||||
else if (((sign < 0 && val > -LONG_MIN)
|
*/
|
||||||
|
if (is_signed
|
||||||
|
&& ( (sign < 0 && val > -LONG_MIN)
|
||||||
|| (sign > 0 && val > LONG_MAX)))
|
|| (sign > 0 && val > LONG_MAX)))
|
||||||
ovfl++;
|
ovfl++;
|
||||||
}
|
}
|
||||||
|
@ -93,6 +92,5 @@ string2long(register const char *nptr, char ** const endptr,
|
||||||
else return LONG_MAX;
|
else return LONG_MAX;
|
||||||
else return ULONG_MAX;
|
else return ULONG_MAX;
|
||||||
}
|
}
|
||||||
if (is_signed) return (unsigned long) sign * val;
|
return (unsigned long) sign * val;
|
||||||
else return val;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,8 @@ wcstombs(register char *s, register const wchar_t *pwcs, size_t n)
|
||||||
register int i = n;
|
register int i = n;
|
||||||
|
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
if (!(*s++ = *pwcs))
|
if (!(*s++ = *pwcs++))
|
||||||
return n - i - 1;
|
break;
|
||||||
}
|
}
|
||||||
return n - i;
|
return n - i - 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,5 +13,5 @@ wctomb(char *s, wchar_t wchar)
|
||||||
if (!s) return 0; /* no state dependent codings */
|
if (!s) return 0; /* no state dependent codings */
|
||||||
|
|
||||||
*s = wchar;
|
*s = wchar;
|
||||||
return (wchar != 0);
|
return (*s != '\0');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue