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