summaryrefslogtreecommitdiffstats
path: root/tinySAK/src/tsk_time.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinySAK/src/tsk_time.c')
-rw-r--r--tinySAK/src/tsk_time.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/tinySAK/src/tsk_time.c b/tinySAK/src/tsk_time.c
new file mode 100644
index 0000000..5d2d66b
--- /dev/null
+++ b/tinySAK/src/tsk_time.c
@@ -0,0 +1,154 @@
+/*
+* Copyright (C) 2009-2010 Mamadou Diop.
+*
+* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
+*
+* This file is part of Open Source Doubango Framework.
+*
+* DOUBANGO is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* DOUBANGO 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with DOUBANGO.
+*
+*/
+
+/**@file tsk_time.c
+* @brief Datetime functions.
+*
+* @author Mamadou Diop <diopmamadou(at)doubango.org>
+*
+* @date Created: Sat Nov 8 16:54:58 2009 mdiop
+*/
+#include "tsk_time.h"
+
+#include "tsk_debug.h"
+
+#if TSK_UNDER_WINDOWS
+//# ifdef _WIN32_WCE
+# include <Winsock2.h> // timeval
+//# endif
+# include <windows.h>
+#elif defined(__SYMBIAN32__)
+# include <_timeval.h>
+#else
+# include <sys/time.h>
+#endif
+
+#include <time.h>
+
+/**@defgroup tsk_time_group Datetime functions.
+*/
+
+#if !HAVE_GETTIMEOFDAY
+#if TSK_UNDER_WINDOWS
+
+/* Thanks to "http://www.cpp-programming.net/c-tidbits/gettimeofday-function-for-windows" */
+#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
+#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
+#else
+#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
+#endif
+
+struct timezone
+{
+ int tz_minuteswest; /* minutes W of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
+
+int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ FILETIME ft;
+ uint64_t tmpres = 0;
+ static int tzflag = 0;
+
+ if(tv)
+ {
+#ifdef _WIN32_WCE
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+ SystemTimeToFileTime(&st, &ft);
+#else
+ GetSystemTimeAsFileTime(&ft);
+#endif
+
+ tmpres |= ft.dwHighDateTime;
+ tmpres <<= 32;
+ tmpres |= ft.dwLowDateTime;
+
+ /*converting file time to unix epoch*/
+ tmpres /= 10; /*convert into microseconds*/
+ tmpres -= DELTA_EPOCH_IN_MICROSECS;
+ tv->tv_sec = (long)(tmpres / 1000000UL);
+ tv->tv_usec = (long)(tmpres % 1000000UL);
+ }
+
+ if (tz){
+ if (!tzflag){
+ _tzset();
+ tzflag++;
+ }
+ tz->tz_minuteswest = _timezone / 60;
+ tz->tz_dsttime = _daylight;
+ }
+
+ return 0;
+}
+
+#else
+#pragma error "You MUST provide an implement for 'gettimeofday'"
+#endif /* WIN32 */
+
+#endif /* !HAVE_GETTIMEOFDAY */
+
+/**@ingroup tsk_time_group
+* The tsk_gettimeofday() function shall obtain the current time, expressed as seconds and microseconds since EPOCH (00:00:00 UTC on 1 January 1970).
+* The resolution of the system clock is unspecified.
+* @param tv The current time, expressed as seconds and microseconds since EPOCH(00:00:00 UTC on 1 January 1970).
+* @param tz The timezone.
+* @retval The tsk_gettimeofday() function shall return 0 and no value shall be reserved to indicate an error.
+*/
+int tsk_gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ return gettimeofday(tv, tz);
+}
+
+/**@ingroup tsk_time_group
+* Gets the number of milliseconds in @a tv
+* @retval The number of milliseconds
+*/
+uint64_t tsk_time_get_ms(struct timeval* tv)
+{
+ if(!tv){
+ TSK_DEBUG_ERROR("Invalid parameter");
+ return 0;
+ }
+ return (((uint64_t)tv->tv_sec)*(uint64_t)1000) + (((uint64_t)tv->tv_usec)/(uint64_t)1000);
+}
+
+/**@ingroup tsk_time_group
+* Gets the number of milliseconds since the EPOCH.
+* @retval The number of milliseconds since EPOCH.
+*/
+uint64_t tsk_time_epoch()
+{
+#if TSK_UNDER_WINDOWS
+ return (uint64_t)timeGetTime();
+#elif HAVE_CLOCK_GETTIME
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (((uint64_t)ts.tv_sec)*(uint64_t)1000) + (((uint64_t)ts.tv_nsec)/(uint64_t)1000000);
+#else
+ struct timeval tv;
+ gettimeofday(&tv, 0);
+ return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000);
+#endif
+}
+
OpenPOWER on IntegriCloud