From 0ec9503a81eeeb5a23e8654cc0e76fca89ab163b Mon Sep 17 00:00:00 2001 From: deraadt <> Date: Thu, 21 Dec 1995 14:58:39 +0000 Subject: from netbsd; Rearrange to avoid sign problems with GCC. --- src/lib/libc/stdlib/strtouq.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src/lib/libc/stdlib/strtouq.c') diff --git a/src/lib/libc/stdlib/strtouq.c b/src/lib/libc/stdlib/strtouq.c index cc647d8d28..3ab2c232dd 100644 --- a/src/lib/libc/stdlib/strtouq.c +++ b/src/lib/libc/stdlib/strtouq.c @@ -37,9 +37,9 @@ static char sccsid[] = "@(#)strtouq.c 5.1 (Berkeley) 6/26/92"; #include -#include -#include #include +#include +#include #include /* @@ -54,10 +54,9 @@ strtouq(nptr, endptr, base) char **endptr; register int base; { - register const char *s = nptr; - register u_quad_t acc; + register const char *s; + register u_quad_t acc, cutoff; register int c; - register u_quad_t qbase, cutoff; register int neg, any, cutlim; /* @@ -83,9 +82,9 @@ strtouq(nptr, endptr, base) } if (base == 0) base = c == '0' ? 8 : 10; - qbase = (unsigned)base; - cutoff = (u_quad_t)UQUAD_MAX / qbase; - cutlim = (u_quad_t)UQUAD_MAX % qbase; + + cutoff = UQUAD_MAX / (u_quad_t)base; + cutlim = UQUAD_MAX % (u_quad_t)base; for (acc = 0, any = 0;; c = *s++) { if (isdigit(c)) c -= '0'; @@ -95,18 +94,19 @@ strtouq(nptr, endptr, base) break; if (c >= base) break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) + if (any < 0) + continue; + if (acc > cutoff || acc == cutoff && c > cutlim) { any = -1; - else { + acc = UQUAD_MAX; + errno = ERANGE; + } else { any = 1; - acc *= qbase; + acc *= (u_quad_t)base; acc += c; } } - if (any < 0) { - acc = UQUAD_MAX; - errno = ERANGE; - } else if (neg) + if (neg && any > 0) acc = -acc; if (endptr != 0) *endptr = (char *) (any ? s - 1 : nptr); -- cgit v1.2.3-55-g6feb