|
|
researchv10 Norman
/*
* Original ("atof1") from J.P. Hawkins at WH: "atof1.c"
* "atof" in libc.a is in assembly language and uses floating point;
* (No good when using RH floating point preprocessor)
* mjm: put this in "flibu" (-lfu) "mmatof.o
* change name: atof1 -> atof
*/
double atof(s) /*convert string s to floating point*//* mjm: was atof1 */
char s[];
{
char *s1;
char *s2;
double val,power;
int i,sign,esin,exp;
s1 = s;
s2 = s;
while(*s2 != '\0')
switch (*s2) {
case ' ' :
case '\015' :
case '\012' :
case '\t':
s2++;
break;
case 'E':
*s1++ = 'e';
s2++;
break;
default:
*s1++ = *s2++;
}
*s1 = '\0';
i=0;
sign = 1;
if(s[i] == '+' || s[i] == '-')
sign = (s[i++] == '+') ? 1 : -1 ;
for(val = 0;s[i] >= '0' && s[i] <= '9';i++)
val = 10 * val + s[i] - '0';
if(s[i] == '.')
{
i++;
for(power = 1;s[i] >= '0' && s[i] <= '9'; i++)
{
val = val * 10 + s[i] - '0';
power *= 10;
}
val /= power;
}
if(s[i] == 'e')
{
i++;
esin = 1;
if(s[i] == '+' || s[i] == '-')
esin = (s[i++] == '+') ? 1 : -1;
for(exp = 0;s[i] >= '0' && s[i] <= '9';i++)
exp = 10 * exp + s[i] - '0';
power = 1;
for(i=0;i<exp;i++)
power *= 10;
val = (esin == -1) ? val/power : val * power ;
}
return(sign * val);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.