|
|
1.1 root 1: /*
2: * Original ("atof1") from J.P. Hawkins at WH: "atof1.c"
3: * "atof" in libc.a is in assembly language and uses floating point;
4: * (No good when using RH floating point preprocessor)
5: * mjm: put this in "flibu" (-lfu) "mmatof.o
6: * change name: atof1 -> atof
7: */
8:
9: double atof(s) /*convert string s to floating point*//* mjm: was atof1 */
10: char s[];
11: {
12: char *s1;
13: char *s2;
14: double val,power;
15: int i,sign,esin,exp;
16:
17: s1 = s;
18: s2 = s;
19: while(*s2 != '\0')
20: switch (*s2) {
21: case ' ' :
22: case '\015' :
23: case '\012' :
24: case '\t':
25: s2++;
26: break;
27: case 'E':
28: *s1++ = 'e';
29: s2++;
30: break;
31: default:
32: *s1++ = *s2++;
33: }
34: *s1 = '\0';
35: i=0;
36: sign = 1;
37: if(s[i] == '+' || s[i] == '-')
38: sign = (s[i++] == '+') ? 1 : -1 ;
39: for(val = 0;s[i] >= '0' && s[i] <= '9';i++)
40: val = 10 * val + s[i] - '0';
41: if(s[i] == '.')
42: {
43: i++;
44: for(power = 1;s[i] >= '0' && s[i] <= '9'; i++)
45: {
46: val = val * 10 + s[i] - '0';
47: power *= 10;
48: }
49: val /= power;
50: }
51: if(s[i] == 'e')
52: {
53: i++;
54: esin = 1;
55: if(s[i] == '+' || s[i] == '-')
56: esin = (s[i++] == '+') ? 1 : -1;
57: for(exp = 0;s[i] >= '0' && s[i] <= '9';i++)
58: exp = 10 * exp + s[i] - '0';
59: power = 1;
60: for(i=0;i<exp;i++)
61: power *= 10;
62: val = (esin == -1) ? val/power : val * power ;
63: }
64: return(sign * val);
65: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.