fix multiple bugs in SIGEV_THREAD timers
[musl] / src / time / wcsftime.c
1 #include <wchar.h>
2 #include <time.h>
3 #include <string.h>
4 #include <locale.h>
5 #include "libc.h"
6
7 size_t __strftime_l(char *restrict, size_t, const char *restrict, const struct tm *restrict, locale_t);
8
9 size_t __wcsftime_l(wchar_t *restrict wcs, size_t n, const wchar_t *restrict f, const struct tm *restrict tm, locale_t loc)
10 {
11         size_t k, n0=n;
12         char out[100], in[4];
13         while (*f) {
14                 if (!n) return 0;
15                 if (*f != '%') {
16                         *wcs++ = *f++;
17                         n--;
18                         continue;
19                 }
20                 in[2] = in[3] = 0;
21                 in[0] = *f++;
22                 if (strchr("EO", (in[1]=*f++)))
23                         in[2] = *f++;
24                 k = __strftime_l(out, sizeof out, in, tm, loc);
25                 if (!k) return 0;
26                 k = mbsrtowcs(wcs, (const char *[]){out}, n, 0);
27                 if (k==(size_t)-1) return 0;
28                 wcs += k;
29                 n -= k;
30         }
31         if (!n) return 0;
32         *wcs++ = 0;
33         return n0-n;
34 }
35
36 size_t wcsftime(wchar_t *restrict wcs, size_t n, const wchar_t *restrict f, const struct tm *restrict tm)
37 {
38         return __wcsftime_l(wcs, n, f, tm, 0);
39 }
40
41 weak_alias(__wcsftime_l, wcsftime_l);