in src/dt.c [296:319]
dt_status_t dt_sum_intervals(const dt_interval_t *lhs, const dt_interval_t *rhs, dt_interval_t *result)
{
unsigned long seconds = 0;
unsigned long nano_seconds = 0;
unsigned long seconds_nanoseconds_part = 0;
unsigned long full_seconds_part = 0;
if (dt_validate_interval(lhs) == DT_FALSE || dt_validate_interval(rhs) == DT_FALSE || !result) {
return DT_INVALID_ARGUMENT;
}
seconds_nanoseconds_part = (lhs->nano_seconds + rhs->nano_seconds) / 1000000000UL;
full_seconds_part = rhs->seconds + seconds_nanoseconds_part;
if (is_unsigned_long_sum_overflows(rhs->seconds, seconds_nanoseconds_part) == DT_TRUE ||
is_unsigned_long_sum_overflows(lhs->seconds, full_seconds_part) == DT_TRUE) {
return DT_OVERFLOW;
}
seconds = lhs->seconds + full_seconds_part;
nano_seconds = (lhs->nano_seconds + rhs->nano_seconds) % 1000000000UL;
result->seconds = seconds;
result->nano_seconds = nano_seconds;
return DT_OK;
}