atol and atoi get old-fashioned behaviour
authorceriel <none@none>
Tue, 22 May 1990 10:48:12 +0000 (10:48 +0000)
committerceriel <none@none>
Tue, 22 May 1990 10:48:12 +0000 (10:48 +0000)
lang/cem/libcc.ansi/stdlib/atoi.c
lang/cem/libcc.ansi/stdlib/atol.c

index e8cdfdc..cb8495e 100644 (file)
@@ -4,15 +4,27 @@
  */
 /* $Header$ */
 
-#include       <stdlib.h>
-#include       <errno.h>
+#include       <ctype.h>
 
+/* We do not use strtol here for backwards compatibility in behaviour on
+   overflow.
+*/
 int
-atoi(const char *nptr)
+atol(register const char *nptr)
 {
-       int i, e = errno;
+       int total = 0;
+       register unsigned int digit;
+       int minus = 0;
 
-       i = (int)strtol(nptr, (char **)NULL, 10);
-       errno = e;
-       return i;
+       while (isspace(*nptr)) nptr++;
+       if (*nptr == '+') nptr++;
+       else if (*nptr == '-') {
+               minus = 1;
+               nptr++;
+       }
+       while (isdigit(*nptr)) {
+               total *= 10;
+               total += (*nptr++ - '0');
+       }
+       return minus ? -total : total;
 }
index 41f67b5..fe4a21a 100644 (file)
@@ -4,16 +4,27 @@
  */
 /* $Header$ */
 
-#include       <stdlib.h>
-#include       <errno.h>
+#include       <ctype.h>
 
+/* We do not use strtol here for backwards compatibility in behaviour on
+   overflow.
+*/
 long
-atol(const char *nptr)
+atol(register const char *nptr)
 {
-       long l;
-       int e = errno;
+       long total = 0;
+       register unsigned int digit;
+       int minus = 0;
 
-       l = strtol(nptr, (char **)NULL, 10);
-       errno = e;
-       return l;
+       while (isspace(*nptr)) nptr++;
+       if (*nptr == '+') nptr++;
+       else if (*nptr == '-') {
+               minus = 1;
+               nptr++;
+       }
+       while (isdigit(*nptr)) {
+               total *= 10;
+               total += (*nptr++ - '0');
+       }
+       return minus ? -total : total;
 }