aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-06-27 00:15:08 +0300
committermax99x <max99x@gmail.com>2011-06-27 00:15:08 +0300
commit25e70573df01c945d22613e9cabbf76af36e45ac (patch)
treefb12855dceaea01de5d81c34e6b987926ce8b67e
parent0575efbfafda86bbc921b086167aefc59252ecde (diff)
Added exponent handling to strtod().
-rw-r--r--src/library.js36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js
index 083bf29c..1692f3f2 100644
--- a/src/library.js
+++ b/src/library.js
@@ -643,19 +643,24 @@ var Library = {
strtod__deps: ['isspace', 'isdigit'],
strtod: function(str, endptr) {
- // FIXME handles only whitespace + |[0-9]+(.[0.9]+)?|, no e+
+ // Skip space.
while (_isspace(str)) str++;
+
var chr;
var ret = 0;
+
+ // Get whole part.
while(1) {
chr = {{{ makeGetValue('str', 0, 'i8') }}};
if (!_isdigit(chr)) break;
ret = ret*10 + chr - '0'.charCodeAt(0);
str++;
}
+
+ // Get fractional part.
if ({{{ makeGetValue('str', 0, 'i8') }}} == '.'.charCodeAt(0)) {
str++;
- var mul=1/10;
+ var mul = 1/10;
while(1) {
chr = {{{ makeGetValue('str', 0, 'i8') }}};
if (!_isdigit(chr)) break;
@@ -664,9 +669,36 @@ var Library = {
str++;
}
}
+
+ // Get exponent part.
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ if (chr == 'e'.charCodeAt(0) || chr == 'E'.charCodeAt(0)) {
+ str++;
+ var exponent = 0;
+ var expNegative = false;
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ if (chr == '-'.charCodeAt(0)) {
+ negative = true;
+ str++;
+ } else if (chr == '+'.charCodeAt(0)) {
+ str++;
+ }
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ while(1) {
+ if (!_isdigit(chr)) break;
+ exponent = exponent*10 + chr - '0'.charCodeAt(0);
+ str++;
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ }
+ if (expNegative) exponent = -exponent;
+ ret = Math.pow(ret, exponent);
+ }
+
+ // Set end pointer.
if (endptr) {
{{{ makeSetValue('endptr', 0, 'str', '*') }}}
}
+
return ret;
},