From f66af59989c8d4f68395125fc83a6ba8131f7278 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 25 Feb 2004 01:25:00 +0000 Subject: [PATCH] Speed up RtlTimeFieldsToTime. --- dlls/ntdll/time.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c index bd10c508554..f90859e80c1 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c @@ -284,7 +284,6 @@ static const struct tagTZ_INFO TZ_INFO[] = #define TICKS_1601_TO_1980 (SECS_1601_TO_1980 * TICKSPERSEC) -static const int YearLengths[2] = {DAYSPERNORMALYEAR, DAYSPERLEAPYEAR}; static const int MonthLengths[2][MONSPERYEAR] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, @@ -421,7 +420,7 @@ BOOLEAN WINAPI RtlTimeFieldsToTime( PTIME_FIELDS tfTimeFields, PLARGE_INTEGER Time) { - int CurYear, CurMonth; + int CurYear, CurMonth, DeltaYear; LONGLONG rcTime; TIME_FIELDS TimeFields = *tfTimeFields; @@ -445,9 +444,18 @@ BOOLEAN WINAPI RtlTimeFieldsToTime( } /* FIXME: handle calendar corrections here */ - for (CurYear = EPOCHYEAR; CurYear < TimeFields.Year; CurYear++) - { rcTime += YearLengths[IsLeapYear(CurYear)]; - } + CurYear = TimeFields.Year - EPOCHYEAR; + DeltaYear = CurYear / 400; + CurYear -= DeltaYear * 400; + rcTime += DeltaYear * DAYSPERQUADRICENTENNIUM; + DeltaYear = CurYear / 100; + CurYear -= DeltaYear * 100; + rcTime += DeltaYear * DAYSPERNORMALCENTURY; + DeltaYear = CurYear / 4; + CurYear -= DeltaYear * 4; + rcTime += DeltaYear * DAYSPERNORMALQUADRENNIUM; + rcTime += CurYear * DAYSPERNORMALYEAR; + for (CurMonth = 1; CurMonth < TimeFields.Month; CurMonth++) { rcTime += MonthLengths[IsLeapYear(CurYear)][CurMonth - 1]; } @@ -460,7 +468,6 @@ BOOLEAN WINAPI RtlTimeFieldsToTime( return TRUE; } -/************ end of code by Rex Jolliff (rex@lvcablemodem.com) ***************/ /****************************************************************************** * RtlLocalTimeToSystemTime [NTDLL.@]