commit 469daa16eeb2b894781ab6d6364a6d1d31db558e
parent 7707f3e7c3eea95551255f7dafa6ff918d3cf23a
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Thu, 20 Mar 2014 16:18:29 -0300
configuration for Lua type corresponding to 'time_t'
Diffstat:
M | loslib.c | | | 34 | ++++++++++++++++++++++++---------- |
1 file changed, 24 insertions(+), 10 deletions(-)
diff --git a/loslib.c b/loslib.c
@@ -1,5 +1,5 @@
/*
-** $Id: loslib.c,v 1.43 2014/02/26 15:55:58 roberto Exp roberto $
+** $Id: loslib.c,v 1.44 2014/03/12 20:57:40 roberto Exp roberto $
** Standard Operating System library
** See Copyright Notice in lua.h
*/
@@ -20,10 +20,10 @@
#include "lualib.h"
+#if !defined(LUA_STRFTIMEOPTIONS) /* { */
/*
** list of valid conversion specifiers for the 'strftime' function
*/
-#if !defined(LUA_STRFTIMEOPTIONS)
#if !defined(LUA_USE_POSIX)
#define LUA_STRFTIMEOPTIONS { "aAbBcdHIjmMpSUwWxXyYz%", "" }
@@ -34,15 +34,27 @@
"O", "deHImMSuUVwWy" }
#endif
-#endif
+#endif /* } */
+#if !defined(l_time_t) /* { */
+/*
+** type to represent time_t in Lua
+*/
+#define l_timet lua_Integer
+#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t))
+#define l_checktime(L,a) ((time_t)luaL_checkinteger(L,a))
+
+#endif /* } */
+
+
+
+#if !defined(lua_tmpnam) /* { */
/*
** By default, Lua uses tmpnam except when POSIX is available, where it
** uses mkstemp.
*/
-#if !defined(lua_tmpnam) /* { */
#if defined(LUA_USE_POSIX) /* { */
@@ -65,11 +77,12 @@
#endif /* } */
+
+#if !defined(l_gmtime) /* { */
/*
** By default, Lua uses gmtime/localtime, except when POSIX is available,
** where it uses gmtime_r/localtime_r
*/
-#if !defined(l_gmtime) /* { */
#if defined(LUA_USE_POSIX) /* { */
@@ -204,7 +217,7 @@ static const char *checkoption (lua_State *L, const char *conv, char *buff) {
static int os_date (lua_State *L) {
const char *s = luaL_optstring(L, 1, "%c");
- time_t t = luaL_opt(L, (time_t)luaL_checkinteger, 2, time(NULL));
+ time_t t = luaL_opt(L, l_checktime, 2, time(NULL));
struct tm tmr, *stm;
if (*s == '!') { /* UTC? */
stm = l_gmtime(&t, &tmr);
@@ -265,17 +278,18 @@ static int os_time (lua_State *L) {
ts.tm_isdst = getboolfield(L, "isdst");
t = mktime(&ts);
}
- if (t == (time_t)(-1))
+ if (t != (time_t)(l_timet)t)
+ luaL_error(L, "time result cannot be represented in this Lua instalation");
+ else if (t == (time_t)(-1))
lua_pushnil(L);
else
- lua_pushinteger(L, t);
+ l_pushtime(L, t);
return 1;
}
static int os_difftime (lua_State *L) {
- lua_pushnumber(L, difftime((time_t)(luaL_checkinteger(L, 1)),
- (time_t)(luaL_optinteger(L, 2, 0))));
+ lua_pushnumber(L, difftime((l_checktime(L, 1)), (l_checktime(L, 2))));
return 1;
}