1#include "timespec.h"
 2
 3void timespec_add(struct timespec* ts, double increment)
 4{
 5    double integral;
 6    double frac = modf(increment, &integral);
 7    frac *= 1'000'000'000;
 8    ts->tv_sec += integral;
 9    ts->tv_nsec += frac;
10    if (ts->tv_nsec >= 1'000'000'000) {
11        ts->tv_nsec -= 1'000'000'000;
12        ts->tv_sec++;
13    }
14}
15
16void timespec_sub(struct timespec* a, struct timespec* b)
17{
18    a->tv_sec -= b->tv_sec;
19    if (a->tv_nsec < b->tv_nsec) {
20        a->tv_sec--;
21        a->tv_nsec += 1000'000'000UL;
22    }
23    a->tv_nsec -= b->tv_nsec;
24}
25
26int timespec_cmp(struct timespec* a, struct timespec* b)
27{
28    if (a->tv_sec < b->tv_sec) {
29        return -1;
30    } else if (a->tv_sec > b->tv_sec) {
31        return 1;
32    }
33    if (a->tv_nsec < b->tv_nsec) {
34        return -1;
35    } else if (a->tv_nsec > b->tv_nsec) {
36        return 1;
37    }
38    return 0;
39}