diff options
-rw-r--r-- | src/library.js | 175 | ||||
-rw-r--r-- | tests/langinfo/output.txt | 56 | ||||
-rw-r--r-- | tests/langinfo/test.c | 64 | ||||
-rw-r--r-- | tests/runner.py | 5 |
4 files changed, 296 insertions, 4 deletions
diff --git a/src/library.js b/src/library.js index e2d75f84..c9a6ce38 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); @@ -4685,12 +4685,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/tests/langinfo/output.txt b/tests/langinfo/output.txt new file mode 100644 index 00000000..2464cf61 --- /dev/null +++ b/tests/langinfo/output.txt @@ -0,0 +1,56 @@ + CODESET: "ANSI_X3.4-1968" + D_T_FMT: "%a %b %e %H:%M:%S %Y" + D_FMT: "%m/%d/%y" + T_FMT: "%H:%M:%S" + T_FMT_AMPM: "%I:%M:%S %p" + AM_STR: "AM" + PM_STR: "PM" + DAY_1: "Sunday" + DAY_2: "Monday" + DAY_3: "Tuesday" + DAY_4: "Wednesday" + DAY_5: "Thursday" + DAY_6: "Friday" + DAY_7: "Saturday" + ABDAY_1: "Sun" + ABDAY_2: "Mon" + ABDAY_3: "Tue" + ABDAY_4: "Wed" + ABDAY_5: "Thu" + ABDAY_6: "Fri" + ABDAY_7: "Sat" + MON_1: "January" + MON_2: "February" + MON_3: "March" + MON_4: "April" + MON_5: "May" + MON_6: "June" + MON_7: "July" + MON_8: "August" + MON_9: "September" + MON_10: "October" + MON_11: "November" + MON_12: "December" + ABMON_1: "Jan" + ABMON_2: "Feb" + ABMON_3: "Mar" + ABMON_4: "Apr" + ABMON_5: "May" + ABMON_6: "Jun" + ABMON_7: "Jul" + ABMON_8: "Aug" + ABMON_9: "Sep" + ABMON_10: "Oct" + ABMON_11: "Nov" + ABMON_12: "Dec" + ERA: "" + ERA_D_FMT: "" + ERA_D_T_FMT: "" + ERA_T_FMT: "" + ALT_DIGITS: "" + RADIXCHAR: "." + THOUSEP: "" + YESEXPR: "^[yY]" + NOEXPR: "^[nN]" + CRNCYSTR: "-" + (bad value): "" diff --git a/tests/langinfo/test.c b/tests/langinfo/test.c new file mode 100644 index 00000000..3b506835 --- /dev/null +++ b/tests/langinfo/test.c @@ -0,0 +1,64 @@ +#include <stdio.h> +#include <langinfo.h> + +int main() { + printf("%16s: \"%s\"\n", "CODESET", nl_langinfo(CODESET)); + printf("%16s: \"%s\"\n", "D_T_FMT", nl_langinfo(D_T_FMT)); + printf("%16s: \"%s\"\n", "D_FMT", nl_langinfo(D_FMT)); + printf("%16s: \"%s\"\n", "T_FMT", nl_langinfo(T_FMT)); + printf("%16s: \"%s\"\n", "T_FMT_AMPM", nl_langinfo(T_FMT_AMPM)); + printf("%16s: \"%s\"\n", "AM_STR", nl_langinfo(AM_STR)); + printf("%16s: \"%s\"\n", "PM_STR", nl_langinfo(PM_STR)); + printf("%16s: \"%s\"\n", "DAY_1", nl_langinfo(DAY_1)); + printf("%16s: \"%s\"\n", "DAY_2", nl_langinfo(DAY_2)); + printf("%16s: \"%s\"\n", "DAY_3", nl_langinfo(DAY_3)); + printf("%16s: \"%s\"\n", "DAY_4", nl_langinfo(DAY_4)); + printf("%16s: \"%s\"\n", "DAY_5", nl_langinfo(DAY_5)); + printf("%16s: \"%s\"\n", "DAY_6", nl_langinfo(DAY_6)); + printf("%16s: \"%s\"\n", "DAY_7", nl_langinfo(DAY_7)); + printf("%16s: \"%s\"\n", "ABDAY_1", nl_langinfo(ABDAY_1)); + printf("%16s: \"%s\"\n", "ABDAY_2", nl_langinfo(ABDAY_2)); + printf("%16s: \"%s\"\n", "ABDAY_3", nl_langinfo(ABDAY_3)); + printf("%16s: \"%s\"\n", "ABDAY_4", nl_langinfo(ABDAY_4)); + printf("%16s: \"%s\"\n", "ABDAY_5", nl_langinfo(ABDAY_5)); + printf("%16s: \"%s\"\n", "ABDAY_6", nl_langinfo(ABDAY_6)); + printf("%16s: \"%s\"\n", "ABDAY_7", nl_langinfo(ABDAY_7)); + printf("%16s: \"%s\"\n", "MON_1", nl_langinfo(MON_1)); + printf("%16s: \"%s\"\n", "MON_2", nl_langinfo(MON_2)); + printf("%16s: \"%s\"\n", "MON_3", nl_langinfo(MON_3)); + printf("%16s: \"%s\"\n", "MON_4", nl_langinfo(MON_4)); + printf("%16s: \"%s\"\n", "MON_5", nl_langinfo(MON_5)); + printf("%16s: \"%s\"\n", "MON_6", nl_langinfo(MON_6)); + printf("%16s: \"%s\"\n", "MON_7", nl_langinfo(MON_7)); + printf("%16s: \"%s\"\n", "MON_8", nl_langinfo(MON_8)); + printf("%16s: \"%s\"\n", "MON_9", nl_langinfo(MON_9)); + printf("%16s: \"%s\"\n", "MON_10", nl_langinfo(MON_10)); + printf("%16s: \"%s\"\n", "MON_11", nl_langinfo(MON_11)); + printf("%16s: \"%s\"\n", "MON_12", nl_langinfo(MON_12)); + printf("%16s: \"%s\"\n", "ABMON_1", nl_langinfo(ABMON_1)); + printf("%16s: \"%s\"\n", "ABMON_2", nl_langinfo(ABMON_2)); + printf("%16s: \"%s\"\n", "ABMON_3", nl_langinfo(ABMON_3)); + printf("%16s: \"%s\"\n", "ABMON_4", nl_langinfo(ABMON_4)); + printf("%16s: \"%s\"\n", "ABMON_5", nl_langinfo(ABMON_5)); + printf("%16s: \"%s\"\n", "ABMON_6", nl_langinfo(ABMON_6)); + printf("%16s: \"%s\"\n", "ABMON_7", nl_langinfo(ABMON_7)); + printf("%16s: \"%s\"\n", "ABMON_8", nl_langinfo(ABMON_8)); + printf("%16s: \"%s\"\n", "ABMON_9", nl_langinfo(ABMON_9)); + printf("%16s: \"%s\"\n", "ABMON_10", nl_langinfo(ABMON_10)); + printf("%16s: \"%s\"\n", "ABMON_11", nl_langinfo(ABMON_11)); + printf("%16s: \"%s\"\n", "ABMON_12", nl_langinfo(ABMON_12)); + printf("%16s: \"%s\"\n", "ERA", nl_langinfo(ERA)); + printf("%16s: \"%s\"\n", "ERA_D_FMT", nl_langinfo(ERA_D_FMT)); + printf("%16s: \"%s\"\n", "ERA_D_T_FMT", nl_langinfo(ERA_D_T_FMT)); + printf("%16s: \"%s\"\n", "ERA_T_FMT", nl_langinfo(ERA_T_FMT)); + printf("%16s: \"%s\"\n", "ALT_DIGITS", nl_langinfo(ALT_DIGITS)); + printf("%16s: \"%s\"\n", "RADIXCHAR", nl_langinfo(RADIXCHAR)); + printf("%16s: \"%s\"\n", "THOUSEP", nl_langinfo(THOUSEP)); + printf("%16s: \"%s\"\n", "YESEXPR", nl_langinfo(YESEXPR)); + printf("%16s: \"%s\"\n", "NOEXPR", nl_langinfo(NOEXPR)); + printf("%16s: \"%s\"\n", "CRNCYSTR", nl_langinfo(CRNCYSTR)); + + printf("%16s: \"%s\"\n", "(bad value)", nl_langinfo(123)); + + return 0; +} diff --git a/tests/runner.py b/tests/runner.py index 14493612..ec47416f 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -2089,6 +2089,11 @@ if 'benchmark' not in sys.argv: expected = open(path_from_root('tests', 'printf', 'output.txt'), 'r').read() self.do_test(src, expected) + def test_langinfo(self): + src = open(path_from_root('tests', 'langinfo', 'test.c'), 'r').read() + expected = open(path_from_root('tests', 'langinfo', 'output.txt'), 'r').read() + self.do_test(src, expected) + def test_files(self): global CORRECT_SIGNS; CORRECT_SIGNS = 1 # Just so our output is what we expect. Can flip them both. def post(filename): |