aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-08-28 10:06:36 +0300
committermax99x <max99x@gmail.com>2011-08-28 10:06:36 +0300
commit19458449a6c3eca2f63bdaae134173a000a89ce0 (patch)
tree4a49fa7a4ba3459aadf724226bd00118c419bfd0 /src
parent42e4d9cb7e37d1a79ac928852f8a34a6232e70d7 (diff)
Fixed negatives in strtod(); implemented strto[l/ul/ll/ull]().
Diffstat (limited to 'src')
-rw-r--r--src/library.js97
1 files changed, 96 insertions, 1 deletions
diff --git a/src/library.js b/src/library.js
index 03f23439..3fd96f5b 100644
--- a/src/library.js
+++ b/src/library.js
@@ -3168,7 +3168,16 @@ LibraryManager.library = {
strtod__deps: ['isspace', 'isdigit'],
strtod: function(str, endptr) {
// Skip space.
- while (_isspace(str)) str++;
+ while (_isspace({{{ makeGetValue('str', 0, 'i8') }}})) str++;
+
+ // Check for a plus/minus sign.
+ var multiplier = 1;
+ if ({{{ makeGetValue('str', 0, 'i8') }}} == '-'.charCodeAt(0)) {
+ multiplier = -1;
+ str++;
+ } else if ({{{ makeGetValue('str', 0, 'i8') }}} == '+'.charCodeAt(0)) {
+ str++;
+ }
var chr;
var ret = 0;
@@ -3223,8 +3232,94 @@ LibraryManager.library = {
{{{ makeSetValue('endptr', 0, 'str', '*') }}}
}
+ return ret * multiplier;
+ },
+
+ _parseInt__deps: ['isspace', '__setErrNo', '$ERRNO_CODES'],
+ _parseInt: function(str, endptr, base, min, max, unsignBits) {
+ // Skip space.
+ while (_isspace({{{ makeGetValue('str', 0, 'i8') }}})) str++;
+
+ // Check for a plus/minus sign.
+ var multiplier = 1;
+ if ({{{ makeGetValue('str', 0, 'i8') }}} == '-'.charCodeAt(0)) {
+ multiplier = -1;
+ str++;
+ } else if ({{{ makeGetValue('str', 0, 'i8') }}} == '+'.charCodeAt(0)) {
+ str++;
+ }
+
+ // Find base.
+ var finalBase = base;
+ if (!finalBase) {
+ if ({{{ makeGetValue('str', 0, 'i8') }}} == '0'.charCodeAt(0)) {
+ if ({{{ makeGetValue('str+1', 0, 'i8') }}} == 'x'.charCodeAt(0) ||
+ {{{ makeGetValue('str+1', 0, 'i8') }}} == 'X'.charCodeAt(0)) {
+ finalBase = 16;
+ str += 2;
+ } else {
+ finalBase = 8;
+ str++;
+ }
+ }
+ }
+ if (!finalBase) finalBase = 10;
+
+ // Get digits.
+ var chr;
+ var ret = 0;
+ while ((chr = {{{ makeGetValue('str', 0, 'i8') }}}) != 0) {
+ var digit = parseInt(String.fromCharCode(chr), finalBase);
+ if (isNaN(digit)) {
+ break;
+ } else {
+ ret = ret * finalBase + digit;
+ str++;
+ }
+ }
+
+ // Apply sign.
+ ret *= multiplier;
+
+ // Set end pointer.
+ if (endptr) {
+ {{{ makeSetValue('endptr', 0, 'str', '*') }}}
+ }
+
+ // Unsign if needed.
+ if (unsignBits) {
+ if (Math.abs(ret) > max) {
+ ret = max;
+ ___setErrNo(ERRNO_CODES.ERANGE);
+ } else {
+ ret = unSign(ret, unsignBits);
+ }
+ }
+
+ // Validate range.
+ if (ret > max || ret < min) {
+ ret = ret > max ? max : min;
+ ___setErrNo(ERRNO_CODES.ERANGE);
+ }
+
return ret;
},
+ strtoll__deps: ['_parseInt'],
+ strtoll: function(str, endptr, base) {
+ return __parseInt(str, endptr, base, -9223372036854775808, 9223372036854775807); // LLONG_MIN, LLONG_MAX; imprecise.
+ },
+ strtol__deps: ['_parseInt'],
+ strtol: function(str, endptr, base) {
+ return __parseInt(str, endptr, base, -2147483648, 2147483647); // LONG_MIN, LONG_MAX.
+ },
+ strtoul__deps: ['_parseInt'],
+ strtoul: function(str, endptr, base) {
+ return __parseInt(str, endptr, base, 0, 4294967295, 32); // ULONG_MAX.
+ },
+ strtoull__deps: ['_parseInt'],
+ strtoull: function(str, endptr, base) {
+ return __parseInt(str, endptr, base, 0, 18446744073709551615, 64); // ULONG_MAX; imprecise.
+ },
qsort__deps: ['memcpy'],
qsort: function(base, num, size, comparator) {