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