struct timespec timespec_sub (struct timespec a, struct timespec b) { struct timespec r; time_t rs = a.tv_sec; time_t bs = b.tv_sec; int ns = a.tv_nsec - b.tv_nsec; int rns = ns; if (ns < 0) { rns = ns + 1000000000; if (rs == TYPE_MINIMUM (time_t)) { if (bs <= 0) goto low_overflow; bs--; } else rs--; } if (INT_SUBTRACT_OVERFLOW (rs, bs)) { if (rs < 0) { low_overflow: rs = TYPE_MINIMUM (time_t); rns = 0; } else { rs = TYPE_MAXIMUM (time_t); rns = 999999999; } } else rs -= bs; r.tv_sec = rs; r.tv_nsec = rns; return r; }
struct timespec timespec_sub (struct timespec a, struct timespec b) { time_t rs = a.tv_sec; time_t bs = b.tv_sec; int ns = a.tv_nsec - b.tv_nsec; int rns = ns; if (ns < 0) { rns = ns + TIMESPEC_RESOLUTION; if (rs == TYPE_MINIMUM (time_t)) { if (bs <= 0) goto low_overflow; bs--; } else rs--; } if (INT_SUBTRACT_OVERFLOW (rs, bs)) { if (rs < 0) { low_overflow: rs = TYPE_MINIMUM (time_t); rns = 0; } else { rs = TYPE_MAXIMUM (time_t); rns = TIMESPEC_RESOLUTION - 1; } } else rs -= bs; return make_timespec (rs, rns); }