From b873a222d7ece48f227516a3f2ba8717018ebae4 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 20 Jan 2022 13:54:25 -0500 Subject: [PATCH] AK: Implement AK::Time's seconds_since_epoch_to_year without LibM In order for this method to be used within LibC itself, avoid using the floor() method from LibM, which is not available from within LibC. This header similarly avoids other standard headers as well. --- AK/Time.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/AK/Time.h b/AK/Time.h index 3752c37949..adea9fe2b1 100644 --- a/AK/Time.h +++ b/AK/Time.h @@ -10,7 +10,6 @@ #include #include #include -#include // Kernel and Userspace pull in the definitions from different places. // Avoid trying to figure out which one. @@ -83,8 +82,17 @@ constexpr i64 seconds_since_epoch_to_year(i64 seconds) { constexpr double seconds_per_year = 60.0 * 60.0 * 24.0 * 365.2425; + // NOTE: We are not using floor() from to avoid LibC / DynamicLoader dependency issues. + auto round_down = [](double value) -> i64 { + auto as_i64 = static_cast(value); + + if ((value == as_i64) || (as_i64 >= 0)) + return as_i64; + return as_i64 - 1; + }; + auto years_since_epoch = static_cast(seconds) / seconds_per_year; - return 1970 + static_cast(floor(years_since_epoch)); + return 1970 + round_down(years_since_epoch); } /*