Fix i586 compilation and add more checks

This commit is contained in:
Wildan M
2026-01-06 15:56:57 +07:00
parent 0ade938c63
commit fab87ae2d8
+16 -8
View File
@@ -48,7 +48,7 @@ pub use strptime::strptime;
const YEARS_PER_ERA: time_t = 400;
const DAYS_PER_ERA: time_t = 146097;
const SECS_PER_DAY: time_t = 24 * 60 * 60;
const NANOSECONDS: i64 = 1_000_000_000;
const NANOSECONDS: c_long = 1_000_000_000;
const UTC_STR: &core::ffi::CStr = c"UTC";
/// See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/time.h.html>.
@@ -64,32 +64,40 @@ impl timespec {
/// similar logic with timeradd
pub fn add(base: timespec, interval: timespec) -> Option<timespec> {
let delta_sec = base.tv_sec + interval.tv_sec;
let delta_nsec = base.tv_nsec + interval.tv_nsec;
let Some(delta_sec) = base.tv_sec.checked_add(interval.tv_sec) else {
return None;
};
let Some(delta_nsec) = base.tv_nsec.checked_add(interval.tv_nsec) else {
return None;
};
if delta_sec < 0 || delta_nsec < 0 {
return None;
}
Some(Self {
tv_sec: delta_sec + (delta_nsec / NANOSECONDS),
tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t,
tv_nsec: delta_nsec % NANOSECONDS,
})
}
/// similar logic with timersub
pub fn subtract(later: timespec, earlier: timespec) -> Option<timespec> {
let delta_sec = later.tv_sec - earlier.tv_sec;
let delta_nsec = later.tv_nsec - earlier.tv_nsec;
let Some(delta_sec) = later.tv_sec.checked_sub(earlier.tv_sec) else {
return None;
};
let Some(delta_nsec) = later.tv_nsec.checked_sub(earlier.tv_nsec) else {
return None;
};
let time = if delta_nsec < 0 {
let roundup_sec = -delta_nsec / NANOSECONDS + 1;
timespec {
tv_sec: delta_sec - roundup_sec,
tv_sec: delta_sec - (roundup_sec as time_t),
tv_nsec: roundup_sec * NANOSECONDS - delta_nsec,
}
} else {
timespec {
tv_sec: delta_sec + (delta_nsec / NANOSECONDS),
tv_sec: delta_sec + (delta_nsec / NANOSECONDS) as time_t,
tv_nsec: delta_nsec % NANOSECONDS,
}
};