Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Jun 2014 22:08:21 -0300
From:      Pedro Arthur <bygrandao@gmail.com>
To:        "Wojciech A. Koszek" <wkoszek@freebsd.org>
Cc:        svn-soc-all@freebsd.org, pedrosouza@freebsd.org
Subject:   Re: socsvn commit: r268941 - soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src
Message-ID:  <CAKN1MR6ekH=pZUa6i75injoVZxsO8CuHVpoRAS0Q4XTNise_Pg@mail.gmail.com>
In-Reply-To: <20140602220616.GC2587@FreeBSD.org>
References:  <201406020100.s5210uAh043824@socsvn.freebsd.org> <20140602220616.GC2587@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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@freebsd.org>:

> On Mon, Jun 02, 2014 at 01:00:56AM +0000, pedrosouza@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@freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/svn-soc-all
> > To unsubscribe, send any mail to "svn-soc-all-unsubscribe@freebsd.org"
>
> --
> Wojciech A. Koszek
> wkoszek@FreeBSD.czest.pl
> http://FreeBSD.czest.pl/~wkoszek/
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAKN1MR6ekH=pZUa6i75injoVZxsO8CuHVpoRAS0Q4XTNise_Pg>