summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2001-12-02 09:15:54 +0000
committerache <ache@FreeBSD.org>2001-12-02 09:15:54 +0000
commit0d916b164851ca6a8393c4d1b379883bafaf854f (patch)
tree01d842dd70781a93a969d31415ffff3267002efa /lib
parentf2aa6ac13fd55dd1b12a2a9b7a7eb09856f0e5fd (diff)
downloadFreeBSD-src-0d916b164851ca6a8393c4d1b379883bafaf854f.zip
FreeBSD-src-0d916b164851ca6a8393c4d1b379883bafaf854f.tar.gz
Make it works for non ASCII compatible encodings too.
The only assumption left is that 'A'..'Z' 'a'..'z' both are contiguous
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdlib/strtoimax.c14
-rw-r--r--lib/libc/stdlib/strtol.c14
-rw-r--r--lib/libc/stdlib/strtoll.c14
-rw-r--r--lib/libc/stdlib/strtoul.c14
-rw-r--r--lib/libc/stdlib/strtoull.c14
-rw-r--r--lib/libc/stdlib/strtoumax.c14
6 files changed, 42 insertions, 42 deletions
diff --git a/lib/libc/stdlib/strtoimax.c b/lib/libc/stdlib/strtoimax.c
index f8ff09b..958e72a 100644
--- a/lib/libc/stdlib/strtoimax.c
+++ b/lib/libc/stdlib/strtoimax.c
@@ -58,7 +58,7 @@ strtoimax(nptr, endptr, base)
uintmax_t acc;
unsigned char c;
uintmax_t cutoff;
- int neg, any, cutlim;
+ int neg, any, cutlim, n;
/*
* Skip white space and pick up leading +/- sign if any.
@@ -113,19 +113,19 @@ strtoimax(nptr, endptr, base)
cutoff /= base;
for ( ; ; c = *s++) {
if (isxdigit(c))
- c = digittoint(c);
- else if (isascii(c) && isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ n = digittoint(c);
+ else if (isalpha(c))
+ n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10);
else
break;
- if (c >= base)
+ if (n < 0 || n >= base)
break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim))
any = -1;
else {
any = 1;
acc *= base;
- acc += c;
+ acc += n;
}
}
if (any < 0) {
diff --git a/lib/libc/stdlib/strtol.c b/lib/libc/stdlib/strtol.c
index 3d19693..449f3c5 100644
--- a/lib/libc/stdlib/strtol.c
+++ b/lib/libc/stdlib/strtol.c
@@ -59,7 +59,7 @@ strtol(nptr, endptr, base)
unsigned long acc;
unsigned char c;
unsigned long cutoff;
- int neg, any, cutlim;
+ int neg, any, cutlim, n;
/*
* Skip white space and pick up leading +/- sign if any.
@@ -113,19 +113,19 @@ strtol(nptr, endptr, base)
cutoff /= base;
for ( ; ; c = *s++) {
if (isxdigit(c))
- c = digittoint(c);
- else if (isascii(c) && isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ n = digittoint(c);
+ else if (isalpha(c))
+ n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10);
else
break;
- if (c >= base)
+ if (n < 0 || n >= base)
break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim))
any = -1;
else {
any = 1;
acc *= base;
- acc += c;
+ acc += n;
}
}
if (any < 0) {
diff --git a/lib/libc/stdlib/strtoll.c b/lib/libc/stdlib/strtoll.c
index 1fd7d9c..75131fa 100644
--- a/lib/libc/stdlib/strtoll.c
+++ b/lib/libc/stdlib/strtoll.c
@@ -58,7 +58,7 @@ strtoll(nptr, endptr, base)
unsigned long long acc;
unsigned char c;
unsigned long long cutoff;
- int neg, any, cutlim;
+ int neg, any, cutlim, n;
/*
* Skip white space and pick up leading +/- sign if any.
@@ -113,19 +113,19 @@ strtoll(nptr, endptr, base)
cutoff /= base;
for ( ; ; c = *s++) {
if (isxdigit(c))
- c = digittoint(c);
- else if (isascii(c) && isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ n = digittoint(c);
+ else if (isalpha(c))
+ n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10);
else
break;
- if (c >= base)
+ if (n < 0 || n >= base)
break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim))
any = -1;
else {
any = 1;
acc *= base;
- acc += c;
+ acc += n;
}
}
if (any < 0) {
diff --git a/lib/libc/stdlib/strtoul.c b/lib/libc/stdlib/strtoul.c
index e431dc8..1fd800a 100644
--- a/lib/libc/stdlib/strtoul.c
+++ b/lib/libc/stdlib/strtoul.c
@@ -58,7 +58,7 @@ strtoul(nptr, endptr, base)
unsigned long acc;
unsigned char c;
unsigned long cutoff;
- int neg, any, cutlim;
+ int neg, any, cutlim, n;
/*
* See strtol for comments as to the logic used.
@@ -91,19 +91,19 @@ strtoul(nptr, endptr, base)
cutlim = ULONG_MAX % base;
for ( ; ; c = *s++) {
if (isxdigit(c))
- c = digittoint(c);
- else if (isascii(c) && isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ n = digittoint(c);
+ else if (isalpha(c))
+ n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10);
else
break;
- if (c >= base)
+ if (n < 0 || n >= base)
break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim))
any = -1;
else {
any = 1;
acc *= base;
- acc += c;
+ acc += n;
}
}
if (any < 0) {
diff --git a/lib/libc/stdlib/strtoull.c b/lib/libc/stdlib/strtoull.c
index adb6556..d9e3e4f 100644
--- a/lib/libc/stdlib/strtoull.c
+++ b/lib/libc/stdlib/strtoull.c
@@ -58,7 +58,7 @@ strtoull(nptr, endptr, base)
unsigned long long acc;
unsigned char c;
unsigned long long cutoff;
- int neg, any, cutlim;
+ int neg, any, cutlim, n;
/*
* See strtoq for comments as to the logic used.
@@ -91,19 +91,19 @@ strtoull(nptr, endptr, base)
cutlim = ULLONG_MAX % base;
for ( ; ; c = *s++) {
if (isxdigit(c))
- c = digittoint(c);
- else if (isascii(c) && isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ n = digittoint(c);
+ else if (isalpha(c))
+ n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10);
else
break;
- if (c >= base)
+ if (n < 0 || n >= base)
break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim))
any = -1;
else {
any = 1;
acc *= base;
- acc += c;
+ acc += n;
}
}
if (any < 0) {
diff --git a/lib/libc/stdlib/strtoumax.c b/lib/libc/stdlib/strtoumax.c
index ea59245..a2da678 100644
--- a/lib/libc/stdlib/strtoumax.c
+++ b/lib/libc/stdlib/strtoumax.c
@@ -58,7 +58,7 @@ strtoumax(nptr, endptr, base)
uintmax_t acc;
unsigned char c;
uintmax_t cutoff;
- int neg, any, cutlim;
+ int neg, any, cutlim, n;
/*
* See strtoimax for comments as to the logic used.
@@ -91,19 +91,19 @@ strtoumax(nptr, endptr, base)
cutlim = UINTMAX_MAX % base;
for ( ; ; c = *s++) {
if (isxdigit(c))
- c = digittoint(c);
- else if (isascii(c) && isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ n = digittoint(c);
+ else if (isalpha(c))
+ n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10);
else
break;
- if (c >= base)
+ if (n < 0 || n >= base)
break;
- if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+ if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim))
any = -1;
else {
any = 1;
acc *= base;
- acc += c;
+ acc += n;
}
}
if (any < 0) {
OpenPOWER on IntegriCloud