string2long(register const char *nptr, char ** const endptr,
int base, int is_signed)
{
- register int v;
+ register unsigned int v;
register unsigned long val = 0;
register int c;
int ovfl = 0, sign = 1;
else
v = c - '0';
if (v >= base) break;
- if (val > (ULONG_MAX - v) / base) ovfl++;
- val = (val * base) + v;
+ if (val > (ULONG_MAX - v) / base) ++ovfl;
+ else val = (val * base) + v;
}
nptr++;
}
if (!ovfl) {
/* Overflow is only possible when converting a signed long.
- * val is unsigned long, so -LONG_MIN is converted to
- * unsigned long.
+ * The "-(LONG_MIN+1)+(unsigned long) 1" construction is there
+ * to prevent overflow warnings on -LONG_MIN.
*/
if (is_signed
&& ( (sign < 0 && val > -(LONG_MIN+1)+(unsigned long) 1)
else return LONG_MAX;
else return ULONG_MAX;
}
- return (long) sign * val;
+ return (sign * val);
}