diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 249 | ||||
-rw-r--r-- | src/preamble.js | 3 |
2 files changed, 240 insertions, 12 deletions
diff --git a/src/library.js b/src/library.js index e2d75f84..a7ac6fc0 100644 --- a/src/library.js +++ b/src/library.js @@ -133,7 +133,7 @@ LibraryManager.library = { }, // Finds the file system object at a given path. If dontResolveLastLink is // set to true and the object is a symbolic link, it will be returned as is - // instead of being resolved. Links embedded in the path as still resolved. + // instead of being resolved. Links embedded in the path are still resolved. findObject: function(path, dontResolveLastLink) { FS.ensureRoot(); var ret = FS.analyzePath(path, dontResolveLastLink); @@ -253,8 +253,13 @@ LibraryManager.library = { // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. var xhr = new XMLHttpRequest(); xhr.open('GET', obj.url, false); - xhr.responseType = 'arraybuffer'; // hint to the browser that we want binary data - xhr.overrideMimeType('text/plain; charset=x-user-defined'); // another hint + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + xhr.send(null); if (xhr.status != 200 && xhr.status != 0) success = false; if (xhr.response !== undefined) { @@ -3467,6 +3472,28 @@ LibraryManager.library = { return limit; }, + // A glibc-like implementation of the C random number generation functions: + // http://pubs.opengroup.org/onlinepubs/000095399/functions/rand.html + __rand_state: 42, + srand__deps: ['__rand_state'], + srand: function(seed) { + // void srand(unsigned seed); + ___rand_state = seed; + }, + rand__deps: ['__rand_state'], + rand: function() { + // int rand(void); + ___rand_state = (1103515245 * ___rand_state + 12345) % 0x100000000; + return ___rand_state & 0x7FFFFFFF; + }, + rand_r: function(seed) { + // int rand_r(unsigned *seed); + var state = {{{ makeGetValue('seed', 0, 'i32') }}}; + state = (1103515245 * state + 12345) % 0x100000000; + {{{ makeSetValue('seed', 0, 'state', 'i32') }}} + return state & 0x7FFFFFFF; + }, + // ========================================================================== // string.h // ========================================================================== @@ -3570,15 +3597,22 @@ LibraryManager.library = { return pdest; }, - strtol: function(ptr) { - assert(!arguments[1] && !arguments[2], "We don't support all strtol params yet"); - return parseInt(Pointer_stringify(ptr)); + 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); }, + // We always assume ASCII locale. + strcoll: 'strcmp', strcasecmp__deps: ['strncasecmp'], strcasecmp: function(px, py) { @@ -3668,7 +3702,14 @@ LibraryManager.library = { }, strdup: function(ptr) { - return allocate(String_copy(ptr, true), 'i8', ALLOC_NORMAL); + var len = String_len(ptr); + var end = ptr + len; + var newStr = _malloc(len + 1); + for (var src = ptr, dst = newStr; src < end; src++, dst++) { + {{{ makeSetValue('dst', 0, 'src', 'i8') }}} + } + {{{ makeSetValue('dst', 0, 0, 'i8') }}} + return newStr; }, strpbrk: function(ptr1, ptr2) { @@ -4555,7 +4596,26 @@ LibraryManager.library = { return -1; }, - // TODO: Implement strftime(), strptime() and getdate(). + strftime: function(s, maxsize, format, timeptr) { + // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); + // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html + // TODO: Implement. + return 0; + }, + + strptime: function(buf, format, tm) { + // char *strptime(const char *restrict buf, const char *restrict format, struct tm *restrict tm); + // http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html + // TODO: Implement. + return 0; + }, + + getdate: function(string) { + // struct tm *getdate(const char *string); + // http://pubs.opengroup.org/onlinepubs/009695399/functions/getdate.html + // TODO: Implement. + return 0; + }, // ========================================================================== // sys/time.h @@ -4685,12 +4745,179 @@ LibraryManager.library = { // langinfo.h // ========================================================================== - // TODO: Implement for real. nl_langinfo: function(item) { + // char *nl_langinfo(nl_item item); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/nl_langinfo.html + var result; + switch (item) { + case 0xE: // CODESET + result = 'ANSI_X3.4-1968'; + break; + case 0x20028: // D_T_FMT + result = '%a %b %e %H:%M:%S %Y'; + break; + case 0x20029: // D_FMT + result = '%m/%d/%y'; + break; + case 0x2002A: // T_FMT + result = '%H:%M:%S'; + break; + case 0x2002B: // T_FMT_AMPM + result = '%I:%M:%S %p'; + break; + case 0x20026: // AM_STR + result = 'AM'; + break; + case 0x20027: // PM_STR + result = 'PM'; + break; + case 0x20007: // DAY_1 + result = 'Sunday'; + break; + case 0x20008: // DAY_2 + result = 'Monday'; + break; + case 0x20009: // DAY_3 + result = 'Tuesday'; + break; + case 0x2000A: // DAY_4 + result = 'Wednesday'; + break; + case 0x2000B: // DAY_5 + result = 'Thursday'; + break; + case 0x2000C: // DAY_6 + result = 'Friday'; + break; + case 0x2000D: // DAY_7 + result = 'Saturday'; + break; + case 0x20000: // ABDAY_1 + result = 'Sun'; + break; + case 0x20001: // ABDAY_2 + result = 'Mon'; + break; + case 0x20002: // ABDAY_3 + result = 'Tue'; + break; + case 0x20003: // ABDAY_4 + result = 'Wed'; + break; + case 0x20004: // ABDAY_5 + result = 'Thu'; + break; + case 0x20005: // ABDAY_6 + result = 'Fri'; + break; + case 0x20006: // ABDAY_7 + result = 'Sat'; + break; + case 0x2001A: // MON_1 + result = 'January'; + break; + case 0x2001B: // MON_2 + result = 'February'; + break; + case 0x2001C: // MON_3 + result = 'March'; + break; + case 0x2001D: // MON_4 + result = 'April'; + break; + case 0x2001E: // MON_5 + result = 'May'; + break; + case 0x2001F: // MON_6 + result = 'June'; + break; + case 0x20020: // MON_7 + result = 'July'; + break; + case 0x20021: // MON_8 + result = 'August'; + break; + case 0x20022: // MON_9 + result = 'September'; + break; + case 0x20023: // MON_10 + result = 'October'; + break; + case 0x20024: // MON_11 + result = 'November'; + break; + case 0x20025: // MON_12 + result = 'December'; + break; + case 0x2000E: // ABMON_1 + result = 'Jan'; + break; + case 0x2000F: // ABMON_2 + result = 'Feb'; + break; + case 0x20010: // ABMON_3 + result = 'Mar'; + break; + case 0x20011: // ABMON_4 + result = 'Apr'; + break; + case 0x20012: // ABMON_5 + result = 'May'; + break; + case 0x20013: // ABMON_6 + result = 'Jun'; + break; + case 0x20014: // ABMON_7 + result = 'Jul'; + break; + case 0x20015: // ABMON_8 + result = 'Aug'; + break; + case 0x20016: // ABMON_9 + result = 'Sep'; + break; + case 0x20017: // ABMON_10 + result = 'Oct'; + break; + case 0x20018: // ABMON_11 + result = 'Nov'; + break; + case 0x20019: // ABMON_12 + result = 'Dec'; + break; + case 0x2002F: // ALT_DIGITS + result = ''; + break; + case 0x10000: // RADIXCHAR + result = '.'; + break; + case 0x10001: // THOUSEP + result = ''; + break; + case 0x50000: // YESEXPR + result = '^[yY]'; + break; + case 0x50001: // NOEXPR + result = '^[nN]'; + break; + case 0x4000F: // CRNCYSTR + result = '-'; + break; + case 0x2002C: // ERA + case 0x2002E: // ERA_D_FMT + case 0x20030: // ERA_D_T_FMT + case 0x20031: // ERA_T_FMT + default: + result = ''; + break; + } + var me = _nl_langinfo; - if (!me.ret) { - me.ret = allocate(intArrayFromString("eh?"), 'i8', ALLOC_NORMAL); + if (!me.ret) me.ret = _malloc(32); + for (var i = 0; i < result.length; i++) { + {{{ makeSetValue('me.ret', 'i', 'result.charCodeAt(i)', 'i8') }}} } + {{{ makeSetValue('me.ret', 'i', '0', 'i8') }}} return me.ret; }, diff --git a/src/preamble.js b/src/preamble.js index 0d802409..2cbd9cf0 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -389,9 +389,10 @@ function Pointer_stringify(ptr) { var ret = ""; var i = 0; var t; + var nullByte = String.fromCharCode(0); while (1) { t = String.fromCharCode({{{ makeGetValue('ptr', 'i', 'i8', 0, 1) }}}); - if (t == "\0") { break; } else {} + if (t == nullByte) { break; } else {} ret += t; i += 1; } |