diff options
author | 2017-11-09 12:17:56 +0200 | |
---|---|---|
committer | 2017-11-09 12:17:56 +0200 | |
commit | 218082e6bf725279bf2231c4290058cba51a290c (patch) | |
tree | f8fa45f295e7deb88eb1bd1d10b1dc376bd6bbca | |
parent | 155ed8d455115b6f004f471a166f54b5225d87af (diff) | |
download | librin-218082e6bf725279bf2231c4290058cba51a290c.tar.gz librin-218082e6bf725279bf2231c4290058cba51a290c.tar.bz2 librin-218082e6bf725279bf2231c4290058cba51a290c.zip |
time: initial implementation.
-rw-r--r-- | include/rin/time.h | 36 | ||||
-rw-r--r-- | meson_options.txt | 1 | ||||
-rw-r--r-- | src/meson.build | 3 | ||||
-rw-r--r-- | src/time/meson.build | 10 | ||||
-rw-r--r-- | src/time/time.c | 117 | ||||
-rw-r--r-- | src/time/time_private.h | 26 |
6 files changed, 192 insertions, 1 deletions
diff --git a/include/rin/time.h b/include/rin/time.h new file mode 100644 index 0000000..aa9bc66 --- /dev/null +++ b/include/rin/time.h @@ -0,0 +1,36 @@ +/* + * 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_INCLUDED +#define LIBRIN_TIME_INCLUDED + +#include <time.h> + +struct timespec rin_time_add(const struct timespec * const a, const struct timespec * const b); +struct timespec rin_time_sub(const struct timespec * const a, const struct timespec * const b); +struct timespec rin_time_normalize(const struct timespec * const t); +unsigned int rin_time_cmp_less(const struct timespec * const a, const struct timespec * const b); +unsigned int rin_time_cmp_more(const struct timespec * const a, const struct timespec * const b); +unsigned int rin_time_cmp_lessequal(const struct timespec * const a, const struct timespec * const b); +unsigned int rin_time_cmp_moreequal(const struct timespec * const a, const struct timespec * const b); +unsigned int rin_time_cmp_equal(const struct timespec * const a, const struct timespec * const b); +unsigned int rin_time_cmp_nonequal(const struct timespec * const a, const struct timespec * const b); + +#endif /* LIBRIN_TIME_INCLUDED */ diff --git a/meson_options.txt b/meson_options.txt index 279996a..b5deb2f 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -4,3 +4,4 @@ option('tests', type : 'boolean', value : false, description : 'Enable building option('float', type : 'boolean', value : true, description : 'Enable building the floating point module') option('gpio', type : 'boolean', value : true, description : 'Enable building the gpio module') option('diagnostic', type : 'boolean', value : true, description : 'Enable building the diagnostics module') +option('time', type : 'boolean', value : true, description : 'Enable building the time module') 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 */ |