diff options
author | Mattias Andrée <maandree@kth.se> | 2017-11-12 14:44:35 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2017-11-12 14:54:29 +0100 |
commit | 67a395794b678d7da053c3daf61eb12d3f9437f2 (patch) | |
tree | 26be121e2738954a648d4032e8798723034960d7 /difftimespec.c | |
parent | More functions and add makefile (diff) | |
download | libsimple-67a395794b678d7da053c3daf61eb12d3f9437f2.tar.gz libsimple-67a395794b678d7da053c3daf61eb12d3f9437f2.tar.bz2 libsimple-67a395794b678d7da053c3daf61eb12d3f9437f2.tar.xz |
Split into multiple units
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'difftimespec.c')
-rw-r--r-- | difftimespec.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/difftimespec.c b/difftimespec.c new file mode 100644 index 0000000..4ea74a8 --- /dev/null +++ b/difftimespec.c @@ -0,0 +1,50 @@ +/* See LICENSE file for copyright and license details. */ +#include "libsimple.h" + + +int +libsimple_difftimespec(struct timespec *diff, const struct timespec *minuend, const struct timespec *subtrahend) +{ + long int ns = minuend->tv_nsec - subtrahend->tv_nsec; + time_t s; + int ret = 0; + + s = minuend->tv_sec - subtrahend->tv_sec; + if ((minuend->tv_sec <= 0) != (subtrahend->tv_sec <= 0)) { + if (minuend->tv_sec < 0 && minuend->tv_sec < TIME_MIN + subtrahend->tv_sec) { + s = TIME_MIN; + ns = 0; + errno = ERANGE; + ret = -1; + } else if (minuend->tv_sec >= 0 && minuend->tv_sec > TIME_MAX + subtrahend->tv_sec) { + s = TIME_MAX; + ns = 999999999L; + errno = ERANGE; + ret = -1; + } + } + + if (ns < 0) { + if (s == TIME_MIN) { + ns = 0L; + errno = ERANGE; + ret = -1; + } else { + s -= 1; + ns += 1000000000L; + } + } else if (ns >= 1000000000L) { + if (s == TIME_MAX) { + ns = 999999999L; + errno = ERANGE; + ret = -1; + } else { + s += 1; + ns -= 1000000000L; + } + } + + diff->tv_sec = s; + diff->tv_nsec = ns; + return ret; +} |