diff options
-rw-r--r-- | src/lapi.js | 2 | ||||
-rw-r--r-- | src/loslib.js | 54 | ||||
-rw-r--r-- | tests/loslib.js | 65 |
3 files changed, 102 insertions, 19 deletions
diff --git a/src/lapi.js b/src/lapi.js index e813313..6b853ae 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -778,7 +778,7 @@ const lua_isinteger = function(L, idx) { }; const lua_isnumber = function(L, idx) { - return lvm.tonumber(L, idx); + return lvm.tonumber(index2addr(L, idx)) !== false; }; const lua_isstring = function(L, idx) { diff --git a/src/loslib.js b/src/loslib.js index cb82bc3..4c3331d 100644 --- a/src/loslib.js +++ b/src/loslib.js @@ -6,7 +6,7 @@ const llimit = require('./llimit.js'); const setfield = function(L, key, value) { lua.lua_pushinteger(L, value); - lua.lua_setfield(L, -2, key); + lua.lua_setfield(L, -2, lua.to_luastring(key, true)); }; const setallfields = function(L, time) { @@ -15,7 +15,7 @@ const setallfields = function(L, time) { setfield(L, "hour", time.getHours()); setfield(L, "day", time.getDate()); setfield(L, "month", time.getMonth()); - setfield(L, "year", time.getYear()); + setfield(L, "year", time.getFullYear()); setfield(L, "wday", time.getDay()); let now = new Date(); setfield(L, "yday", Math.floor((now - (new Date(now.getFullYear(), 0, 0))) / (1000 * 60 * 60 * 24))); @@ -25,10 +25,10 @@ const setallfields = function(L, time) { const L_MAXDATEFIELD = (llimit.MAX_INT / 2); const getfield = function(L, key, d, delta) { - let t = lua.lua_getfield(L, -1, lua.to_luastring(key)); /* get field and its type */ + let t = lua.lua_getfield(L, -1, lua.to_luastring(key, true)); /* get field and its type */ let res = lua.lua_tointegerx(L, -1); - if (res !== false) { /* field is not an integer? */ - if (t != lua.LUA_TNIL) /* some other value? */ + if (res === false) { /* field is not an integer? */ + if (t !== lua.LUA_TNIL) /* some other value? */ return lauxlib.luaL_error(L, lua.to_luastring(`field '${key}' is not an integer`), true); else if (d < 0) /* absent field; no default? */ return lauxlib.luaL_error(L, lua.to_luastring(`field '${key}' missing in date table`), true); @@ -49,11 +49,11 @@ const os_time = function(L) { lauxlib.luaL_checktype(L, 1, lua.LUA_TTABLE); /* make sure table is at the top */ lua.lua_settop(L, 1); t.setSeconds(getfield(L, "sec", 0, 0)); - t.setSeconds(getfield(L, "min", 0, 0)); - t.setSeconds(getfield(L, "hour", 12, 0)); - t.setSeconds(getfield(L, "day", -1, 0)); - t.setSeconds(getfield(L, "month", -1, 1)); - t.setSeconds(getfield(L, "year", -1, 1900)); + t.setMinutes(getfield(L, "min", 0, 0)); + t.setHours(getfield(L, "hour", 12, 0)); + t.setDate(getfield(L, "day", -1, 0)); + t.setMonth(getfield(L, "month", -1, 1)); + t.setFullYear(getfield(L, "year", -1, 0)); setallfields(L, t); } @@ -61,9 +61,22 @@ const os_time = function(L) { return 1; }; +const l_checktime = function(L, arg) { + let t = lauxlib.luaL_checkinteger(L, arg); + // lauxlib.luaL_argcheck(L, t, arg, lua.to_luastring("time out-of-bounds")); + return t; +}; + +const os_difftime = function(L) { + let t1 = l_checktime(L, 1); + let t2 = l_checktime(L, 2); + lua.lua_pushnumber(L, new Date(t1) - new Date(t2)); + return 1; +}; const syslib = { - "time": os_time + "time": os_time, + "difftime": os_difftime }; // Only with Node @@ -149,27 +162,32 @@ if (typeof require === "function") { if (child_process) { const os_execute = function(L) { let cmd = lauxlib.luaL_optstring(L, 1, null); - let out = false; if (cmd !== null) { try { - out = child_process.execSync(lua.to_jsstring(cmd)); + child_process.execSync( + lua.to_jsstring(cmd), + { + stdio: [process.stdin, process.stdout, process.stderr] + } + ); } catch (e) { return lauxlib.luaL_execresult(L, false, e); } - // if (out) console.log(out); - return lauxlib.luaL_execresult(L, true); } else { try { - out = child_process.execSync(lua.to_jsstring(cmd)); + child_process.execSync( + lua.to_jsstring(cmd), + { + stdio: [process.stdin, process.stdout, process.stderr] + } + ); lua.lua_pushboolean(L, 1); } catch (e) { lua.lua_pushboolean(L, 0); } - // if (out) console.log(out); - return 1; } }; diff --git a/tests/loslib.js b/tests/loslib.js index c460919..8555bc4 100644 --- a/tests/loslib.js +++ b/tests/loslib.js @@ -36,6 +36,71 @@ test('os.time', function (t) { }); +test('os.time (with format)', function (t) { + let luaCode = ` + return os.time({day=8,month=2,year=2015}) + `, L; + + t.plan(3); + + t.doesNotThrow(function () { + + L = lauxlib.luaL_newstate(); + + lauxlib.luaL_openlibs(L); + + lauxlib.luaL_loadstring(L, lua.to_luastring(luaCode)); + + }, "Lua program loaded without error"); + + t.doesNotThrow(function () { + + lua.lua_call(L, 0, -1); + + }, "Lua program ran without error"); + + t.strictEqual( + lua.lua_tointeger(L, -1), + new Date(2015, 1, 8, 12, 0, 0, 0).getTime() / 1000, + "Correct element(s) on the stack" + ); + +}); + + +test('os.difftime', function (t) { + let luaCode = ` + local t1 = os.time() + local t2 = os.time() + return os.difftime(t2, t1) + `, L; + + t.plan(3); + + t.doesNotThrow(function () { + + L = lauxlib.luaL_newstate(); + + lauxlib.luaL_openlibs(L); + + lauxlib.luaL_loadstring(L, lua.to_luastring(luaCode)); + + }, "Lua program loaded without error"); + + t.doesNotThrow(function () { + + lua.lua_call(L, 0, -1); + + }, "Lua program ran without error"); + + t.ok( + lua.lua_isnumber(L, -1), + "Correct element(s) on the stack" + ); + +}); + + test('os.getenv', function (t) { let luaCode = ` return os.getenv('HOME') |