summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2001-11-28 00:48:11 +0000
committerache <ache@FreeBSD.org>2001-11-28 00:48:11 +0000
commit950bfdf509d69b5c71a77c19ecb6ea5be2336016 (patch)
tree39609fa880161cf047c27ac96bdf1f70f43a0e14 /lib
parentc5c274cf2c1c3f51f2c5da3acf04d8098f3e2784 (diff)
downloadFreeBSD-src-950bfdf509d69b5c71a77c19ecb6ea5be2336016.zip
FreeBSD-src-950bfdf509d69b5c71a77c19ecb6ea5be2336016.tar.gz
Understand national (non-ASCII) digits now
Allow bases >=36 again Misc cleanup
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdlib/strtol.c24
-rw-r--r--lib/libc/stdlib/strtoll.c24
-rw-r--r--lib/libc/stdlib/strtoq.c3
-rw-r--r--lib/libc/stdlib/strtoul.c22
-rw-r--r--lib/libc/stdlib/strtoull.c22
-rw-r--r--lib/libc/stdlib/strtouq.c3
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)
OpenPOWER on IntegriCloud