aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-08-17 07:44:30 +0300
committermax99x <max99x@gmail.com>2011-08-17 07:44:30 +0300
commitee4b6ebf353585fb0eb0809a4b677f5694a9ba79 (patch)
tree772d9a2df3622a9f2ac8079af2b149c35d4d6ee7
parent7172aacb563367fae198c25743827ef1195083aa (diff)
Implemented nl_langinfo().
-rw-r--r--src/library.js175
-rw-r--r--tests/langinfo/output.txt56
-rw-r--r--tests/langinfo/test.c64
-rw-r--r--tests/runner.py5
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 ebebfc16..e7cdcff1 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -2080,6 +2080,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):