// -- Time Management Routines --\r
//\r
\r
-#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))\r
#define SECSPERMIN (60)\r
#define SECSPERHOUR (60 * 60)\r
#define SECSPERDAY (24 * SECSPERHOUR)\r
}\r
};\r
\r
+/* Check the year is leap or not. */\r
+// BOOLEAN IsLeap(\r
+// INTN timer\r
+// )\r
+BOOLEAN\r
+IsLeap (\r
+ time_t timer\r
+ )\r
+{\r
+ INT64 Remainder1;\r
+ INT64 Remainder2;\r
+ INT64 Remainder3;\r
+\r
+ DivS64x64Remainder (timer, 4, &Remainder1);\r
+ DivS64x64Remainder (timer, 100, &Remainder2);\r
+ DivS64x64Remainder (timer, 400, &Remainder3);\r
+\r
+ return (Remainder1 == 0 && (Remainder2 != 0 || Remainder3 == 0));\r
+}\r
+\r
/* Get the system time as seconds elapsed since midnight, January 1, 1970. */\r
// INTN time(\r
// INTN *timer\r
)\r
{\r
struct tm *GmTime;\r
- UINT16 DayNo;\r
- UINT32 DayRemainder;\r
+ UINT64 DayNo;\r
+ UINT64 DayRemainder;\r
time_t Year;\r
time_t YearNo;\r
- UINT16 TotalDays;\r
- UINT16 MonthNo;\r
+ UINT32 TotalDays;\r
+ UINT32 MonthNo;\r
+ INT64 Remainder;\r
\r
if (timer == NULL) {\r
return NULL;\r
\r
ZeroMem ((VOID *)GmTime, (UINTN)sizeof (struct tm));\r
\r
- DayNo = (UINT16)(*timer / SECSPERDAY);\r
- DayRemainder = (UINT32)(*timer % SECSPERDAY);\r
+ DayNo = (UINT64)DivS64x64Remainder (*timer, SECSPERDAY, &Remainder);\r
+ DayRemainder = (UINT64)Remainder;\r
\r
- GmTime->tm_sec = (int)(DayRemainder % SECSPERMIN);\r
- GmTime->tm_min = (int)((DayRemainder % SECSPERHOUR) / SECSPERMIN);\r
- GmTime->tm_hour = (int)(DayRemainder / SECSPERHOUR);\r
- GmTime->tm_wday = (int)((DayNo + 4) % 7);\r
+ DivS64x64Remainder (DayRemainder, SECSPERMIN, &Remainder);\r
+ GmTime->tm_sec = (int)Remainder;\r
+ DivS64x64Remainder (DayRemainder, SECSPERHOUR, &Remainder);\r
+ GmTime->tm_min = (int)DivS64x64Remainder (Remainder, SECSPERMIN, NULL);\r
+ GmTime->tm_hour = (int)DivS64x64Remainder (DayRemainder, SECSPERHOUR, NULL);\r
+ DivS64x64Remainder ((DayNo + 4), 7, &Remainder);\r
+ GmTime->tm_wday = (int)Remainder;\r
\r
for (Year = 1970, YearNo = 0; DayNo > 0; Year++) {\r
- TotalDays = (UINT16)(IsLeap (Year) ? 366 : 365);\r
+ TotalDays = (UINT32)(IsLeap (Year) ? 366 : 365);\r
if (DayNo >= TotalDays) {\r
- DayNo = (UINT16)(DayNo - TotalDays);\r
+ DayNo = (UINT64)(DayNo - TotalDays);\r
YearNo++;\r
} else {\r
break;\r
\r
for (MonthNo = 12; MonthNo > 1; MonthNo--) {\r
if (DayNo >= CumulativeDays[IsLeap (Year)][MonthNo]) {\r
- DayNo = (UINT16)(DayNo - (UINT16)(CumulativeDays[IsLeap (Year)][MonthNo]));\r
+ DayNo = (UINT64)(DayNo - (UINT32)(CumulativeDays[IsLeap (Year)][MonthNo]));\r
break;\r
}\r
}\r