diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-08-30 12:56:34 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-08-30 12:56:34 -0700 |
commit | 4943a80e08e0c5bfc97fad9de625d6a7d24548f9 (patch) | |
tree | 0cbda8a068d48590f54e9e89d8d67a93d3ea1d2c /src | |
parent | 639775b8a012a89e19ae5ba3ce459248b4cd98a9 (diff) | |
parent | c746d2005286626f8a468b32df59073c7ec88639 (diff) |
Merge pull request #75 from max99x/master
Eliminator update, strtox(), Closure compatibility and other fixes
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 138 | ||||
-rw-r--r-- | src/preamble.js | 2 |
2 files changed, 116 insertions, 24 deletions
diff --git a/src/library.js b/src/library.js index 5e0a53a1..62e4de55 100644 --- a/src/library.js +++ b/src/library.js @@ -2146,6 +2146,7 @@ LibraryManager.library = { (type === 's')) { buffer.push(String.fromCharCode(next)); next = get(); + curr++; } else { break; } @@ -3073,11 +3074,14 @@ LibraryManager.library = { vsnprintf: 'snprintf', vprintf: 'printf', vsprintf: 'sprintf', - // TODO: Implement v*scanf(). + vscanf: 'scanf', + vfscanf: 'fscanf', + vsscanf: 'sscanf', __01fopen64_: 'fopen', __01fseeko64_: 'fseek', __01ftello64_: 'ftell', __01tmpfile64_: 'tmpfile', + __isoc99_fscanf: 'fscanf', // TODO: Check if any other aliases are needed. _IO_getc: 'getc', _IO_putc: 'putc', @@ -3099,6 +3103,7 @@ LibraryManager.library = { return allocate(info.object.contents.slice(offset, offset+num), 'i8', ALLOC_NORMAL); }, + __01mmap64_: 'mmap', munmap: function(start, num) { // FIXME: Not really correct at all. @@ -3168,7 +3173,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 +3237,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) { @@ -3258,6 +3358,13 @@ LibraryManager.library = { var poolPtr; var envPtr; if (_environ === null) { + // Set default values. Use string keys for Closure Compiler compatibility. + ENV['USER'] = 'root'; + ENV['PATH'] = '/'; + ENV['PWD'] = '/'; + ENV['HOME'] = '/'; + ENV['LANG'] = 'en_US.UTF-8'; + ENV['_'] = './this.program'; // Allocate memory. poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC); envPtr = allocate(MAX_ENV_VALUES * {{{ QUANTUM_SIZE }}}, @@ -3300,14 +3407,7 @@ LibraryManager.library = { }, $ENV__deps: ['__buildEnvironment'], $ENV__postset: '___buildEnvironment(ENV);', - $ENV: { - 'USER': 'root', - 'PATH': '/', - 'PWD': '/', - 'HOME': '/', - 'LANG': 'en_US.UTF-8', - '_': './this.program' - }, + $ENV: {}, getenv__deps: ['$ENV'], getenv: function(name) { // char *getenv(const char *name); @@ -3546,16 +3646,6 @@ LibraryManager.library = { return pdest; }, - strtol: function(ptr, endptr, base) { - assert(!endptr, "We don't support all strtol params yet"); - return parseInt(Pointer_stringify(ptr), base); - }, - strtoul__deps: ['strtol'], - strtoul: function(ptr, endptr, base) { - var result = _strtol(ptr, endptr, base); - return unSign(result, 32); - }, - strcmp__deps: ['strncmp'], strcmp: function(px, py) { return _strncmp(px, py, TOTAL_MEMORY); @@ -4339,7 +4429,7 @@ LibraryManager.library = { return 0; } else { if (DLFCN_DATA.error) _free(DLFCN_DATA.error); - var msgArr = Module.intArrayFromString(DLFCN_DATA.errorMsg); + var msgArr = intArrayFromString(DLFCN_DATA.errorMsg); DLFCN_DATA.error = allocate(msgArr, 'i8', ALLOC_NORMAL); DLFCN_DATA.errorMsg = null; return DLFCN_DATA.error; @@ -4625,15 +4715,17 @@ LibraryManager.library = { // setjmp.h // ========================================================================== - _setjmp: function(env) { + setjmp: function(env) { // XXX print('WARNING: setjmp() not really implemented, will fail if longjmp() is actually called'); return 0; }, + _setjmp: 'setjmp', - _longjmp: function(env, val) { + longjmp: function(env, val) { // not really working... assert(0); }, + _longjmp: 'longjmp', // ========================================================================== // signal.h diff --git a/src/preamble.js b/src/preamble.js index 54011558..8ab9bce8 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -562,7 +562,7 @@ Module['String_copy'] = String_copy; // Tools if (typeof print === 'undefined') { - print = console.log; // we are on the web + this['print'] = console.log; // we are on the web } // This processes a JS string into a C-line array of numbers, 0-terminated. |