ref: 6f90213cae7f70b5244fea567defa91f498b703e
parent: 6681b1d6f658626fe560b8b26d608c8fc5075830
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Aug 3 14:10:53 EDT 2015
libc: make atoi() not parse c-style octal and hex numbers interpreting octal breaks parsing of decimal numbers with leading zeros. the manpage listed this in the BUGS section, so we'r going to fix it as this just causes confusion as most callers of atoi() do not expect it.
--- a/sys/man/2/atof
+++ b/sys/man/2/atof
@@ -135,10 +135,3 @@
interpretable as a number; even in this case,
.I rptr
will be updated.
-.SH BUGS
-.I Atoi,
-.I atol,
-and
-.I atoll
-accept octal and hexadecimal numbers in the style of C,
-contrary to the ANSI specification.
--- a/sys/src/libc/port/atol.c
+++ b/sys/src/libc/port/atol.c
@@ -4,50 +4,11 @@
long
atol(char *s)
{- long n;
- int f, c;
-
- n = 0;
- f = 0;
- while(*s == ' ' || *s == '\t')
- s++;
- if(*s == '-' || *s == '+') {- if(*s++ == '-')
- f = 1;
- while(*s == ' ' || *s == '\t')
- s++;
- }
- if(s[0]=='0' && s[1]) {- if(s[1]=='x' || s[1]=='X'){- s += 2;
- for(;;) {- c = *s;
- if(c >= '0' && c <= '9')
- n = n*16 + c - '0';
- else
- if(c >= 'a' && c <= 'f')
- n = n*16 + c - 'a' + 10;
- else
- if(c >= 'A' && c <= 'F')
- n = n*16 + c - 'A' + 10;
- else
- break;
- s++;
- }
- } else
- while(*s >= '0' && *s <= '7')
- n = n*8 + *s++ - '0';
- } else
- while(*s >= '0' && *s <= '9')
- n = n*10 + *s++ - '0';
- if(f)
- n = -n;
- return n;
+ return strtol(s, nil, 10);
}
int
atoi(char *s)
{-
- return atol(s);
+ return strtol(s, nil, 10);
}
--- a/sys/src/libc/port/atoll.c
+++ b/sys/src/libc/port/atoll.c
@@ -4,5 +4,5 @@
vlong
atoll(char *s)
{- return strtoll(s, nil, 0);
+ return strtoll(s, nil, 10);
}
--
⑨