[ros-diffs] [jmorlan] 34352: Extract days-since-epoch calculation code from RtlTimeToTimeFields into own function, optimize a bit, and use it in RtlTimeFieldsToTime instead of doing a 400 iteration loop.

jmorlan at svn.reactos.org jmorlan at svn.reactos.org
Mon Jul 7 12:23:42 CEST 2008


Author: jmorlan
Date: Mon Jul  7 05:23:41 2008
New Revision: 34352

URL: http://svn.reactos.org/svn/reactos?rev=34352&view=rev
Log:
Extract days-since-epoch calculation code from RtlTimeToTimeFields into own function, optimize a bit, and use it in RtlTimeFieldsToTime instead of doing a 400 iteration loop.

Modified:
    trunk/reactos/lib/rtl/time.c

Modified: trunk/reactos/lib/rtl/time.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/time.c?rev=34352&r1=34351&r2=34352&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/time.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/time.c [iso-8859-1] Mon Jul  7 05:23:41 2008
@@ -52,6 +52,15 @@
    return Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 1 : 0;
 }
 
+static int DaysSinceEpoch(int Year)
+{
+   int Days;
+   Year--; /* Don't include a leap day from the current year */
+   Days = Year * DAYSPERNORMALYEAR + Year / 4 - Year / 100 + Year / 400;
+   Days -= (EPOCHYEAR - 1) * DAYSPERNORMALYEAR + (EPOCHYEAR - 1) / 4 - (EPOCHYEAR - 1) / 100 + (EPOCHYEAR - 1) / 400;
+   return Days;
+}
+
 static __inline void NormalizeTimeFields(CSHORT *FieldToNormalize,
       CSHORT *CarryField,
       int Modulus)
@@ -170,11 +179,9 @@
    IN PTIME_FIELDS TimeFields,
    OUT PLARGE_INTEGER Time)
 {
-   int CurYear;
    int CurMonth;
    TIME_FIELDS IntTimeFields;
 
-   Time->QuadPart = 0;
    memcpy(&IntTimeFields,
           TimeFields,
           sizeof(TIME_FIELDS));
@@ -213,13 +220,10 @@
    }
 
    /* Compute the time */
-   for (CurYear = EPOCHYEAR; CurYear < IntTimeFields.Year; CurYear++)
-   {
-      Time->QuadPart += YearLengths[IsLeapYear(CurYear)];
-   }
+   Time->QuadPart = DaysSinceEpoch(IntTimeFields.Year);
    for (CurMonth = 1; CurMonth < IntTimeFields.Month; CurMonth++)
    {
-      Time->QuadPart += MonthLengths[IsLeapYear(CurYear)][CurMonth - 1];
+      Time->QuadPart += MonthLengths[IsLeapYear(IntTimeFields.Year)][CurMonth - 1];
    }
    Time->QuadPart += IntTimeFields.Day - 1;
    Time->QuadPart *= SECSPERDAY;
@@ -317,11 +321,7 @@
    /* compute year */
    CurYear = EPOCHYEAR;
    CurYear += Days / DAYSPERLEAPYEAR;
-   Days -= (CurYear - EPOCHYEAR) * DAYSPERLEAPYEAR;
-   CurYear--; /* The next calculation needs CurYear - 1 */
-   Days += CurYear - CurYear / 4 + CurYear / 100 - CurYear / 400;
-   CurYear++;
-   Days -= EPOCHYEAR - 1 - (EPOCHYEAR -1) / 4 + (EPOCHYEAR -1) / 100 - (EPOCHYEAR - 1) / 400;
+   Days -= DaysSinceEpoch(CurYear);
    while (1)
    {
       LeapYear = IsLeapYear(CurYear);



More information about the Ros-diffs mailing list