aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/meson.build3
-rw-r--r--src/time/meson.build10
-rw-r--r--src/time/time.c117
-rw-r--r--src/time/time_private.h26
4 files changed, 155 insertions, 1 deletions
diff --git a/src/meson.build b/src/meson.build
index 1d98b67..8bd83b7 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,6 +1,7 @@
subdir('float')
subdir('gpio')
subdir('diagnostic')
+subdir('time')
-sources = [float_sources, gpio_sources, diagnostic_sources]
+sources = [float_sources, gpio_sources, diagnostic_sources, time_sources]
diff --git a/src/time/meson.build b/src/time/meson.build
new file mode 100644
index 0000000..93c1a4d
--- /dev/null
+++ b/src/time/meson.build
@@ -0,0 +1,10 @@
+if get_option('time')
+ time_filenames = [
+ 'time.c',
+ 'time_private.h',
+ ]
+else
+ time_filenames = []
+endif
+
+time_sources = files(time_filenames)
diff --git a/src/time/time.c b/src/time/time.c
new file mode 100644
index 0000000..2c87cba
--- /dev/null
+++ b/src/time/time.c
@@ -0,0 +1,117 @@
+/*
+ * The Rin Library – time module
+ *
+ * Copyright (C) 2017 Gediminas Jakutis
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "rin/time.h"
+#include "time_private.h"
+
+struct timespec rin_time_add(const struct timespec * const a, const struct timespec * const b)
+{
+ struct timespec ret;
+
+ ret.tv_sec = a->tv_sec + b->tv_sec;
+ ret.tv_nsec = a->tv_nsec + b->tv_nsec;
+
+ return rin_time_normalize(&ret);
+}
+
+struct timespec rin_time_sub(const struct timespec * const a, const struct timespec * const b)
+{
+ struct timespec ret;
+
+ ret.tv_sec = a->tv_sec - b->tv_sec;
+ ret.tv_nsec = a->tv_nsec - b->tv_nsec;
+
+ return rin_time_normalize(&ret);
+}
+
+struct timespec rin_time_normalize(const struct timespec * const t)
+{
+ struct timespec ret;
+
+ ret = *t;
+
+ if (ret.tv_nsec >= 0 && ret.tv_nsec <= tv_nsec_max) {
+ return ret;
+ }
+
+ if (ret.tv_nsec > 0) {
+ ret.tv_sec += ret.tv_nsec / tv_nsec_max;
+ ret.tv_nsec = ret.tv_nsec % tv_nsec_max;
+ } else {
+ ret.tv_sec += ret.tv_nsec / tv_nsec_max - 1;
+ ret.tv_nsec = tv_nsec_max - ret.tv_nsec % tv_nsec_max;
+ }
+
+ return ret;
+
+}
+unsigned int rin_time_cmp_less(const struct timespec * const a, const struct timespec * const b)
+{
+ if (a->tv_sec > b->tv_sec) {
+ return 0;
+ } else if (a->tv_sec < b->tv_sec) {
+ return 1;
+ } else {
+ return a->tv_nsec < b->tv_nsec;
+ }
+}
+
+unsigned int rin_time_cmp_more(const struct timespec * const a, const struct timespec * const b)
+{
+ if (a->tv_sec < b->tv_sec) {
+ return 0;
+ } else if (a->tv_sec > b->tv_sec) {
+ return 1;
+ } else {
+ return a->tv_nsec > b->tv_nsec;
+ }
+}
+
+unsigned int rin_time_cmp_lessequal(const struct timespec * const a, const struct timespec * const b)
+{
+ if (a->tv_sec > b->tv_sec) {
+ return 0;
+ } else if (a->tv_sec < b->tv_sec) {
+ return 1;
+ } else {
+ return a->tv_nsec <= b->tv_nsec;
+ }
+}
+
+unsigned int rin_time_cmp_moreequal(const struct timespec * const a, const struct timespec * const b)
+{
+ if (a->tv_sec < b->tv_sec) {
+ return 0;
+ } else if (a->tv_sec > b->tv_sec) {
+ return 1;
+ } else {
+ return a->tv_nsec >= b->tv_nsec;
+ }
+}
+
+unsigned int rin_time_cmp_equal(const struct timespec * const a, const struct timespec * const b)
+{
+ return a->tv_sec == b->tv_sec && a->tv_nsec == b->tv_nsec;
+}
+
+unsigned int rin_time_cmp_nonequal(const struct timespec * const a, const struct timespec * const b)
+{
+ return a->tv_sec != b->tv_sec || a->tv_sec != b->tv_nsec;
+}
diff --git a/src/time/time_private.h b/src/time/time_private.h
new file mode 100644
index 0000000..4bb6099
--- /dev/null
+++ b/src/time/time_private.h
@@ -0,0 +1,26 @@
+/*
+ * The Rin Library – time module
+ *
+ * Copyright (C) 2017 Gediminas Jakutis
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef LIBRIN_TIME_PRIVATE_INCLUDED
+#define LIBRIN_TIME_PRIVATE_INCLUDED
+
+static const long tv_nsec_max = 999999999l;
+
+#endif /* LIBRIN_TIME_PRIVATE_INCLUDED */