소스 검색

AK+LibC+Kernel: Have fewer implementations of year_to_days_in_epoch

I believe the implementation in RTC.cpp had an off-by-one
in the year passed to is_leap_year(). If that's true, then this
fixes that too.
Nico Weber 5 년 전
부모
커밋
9b17082899
3개의 변경된 파일13개의 추가작업 그리고 18개의 파일을 삭제
  1. 11 0
      AK/Time.h
  2. 1 13
      Kernel/RTC.cpp
  3. 1 5
      Libraries/LibC/time.cpp

+ 11 - 0
AK/Time.h

@@ -33,6 +33,16 @@ inline bool is_leap_year(int year)
     return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
 }
 
+inline int years_to_days_since_epoch(int year)
+{
+    int days = 0;
+    for (int current_year = 1970; current_year < year; ++current_year)
+        days += 365 + is_leap_year(current_year);
+    for (int current_year = year; current_year < 1970; ++current_year)
+        days -= 365 + is_leap_year(current_year);
+    return days;
+}
+
 template<typename TimevalType>
 inline void timeval_sub(const TimevalType& a, const TimevalType& b, TimevalType& result)
 {
@@ -160,6 +170,7 @@ using AK::timespec_to_timeval;
 using AK::timeval_add;
 using AK::timeval_sub;
 using AK::timeval_to_timespec;
+using AK::years_to_days_since_epoch;
 using AK::operator<=;
 using AK::operator<;
 using AK::operator>;

+ 1 - 13
Kernel/RTC.cpp

@@ -93,18 +93,6 @@ static unsigned days_in_months_since_start_of_year(unsigned month, unsigned year
     return days;
 }
 
-static unsigned days_in_years_since_epoch(unsigned year)
-{
-    unsigned days = 0;
-    while (year > 1969) {
-        days += 365;
-        if (is_leap_year(year))
-            ++days;
-        --year;
-    }
-    return days;
-}
-
 static u8 bcd_to_binary(u8 bcd)
 {
     return (bcd & 0x0F) + ((bcd >> 4) * 10);
@@ -160,7 +148,7 @@ time_t now()
 
     ASSERT(year >= 2018);
 
-    return days_in_years_since_epoch(year - 1) * 86400
+    return years_to_days_since_epoch(year) * 86400
         + days_in_months_since_start_of_year(month - 1, year) * 86400
         + (day - 1) * 86400
         + hour * 3600

+ 1 - 5
Libraries/LibC/time.cpp

@@ -116,11 +116,7 @@ static time_t tm_to_time(struct tm* tm, long timezone_adjust_seconds)
         tm->tm_mon += 12;
     }
 
-    int days = 0;
-    for (int year = 70; year < tm->tm_year; ++year)
-        days += 365 + is_leap_year(1900 + year);
-    for (int year = tm->tm_year; year < 70; ++year)
-        days -= 365 + is_leap_year(1900 + year);
+    int days = years_to_days_since_epoch(1900 + tm->tm_year);
 
     tm->tm_yday = tm->tm_mday - 1;
     for (int month = 0; month < tm->tm_mon; ++month)