if (c == 'E' || c == 'e') {
int exp1 = 0;
int sign = 1;
+ int exp_overflow = 0;
switch(*s) {
case '-':
exp1 = 10 * exp1 + (c - '0');
if ((tmp = sign * exp1 + exp) > MAX_EXP ||
tmp < -MAX_EXP) {
- errno = ERANGE;
+ exp_overflow = 1;
}
} while (c = *++s, isdigit(c));
if (ss) *ss = s;
}
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;
e->exp = 63;
mbtowc(wchar_t *pwc, register const char *s, size_t n)
{
if (s == (const char *)NULL) return 0;
- if (*s == '\0') return 0;
if (n <= 0) return 0;
if (pwc) *pwc = *s;
return (*s != 0);
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 (!is_signed)
- if (sign < 0 && val != 0)
- ovfl++;
- else if (((sign < 0 && val > -LONG_MIN)
- || (sign > 0 && val > LONG_MAX)))
- ovfl++;
+ /* Overflow is only possible when converting a signed long.
+ * val is unsigned long, so -LONG_MIN is converted to
+ * unsigned long.
+ */
+ if (is_signed
+ && ( (sign < 0 && val > -LONG_MIN)
+ || (sign > 0 && val > LONG_MAX)))
+ ovfl++;
}
if (ovfl) {
else return LONG_MAX;
else return ULONG_MAX;
}
- if (is_signed) return (unsigned long) sign * val;
- else return val;
+ return (unsigned long) sign * val;
}