xref: /inferno-os/libkern/atol.c (revision 46439007cf417cbd9ac8049bb4122c890097a0fa)
1 #include <lib9.h>
2 
3 long
4 atol(char *s)
5 {
6 	long n;
7 	int f;
8 
9 	n = 0;
10 	f = 0;
11 	while(*s == ' ' || *s == '\t')
12 		s++;
13 	if(*s == '-' || *s == '+') {
14 		if(*s++ == '-')
15 			f = 1;
16 		while(*s == ' ' || *s == '\t')
17 			s++;
18 	}
19 	if(s[0]=='0' && s[1]){
20 		if(s[1]=='x' || s[1]=='X'){
21 			s += 2;
22 			for(;;){
23 				if(*s >= '0' && *s <= '9')
24 					n = n*16 + *s++ - '0';
25 				else if(*s >= 'a' && *s <= 'f')
26 					n = n*16 + *s++ - 'a' + 10;
27 				else if(*s >= 'A' && *s <= 'F')
28 					n = n*16 + *s++ - 'A' + 10;
29 				else
30 					break;
31 			}
32 		} else
33 			while(*s >= '0' && *s <= '7')
34 				n = n*8 + *s++ - '0';
35 	} else
36 		while(*s >= '0' && *s <= '9')
37 			n = n*10 + *s++ - '0';
38 	if(f)
39 		n = -n;
40 	return n;
41 }
42 
43 atoi(char *s)
44 {
45 
46 	return atol(s);
47 }
48