---
mingw-w64-crt/testcases/t_time.c | 106 +++++++++++++++++++++++++++++--
1 file changed, 99 insertions(+), 7 deletions(-)
diff --git a/mingw-w64-crt/testcases/t_time.c b/mingw-w64-crt/testcases/t_time.c
index 714cc51913f9..c4304dca2a27 100644
--- a/mingw-w64-crt/testcases/t_time.c
+++ b/mingw-w64-crt/testcases/t_time.c
@@ -1,29 +1,121 @@
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <time.h>
+#include <sys/timeb.h>
+#include <assert.h>
+
+int __cdecl ftime32(struct __timeb32 *tb32);
+int __cdecl ftime64(struct __timeb64 *tb64);
int main()
{
time_t t;
- __time32_t t32 = 0;
+ __time32_t t32;
__time64_t t64;
+ struct timeb tb;
+ struct _timeb tb_;
+ struct __timeb32 tb32;
+ struct __timeb64 tb64;
struct tm *htm;
+ int ret1, ret2, ret3;
+#if __MSVCRT_VERSION__ > 0x0400
+ const char *str;
+ const wchar_t *wstr;
+#endif
+
time (&t);
-#ifndef WIN64
_time32 (&t32);
-#endif
_time64 (&t64);
- printf ("0x%I64xULL, 0x%I32x, 0x%I64xULL\n",
+ printf ("time: 0x%I64xULL\n_time32: 0x%I32x\n_time64: 0x%I64xULL\n",
(unsigned long long) t, (unsigned int) t32, (unsigned long long) t64);
-#ifndef WIN64
htm = _localtime32 (&t32);
if (!htm) printf ("Failed _localtime32\n");
else printf ("_localtime32: %s", asctime (htm));
-#endif
htm = localtime (&t);
if (!htm) printf ("Failed localtime\n");
- else printf ("localtime: %s", asctime (htm));
+ else printf ("localtime: %s", asctime (htm));
+
+ /* FIXME: mingw-w64 does not provide _localtime64 for msvcrt40 and older CRT
libraries */
+#if __MSVCRT_VERSION__ > 0x0400
htm = _localtime64 (&t64);
if (!htm) printf ("Failed _localtime64\n");
else printf ("_localtime64: %s", asctime (htm));
+#endif
+
+ _ftime (&tb_);
+ _ftime32 (&tb32);
+ _ftime64 (&tb64);
+ printf ("_ftime: 0x%I64xULL.0x%x\n", (unsigned long long)tb_.time,
(unsigned)tb_.millitm);
+ printf ("_ftime32: 0x%I32x .0x%x\n", tb32.time, (unsigned)tb32.millitm);
+ printf ("_ftime64: 0x%I64xULL.0x%x\n", tb64.time, (unsigned)tb64.millitm);
+
+ ret1 = ftime (&tb);
+ ret2 = ftime32 (&tb32);
+ ret3 = ftime64 (&tb64);
+ printf ("ftime: %d 0x%I64xULL.0x%x\n", ret1, (unsigned long long)tb.time,
(unsigned)tb.millitm);
+ printf ("ftime32: %d 0x%I32x .0x%x\n", ret2, tb32.time,
(unsigned)tb32.millitm);
+ printf ("ftime64: %d 0x%I64xULL.0x%x\n", ret3, tb64.time,
(unsigned)tb64.millitm);
+
+ t64 = 1ULL << 33;
+ htm = _gmtime64( &t64 );
+ printf ("_gmtime64(1<<33): sec=%d min=%d hour=%d mday=%d mon=%d year=%d
wday=%d yday=%d isdst=%d\n",
+ htm->tm_sec, htm->tm_min, htm->tm_hour, htm->tm_mday, htm->tm_mon,
htm->tm_year, htm->tm_wday, htm->tm_yday, htm->tm_isdst);
+ assert (htm->tm_sec == 32);
+ assert (htm->tm_min == 56);
+ assert (htm->tm_hour == 12);
+ assert (htm->tm_mday == 16);
+ assert (htm->tm_mon == 2);
+ assert (htm->tm_year == 342);
+ assert (htm->tm_wday == 3);
+ assert (htm->tm_yday == 74);
+ assert (htm->tm_isdst == 0);
+
+ t64 = _mkgmtime64 (htm);
+ printf ("_mkgmtime64(): 0x%I64x sec=%d min=%d hour=%d mday=%d mon=%d year=%d
wday=%d yday=%d isdst=%d\n",
+ t64, htm->tm_sec, htm->tm_min, htm->tm_hour, htm->tm_mday, htm->tm_mon,
htm->tm_year, htm->tm_wday, htm->tm_yday, htm->tm_isdst);
+ assert (t64 == (1ULL << 33));
+ assert (htm->tm_sec == 32);
+ assert (htm->tm_min == 56);
+ assert (htm->tm_hour == 12);
+ assert (htm->tm_mday == 16);
+ assert (htm->tm_mon == 2);
+ assert (htm->tm_year == 342);
+ assert (htm->tm_wday == 3);
+ assert (htm->tm_yday == 74);
+ assert (htm->tm_isdst == 0);
+
+ htm->tm_min = 66; /* change 56 to 66 -> + 10 minutes */
+ t64 = _mkgmtime64 (htm);
+ printf ("_mkgmtime64(): 0x%I64x sec=%d min=%d hour=%d mday=%d mon=%d year=%d
wday=%d yday=%d isdst=%d\n",
+ t64, htm->tm_sec, htm->tm_min, htm->tm_hour, htm->tm_mday, htm->tm_mon,
htm->tm_year, htm->tm_wday, htm->tm_yday, htm->tm_isdst);
+ assert (t64 == (1ULL << 33) + 10*60); /* + 10 minutes */
+ assert (htm->tm_sec == 32);
+ assert (htm->tm_min == 6); /* 66 is changed to 6 */
+ assert (htm->tm_hour == 13); /* 12 is changed to 13 */
+ assert (htm->tm_mday == 16);
+ assert (htm->tm_mon == 2);
+ assert (htm->tm_year == 342);
+ assert (htm->tm_wday == 3);
+ assert (htm->tm_yday == 74);
+ assert (htm->tm_isdst == 0);
+
+ /* FIXME: mingw-w64 does not provide _ctime64 and _wctime64 for msvcrt40 and
older CRT libraries */
+#if __MSVCRT_VERSION__ > 0x0400
+ /* ctime returns time string in local timezone, so set local timezone to UTC
to have test timezone independent */
+ putenv ("TZ=UTC");
+ tzset ();
+
+ t64 = 1ULL << 33;
+ str = _ctime64 ( &t64 );
+ printf ("_ctime64(1<<33): %s", str);
+ assert (strcmp (str, "Wed Mar 16 12:56:32 2242\n") == 0);
+
+ t64 = 1ULL << 33;
+ wstr = _wctime64 ( &t64 );
+ printf ("_wctime64(1<<33): %ls", wstr);
+ assert (wcscmp (wstr, L"Wed Mar 16 12:56:32 2242\n") == 0);
+#endif
+
return 0;
}
--
2.20.1
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public