xref: /inferno-os/libkern/strtod.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include <lib9.h>
2*37da2899SCharles.Forsyth 
3*37da2899SCharles.Forsyth static int
strtodf(void * vp)4*37da2899SCharles.Forsyth strtodf(void *vp)
5*37da2899SCharles.Forsyth {
6*37da2899SCharles.Forsyth 	return *(*((char**)vp))++;
7*37da2899SCharles.Forsyth }
8*37da2899SCharles.Forsyth 
9*37da2899SCharles.Forsyth double
strtod(char * s,char ** end)10*37da2899SCharles.Forsyth strtod(char *s, char **end)
11*37da2899SCharles.Forsyth {
12*37da2899SCharles.Forsyth 	double d;
13*37da2899SCharles.Forsyth 	char *ss;
14*37da2899SCharles.Forsyth 	int c;
15*37da2899SCharles.Forsyth 
16*37da2899SCharles.Forsyth 	ss = s;
17*37da2899SCharles.Forsyth 	d = charstod(strtodf, &s);
18*37da2899SCharles.Forsyth 	/*
19*37da2899SCharles.Forsyth 	 * Fix cases like 2.3e+ , which charstod will consume
20*37da2899SCharles.Forsyth 	 */
21*37da2899SCharles.Forsyth 	if(end){
22*37da2899SCharles.Forsyth 		*end = --s;
23*37da2899SCharles.Forsyth 		while(s > ss){
24*37da2899SCharles.Forsyth 			c = *--s;
25*37da2899SCharles.Forsyth 			if(c!='-' && c!='+' && c!='e' && c!='E')
26*37da2899SCharles.Forsyth 				break;
27*37da2899SCharles.Forsyth 			(*end)--;
28*37da2899SCharles.Forsyth 		}
29*37da2899SCharles.Forsyth 	}
30*37da2899SCharles.Forsyth 	return d;
31*37da2899SCharles.Forsyth }
32