116a5fed65808adf648004b34f98718301d718fa2darylm/* 216a5fed65808adf648004b34f98718301d718fa2darylm** $Id: loslib.c,v 1.40.1.1 2013/04/12 18:48:47 roberto Exp $ 316a5fed65808adf648004b34f98718301d718fa2darylm** Standard Operating System library 416a5fed65808adf648004b34f98718301d718fa2darylm** See Copyright Notice in lua.h 516a5fed65808adf648004b34f98718301d718fa2darylm*/ 616a5fed65808adf648004b34f98718301d718fa2darylm 716a5fed65808adf648004b34f98718301d718fa2darylm 816a5fed65808adf648004b34f98718301d718fa2darylm#include <errno.h> 916a5fed65808adf648004b34f98718301d718fa2darylm#include <locale.h> 1016a5fed65808adf648004b34f98718301d718fa2darylm#include <stdlib.h> 1116a5fed65808adf648004b34f98718301d718fa2darylm#include <string.h> 1216a5fed65808adf648004b34f98718301d718fa2darylm#include <time.h> 1316a5fed65808adf648004b34f98718301d718fa2darylm 1416a5fed65808adf648004b34f98718301d718fa2darylm#define loslib_c 1516a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_LIB 1616a5fed65808adf648004b34f98718301d718fa2darylm 1716a5fed65808adf648004b34f98718301d718fa2darylm#include "lua.h" 1816a5fed65808adf648004b34f98718301d718fa2darylm 1916a5fed65808adf648004b34f98718301d718fa2darylm#include "lauxlib.h" 2016a5fed65808adf648004b34f98718301d718fa2darylm#include "lualib.h" 2116a5fed65808adf648004b34f98718301d718fa2darylm 2216a5fed65808adf648004b34f98718301d718fa2darylm 2316a5fed65808adf648004b34f98718301d718fa2darylm/* 2416a5fed65808adf648004b34f98718301d718fa2darylm** list of valid conversion specifiers for the 'strftime' function 2516a5fed65808adf648004b34f98718301d718fa2darylm*/ 2616a5fed65808adf648004b34f98718301d718fa2darylm#if !defined(LUA_STRFTIMEOPTIONS) 2716a5fed65808adf648004b34f98718301d718fa2darylm 2816a5fed65808adf648004b34f98718301d718fa2darylm#if !defined(LUA_USE_POSIX) 2916a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_STRFTIMEOPTIONS { "aAbBcdHIjmMpSUwWxXyYz%", "" } 3016a5fed65808adf648004b34f98718301d718fa2darylm#else 3116a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_STRFTIMEOPTIONS \ 3216a5fed65808adf648004b34f98718301d718fa2darylm { "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%", "" \ 3316a5fed65808adf648004b34f98718301d718fa2darylm "", "E", "cCxXyY", \ 3416a5fed65808adf648004b34f98718301d718fa2darylm "O", "deHImMSuUVwWy" } 3516a5fed65808adf648004b34f98718301d718fa2darylm#endif 3616a5fed65808adf648004b34f98718301d718fa2darylm 3716a5fed65808adf648004b34f98718301d718fa2darylm#endif 3816a5fed65808adf648004b34f98718301d718fa2darylm 3916a5fed65808adf648004b34f98718301d718fa2darylm 4016a5fed65808adf648004b34f98718301d718fa2darylm 4116a5fed65808adf648004b34f98718301d718fa2darylm/* 4216a5fed65808adf648004b34f98718301d718fa2darylm** By default, Lua uses tmpnam except when POSIX is available, where it 4316a5fed65808adf648004b34f98718301d718fa2darylm** uses mkstemp. 4416a5fed65808adf648004b34f98718301d718fa2darylm*/ 4516a5fed65808adf648004b34f98718301d718fa2darylm#if defined(LUA_USE_MKSTEMP) 4616a5fed65808adf648004b34f98718301d718fa2darylm#include <unistd.h> 4716a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TMPNAMBUFSIZE 32 4816a5fed65808adf648004b34f98718301d718fa2darylm#define lua_tmpnam(b,e) { \ 4916a5fed65808adf648004b34f98718301d718fa2darylm strcpy(b, "/tmp/lua_XXXXXX"); \ 5016a5fed65808adf648004b34f98718301d718fa2darylm e = mkstemp(b); \ 5116a5fed65808adf648004b34f98718301d718fa2darylm if (e != -1) close(e); \ 5216a5fed65808adf648004b34f98718301d718fa2darylm e = (e == -1); } 5316a5fed65808adf648004b34f98718301d718fa2darylm 5416a5fed65808adf648004b34f98718301d718fa2darylm#elif !defined(lua_tmpnam) 5516a5fed65808adf648004b34f98718301d718fa2darylm 5616a5fed65808adf648004b34f98718301d718fa2darylm#define LUA_TMPNAMBUFSIZE L_tmpnam 5716a5fed65808adf648004b34f98718301d718fa2darylm#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } 5816a5fed65808adf648004b34f98718301d718fa2darylm 5916a5fed65808adf648004b34f98718301d718fa2darylm#endif 6016a5fed65808adf648004b34f98718301d718fa2darylm 6116a5fed65808adf648004b34f98718301d718fa2darylm 6216a5fed65808adf648004b34f98718301d718fa2darylm/* 6316a5fed65808adf648004b34f98718301d718fa2darylm** By default, Lua uses gmtime/localtime, except when POSIX is available, 6416a5fed65808adf648004b34f98718301d718fa2darylm** where it uses gmtime_r/localtime_r 6516a5fed65808adf648004b34f98718301d718fa2darylm*/ 6616a5fed65808adf648004b34f98718301d718fa2darylm#if defined(LUA_USE_GMTIME_R) 6716a5fed65808adf648004b34f98718301d718fa2darylm 6816a5fed65808adf648004b34f98718301d718fa2darylm#define l_gmtime(t,r) gmtime_r(t,r) 6916a5fed65808adf648004b34f98718301d718fa2darylm#define l_localtime(t,r) localtime_r(t,r) 7016a5fed65808adf648004b34f98718301d718fa2darylm 7116a5fed65808adf648004b34f98718301d718fa2darylm#elif !defined(l_gmtime) 7216a5fed65808adf648004b34f98718301d718fa2darylm 7316a5fed65808adf648004b34f98718301d718fa2darylm#define l_gmtime(t,r) ((void)r, gmtime(t)) 7416a5fed65808adf648004b34f98718301d718fa2darylm#define l_localtime(t,r) ((void)r, localtime(t)) 7516a5fed65808adf648004b34f98718301d718fa2darylm 7616a5fed65808adf648004b34f98718301d718fa2darylm#endif 7716a5fed65808adf648004b34f98718301d718fa2darylm 7816a5fed65808adf648004b34f98718301d718fa2darylm 7916a5fed65808adf648004b34f98718301d718fa2darylm 8016a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_execute (lua_State *L) { 8116a5fed65808adf648004b34f98718301d718fa2darylm const char *cmd = luaL_optstring(L, 1, NULL); 8216a5fed65808adf648004b34f98718301d718fa2darylm int stat = system(cmd); 8316a5fed65808adf648004b34f98718301d718fa2darylm if (cmd != NULL) 8416a5fed65808adf648004b34f98718301d718fa2darylm return luaL_execresult(L, stat); 8516a5fed65808adf648004b34f98718301d718fa2darylm else { 8616a5fed65808adf648004b34f98718301d718fa2darylm lua_pushboolean(L, stat); /* true if there is a shell */ 8716a5fed65808adf648004b34f98718301d718fa2darylm return 1; 8816a5fed65808adf648004b34f98718301d718fa2darylm } 8916a5fed65808adf648004b34f98718301d718fa2darylm} 9016a5fed65808adf648004b34f98718301d718fa2darylm 9116a5fed65808adf648004b34f98718301d718fa2darylm 9216a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_remove (lua_State *L) { 9316a5fed65808adf648004b34f98718301d718fa2darylm const char *filename = luaL_checkstring(L, 1); 9416a5fed65808adf648004b34f98718301d718fa2darylm return luaL_fileresult(L, remove(filename) == 0, filename); 9516a5fed65808adf648004b34f98718301d718fa2darylm} 9616a5fed65808adf648004b34f98718301d718fa2darylm 9716a5fed65808adf648004b34f98718301d718fa2darylm 9816a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_rename (lua_State *L) { 9916a5fed65808adf648004b34f98718301d718fa2darylm const char *fromname = luaL_checkstring(L, 1); 10016a5fed65808adf648004b34f98718301d718fa2darylm const char *toname = luaL_checkstring(L, 2); 10116a5fed65808adf648004b34f98718301d718fa2darylm return luaL_fileresult(L, rename(fromname, toname) == 0, NULL); 10216a5fed65808adf648004b34f98718301d718fa2darylm} 10316a5fed65808adf648004b34f98718301d718fa2darylm 10416a5fed65808adf648004b34f98718301d718fa2darylm 10516a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_tmpname (lua_State *L) { 10616a5fed65808adf648004b34f98718301d718fa2darylm char buff[LUA_TMPNAMBUFSIZE]; 10716a5fed65808adf648004b34f98718301d718fa2darylm int err; 10816a5fed65808adf648004b34f98718301d718fa2darylm lua_tmpnam(buff, err); 10916a5fed65808adf648004b34f98718301d718fa2darylm if (err) 11016a5fed65808adf648004b34f98718301d718fa2darylm return luaL_error(L, "unable to generate a unique filename"); 11116a5fed65808adf648004b34f98718301d718fa2darylm lua_pushstring(L, buff); 11216a5fed65808adf648004b34f98718301d718fa2darylm return 1; 11316a5fed65808adf648004b34f98718301d718fa2darylm} 11416a5fed65808adf648004b34f98718301d718fa2darylm 11516a5fed65808adf648004b34f98718301d718fa2darylm 11616a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_getenv (lua_State *L) { 11716a5fed65808adf648004b34f98718301d718fa2darylm lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ 11816a5fed65808adf648004b34f98718301d718fa2darylm return 1; 11916a5fed65808adf648004b34f98718301d718fa2darylm} 12016a5fed65808adf648004b34f98718301d718fa2darylm 12116a5fed65808adf648004b34f98718301d718fa2darylm 12216a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_clock (lua_State *L) { 12316a5fed65808adf648004b34f98718301d718fa2darylm lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); 12416a5fed65808adf648004b34f98718301d718fa2darylm return 1; 12516a5fed65808adf648004b34f98718301d718fa2darylm} 12616a5fed65808adf648004b34f98718301d718fa2darylm 12716a5fed65808adf648004b34f98718301d718fa2darylm 12816a5fed65808adf648004b34f98718301d718fa2darylm/* 12916a5fed65808adf648004b34f98718301d718fa2darylm** {====================================================== 13016a5fed65808adf648004b34f98718301d718fa2darylm** Time/Date operations 13116a5fed65808adf648004b34f98718301d718fa2darylm** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, 13216a5fed65808adf648004b34f98718301d718fa2darylm** wday=%w+1, yday=%j, isdst=? } 13316a5fed65808adf648004b34f98718301d718fa2darylm** ======================================================= 13416a5fed65808adf648004b34f98718301d718fa2darylm*/ 13516a5fed65808adf648004b34f98718301d718fa2darylm 13616a5fed65808adf648004b34f98718301d718fa2darylmstatic void setfield (lua_State *L, const char *key, int value) { 13716a5fed65808adf648004b34f98718301d718fa2darylm lua_pushinteger(L, value); 13816a5fed65808adf648004b34f98718301d718fa2darylm lua_setfield(L, -2, key); 13916a5fed65808adf648004b34f98718301d718fa2darylm} 14016a5fed65808adf648004b34f98718301d718fa2darylm 14116a5fed65808adf648004b34f98718301d718fa2darylmstatic void setboolfield (lua_State *L, const char *key, int value) { 14216a5fed65808adf648004b34f98718301d718fa2darylm if (value < 0) /* undefined? */ 14316a5fed65808adf648004b34f98718301d718fa2darylm return; /* does not set field */ 14416a5fed65808adf648004b34f98718301d718fa2darylm lua_pushboolean(L, value); 14516a5fed65808adf648004b34f98718301d718fa2darylm lua_setfield(L, -2, key); 14616a5fed65808adf648004b34f98718301d718fa2darylm} 14716a5fed65808adf648004b34f98718301d718fa2darylm 14816a5fed65808adf648004b34f98718301d718fa2darylmstatic int getboolfield (lua_State *L, const char *key) { 14916a5fed65808adf648004b34f98718301d718fa2darylm int res; 15016a5fed65808adf648004b34f98718301d718fa2darylm lua_getfield(L, -1, key); 15116a5fed65808adf648004b34f98718301d718fa2darylm res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); 15216a5fed65808adf648004b34f98718301d718fa2darylm lua_pop(L, 1); 15316a5fed65808adf648004b34f98718301d718fa2darylm return res; 15416a5fed65808adf648004b34f98718301d718fa2darylm} 15516a5fed65808adf648004b34f98718301d718fa2darylm 15616a5fed65808adf648004b34f98718301d718fa2darylm 15716a5fed65808adf648004b34f98718301d718fa2darylmstatic int getfield (lua_State *L, const char *key, int d) { 15816a5fed65808adf648004b34f98718301d718fa2darylm int res, isnum; 15916a5fed65808adf648004b34f98718301d718fa2darylm lua_getfield(L, -1, key); 16016a5fed65808adf648004b34f98718301d718fa2darylm res = (int)lua_tointegerx(L, -1, &isnum); 16116a5fed65808adf648004b34f98718301d718fa2darylm if (!isnum) { 16216a5fed65808adf648004b34f98718301d718fa2darylm if (d < 0) 16316a5fed65808adf648004b34f98718301d718fa2darylm return luaL_error(L, "field " LUA_QS " missing in date table", key); 16416a5fed65808adf648004b34f98718301d718fa2darylm res = d; 16516a5fed65808adf648004b34f98718301d718fa2darylm } 16616a5fed65808adf648004b34f98718301d718fa2darylm lua_pop(L, 1); 16716a5fed65808adf648004b34f98718301d718fa2darylm return res; 16816a5fed65808adf648004b34f98718301d718fa2darylm} 16916a5fed65808adf648004b34f98718301d718fa2darylm 17016a5fed65808adf648004b34f98718301d718fa2darylm 17116a5fed65808adf648004b34f98718301d718fa2darylmstatic const char *checkoption (lua_State *L, const char *conv, char *buff) { 17216a5fed65808adf648004b34f98718301d718fa2darylm static const char *const options[] = LUA_STRFTIMEOPTIONS; 17316a5fed65808adf648004b34f98718301d718fa2darylm unsigned int i; 17416a5fed65808adf648004b34f98718301d718fa2darylm for (i = 0; i < sizeof(options)/sizeof(options[0]); i += 2) { 17516a5fed65808adf648004b34f98718301d718fa2darylm if (*conv != '\0' && strchr(options[i], *conv) != NULL) { 17616a5fed65808adf648004b34f98718301d718fa2darylm buff[1] = *conv; 17716a5fed65808adf648004b34f98718301d718fa2darylm if (*options[i + 1] == '\0') { /* one-char conversion specifier? */ 17816a5fed65808adf648004b34f98718301d718fa2darylm buff[2] = '\0'; /* end buffer */ 17916a5fed65808adf648004b34f98718301d718fa2darylm return conv + 1; 18016a5fed65808adf648004b34f98718301d718fa2darylm } 18116a5fed65808adf648004b34f98718301d718fa2darylm else if (*(conv + 1) != '\0' && 18216a5fed65808adf648004b34f98718301d718fa2darylm strchr(options[i + 1], *(conv + 1)) != NULL) { 18316a5fed65808adf648004b34f98718301d718fa2darylm buff[2] = *(conv + 1); /* valid two-char conversion specifier */ 18416a5fed65808adf648004b34f98718301d718fa2darylm buff[3] = '\0'; /* end buffer */ 18516a5fed65808adf648004b34f98718301d718fa2darylm return conv + 2; 18616a5fed65808adf648004b34f98718301d718fa2darylm } 18716a5fed65808adf648004b34f98718301d718fa2darylm } 18816a5fed65808adf648004b34f98718301d718fa2darylm } 18916a5fed65808adf648004b34f98718301d718fa2darylm luaL_argerror(L, 1, 19016a5fed65808adf648004b34f98718301d718fa2darylm lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv)); 19116a5fed65808adf648004b34f98718301d718fa2darylm return conv; /* to avoid warnings */ 19216a5fed65808adf648004b34f98718301d718fa2darylm} 19316a5fed65808adf648004b34f98718301d718fa2darylm 19416a5fed65808adf648004b34f98718301d718fa2darylm 19516a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_date (lua_State *L) { 19616a5fed65808adf648004b34f98718301d718fa2darylm const char *s = luaL_optstring(L, 1, "%c"); 19716a5fed65808adf648004b34f98718301d718fa2darylm time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); 19816a5fed65808adf648004b34f98718301d718fa2darylm struct tm tmr, *stm; 19916a5fed65808adf648004b34f98718301d718fa2darylm if (*s == '!') { /* UTC? */ 20016a5fed65808adf648004b34f98718301d718fa2darylm stm = l_gmtime(&t, &tmr); 20116a5fed65808adf648004b34f98718301d718fa2darylm s++; /* skip `!' */ 20216a5fed65808adf648004b34f98718301d718fa2darylm } 20316a5fed65808adf648004b34f98718301d718fa2darylm else 20416a5fed65808adf648004b34f98718301d718fa2darylm stm = l_localtime(&t, &tmr); 20516a5fed65808adf648004b34f98718301d718fa2darylm if (stm == NULL) /* invalid date? */ 20616a5fed65808adf648004b34f98718301d718fa2darylm lua_pushnil(L); 20716a5fed65808adf648004b34f98718301d718fa2darylm else if (strcmp(s, "*t") == 0) { 20816a5fed65808adf648004b34f98718301d718fa2darylm lua_createtable(L, 0, 9); /* 9 = number of fields */ 20916a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "sec", stm->tm_sec); 21016a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "min", stm->tm_min); 21116a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "hour", stm->tm_hour); 21216a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "day", stm->tm_mday); 21316a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "month", stm->tm_mon+1); 21416a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "year", stm->tm_year+1900); 21516a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "wday", stm->tm_wday+1); 21616a5fed65808adf648004b34f98718301d718fa2darylm setfield(L, "yday", stm->tm_yday+1); 21716a5fed65808adf648004b34f98718301d718fa2darylm setboolfield(L, "isdst", stm->tm_isdst); 21816a5fed65808adf648004b34f98718301d718fa2darylm } 21916a5fed65808adf648004b34f98718301d718fa2darylm else { 22016a5fed65808adf648004b34f98718301d718fa2darylm char cc[4]; 22116a5fed65808adf648004b34f98718301d718fa2darylm luaL_Buffer b; 22216a5fed65808adf648004b34f98718301d718fa2darylm cc[0] = '%'; 22316a5fed65808adf648004b34f98718301d718fa2darylm luaL_buffinit(L, &b); 22416a5fed65808adf648004b34f98718301d718fa2darylm while (*s) { 22516a5fed65808adf648004b34f98718301d718fa2darylm if (*s != '%') /* no conversion specifier? */ 22616a5fed65808adf648004b34f98718301d718fa2darylm luaL_addchar(&b, *s++); 22716a5fed65808adf648004b34f98718301d718fa2darylm else { 22816a5fed65808adf648004b34f98718301d718fa2darylm size_t reslen; 22916a5fed65808adf648004b34f98718301d718fa2darylm char buff[200]; /* should be big enough for any conversion result */ 23016a5fed65808adf648004b34f98718301d718fa2darylm s = checkoption(L, s + 1, cc); 23116a5fed65808adf648004b34f98718301d718fa2darylm reslen = strftime(buff, sizeof(buff), cc, stm); 23216a5fed65808adf648004b34f98718301d718fa2darylm luaL_addlstring(&b, buff, reslen); 23316a5fed65808adf648004b34f98718301d718fa2darylm } 23416a5fed65808adf648004b34f98718301d718fa2darylm } 23516a5fed65808adf648004b34f98718301d718fa2darylm luaL_pushresult(&b); 23616a5fed65808adf648004b34f98718301d718fa2darylm } 23716a5fed65808adf648004b34f98718301d718fa2darylm return 1; 23816a5fed65808adf648004b34f98718301d718fa2darylm} 23916a5fed65808adf648004b34f98718301d718fa2darylm 24016a5fed65808adf648004b34f98718301d718fa2darylm 24116a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_time (lua_State *L) { 24216a5fed65808adf648004b34f98718301d718fa2darylm time_t t; 24316a5fed65808adf648004b34f98718301d718fa2darylm if (lua_isnoneornil(L, 1)) /* called without args? */ 24416a5fed65808adf648004b34f98718301d718fa2darylm t = time(NULL); /* get current time */ 24516a5fed65808adf648004b34f98718301d718fa2darylm else { 24616a5fed65808adf648004b34f98718301d718fa2darylm struct tm ts; 24716a5fed65808adf648004b34f98718301d718fa2darylm luaL_checktype(L, 1, LUA_TTABLE); 24816a5fed65808adf648004b34f98718301d718fa2darylm lua_settop(L, 1); /* make sure table is at the top */ 24916a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_sec = getfield(L, "sec", 0); 25016a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_min = getfield(L, "min", 0); 25116a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_hour = getfield(L, "hour", 12); 25216a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_mday = getfield(L, "day", -1); 25316a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_mon = getfield(L, "month", -1) - 1; 25416a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_year = getfield(L, "year", -1) - 1900; 25516a5fed65808adf648004b34f98718301d718fa2darylm ts.tm_isdst = getboolfield(L, "isdst"); 25616a5fed65808adf648004b34f98718301d718fa2darylm t = mktime(&ts); 25716a5fed65808adf648004b34f98718301d718fa2darylm } 25816a5fed65808adf648004b34f98718301d718fa2darylm if (t == (time_t)(-1)) 25916a5fed65808adf648004b34f98718301d718fa2darylm lua_pushnil(L); 26016a5fed65808adf648004b34f98718301d718fa2darylm else 26116a5fed65808adf648004b34f98718301d718fa2darylm lua_pushnumber(L, (lua_Number)t); 26216a5fed65808adf648004b34f98718301d718fa2darylm return 1; 26316a5fed65808adf648004b34f98718301d718fa2darylm} 26416a5fed65808adf648004b34f98718301d718fa2darylm 26516a5fed65808adf648004b34f98718301d718fa2darylm 26616a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_difftime (lua_State *L) { 26716a5fed65808adf648004b34f98718301d718fa2darylm lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), 26816a5fed65808adf648004b34f98718301d718fa2darylm (time_t)(luaL_optnumber(L, 2, 0)))); 26916a5fed65808adf648004b34f98718301d718fa2darylm return 1; 27016a5fed65808adf648004b34f98718301d718fa2darylm} 27116a5fed65808adf648004b34f98718301d718fa2darylm 27216a5fed65808adf648004b34f98718301d718fa2darylm/* }====================================================== */ 27316a5fed65808adf648004b34f98718301d718fa2darylm 27416a5fed65808adf648004b34f98718301d718fa2darylm 27516a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_setlocale (lua_State *L) { 27616a5fed65808adf648004b34f98718301d718fa2darylm static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, 27716a5fed65808adf648004b34f98718301d718fa2darylm LC_NUMERIC, LC_TIME}; 27816a5fed65808adf648004b34f98718301d718fa2darylm static const char *const catnames[] = {"all", "collate", "ctype", "monetary", 27916a5fed65808adf648004b34f98718301d718fa2darylm "numeric", "time", NULL}; 28016a5fed65808adf648004b34f98718301d718fa2darylm const char *l = luaL_optstring(L, 1, NULL); 28116a5fed65808adf648004b34f98718301d718fa2darylm int op = luaL_checkoption(L, 2, "all", catnames); 28216a5fed65808adf648004b34f98718301d718fa2darylm lua_pushstring(L, setlocale(cat[op], l)); 28316a5fed65808adf648004b34f98718301d718fa2darylm return 1; 28416a5fed65808adf648004b34f98718301d718fa2darylm} 28516a5fed65808adf648004b34f98718301d718fa2darylm 28616a5fed65808adf648004b34f98718301d718fa2darylm 28716a5fed65808adf648004b34f98718301d718fa2darylmstatic int os_exit (lua_State *L) { 28816a5fed65808adf648004b34f98718301d718fa2darylm int status; 28916a5fed65808adf648004b34f98718301d718fa2darylm if (lua_isboolean(L, 1)) 29016a5fed65808adf648004b34f98718301d718fa2darylm status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE); 29116a5fed65808adf648004b34f98718301d718fa2darylm else 29216a5fed65808adf648004b34f98718301d718fa2darylm status = luaL_optint(L, 1, EXIT_SUCCESS); 29316a5fed65808adf648004b34f98718301d718fa2darylm if (lua_toboolean(L, 2)) 29416a5fed65808adf648004b34f98718301d718fa2darylm lua_close(L); 29516a5fed65808adf648004b34f98718301d718fa2darylm if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */ 29616a5fed65808adf648004b34f98718301d718fa2darylm return 0; 29716a5fed65808adf648004b34f98718301d718fa2darylm} 29816a5fed65808adf648004b34f98718301d718fa2darylm 29916a5fed65808adf648004b34f98718301d718fa2darylm 30016a5fed65808adf648004b34f98718301d718fa2darylmstatic const luaL_Reg syslib[] = { 30116a5fed65808adf648004b34f98718301d718fa2darylm {"clock", os_clock}, 30216a5fed65808adf648004b34f98718301d718fa2darylm {"date", os_date}, 30316a5fed65808adf648004b34f98718301d718fa2darylm {"difftime", os_difftime}, 30416a5fed65808adf648004b34f98718301d718fa2darylm {"execute", os_execute}, 30516a5fed65808adf648004b34f98718301d718fa2darylm {"exit", os_exit}, 30616a5fed65808adf648004b34f98718301d718fa2darylm {"getenv", os_getenv}, 30716a5fed65808adf648004b34f98718301d718fa2darylm {"remove", os_remove}, 30816a5fed65808adf648004b34f98718301d718fa2darylm {"rename", os_rename}, 30916a5fed65808adf648004b34f98718301d718fa2darylm {"setlocale", os_setlocale}, 31016a5fed65808adf648004b34f98718301d718fa2darylm {"time", os_time}, 31116a5fed65808adf648004b34f98718301d718fa2darylm {"tmpname", os_tmpname}, 31216a5fed65808adf648004b34f98718301d718fa2darylm {NULL, NULL} 31316a5fed65808adf648004b34f98718301d718fa2darylm}; 31416a5fed65808adf648004b34f98718301d718fa2darylm 31516a5fed65808adf648004b34f98718301d718fa2darylm/* }====================================================== */ 31616a5fed65808adf648004b34f98718301d718fa2darylm 31716a5fed65808adf648004b34f98718301d718fa2darylm 31816a5fed65808adf648004b34f98718301d718fa2darylm 31916a5fed65808adf648004b34f98718301d718fa2darylmLUAMOD_API int luaopen_os (lua_State *L) { 32016a5fed65808adf648004b34f98718301d718fa2darylm luaL_newlib(L, syslib); 32116a5fed65808adf648004b34f98718301d718fa2darylm return 1; 32216a5fed65808adf648004b34f98718301d718fa2darylm} 32316a5fed65808adf648004b34f98718301d718fa2darylm 324