socsvn commit: r268941 - soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src
Pedro Arthur
bygrandao at gmail.com
Tue Jun 3 01:08:23 UTC 2014
Hi,
libstand doesn't have any function to parse floating point numbers, it can
parse only integers.
The lua interpreter consider all numbers as floating point (double) and
uses the strtod function,
I also searched through the ficl interpreter to see which function it uses
to parse numbers but
I found that it parses only integers too.
By he way libstand also can't convert any floating point to string.
2014-06-02 19:06 GMT-03:00 Wojciech A. Koszek <wkoszek at freebsd.org>:
> 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