diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib_os.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/lib_os.c b/src/lib_os.c index 38aada67..2412d47b 100644 --- a/src/lib_os.c +++ b/src/lib_os.c | |||
@@ -167,13 +167,24 @@ LJLIB_CF(os_date) | |||
167 | const char *s = luaL_optstring(L, 1, "%c"); | 167 | const char *s = luaL_optstring(L, 1, "%c"); |
168 | time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); | 168 | time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); |
169 | struct tm *stm; | 169 | struct tm *stm; |
170 | #if LJ_TARGET_POSIX | ||
171 | struct tm rtm; | ||
172 | #endif | ||
170 | if (*s == '!') { /* UTC? */ | 173 | if (*s == '!') { /* UTC? */ |
174 | s++; /* Skip '!' */ | ||
175 | #if LJ_TARGET_POSIX | ||
176 | stm = gmtime_r(&t, &rtm); | ||
177 | #else | ||
171 | stm = gmtime(&t); | 178 | stm = gmtime(&t); |
172 | s++; /* skip `!' */ | 179 | #endif |
173 | } else { | 180 | } else { |
181 | #if LJ_TARGET_POSIX | ||
182 | stm = localtime_r(&t, &rtm); | ||
183 | #else | ||
174 | stm = localtime(&t); | 184 | stm = localtime(&t); |
185 | #endif | ||
175 | } | 186 | } |
176 | if (stm == NULL) { /* invalid date? */ | 187 | if (stm == NULL) { /* Invalid date? */ |
177 | setnilV(L->top-1); | 188 | setnilV(L->top-1); |
178 | } else if (strcmp(s, "*t") == 0) { | 189 | } else if (strcmp(s, "*t") == 0) { |
179 | lua_createtable(L, 0, 9); /* 9 = number of fields */ | 190 | lua_createtable(L, 0, 9); /* 9 = number of fields */ |
@@ -192,11 +203,11 @@ LJLIB_CF(os_date) | |||
192 | cc[0] = '%'; cc[2] = '\0'; | 203 | cc[0] = '%'; cc[2] = '\0'; |
193 | luaL_buffinit(L, &b); | 204 | luaL_buffinit(L, &b); |
194 | for (; *s; s++) { | 205 | for (; *s; s++) { |
195 | if (*s != '%' || *(s + 1) == '\0') { /* no conversion specifier? */ | 206 | if (*s != '%' || *(s + 1) == '\0') { /* No conversion specifier? */ |
196 | luaL_addchar(&b, *s); | 207 | luaL_addchar(&b, *s); |
197 | } else { | 208 | } else { |
198 | size_t reslen; | 209 | size_t reslen; |
199 | char buff[200]; /* should be big enough for any conversion result */ | 210 | char buff[200]; /* Should be big enough for any conversion result. */ |
200 | cc[1] = *(++s); | 211 | cc[1] = *(++s); |
201 | reslen = strftime(buff, sizeof(buff), cc, stm); | 212 | reslen = strftime(buff, sizeof(buff), cc, stm); |
202 | luaL_addlstring(&b, buff, reslen); | 213 | luaL_addlstring(&b, buff, reslen); |