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}