static dt_status_t dt_apply_interval_backward()

in src/dt.c [214:233]


static dt_status_t dt_apply_interval_backward(const dt_timestamp_t *lhs, const dt_interval_t *duration, dt_timestamp_t *result)
{

    long min = LONG_MIN;
    if (lhs->nano_second >= duration->nano_seconds) {
        if (duration->seconds > (unsigned long)(-min) + lhs->second) {
            return DT_OVERFLOW;
        }
        result->nano_second = lhs->nano_second - duration->nano_seconds;
        result->second = lhs->second - duration->seconds;
    } else {
        if (lhs->second == LONG_MIN || (duration->seconds  > (unsigned long)(-min) + lhs->second - 1)) {
            return DT_OVERFLOW;
        }
        result->nano_second = duration->nano_seconds - lhs->nano_second;
        result->second = lhs->second - duration->seconds - 1;
        result->nano_second = 1000000000UL - result->nano_second;
    }
    return DT_OK;
}