From c4d6877894e67c001b3a67518570e1f2dacc5f4c Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 27 Apr 2010 08:42:13 +0200 Subject: [PATCH] msvcrt: Added _mkgmtime implementation. --- dlls/msvcr80/msvcr80.spec | 4 +- dlls/msvcr90/msvcr90.spec | 4 +- dlls/msvcrt/msvcrt.spec | 6 +-- dlls/msvcrt/tests/time.c | 81 ++++++++++++++++++++++++++++++++------- dlls/msvcrt/time.c | 58 ++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 20 deletions(-) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 60e66bafc60..3cc641ec2eb 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -800,8 +800,8 @@ @ cdecl _memicmp(str str long) msvcrt._memicmp @ stub _memicmp_l @ cdecl _mkdir(str) msvcrt._mkdir -@ stub _mkgmtime32 -@ stub _mkgmtime64 +@ cdecl _mkgmtime32(ptr) msvcrt._mkgmtime32 +@ cdecl _mkgmtime64(ptr) msvcrt._mkgmtime64 @ cdecl _mktemp(str) msvcrt._mktemp @ stub _mktemp_s @ cdecl _mktime32(ptr) msvcrt._mktime32 diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 16a1bc2c694..59a71ba6feb 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -788,8 +788,8 @@ @ cdecl _memicmp(str str long) msvcrt._memicmp @ stub _memicmp_l @ cdecl _mkdir(str) msvcrt._mkdir -@ stub _mkgmtime32 -@ stub _mkgmtime64 +@ cdecl _mkgmtime32(ptr) msvcrt._mkgmtime32 +@ cdecl _mkgmtime64(ptr) msvcrt._mkgmtime64 @ cdecl _mktemp(str) msvcrt._mktemp @ stub _mktemp_s @ cdecl _mktime32(ptr) msvcrt._mktime32 diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 6807de2dd6e..e5bbaf4dec4 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -745,9 +745,9 @@ @ cdecl _memicmp(str str long) ntdll._memicmp # stub _memicmp_l @ cdecl _mkdir(str) MSVCRT__mkdir -# stub _mkgmtime -# stub _mkgmtime32 -# stub _mkgmtime64 +@ cdecl _mkgmtime(ptr) MSVCRT__mkgmtime +@ cdecl _mkgmtime32(ptr) MSVCRT__mkgmtime32 +@ cdecl _mkgmtime64(ptr) MSVCRT__mkgmtime64 @ cdecl _mktemp(str) # stub _mktemp_s @ cdecl _mktime32(ptr) MSVCRT__mktime32 diff --git a/dlls/msvcrt/tests/time.c b/dlls/msvcrt/tests/time.c index ac782cab835..7f0a80b7542 100644 --- a/dlls/msvcrt/tests/time.c +++ b/dlls/msvcrt/tests/time.c @@ -54,20 +54,75 @@ static void test_ctime(void) } static void test_gmtime(void) { - time_t gmt = 0; - struct tm* gmt_tm = gmtime(&gmt); - if(gmt_tm == 0) - { - ok(0,"gmtime() error\n"); - return; - } + static __time32_t (__cdecl *p_mkgmtime32)(struct tm*); + static struct tm* (__cdecl *p_gmtime32)(__time32_t*); + + HMODULE hmod = GetModuleHandleA("msvcrt.dll"); + __time32_t valid, gmt; + struct tm* gmt_tm; + + p_gmtime32 = (void*)GetProcAddress(hmod, "_gmtime32"); + if(!p_gmtime32) { + win_skip("Skipping _gmtime32 tests\n"); + return; + } + + gmt = valid = 0; + gmt_tm = p_gmtime32(&gmt); + if(!gmt_tm) { + ok(0, "_gmtime32() failed\n"); + return; + } + ok(((gmt_tm->tm_year == 70) && (gmt_tm->tm_mon == 0) && (gmt_tm->tm_yday == 0) && - (gmt_tm->tm_mday == 1) && (gmt_tm->tm_wday == 4) && (gmt_tm->tm_hour == 0) && - (gmt_tm->tm_min == 0) && (gmt_tm->tm_sec == 0) && (gmt_tm->tm_isdst == 0)), - "Wrong date:Year %4d mon %2d yday %3d mday %2d wday %1d hour%2d min %2d sec %2d dst %2d\n", - gmt_tm->tm_year, gmt_tm->tm_mon, gmt_tm->tm_yday, gmt_tm->tm_mday, gmt_tm->tm_wday, - gmt_tm->tm_hour, gmt_tm->tm_min, gmt_tm->tm_sec, gmt_tm->tm_isdst); - + (gmt_tm->tm_mday == 1) && (gmt_tm->tm_wday == 4) && (gmt_tm->tm_hour == 0) && + (gmt_tm->tm_min == 0) && (gmt_tm->tm_sec == 0) && (gmt_tm->tm_isdst == 0)), + "Wrong date:Year %4d mon %2d yday %3d mday %2d wday %1d hour%2d min %2d sec %2d dst %2d\n", + gmt_tm->tm_year, gmt_tm->tm_mon, gmt_tm->tm_yday, gmt_tm->tm_mday, gmt_tm->tm_wday, + gmt_tm->tm_hour, gmt_tm->tm_min, gmt_tm->tm_sec, gmt_tm->tm_isdst); + + p_mkgmtime32 = (void*)GetProcAddress(hmod, "_mkgmtime32"); + if(!p_mkgmtime32) { + win_skip("Skipping _mkgmtime32 tests\n"); + return; + } + + gmt_tm->tm_wday = gmt_tm->tm_yday = 0; + gmt = p_mkgmtime32(gmt_tm); + ok(gmt == valid, "gmt = %u\n", gmt); + ok(gmt_tm->tm_wday == 4, "gmt_tm->tm_wday = %d\n", gmt_tm->tm_wday); + ok(gmt_tm->tm_yday == 0, "gmt_tm->tm_yday = %d\n", gmt_tm->tm_yday); + + gmt_tm->tm_wday = gmt_tm->tm_yday = 0; + gmt_tm->tm_isdst = -1; + gmt = p_mkgmtime32(gmt_tm); + ok(gmt == valid, "gmt = %u\n", gmt); + ok(gmt_tm->tm_wday == 4, "gmt_tm->tm_wday = %d\n", gmt_tm->tm_wday); + ok(gmt_tm->tm_yday == 0, "gmt_tm->tm_yday = %d\n", gmt_tm->tm_yday); + + gmt_tm->tm_wday = gmt_tm->tm_yday = 0; + gmt_tm->tm_isdst = 1; + gmt = p_mkgmtime32(gmt_tm); + ok(gmt == valid, "gmt = %u\n", gmt); + ok(gmt_tm->tm_wday == 4, "gmt_tm->tm_wday = %d\n", gmt_tm->tm_wday); + ok(gmt_tm->tm_yday == 0, "gmt_tm->tm_yday = %d\n", gmt_tm->tm_yday); + + gmt = valid = 173921; + gmt_tm = p_gmtime32(&gmt); + if(!gmt_tm) { + ok(0, "_gmtime32() failed\n"); + return; + } + + gmt_tm->tm_isdst = -1; + gmt = p_mkgmtime32(gmt_tm); + ok(gmt == valid, "gmt = %u\n", gmt); + ok(gmt_tm->tm_wday == 6, "gmt_tm->tm_wday = %d\n", gmt_tm->tm_wday); + ok(gmt_tm->tm_yday == 2, "gmt_tm->tm_yday = %d\n", gmt_tm->tm_yday); + + gmt_tm->tm_isdst = 1; + gmt = p_mkgmtime32(gmt_tm); + ok(gmt == valid, "gmt = %u\n", gmt); } static void test_mktime(void) diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c index d5b02274e84..2e8828cb377 100644 --- a/dlls/msvcrt/time.c +++ b/dlls/msvcrt/time.c @@ -123,6 +123,64 @@ MSVCRT___time32_t CDECL MSVCRT_mktime(struct MSVCRT_tm *mstm) } #endif +/********************************************************************** + * _mkgmtime64 (MSVCRT.@) + * + * time->tm_isdst value is ignored + */ +MSVCRT___time64_t CDECL MSVCRT__mkgmtime64(struct MSVCRT_tm *time) +{ + SYSTEMTIME st; + FILETIME ft; + MSVCRT___time64_t ret; + int i; + + st.wMilliseconds = 0; + st.wSecond = time->tm_sec; + st.wMinute = time->tm_min; + st.wHour = time->tm_hour; + st.wDay = time->tm_mday; + st.wMonth = time->tm_mon+1; + st.wYear = time->tm_year+1900; + + if(!SystemTimeToFileTime(&st, &ft)) + return -1; + + FileTimeToSystemTime(&ft, &st); + time->tm_wday = st.wDayOfWeek; + + for(i=time->tm_yday=0; itm_yday += MonthLengths[IsLeapYear(st.wYear)][i]; + time->tm_yday += st.wDay-1; + + ret = ((MSVCRT___time64_t)ft.dwHighDateTime<<32)+ft.dwLowDateTime; + ret = (ret-TICKS_1601_TO_1970)/TICKSPERSEC; + return ret; +} + +/********************************************************************** + * _mkgmtime32 (MSVCRT.@) + */ +MSVCRT___time32_t CDECL MSVCRT__mkgmtime32(struct MSVCRT_tm *time) +{ + return MSVCRT__mkgmtime64(time); +} + +/********************************************************************** + * _mkgmtime (MSVCRT.@) + */ +#ifdef _WIN64 +MSVCRT___time64_t CDECL MSVCRT__mkgmtime(struct MSVCRT_tm *time) +{ + return MSVCRT__mkgmtime64(time); +} +#else +MSVCRT___time32_t CDECL MSVCRT__mkgmtime(struct MSVCRT_tm *time) +{ + return MSVCRT__mkgmtime32(time); +} +#endif + /********************************************************************* * _localtime64 (MSVCRT.@) */