1 #include <windows.h>
2 #include <malloc.h>
3 #include <time.h>
4 #include <errno.h>
5 #include <msvcrt.h>
6
7 static errno_t __cdecl _int_wstrtime_s (wchar_t *, size_t);
8 static errno_t __cdecl _stub (wchar_t *, size_t);
9
10 errno_t __cdecl (*__MINGW_IMP_SYMBOL(_wstrtime_s))(wchar_t *, size_t) =
11 _stub;
12
13 static errno_t __cdecl
_stub(wchar_t * d,size_t dn)14 _stub (wchar_t *d, size_t dn)
15 {
16 errno_t __cdecl (*f)(wchar_t *, size_t) = __MINGW_IMP_SYMBOL(_wstrtime_s);
17
18 if (f == _stub)
19 {
20 f = (errno_t __cdecl (*)(wchar_t *, size_t))
21 GetProcAddress (__mingw_get_msvcrt_handle (), "_wstrtime_s");
22 if (!f)
23 f = _int_wstrtime_s;
24 __MINGW_IMP_SYMBOL(_wstrtime_s) = f;
25 }
26 return (*f)(d, dn);
27 }
28
29 errno_t __cdecl
_wstrtime_s(wchar_t * d,size_t dn)30 _wstrtime_s (wchar_t *d, size_t dn)
31 {
32 return _stub (d, dn);
33 }
34
35 static errno_t __cdecl
_int_wstrtime_s(wchar_t * d,size_t dn)36 _int_wstrtime_s (wchar_t *d, size_t dn)
37 {
38 SYSTEMTIME dt;
39 int hours, minutes, seconds;
40
41 if (!d || !dn)
42 {
43 errno = EINVAL;
44 return EINVAL;
45 }
46
47 d[0] = 0;
48
49 if (dn < 9)
50 {
51 errno = ERANGE;
52 return ERANGE;
53 }
54
55 GetLocalTime (&dt);
56
57 hours = dt.wHour;
58 minutes = dt.wMinute;
59 seconds = dt.wSecond;
60
61 d[2] = d[5] = ':';
62 d[0] = (wchar_t) (hours / 10 + '0');
63 d[1] = (wchar_t) (hours % 10 + '0');
64 d[3] = (wchar_t) (minutes / 10 + '0');
65 d[4] = (wchar_t) (minutes % 10 + '0');
66 d[6] = (wchar_t) (seconds / 10 + '0');
67 d[7] = (wchar_t) (seconds % 10 + '0');
68 d[8] = 0;
69
70 return 0;
71 }
72