From owner-svn-soc-all@FreeBSD.ORG Mon Jun 2 01:00:56 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id F15F4A26 for ; Mon, 2 Jun 2014 01:00:56 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C3D3124FB for ; Mon, 2 Jun 2014 01:00:56 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.8/8.14.8) with ESMTP id s5210uh6043921 for ; Mon, 2 Jun 2014 01:00:56 GMT (envelope-from pedrosouza@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.8/8.14.8/Submit) id s5210uAh043824 for svn-soc-all@FreeBSD.org; Mon, 2 Jun 2014 01:00:56 GMT (envelope-from pedrosouza@FreeBSD.org) Date: Mon, 2 Jun 2014 01:00:56 GMT Message-Id: <201406020100.s5210uAh043824@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to pedrosouza@FreeBSD.org using -f From: pedrosouza@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r268941 - soc2014/pedrosouza/lua_loader/head/sys/boot/lua/src MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Jun 2014 01:00:57 -0000 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 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; }