summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/strtouq.c
diff options
context:
space:
mode:
authorderaadt <>1995-12-21 14:58:39 +0000
committerderaadt <>1995-12-21 14:58:39 +0000
commit0ec9503a81eeeb5a23e8654cc0e76fca89ab163b (patch)
tree5139e3085b6bfe3f9b0ebfb69133325f13456ead /src/lib/libc/stdlib/strtouq.c
parent0fd8d706013540776674a583d2456224f1631724 (diff)
downloadopenbsd-0ec9503a81eeeb5a23e8654cc0e76fca89ab163b.tar.gz
openbsd-0ec9503a81eeeb5a23e8654cc0e76fca89ab163b.tar.bz2
openbsd-0ec9503a81eeeb5a23e8654cc0e76fca89ab163b.zip
from netbsd; Rearrange to avoid sign problems with GCC.
Diffstat (limited to 'src/lib/libc/stdlib/strtouq.c')
-rw-r--r--src/lib/libc/stdlib/strtouq.c30
1 files changed, 15 insertions, 15 deletions
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";
37 37
38#include <sys/types.h> 38#include <sys/types.h>
39 39
40#include <limits.h>
41#include <errno.h>
42#include <ctype.h> 40#include <ctype.h>
41#include <errno.h>
42#include <limits.h>
43#include <stdlib.h> 43#include <stdlib.h>
44 44
45/* 45/*
@@ -54,10 +54,9 @@ strtouq(nptr, endptr, base)
54 char **endptr; 54 char **endptr;
55 register int base; 55 register int base;
56{ 56{
57 register const char *s = nptr; 57 register const char *s;
58 register u_quad_t acc; 58 register u_quad_t acc, cutoff;
59 register int c; 59 register int c;
60 register u_quad_t qbase, cutoff;
61 register int neg, any, cutlim; 60 register int neg, any, cutlim;
62 61
63 /* 62 /*
@@ -83,9 +82,9 @@ strtouq(nptr, endptr, base)
83 } 82 }
84 if (base == 0) 83 if (base == 0)
85 base = c == '0' ? 8 : 10; 84 base = c == '0' ? 8 : 10;
86 qbase = (unsigned)base; 85
87 cutoff = (u_quad_t)UQUAD_MAX / qbase; 86 cutoff = UQUAD_MAX / (u_quad_t)base;
88 cutlim = (u_quad_t)UQUAD_MAX % qbase; 87 cutlim = UQUAD_MAX % (u_quad_t)base;
89 for (acc = 0, any = 0;; c = *s++) { 88 for (acc = 0, any = 0;; c = *s++) {
90 if (isdigit(c)) 89 if (isdigit(c))
91 c -= '0'; 90 c -= '0';
@@ -95,18 +94,19 @@ strtouq(nptr, endptr, base)
95 break; 94 break;
96 if (c >= base) 95 if (c >= base)
97 break; 96 break;
98 if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) 97 if (any < 0)
98 continue;
99 if (acc > cutoff || acc == cutoff && c > cutlim) {
99 any = -1; 100 any = -1;
100 else { 101 acc = UQUAD_MAX;
102 errno = ERANGE;
103 } else {
101 any = 1; 104 any = 1;
102 acc *= qbase; 105 acc *= (u_quad_t)base;
103 acc += c; 106 acc += c;
104 } 107 }
105 } 108 }
106 if (any < 0) { 109 if (neg && any > 0)
107 acc = UQUAD_MAX;
108 errno = ERANGE;
109 } else if (neg)
110 acc = -acc; 110 acc = -acc;
111 if (endptr != 0) 111 if (endptr != 0)
112 *endptr = (char *) (any ? s - 1 : nptr); 112 *endptr = (char *) (any ? s - 1 : nptr);