+
+/* ------------------------------------------------------------------------- */
+/* Definitions for time measurement. TIMEVALUE is a type; TIMEVALUE_NOW() */
+/* sets it; TIMEVALUE_DIFFERENCE() determines a difference in seconds, */
+/* as a float. */
+/* Modern platforms should support timespec_get() or clock_gettime(). To */
+/* use timespec_get(), #define USE_C11_TIME_API. To use clock_gettime(), */
+/* #define USE_POSIX_TIME_API. To use the old implementation using */
+/* time(), #define USE_OLD_TIME_API. This can only measure in integer */
+/* second counts, but it's better than waiting for gnomon. */
+/* ------------------------------------------------------------------------- */
+
+#if !defined(USE_C11_TIME_API) && !defined(USE_POSIX_TIME_API) && !defined(USE_OLD_TIME_API)
+#define USE_OLD_TIME_API
+#endif
+
+#if defined(USE_OLD_TIME_API)
+ #define TIMEVALUE time_t
+ #define TIMEVALUE_NOW(t) (*t) = time(0)
+ #define TIMEVALUE_DIFFERENCE(begt, endt) (float)(*(endt) - *(begt))
+#elif defined(USE_C11_TIME_API)
+ #define TIMEVALUE struct timespec
+ #define TIMEVALUE_NOW(t) timespec_get((t), TIME_UTC)
+ #define TIMEVALUE_DIFFERENCE(begt, endt) ((float)((endt)->tv_sec - (begt)->tv_sec) + (float)((endt)->tv_nsec - (begt)->tv_nsec) / 1000000000.0F)
+#elif defined(USE_POSIX_TIME_API)
+ #define TIMEVALUE struct timespec
+ #define TIMEVALUE_NOW(t) clock_gettime(CLOCK_REALTIME, (t))
+ #define TIMEVALUE_DIFFERENCE(begt, endt) ((float)((endt)->tv_sec - (begt)->tv_sec) + (float)((endt)->tv_nsec - (begt)->tv_nsec) / 1000000000.0F)
+#endif
+