Module: wine Branch: master Commit: d3ecfe059960440f95ce8c25f13b4b0070952c5d URL: http://source.winehq.org/git/wine.git/?a=commit;h=d3ecfe059960440f95ce8c25f1...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Dec 10 12:48:07 2012 +0100
msvcrt: Fixed _localtime64 implementation.
---
dlls/msvcrt/dir.c | 1 - dlls/msvcrt/file.c | 1 - dlls/msvcrt/time.c | 66 ++++++++++++++++++++++++--------------------------- 3 files changed, 31 insertions(+), 37 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index a504fee..82824e9 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -25,7 +25,6 @@ #include "wine/port.h"
#include <stdarg.h> -#include <time.h>
#include "windef.h" #include "winbase.h" diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 1b87dd2..bca17d2 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -29,7 +29,6 @@ #include "config.h" #include "wine/port.h"
-#include <time.h> #include <stdarg.h> #include <stdio.h> #ifdef HAVE_UNISTD_H diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c index 263c035..4c21380 100644 --- a/dlls/msvcrt/time.c +++ b/dlls/msvcrt/time.c @@ -25,12 +25,6 @@ #include "config.h"
#include <stdlib.h> -#define _POSIX_PTHREAD_SEMANTICS /* switch to a 2 arg style asctime_r on Solaris */ -#include <time.h> -#ifdef HAVE_SYS_TIMES_H -# include <sys/times.h> -#endif -#include <limits.h>
#include "msvcrt.h" #include "mtdll.h" @@ -52,20 +46,6 @@ static inline int IsLeapYear(int Year) return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0); }
-static inline void unix_tm_to_msvcrt( struct MSVCRT_tm *dest, const struct tm *src ) -{ - memset( dest, 0, sizeof(*dest) ); - dest->tm_sec = src->tm_sec; - dest->tm_min = src->tm_min; - dest->tm_hour = src->tm_hour; - dest->tm_mday = src->tm_mday; - dest->tm_mon = src->tm_mon; - dest->tm_year = src->tm_year; - dest->tm_wday = src->tm_wday; - dest->tm_yday = src->tm_yday; - dest->tm_isdst = src->tm_isdst; -} - static inline void write_invalid_msvcrt_tm( struct MSVCRT_tm *tm ) { tm->tm_sec = -1; @@ -378,32 +358,48 @@ MSVCRT___time32_t CDECL MSVCRT__mkgmtime(struct MSVCRT_tm *time) /********************************************************************* * _localtime64_s (MSVCRT.@) */ -int CDECL _localtime64_s(struct MSVCRT_tm *time, const MSVCRT___time64_t *secs) +int CDECL _localtime64_s(struct MSVCRT_tm *res, const MSVCRT___time64_t *secs) { - struct tm *tm; - time_t seconds; + int i; + FILETIME ft; + SYSTEMTIME st; + ULONGLONG time;
- if (!time || !secs || *secs < 0 || *secs > _MAX__TIME64_T) + if (!res || !secs || *secs < 0 || *secs > _MAX__TIME64_T) { - if (time) - write_invalid_msvcrt_tm(time); + if (res) + write_invalid_msvcrt_tm(res);
*MSVCRT__errno() = MSVCRT_EINVAL; return MSVCRT_EINVAL; }
- seconds = *secs; + _tzset_init(); + time = (*secs - MSVCRT___timezone) * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970;
- _mlock(_TIME_LOCK); - if (!(tm = localtime(&seconds))) - { - _munlock(_TIME_LOCK); - *MSVCRT__errno() = MSVCRT_EINVAL; - return MSVCRT_EINVAL; + ft.dwHighDateTime = (UINT)(time >> 32); + ft.dwLowDateTime = (UINT)time; + FileTimeToSystemTime(&ft, &st); + + res->tm_isdst = is_dst(&st) ? 1 : 0; + if(res->tm_isdst) { + time -= MSVCRT__dstbias * (ULONGLONG)TICKSPERSEC; + ft.dwHighDateTime = (UINT)(time >> 32); + ft.dwLowDateTime = (UINT)time; + FileTimeToSystemTime(&ft, &st); }
- unix_tm_to_msvcrt(time, tm); - _munlock(_TIME_LOCK); + res->tm_sec = st.wSecond; + res->tm_min = st.wMinute; + res->tm_hour = st.wHour; + res->tm_mday = st.wDay; + res->tm_year = st.wYear - 1900; + res->tm_mon = st.wMonth - 1; + res->tm_wday = st.wDayOfWeek; + for (i = res->tm_yday = 0; i < st.wMonth - 1; i++) + res->tm_yday += MonthLengths[IsLeapYear(st.wYear)][i]; + res->tm_yday += st.wDay - 1; + return 0; }