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>