aboutsummaryrefslogtreecommitdiffstats
path: root/timespec2timeval.c
diff options
context:
space:
mode:
Diffstat (limited to 'timespec2timeval.c')
-rw-r--r--timespec2timeval.c111
1 files changed, 95 insertions, 16 deletions
diff --git a/timespec2timeval.c b/timespec2timeval.c
index 282f794..92c9b3e 100644
--- a/timespec2timeval.c
+++ b/timespec2timeval.c
@@ -1,23 +1,102 @@
/* See LICENSE file for copyright and license details. */
#include "libsimple.h"
+#ifndef TEST
int
-libsimple_timespec2timeval(struct timeval *restrict tv, const struct timespec *restrict ts) /* TODO test */
+libsimple_timespec2timeval(struct timeval *restrict tv, const struct timespec *restrict ts)
{
- tv->tv_sec = ts->tv_sec;
- tv->tv_usec = ts->tv_nsec / 1000L;
- if ((ts->tv_nsec % 1000L) >= 500L) {
- if (++(tv->tv_usec) == 1000000L) {
- tv->tv_usec = 0;
- if (tv->tv_sec == TIME_MAX) {
- tv->tv_usec = 999999L;
- errno = EOVERFLOW;
- return -1;
- } else {
- tv->tv_sec += 1;
- }
- }
- }
- return 0;
+ tv->tv_sec = ts->tv_sec;
+ tv->tv_usec = ts->tv_nsec / 1000L;
+ if ((ts->tv_nsec % 1000L) >= 500L) {
+ if (++(tv->tv_usec) == 1000000L) {
+ tv->tv_usec = 0;
+ if (tv->tv_sec == TIME_MAX) {
+ tv->tv_usec = 999999L;
+ errno = EOVERFLOW;
+ return -1;
+ } else {
+ tv->tv_sec += 1;
+ }
+ }
+ }
+ return 0;
}
+
+
+#else
+#include "test.h"
+
+int
+main(void)
+{
+ struct timeval tv;
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){0, 0}));
+ assert(tv.tv_sec == 0);
+ assert(tv.tv_usec == 0);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){100, 0}));
+ assert(tv.tv_sec == 100);
+ assert(tv.tv_usec == 0);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){100, 100000000L}));
+ assert(tv.tv_sec == 100);
+ assert(tv.tv_usec == 100000L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){100, 100000400L}));
+ assert(tv.tv_sec == 100);
+ assert(tv.tv_usec == 100000L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){100, 100000500L}));
+ assert(tv.tv_sec == 100);
+ assert(tv.tv_usec == 100001L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){100, 999999999L}));
+ assert(tv.tv_sec == 101);
+ assert(tv.tv_usec == 0L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){-100, 0}));
+ assert(tv.tv_sec == -100);
+ assert(tv.tv_usec == 0);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){-100, 100000000L}));
+ assert(tv.tv_sec == -100);
+ assert(tv.tv_usec == 100000L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){-100, 100000400L}));
+ assert(tv.tv_sec == -100);
+ assert(tv.tv_usec == 100000L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){-100, 100000500L}));
+ assert(tv.tv_sec == -100);
+ assert(tv.tv_usec == 100001L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){-100, 999999999L}));
+ assert(tv.tv_sec == -99);
+ assert(tv.tv_usec == 0L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){TIME_MAX, 100000500L}));
+ assert(tv.tv_sec == TIME_MAX);
+ assert(tv.tv_usec == 100001L);
+
+ assert(libsimple_timespec2timeval(&tv, &(struct timespec){TIME_MAX, 999999500L}) == -1 && errno == EOVERFLOW);
+ assert(tv.tv_sec == TIME_MAX);
+ assert(tv.tv_usec == 999999L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){TIME_MIN, 100000500L}));
+ assert(tv.tv_sec == TIME_MIN);
+ assert(tv.tv_usec == 100001L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){TIME_MIN, 0L}));
+ assert(tv.tv_sec == TIME_MIN);
+ assert(tv.tv_usec == 0L);
+
+ assert(!libsimple_timespec2timeval(&tv, &(struct timespec){TIME_MIN, 500L}));
+ assert(tv.tv_sec == TIME_MIN);
+ assert(tv.tv_usec == 1L);
+
+ return 0;
+}
+
+#endif