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 /timespectostr.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 '')
-rw-r--r-- | timespectostr.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/timespectostr.c b/timespectostr.c new file mode 100644 index 0000000..2e7dd7a --- /dev/null +++ b/timespectostr.c @@ -0,0 +1,39 @@ +/* See LICENSE file for copyright and license details. */ +#include "libsimple.h" + + +char * +libsimple_timespectostr(char *restrict buf, const struct timespec *restrict ts) +{ + time_t s = ts->tv_sec; + long int ns = ts->tv_nsec; + char sign[2] = "+"; + + if (!s) { + buf = malloc(INTSTRLEN(time_t) + sizeof("-.999999999")); + if (!buf) + return NULL; + } + + if (ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000L) { + errno = EINVAL; + return NULL; + } + + if (s == TIME_MIN && !ns) { + sprintf(buf, "%lli.000000000", (long long int)s); + return buf; + } + + if (s < 0) { + s = -s; + *sign = '-'; + if (ns) { + s -= 1; + ns = 1000000000L - ns; + } + } + + sprintf(buf, "%s%lli.%09li", sign, (long long int)s, ns); + return buf; +} |