diff --git a/misc.c b/misc.c index 7e33e65a..a81aa9e4 100644 --- a/misc.c +++ b/misc.c @@ -13,15 +13,32 @@ isword(char32_t wc, bool spaces_only, const char32_t *delimiters) return isc32graph(wc); } +void +timespec_add(const struct timespec *a, const struct timespec *b, + struct timespec *res) +{ + const long one_sec_in_ns = 1000000000; + + res->tv_sec = a->tv_sec + b->tv_sec; + res->tv_nsec = a->tv_nsec + b->tv_nsec; + /* tv_nsec may be negative */ + if (res->tv_nsec >= one_sec_in_ns) { + res->tv_sec++; + res->tv_nsec -= one_sec_in_ns; + } +} + void timespec_sub(const struct timespec *a, const struct timespec *b, struct timespec *res) { + const long one_sec_in_ns = 1000000000; + res->tv_sec = a->tv_sec - b->tv_sec; res->tv_nsec = a->tv_nsec - b->tv_nsec; /* tv_nsec may be negative */ if (res->tv_nsec < 0) { res->tv_sec--; - res->tv_nsec += 1000 * 1000 * 1000; + res->tv_nsec += one_sec_in_ns; } } diff --git a/misc.h b/misc.h index ba8b2ce7..648bb65f 100644 --- a/misc.h +++ b/misc.h @@ -6,4 +6,5 @@ bool isword(char32_t wc, bool spaces_only, const char32_t *delimiters); +void timespec_add(const struct timespec *a, const struct timespec *b, struct timespec *res); void timespec_sub(const struct timespec *a, const struct timespec *b, struct timespec *res);