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