diff --git a/bugs b/bugs index eaf2fd26..a489872f 100644 --- a/bugs +++ b/bugs @@ -1142,6 +1142,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 = [[ ]], diff --git a/loslib.c b/loslib.c index 3a1e8409..05138417 100644 --- 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; }