summaryrefslogtreecommitdiff
path: root/include/tai.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/tai.h')
-rw-r--r--include/tai.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/include/tai.h b/include/tai.h
new file mode 100644
index 0000000..37d24e0
--- /dev/null
+++ b/include/tai.h
@@ -0,0 +1,74 @@
+#ifndef TAI_H
+#define TAI_H
+
+/*
+ * Revision 20160728, Kai Peter
+ * - switched to 'uint_t.h'
+*/
+/* this header file comes from libowfat, http://www.fefe.de/libowfat/ */
+
+/* Times with 1 second precision */
+
+#include "uint_t.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A struct tai value is an integer between 0 inclusive and 2^64
+ * exclusive. The format of struct tai is designed to speed up common
+ * operations; applications should not look inside struct tai.
+ *
+ * A struct tai variable is commonly used to store a TAI64 label. Each
+ * TAI64 label refers to one second of real time. TAI64 labels span a
+ * range of hundreds of billions of years.
+ *
+ * A struct tai variable may also be used to store the numerical
+ * difference between two TAI64 labels.
+ * See http://cr.yp.to/libtai/tai64.html */
+
+typedef struct tai {
+ uint64 x;
+} tai64;
+
+
+#define tai_unix(t,u) ((void) ((t)->x = 4611686018427387914ULL + (uint64) (u)))
+
+/* tai_now puts the current time into t. More precisely: tai_now puts
+ * into t its best guess as to the TAI64 label for the 1-second interval
+ * that contains the current time.
+ *
+ * This implementation of tai_now assumes that the time_t returned from
+ * the time function represents the number of TAI seconds since
+ * 1970-01-01 00:00:10 TAI. This matches the convention used by the
+ * Olson tz library in ``right'' mode. */
+void tai_now(struct tai *);
+
+/* tai_approx returns a double-precision approximation to t. The result
+ * of tai_approx is always nonnegative. */
+#define tai_approx(t) ((double) ((t)->x))
+
+/* tai_add adds a to b modulo 2^64 and puts the result into t. The
+ * inputs and output may overlap. */
+void tai_add(struct tai *,const struct tai *,const struct tai *);
+/* tai_sub subtracts b from a modulo 2^64 and puts the result into t.
+ * The inputs and output may overlap. */
+void tai_sub(struct tai *,const struct tai *,const struct tai *);
+/* tai_less returns 1 if a is less than b, 0 otherwise. */
+#define tai_less(t,u) ((t)->x < (u)->x)
+
+#define TAI_PACK 8
+/* tai_pack converts a TAI64 label from internal format in t to external
+ * TAI64 format in buf. */
+void tai_pack(char *,const struct tai *);
+/* tai_unpack converts a TAI64 label from external TAI64 format in buf
+ * to internal format in t. */
+void tai_unpack(const char *,struct tai *);
+
+void tai_uint(struct tai *,unsigned int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif