Piotr Caban : msvcrt: Added _mkgmtime implementation.
Alexandre Julliard
julliard at winehq.org
Tue Apr 27 16:59:31 CDT 2010
Module: wine
Branch: master
Commit: c4d6877894e67c001b3a67518570e1f2dacc5f4c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c4d6877894e67c001b3a67518570e1f2dacc5f4c
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Apr 27 08:42:13 2010 +0200
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 60e66ba..3cc641e 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 16a1bc2..59a71ba 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 6807de2..e5bbaf4 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 ac782ca..7f0a80b 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 d5b0227..2e8828c 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; i<st.wMonth-1; i++)
+ time->tm_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.@)
*/
More information about the wine-cvs
mailing list