socsvn commit: r268941 - soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src

Wojciech A. Koszek wkoszek at freebsd.org
Mon Jun 2 22:10:11 UTC 2014


On Mon, Jun 02, 2014 at 01:00:56AM +0000, pedrosouza at freebsd.org wrote:
> Author: pedrosouza
> Date: Mon Jun  2 01:00:55 2014
> New Revision: 268941
> URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=268941
> 
> Log:
>   Implemented number parsing for lua
> 
> Modified:
>   soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src/lstd.c
>

Pedro,

Why was this necessary? Which part of Lua requires that?

If it's strictly needed, was the strtod() implementation present in
libstand? I think the preference would be to use whatever was in libstand.

Thanks,

Wojciech

> Modified: soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src/lstd.c
> ==============================================================================
> --- soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src/lstd.c	Mon Jun  2 00:21:42 2014	(r268940)
> +++ soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src/lstd.c	Mon Jun  2 01:00:55 2014	(r268941)
> @@ -49,6 +49,96 @@
>  double
>  strtod(const char *string, char **endPtr)
>  {
> -	printf("strtod not implemented!\n");
> -	return 0.;
> +	int sign = 0;
> +	int exp_sign = 0;
> +	int has_num = 0;
> +	int has_frac = 0;
> +	int has_exp = 0;
> +	unsigned long long num = 0;
> +	unsigned long long exp = 0;
> +
> +	double frac = 0;
> +	double fm = 0.1;
> +	double exp_m = 1;
> +	double ret = 0;
> +	
> +	const char *ptr = string;
> +
> +	while (isspace(*ptr)) ++ptr;
> +	
> +	if (*ptr == '-') 
> +	{
> +		sign = 1;
> +		++ptr;
> +	} else if (*ptr == '+')
> +		++ptr;
> +
> +	while (isdigit(*ptr))
> +	{
> +		num *= 10;
> +		num += *ptr - '0';
> +		++ptr;
> +		++has_num;
> +	}
> +
> +	if (*ptr == '.')
> +	{
> +		++ptr;
> +		while (isdigit(*ptr))
> +		{
> +			frac += (double)(*ptr - '0') * fm;
> +			fm *= 0.1;
> +			++ptr;
> +			++has_frac;
> +		}
> +	}
> +
> +	if (has_frac == 0 && has_num == 0)
> +	{
> +		if (*endPtr)
> +			*endPtr = (char*)string;
> +		return 0.;
> +	}
> +
> +	ret = (double)num;
> +	ret += frac;
> +
> +	if (*ptr == 'e' || *ptr == 'E')
> +	{
> +		if (*endPtr)
> +			*endPtr = (char*)ptr;
> +		++ptr;
> +		if (*ptr == '-') 
> +		{
> +			exp_sign = 1;
> +			++ptr;
> +		} else if (*ptr == '+')
> +			++ptr;
> +
> +		while (isdigit(*ptr))
> +		{
> +			exp *= 10;
> +			exp += *ptr - '0';
> +			++ptr;
> +			++has_exp;
> +		}
> +		if (has_exp == 0)
> +			return ret;
> +	}
> +
> +	if (*endPtr)
> +		*endPtr = (char*)ptr;
> +
> +	if (has_exp)
> +	{
> +		while (exp--)
> +			exp_m *= 10;
> +		if (exp_sign)
> +			exp_m = 1./exp_m;
> +
> +	}
> +	if (sign)
> +		ret = -ret;
> +
> +	return ret * exp_m;
>  }
> _______________________________________________
> svn-soc-all at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-soc-all
> To unsubscribe, send any mail to "svn-soc-all-unsubscribe at freebsd.org"

-- 
Wojciech A. Koszek
wkoszek at FreeBSD.czest.pl
http://FreeBSD.czest.pl/~wkoszek/


More information about the svn-soc-all mailing list