|
@@ -18,7 +18,9 @@
|
|
|
#include "lualib.h"
|
|
|
|
|
|
#include "lj_obj.h"
|
|
|
+#include "lj_gc.h"
|
|
|
#include "lj_err.h"
|
|
|
+#include "lj_buf.h"
|
|
|
#include "lj_lib.h"
|
|
|
|
|
|
#if LJ_TARGET_POSIX
|
|
@@ -197,23 +199,25 @@ LJLIB_CF(os_date)
|
|
|
setfield(L, "wday", stm->tm_wday+1);
|
|
|
setfield(L, "yday", stm->tm_yday+1);
|
|
|
setboolfield(L, "isdst", stm->tm_isdst);
|
|
|
- } else {
|
|
|
- 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);
|
|
|
+ } else if (*s) {
|
|
|
+ SBuf *sb = &G(L)->tmpbuf;
|
|
|
+ MSize sz = 0;
|
|
|
+ const char *q;
|
|
|
+ for (q = s; *q; q++)
|
|
|
+ sz += (*q == '%') ? 30 : 1; /* Overflow doesn't matter. */
|
|
|
+ setmref(sb->L, L);
|
|
|
+ for (;;) {
|
|
|
+ char *buf = lj_buf_need(sb, sz);
|
|
|
+ size_t len = strftime(buf, sbufsz(sb), s, stm);
|
|
|
+ if (len) {
|
|
|
+ setstrV(L, L->top-1, lj_str_new(L, buf, len));
|
|
|
+ lj_gc_check(L);
|
|
|
+ break;
|
|
|
}
|
|
|
+ sz += (sz|1);
|
|
|
}
|
|
|
- luaL_pushresult(&b);
|
|
|
+ } else {
|
|
|
+ setstrV(L, L->top-1, &G(L)->strempty);
|
|
|
}
|
|
|
return 1;
|
|
|
}
|