commit d513c3c66b3c71412d87a3f24b8f792b7b728e93
parent 93d3c8450c7a78321cf7f9db9173d46c62ebe958
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 19 Sep 2006 10:56:45 -0300
bug: os.date throws error when result is the empty string
Diffstat:
2 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/bugs b/bugs
@@ -1143,6 +1143,15 @@ patch = [[
Bug{
+what = [[os.date throws an error when result is the empty string]],
+report = [[ ]],
+since = [[4.0]],
+example = [[print(os.date(""))]],
+patch = [[ ]],
+}
+
+
+Bug{
what = [[ ]],
report = [[ ]],
since = [[ ]],
diff --git a/loslib.c b/loslib.c
@@ -1,5 +1,5 @@
/*
-** $Id: loslib.c,v 1.18 2006/03/09 18:08:22 roberto Exp roberto $
+** $Id: loslib.c,v 1.19 2006/04/26 18:19:49 roberto Exp roberto $
** Standard Operating System library
** See Copyright Notice in lua.h
*/
@@ -146,11 +146,22 @@ static int os_date (lua_State *L) {
setboolfield(L, "isdst", stm->tm_isdst);
}
else {
- char b[256];
- if (strftime(b, sizeof(b), s, stm))
- lua_pushstring(L, b);
- else
- return luaL_error(L, LUA_QL("date") " format too long");
+ char cc[3];
+ luaL_Buffer b;
+ cc[0] = '%'; cc[2] = '\0';
+ luaL_buffinit(L, &b);
+ for (; *s; s++) {
+ if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */
+ luaL_addchar(&b, *s);
+ else {
+ size_t reslen;
+ char buff[200]; /* should be big enough for any conversion result */
+ cc[1] = *(++s);
+ reslen = strftime(buff, sizeof(buff), cc, stm);
+ luaL_addlstring(&b, buff, reslen);
+ }
+ }
+ luaL_pushresult(&b);
}
return 1;
}