aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/library.js249
-rw-r--r--src/preamble.js3
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;
}