From: ceriel Date: Mon, 25 Jun 1990 15:59:16 +0000 (+0000) Subject: Added strtol() X-Git-Tag: release-5-5~1661 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=29b8ec04c5983977626a13ccb03d9b94112a221e;p=ack.git Added strtol() --- diff --git a/lang/cem/libcc/gen/LIST b/lang/cem/libcc/gen/LIST index b9251b22c..dc4b912c9 100644 --- a/lang/cem/libcc/gen/LIST +++ b/lang/cem/libcc/gen/LIST @@ -4,6 +4,7 @@ atof.c strtod.c atoi.c atol.c +strtol.c bcmp.c bfill.c bmove.c diff --git a/lang/cem/libcc/gen/strtol.c b/lang/cem/libcc/gen/strtol.c new file mode 100644 index 000000000..cab4f5f65 --- /dev/null +++ b/lang/cem/libcc/gen/strtol.c @@ -0,0 +1,56 @@ +/* + * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. + * See the copyright notice in the ACK home directory, in the file "Copyright". + */ +/* $Header$ */ + +#include + +long int +strtol(nptr, endptr, base) + register char *nptr; + char **endptr; +{ + register int v; + register long val = 0; + register int c; + int sign = 1; + char *startnptr = nptr, *nrstart; + + if (endptr) *endptr = (char *)nptr; + while (isspace(*nptr)) nptr++; + c = *nptr; + + if (c == '-' || c == '+') { + if (c == '-') sign = -1; + nptr++; + } + nrstart = nptr; /* start of the number */ + + /* When base is 0, the syntax determines the actual base */ + if (base == 0) + if (*nptr == '0') + if (*++nptr == 'x' || *nptr == 'X') { + base = 16; + nptr++; + } + else base = 8; + else base = 10; + else if (base==16 && *nptr=='0' && (*++nptr =='x' || *nptr =='X')) + nptr++; + + while (isdigit(c = *nptr) || isalpha(c)) { + if (isalpha(c)) + v = 10 + (isupper(c) ? c - 'A' : c - 'a'); + else + v = c - '0'; + if (v >= base) break; + val = (val * base) + v; + nptr++; + } + if (endptr) { + if (nrstart == nptr) *endptr = (char *)startnptr; + else *endptr = (char *)nptr; + } + return (long) sign * val; +}