diff options
author | ache <ache@FreeBSD.org> | 2001-11-28 00:48:11 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2001-11-28 00:48:11 +0000 |
commit | 950bfdf509d69b5c71a77c19ecb6ea5be2336016 (patch) | |
tree | 39609fa880161cf047c27ac96bdf1f70f43a0e14 /lib/libc/stdlib | |
parent | c5c274cf2c1c3f51f2c5da3acf04d8098f3e2784 (diff) | |
download | FreeBSD-src-950bfdf509d69b5c71a77c19ecb6ea5be2336016.zip FreeBSD-src-950bfdf509d69b5c71a77c19ecb6ea5be2336016.tar.gz |
Understand national (non-ASCII) digits now
Allow bases >=36 again
Misc cleanup
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r-- | lib/libc/stdlib/strtol.c | 24 | ||||
-rw-r--r-- | lib/libc/stdlib/strtoll.c | 24 | ||||
-rw-r--r-- | lib/libc/stdlib/strtoq.c | 3 | ||||
-rw-r--r-- | lib/libc/stdlib/strtoul.c | 22 | ||||
-rw-r--r-- | lib/libc/stdlib/strtoull.c | 22 | ||||
-rw-r--r-- | lib/libc/stdlib/strtouq.c | 3 |
6 files changed, 42 insertions, 56 deletions
diff --git a/lib/libc/stdlib/strtol.c b/lib/libc/stdlib/strtol.c index 3bb13e1..10d7425c 100644 --- a/lib/libc/stdlib/strtol.c +++ b/lib/libc/stdlib/strtol.c @@ -53,13 +53,13 @@ long strtol(nptr, endptr, base) const char *nptr; char **endptr; - register int base; + int base; { - register const char *s; - register unsigned long acc; - register unsigned char c; - register unsigned long cutoff; - register int neg, any, cutlim; + const char *s; + unsigned long acc; + unsigned char c; + unsigned long cutoff; + int neg, any, cutlim; /* * Skip white space and pick up leading +/- sign if any. @@ -87,7 +87,7 @@ strtol(nptr, endptr, base) if (base == 0) base = c == '0' ? 8 : 10; acc = any = 0; - if (base < 2 || base > 36) + if (base < 2) goto noconv; /* @@ -107,16 +107,14 @@ strtol(nptr, endptr, base) * Set 'any' if any `digits' consumed; make it negative to indicate * overflow. */ - cutoff = neg ? -(LONG_MIN + LONG_MAX) + (unsigned long)LONG_MAX + cutoff = neg ? (unsigned long)-(LONG_MIN + LONG_MAX) + LONG_MAX : LONG_MAX; cutlim = cutoff % base; cutoff /= base; for ( ; ; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) + if (isxdigit(c)) + c = digittoint(c); + else if (isascii(c) && isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; diff --git a/lib/libc/stdlib/strtoll.c b/lib/libc/stdlib/strtoll.c index 0ce3909..5d656c1 100644 --- a/lib/libc/stdlib/strtoll.c +++ b/lib/libc/stdlib/strtoll.c @@ -52,13 +52,13 @@ long long strtoll(nptr, endptr, base) const char *nptr; char **endptr; - register int base; + int base; { - register const char *s; - register unsigned long long acc; - register unsigned char c; - register unsigned long long cutoff; - register int neg, any, cutlim; + const char *s; + unsigned long long acc; + unsigned char c; + unsigned long long cutoff; + int neg, any, cutlim; /* * Skip white space and pick up leading +/- sign if any. @@ -86,7 +86,7 @@ strtoll(nptr, endptr, base) if (base == 0) base = c == '0' ? 8 : 10; acc = any = 0; - if (base < 2 || base > 36) + if (base < 2) goto noconv; /* @@ -107,16 +107,14 @@ strtoll(nptr, endptr, base) * Set 'any' if any `digits' consumed; make it negative to indicate * overflow. */ - cutoff = neg ? -(LLONG_MIN + LLONG_MAX) + (unsigned long long)LLONG_MAX + cutoff = neg ? (unsigned long long)-(LLONG_MIN + LLONG_MAX) + LLONG_MAX : LLONG_MAX; cutlim = cutoff % base; cutoff /= base; for ( ; ; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) + if (isxdigit(c)) + c = digittoint(c); + else if (isascii(c) && isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; diff --git a/lib/libc/stdlib/strtoq.c b/lib/libc/stdlib/strtoq.c index 853ef43..10b674b 100644 --- a/lib/libc/stdlib/strtoq.c +++ b/lib/libc/stdlib/strtoq.c @@ -43,9 +43,6 @@ static char sccsid[] = "@(#)strtoq.c 8.1 (Berkeley) 6/4/93"; /* * Convert a string to a quad integer. - * - * Assumes that the upper and lower case - * alphabets and digits are each contiguous. */ quad_t strtoq(nptr, endptr, base) diff --git a/lib/libc/stdlib/strtoul.c b/lib/libc/stdlib/strtoul.c index 1f23368..e952663 100644 --- a/lib/libc/stdlib/strtoul.c +++ b/lib/libc/stdlib/strtoul.c @@ -52,13 +52,13 @@ unsigned long strtoul(nptr, endptr, base) const char *nptr; char **endptr; - register int base; + int base; { - register const char *s; - register unsigned long acc; - register unsigned char c; - register unsigned long cutoff; - register int neg, any, cutlim; + const char *s; + unsigned long acc; + unsigned char c; + unsigned long cutoff; + int neg, any, cutlim; /* * See strtol for comments as to the logic used. @@ -84,17 +84,15 @@ strtoul(nptr, endptr, base) if (base == 0) base = c == '0' ? 8 : 10; acc = any = 0; - if (base < 2 || base > 36) + if (base < 2) goto noconv; cutoff = ULONG_MAX / base; cutlim = ULONG_MAX % base; for ( ; ; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) + if (isxdigit(c)) + c = digittoint(c); + else if (isascii(c) && isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; diff --git a/lib/libc/stdlib/strtoull.c b/lib/libc/stdlib/strtoull.c index e3db68c..15a0972 100644 --- a/lib/libc/stdlib/strtoull.c +++ b/lib/libc/stdlib/strtoull.c @@ -52,13 +52,13 @@ unsigned long long strtoull(nptr, endptr, base) const char *nptr; char **endptr; - register int base; + int base; { - register const char *s; - register unsigned long long acc; - register unsigned char c; - register unsigned long long cutoff; - register int neg, any, cutlim; + const char *s; + unsigned long long acc; + unsigned char c; + unsigned long long cutoff; + int neg, any, cutlim; /* * See strtoq for comments as to the logic used. @@ -84,17 +84,15 @@ strtoull(nptr, endptr, base) if (base == 0) base = c == '0' ? 8 : 10; acc = any = 0; - if (base < 2 || base > 36) + if (base < 2) goto noconv; cutoff = ULLONG_MAX / base; cutlim = ULLONG_MAX % base; for ( ; ; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) + if (isxdigit(c)) + c = digittoint(c); + else if (isascii(c) && isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; diff --git a/lib/libc/stdlib/strtouq.c b/lib/libc/stdlib/strtouq.c index 1b59c4a..d5e992a 100644 --- a/lib/libc/stdlib/strtouq.c +++ b/lib/libc/stdlib/strtouq.c @@ -43,9 +43,6 @@ static char sccsid[] = "@(#)strtouq.c 8.1 (Berkeley) 6/4/93"; /* * Convert a string to an unsigned quad integer. - * - * Assumes that the upper and lower case - * alphabets and digits are each contiguous. */ u_quad_t strtouq(nptr, endptr, base) |