summaryrefslogtreecommitdiffstats
path: root/src/timevalarith.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/timevalarith.c')
-rw-r--r--src/timevalarith.c53
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;
+}