Understand national (non-ASCII) digits now

Allow bases >=36 again
Misc cleanup
This commit is contained in:
Andrey A. Chernov 2001-11-28 00:48:11 +00:00
parent d262b81bdb
commit 7e302fc7a2
6 changed files with 42 additions and 56 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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)