diff options
Diffstat (limited to 'src/timevalarith.c')
-rw-r--r-- | src/timevalarith.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/timevalarith.c b/src/timevalarith.c new file mode 100644 index 0000000..1091192 --- /dev/null +++ b/src/timevalarith.c @@ -0,0 +1,53 @@ +#include "timevalarith.h" + +struct timeval timeval_max(struct timeval a, struct timeval b) { + + if (a.tv_sec > b.tv_sec) + return a; + + if (a.tv_sec < b.tv_sec) + return b; + + if (a.tv_usec > b.tv_usec) + return a; + + return b; +} + +struct timeval timeval_add(struct timeval a, uint32_t d) { + uint64_t sec, usec; + struct timeval r; + + sec = (uint64_t) a.tv_sec + (d / 1000000L); + usec = (uint64_t) a.tv_usec + (d % 1000000L); + + while (usec > 1000000L) { + usec -= 1000000L; + sec++; + } + + r.tv_sec = (long) sec; + r.tv_usec = (long) usec; + return r; +} + +struct timeval timeval_sub(struct timeval a, uint32_t d) { + uint64_t sec, usec; + struct timeval r; + + sec = (uint64_t) a.tv_sec - (d / 1000000L); + usec = (uint64_t) a.tv_usec; + + d = (d % 1000000L); + + if (usec > d) + usec -= d; + else { + sec--; + usec = 1000000L + usec - d; + } + + r.tv_sec = (long) sec; + r.tv_usec = (long) usec; + return r; +} |