summaryrefslogtreecommitdiff
path: root/source/kit/time.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/kit/time.c')
-rw-r--r--source/kit/time.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/source/kit/time.c b/source/kit/time.c
new file mode 100644
index 0000000..bcb3819
--- /dev/null
+++ b/source/kit/time.c
@@ -0,0 +1,84 @@
+/*
+ * C11 <time.h> implementation
+ *
+ * (C) Copyright yohhoy 2012.
+ * Copyright 2022 Yonggang Luo
+ * Distributed under the Boost Software License, Version 1.0.
+ *
+ * Permission is hereby granted, free of charge, to any person or
+ * organization obtaining a copy of the software and accompanying
+ * documentation covered by this license (the "Software") to use,
+ * reproduce, display, distribute, execute, and transmit the Software,
+ * and to prepare [[derivative work]]s of the Software, and to permit
+ * third-parties to whom the Software is furnished to do so, all
+ * subject to the following:
+ *
+ * The copyright notices in the Software and this entire statement,
+ * including the above license grant, this restriction and the
+ * following disclaimer, must be included in all copies of the
+ * Software, in whole or in part, and all derivative works of the
+ * Software, unless such copies or derivative works are solely in the
+ * form of machine-executable object code generated by a source
+ * language processor.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
+ * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
+ * DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "time.h"
+
+#ifndef KIT_HAVE_TIMESPEC_GET
+
+# if defined(_WIN32) && !defined(__CYGWIN__)
+
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+# include <windows.h>
+
+int timespec_get(struct timespec *ts, int base) {
+/* difference between 1970 and 1601 */
+# define _TIMESPEC_IMPL_UNIX_EPOCH_IN_TICKS 116444736000000000ull
+/* 1 tick is 100 nanoseconds */
+# define _TIMESPEC_IMPL_TICKS_PER_SECONDS 10000000ull
+ if (!ts)
+ return 0;
+ if (base == TIME_UTC) {
+ FILETIME ft;
+ ULARGE_INTEGER date;
+ LONGLONG ticks;
+
+ GetSystemTimeAsFileTime(&ft);
+ date.HighPart = ft.dwHighDateTime;
+ date.LowPart = ft.dwLowDateTime;
+ ticks = (LONGLONG) (date.QuadPart -
+ _TIMESPEC_IMPL_UNIX_EPOCH_IN_TICKS);
+ ts->tv_sec = ticks / _TIMESPEC_IMPL_TICKS_PER_SECONDS;
+ ts->tv_nsec = (ticks % _TIMESPEC_IMPL_TICKS_PER_SECONDS) * 100;
+ return base;
+ }
+ return 0;
+# undef _TIMESPEC_IMPL_UNIX_EPOCH_IN_TICKS
+# undef _TIMESPEC_IMPL_TICKS_PER_SECONDS
+}
+
+# else
+
+int timespec_get(struct timespec *ts, int base) {
+ if (!ts)
+ return 0;
+ if (base == TIME_UTC) {
+ clock_gettime(CLOCK_REALTIME, ts);
+ return base;
+ }
+ return 0;
+}
+# endif
+
+#endif