diff options
Diffstat (limited to 'libkern/atol.c')
| -rw-r--r-- | libkern/atol.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libkern/atol.c b/libkern/atol.c new file mode 100644 index 00000000..18a34b77 --- /dev/null +++ b/libkern/atol.c @@ -0,0 +1,47 @@ +#include <lib9.h> + +long +atol(char *s) +{ + long n; + int f; + + 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(;;){ + if(*s >= '0' && *s <= '9') + n = n*16 + *s++ - '0'; + else if(*s >= 'a' && *s <= 'f') + n = n*16 + *s++ - 'a' + 10; + else if(*s >= 'A' && *s <= 'F') + n = n*16 + *s++ - 'A' + 10; + else + break; + } + } 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; +} + +atoi(char *s) +{ + + return atol(s); +} |
