[Patch] Time functions
Vincent Béron
vberon at mecano.gme.usherb.ca
Fri May 24 21:22:50 CDT 2002
Some time functions were broken and/or needed some work to act the same
way as on Windows.
GetSystemTimeAdjustment's (GSTA) prototype wasn't correct, and it was
absent from all headers.
DosDateTimeToFileTime (DDTTFT) was wrong (call to mktime rather than
timegm or equivalent).
FileTimeToDosDateTime (FTTDDT) was also wrong (did a TZ conversion when
it wasn't necessary).
LocalFileTimeToFileTime (LFTTFT) wasn't handling correctly the daylight
saving.
FileTimeToLocalFileTime (FTTLFT) didn't returned the same thing whether
timegm was present or not. If it was absent, localtime and gmtime were
returning the same static structure (info libc says not to use
localtime/gmtime/ctime in multithreaded apps: can more than one API be
called at the same time by different Windows processes? Or Wine
threads?), so the
subsequent conversion was false. I streamlined it, but the call to
mktime in the second way doesn't take daylight saving into account
automatically, so I had to do it manually.
Lastly, SystemTimeToFileTime (STTFT), when timegm was absent, also used
both
localtime and gmtime. Furthermore, the result of the call to localtime
was never reused.
I'll now read François's presentation on regression tests and implement
some for those functions. I already have a basis, I just need to do it
the same way as the rest of the regression tests.
Changelog:
- Fixed GetSystemTimeAdjustment prototype and added it to winbase.h.
- Fixed DosDateTimeToFileTime, FileTimeToDosDateTime,
LocalFileTimeToFileTime, FileTimeToLocalFileTime and
SystemTimeToFileTime.
Vincent
-------------- next part --------------
diff -urN wine-orig/dlls/kernel/time.c wine-pas-compilé/dlls/kernel/time.c
--- wine-orig/dlls/kernel/time.c Wed May 15 22:28:45 2002
+++ wine-pas-compilé/dlls/kernel/time.c Fri May 24 17:28:05 2002
@@ -353,12 +353,11 @@
* BUGS
*
* Only the special case of disabled time adjustments is supported.
- * (also the signature is wrong it should have a return type of BOOL)
*/
-DWORD WINAPI GetSystemTimeAdjustment(
- LPDWORD lpTimeAdjustment, /* [out] The clock adjustment per interupt in 100's of nanoseconds. */
- LPDWORD lpTimeIncrement, /* [out] The time between clock interupts in 100's of nanoseconds. */
- LPBOOL lpTimeAdjustmentDisabled) /* [out] The clock synchonisation has been disabled. */
+BOOL WINAPI GetSystemTimeAdjustment(
+ PDWORD lpTimeAdjustment, /* [out] The clock adjustment per interupt in 100's of nanoseconds. */
+ PDWORD lpTimeIncrement, /* [out] The time between clock interupts in 100's of nanoseconds. */
+ PBOOL lpTimeAdjustmentDisabled) /* [out] The clock synchonisation has been disabled. */
{
*lpTimeAdjustment = 0;
*lpTimeIncrement = 0;
diff -urN wine-orig/files/dos_fs.c wine-pas-compilé/files/dos_fs.c
--- wine-orig/files/dos_fs.c Thu May 23 16:36:46 2002
+++ wine-pas-compilé/files/dos_fs.c Fri May 24 17:24:21 2002
@@ -2126,6 +2126,10 @@
BOOL WINAPI DosDateTimeToFileTime( WORD fatdate, WORD fattime, LPFILETIME ft)
{
struct tm newtm;
+#ifndef HAVE_TIMEGM
+ struct tm *gtm;
+ time_t time1, time2;
+#endif
newtm.tm_sec = (fattime & 0x1f) * 2;
newtm.tm_min = (fattime >> 5) & 0x3f;
@@ -2133,7 +2137,14 @@
newtm.tm_mday = (fatdate & 0x1f);
newtm.tm_mon = ((fatdate >> 5) & 0x0f) - 1;
newtm.tm_year = (fatdate >> 9) + 80;
- RtlSecondsSince1970ToTime( mktime( &newtm ), ft );
+#ifdef HAVE_TIMEGM
+ RtlSecondsSince1970ToTime( timegm(&newtm), ft );
+#else
+ time1 = mktime(&newtm);
+ gtm = gmtime(&time1);
+ time2 = mktime(gtm);
+ RtlSecondsSince1970ToTime( 2*time1-time2, ft );
+#endif
return TRUE;
}
@@ -2145,7 +2156,7 @@
LPWORD fattime )
{
time_t unixtime = DOSFS_FileTimeToUnixTime( ft, NULL );
- struct tm *tm = localtime( &unixtime );
+ struct tm *tm = gmtime( &unixtime );
if (fattime)
*fattime = (tm->tm_hour << 11) + (tm->tm_min << 5) + (tm->tm_sec / 2);
if (fatdate)
@@ -2163,11 +2174,14 @@
{
struct tm *xtm;
DWORD remainder;
+ time_t utctime;
- /* convert from local to UTC. Perhaps not correct. FIXME */
- time_t unixtime = DOSFS_FileTimeToUnixTime( localft, &remainder );
- xtm = gmtime( &unixtime );
- DOSFS_UnixTimeToFileTime( mktime(xtm), utcft, remainder );
+ /* Converts from local to UTC. */
+ time_t localtime = DOSFS_FileTimeToUnixTime( localft, &remainder );
+ xtm = gmtime( &localtime );
+ utctime = mktime(xtm);
+ if(xtm->tm_isdst) utctime-=3600;
+ DOSFS_UnixTimeToFileTime( utctime, utcft, remainder );
return TRUE;
}
@@ -2179,7 +2193,7 @@
LPFILETIME localft )
{
DWORD remainder;
- /* convert from UTC to local. Perhaps not correct. FIXME */
+ /* Converts from UTC to local. */
time_t unixtime = DOSFS_FileTimeToUnixTime( utcft, &remainder );
#ifdef HAVE_TIMEGM
struct tm *xtm = localtime( &unixtime );
@@ -2189,14 +2203,13 @@
DOSFS_UnixTimeToFileTime( localtime, localft, remainder );
#else
- struct tm *xtm,*gtm;
- time_t time1,time2;
+ struct tm *xtm;
+ time_t time;
- xtm = localtime( &unixtime );
- gtm = gmtime( &unixtime );
- time1 = mktime(xtm);
- time2 = mktime(gtm);
- DOSFS_UnixTimeToFileTime( 2*time1-time2, localft, remainder );
+ xtm = gmtime( &unixtime );
+ time = mktime(xtm);
+ if(xtm->tm_isdst) time-=3600;
+ DOSFS_UnixTimeToFileTime( 2*unixtime-time, localft, remainder );
#endif
return TRUE;
}
@@ -2291,7 +2304,7 @@
struct tm xtm;
time_t utctime;
#else
- struct tm xtm,*local_tm,*utc_tm;
+ struct tm xtm,*utc_tm;
time_t localtim,utctime;
#endif
@@ -2309,7 +2322,6 @@
syst->wMilliseconds * 10000 );
#else
localtim = mktime(&xtm); /* now we've got local time */
- local_tm = localtime(&localtim);
utc_tm = gmtime(&localtim);
utctime = mktime(utc_tm);
DOSFS_UnixTimeToFileTime( 2*localtim -utctime, ft,
diff -urN wine-orig/include/winbase.h wine-pas-compilé/include/winbase.h
--- wine-orig/include/winbase.h Thu May 23 10:49:53 2002
+++ wine-pas-compilé/include/winbase.h Fri May 24 16:33:33 2002
@@ -1321,6 +1321,7 @@
VOID WINAPI GetSystemInfo(LPSYSTEM_INFO);
BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
VOID WINAPI GetSystemTime(LPSYSTEMTIME);
+BOOL WINAPI GetSystemTimeAdjustment(PDWORD,PDWORD,PBOOL);
VOID WINAPI GetSystemTimeAsFileTime(LPFILETIME);
DWORD WINAPI GetTapeParameters(HANDLE,DWORD,LPDWORD,LPVOID);
DWORD WINAPI GetTapePosition(HANDLE,DWORD,LPDWORD,LPDWORD,LPDWORD);
More information about the wine-patches
mailing list