blob: ca4939100258918dcb00ef46994be90d25576312 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#include <math.h>
#include <errno.h>
/*
* bug: should detect overflow, set errno = ERANGE, and return +/- HUGE_VAL
*/
double
strtod(const char *cp, char **endptr)
{
double num, dem;
extern double pow10(int);
int neg, eneg, dig, predig, exp, c;
const char *p;
p = cp;
num = 0;
neg = 0;
dig = 0;
predig = 0;
exp = 0;
eneg = 0;
c = *p++;
while(c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\v' || c == '\r')
c = *p++;
if(c == '-' || c == '+'){
if(c == '-')
neg = 1;
c = *p++;
}
while(c >= '0' && c <= '9'){
num = num*10 + c-'0';
predig++;
c = *p++;
}
if(c == '.')
c = *p++;
while(c >= '0' && c <= '9'){
num = num*10 + c-'0';
dig++;
c = *p++;
}
if(dig+predig == 0){
if(endptr)
*endptr = (char *)cp;
return 0.0;
}
if(c == 'e' || c == 'E'){
c = *p++;
if(c == '-' || c == '+'){
if(c == '-'){
dig = -dig;
eneg = 1;
}
c = *p++;
}
while(c >= '0' && c <= '9'){
exp = exp*10 + c-'0';
c = *p++;
}
}
exp -= dig;
if(exp < 0){
exp = -exp;
eneg = !eneg;
}
dem = pow10(exp);
if(dem==HUGE_VAL)
num = eneg? 0.0 : HUGE_VAL;
else if(dem==0)
num = eneg? HUGE_VAL : 0.0;
else if(eneg)
num /= dem;
else
num *= dem;
if(neg)
num = -num;
if(endptr){
*endptr = (char *)--p;
/*
* Fix cases like 2.3e+
*/
while(p > cp){
c = *--p;
if(c!='-' && c!='+' && c!='e' && c!='E')
break;
(*endptr)--;
}
}
return num;
}
|