dt_status_t dt_sum_intervals()

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;
}