aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/stdlib/strtouq.c
diff options
context:
space:
mode:
authorDavid E. O'Brien <obrien@FreeBSD.org>2001-02-27 13:33:07 +0000
committerDavid E. O'Brien <obrien@FreeBSD.org>2001-02-27 13:33:07 +0000
commit4c0440cb8652801c1c3750a474f7ddbb17897cdf (patch)
treeeb116378d50e15fc35d1602c0784e9b8bd920e36 /lib/libc/stdlib/strtouq.c
parent1b0dabf0c01e7ada145b752392609ed5438971df (diff)
downloadsrc-4c0440cb8652801c1c3750a474f7ddbb17897cdf.tar.gz
src-4c0440cb8652801c1c3750a474f7ddbb17897cdf.zip
Impliment the ISO-C99 strto[u]ll()
and rewrite strto[u]q() in terms of it.
Notes
Notes: svn path=/head/; revision=73152
Diffstat (limited to 'lib/libc/stdlib/strtouq.c')
-rw-r--r--lib/libc/stdlib/strtouq.c69
1 files changed, 6 insertions, 63 deletions
diff --git a/lib/libc/stdlib/strtouq.c b/lib/libc/stdlib/strtouq.c
index 7656a3c53b14..6005e5bf2d2f 100644
--- a/lib/libc/stdlib/strtouq.c
+++ b/lib/libc/stdlib/strtouq.c
@@ -35,11 +35,11 @@
static char sccsid[] = "@(#)strtouq.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
-#include <sys/types.h>
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif
-#include <limits.h>
-#include <errno.h>
-#include <ctype.h>
#include <stdlib.h>
/*
@@ -52,65 +52,8 @@ u_quad_t
strtouq(nptr, endptr, base)
const char *nptr;
char **endptr;
- register int base;
+ int base;
{
- register const char *s = nptr;
- register u_quad_t acc;
- register unsigned char c;
- register u_quad_t qbase, cutoff;
- register int neg, any, cutlim;
- /*
- * See strtoq for comments as to the logic used.
- */
- s = nptr;
- do {
- c = *s++;
- } while (isspace(c));
- if (c == '-') {
- neg = 1;
- c = *s++;
- } else {
- neg = 0;
- if (c == '+')
- c = *s++;
- }
- if ((base == 0 || base == 16) &&
- c == '0' && (*s == 'x' || *s == 'X')) {
- c = s[1];
- s += 2;
- base = 16;
- }
- 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;
- for (acc = 0, any = 0;; c = *s++) {
- if (!isascii(c))
- break;
- if (isdigit(c))
- c -= '0';
- else if (isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
- else
- break;
- if (c >= base)
- break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
- any = -1;
- else {
- any = 1;
- acc *= qbase;
- acc += c;
- }
- }
- if (any < 0) {
- acc = UQUAD_MAX;
- errno = ERANGE;
- } else if (neg)
- acc = -acc;
- if (endptr != 0)
- *endptr = (char *)(any ? s - 1 : nptr);
- return (acc);
+ return strtoull(nptr, endptr, base);
}