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