diff options
Diffstat (limited to 'include/tai.h')
-rw-r--r-- | include/tai.h | 74 |
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 |