diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib_os.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/src/lib_os.c b/src/lib_os.c index e57e5ec8..941c2a5d 100644 --- a/src/lib_os.c +++ b/src/lib_os.c | |||
@@ -17,7 +17,10 @@ | |||
17 | #include "lualib.h" | 17 | #include "lualib.h" |
18 | 18 | ||
19 | #include "lj_obj.h" | 19 | #include "lj_obj.h" |
20 | #include "lj_gc.h" | ||
20 | #include "lj_err.h" | 21 | #include "lj_err.h" |
22 | #include "lj_buf.h" | ||
23 | #include "lj_str.h" | ||
21 | #include "lj_lib.h" | 24 | #include "lj_lib.h" |
22 | 25 | ||
23 | #if LJ_TARGET_POSIX | 26 | #if LJ_TARGET_POSIX |
@@ -188,7 +191,7 @@ LJLIB_CF(os_date) | |||
188 | #endif | 191 | #endif |
189 | } | 192 | } |
190 | if (stm == NULL) { /* Invalid date? */ | 193 | if (stm == NULL) { /* Invalid date? */ |
191 | setnilV(L->top-1); | 194 | setnilV(L->top++); |
192 | } else if (strcmp(s, "*t") == 0) { | 195 | } else if (strcmp(s, "*t") == 0) { |
193 | lua_createtable(L, 0, 9); /* 9 = number of fields */ | 196 | lua_createtable(L, 0, 9); /* 9 = number of fields */ |
194 | setfield(L, "sec", stm->tm_sec); | 197 | setfield(L, "sec", stm->tm_sec); |
@@ -200,23 +203,25 @@ LJLIB_CF(os_date) | |||
200 | setfield(L, "wday", stm->tm_wday+1); | 203 | setfield(L, "wday", stm->tm_wday+1); |
201 | setfield(L, "yday", stm->tm_yday+1); | 204 | setfield(L, "yday", stm->tm_yday+1); |
202 | setboolfield(L, "isdst", stm->tm_isdst); | 205 | setboolfield(L, "isdst", stm->tm_isdst); |
203 | } else { | 206 | } else if (*s) { |
204 | char cc[3]; | 207 | SBuf *sb = &G(L)->tmpbuf; |
205 | luaL_Buffer b; | 208 | MSize sz = 0; |
206 | cc[0] = '%'; cc[2] = '\0'; | 209 | const char *q; |
207 | luaL_buffinit(L, &b); | 210 | for (q = s; *q; q++) |
208 | for (; *s; s++) { | 211 | sz += (*q == '%') ? 30 : 1; /* Overflow doesn't matter. */ |
209 | if (*s != '%' || *(s + 1) == '\0') { /* No conversion specifier? */ | 212 | setsbufL(sb, L); |
210 | luaL_addchar(&b, *s); | 213 | for (;;) { |
211 | } else { | 214 | char *buf = lj_buf_need(sb, sz); |
212 | size_t reslen; | 215 | size_t len = strftime(buf, sbufsz(sb), s, stm); |
213 | char buff[200]; /* Should be big enough for any conversion result. */ | 216 | if (len) { |
214 | cc[1] = *(++s); | 217 | setstrV(L, L->top++, lj_str_new(L, buf, len)); |
215 | reslen = strftime(buff, sizeof(buff), cc, stm); | 218 | lj_gc_check(L); |
216 | luaL_addlstring(&b, buff, reslen); | 219 | break; |
217 | } | 220 | } |
221 | sz += (sz|1); | ||
218 | } | 222 | } |
219 | luaL_pushresult(&b); | 223 | } else { |
224 | setstrV(L, L->top++, &G(L)->strempty); | ||
220 | } | 225 | } |
221 | return 1; | 226 | return 1; |
222 | } | 227 | } |