V8/usr/src/cmd/PDP11/fpp/aux/mmatof.c

Compare this file to the similar file:
Show the results in this format:

/*
 * 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);
}