summaryrefslogtreecommitdiff
path: root/navit/support/libc/timeutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/support/libc/timeutil.c')
-rw-r--r--navit/support/libc/timeutil.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/navit/support/libc/timeutil.c b/navit/support/libc/timeutil.c
new file mode 100644
index 000000000..433bbbb58
--- /dev/null
+++ b/navit/support/libc/timeutil.c
@@ -0,0 +1,126 @@
+#include "timeutil.h"
+
+/* Originally based on code found in the Ruby WinCE support, which
+ had the following notice: */
+
+/* start original header */
+
+/***************************************************************
+ time.c
+
+ author : uema2
+ date : Nov 30, 2002
+
+ You can freely use, copy, modify, and redistribute
+ the whole contents.
+***************************************************************/
+
+/* end original header */
+
+/* Note: The original filename was: wince/time_wce.c */
+
+/* Adapted to mingw32ce by Pedro Alves <pedro_alves@portugalmail.pt>
+ 10 Feb 2007 - Initial revision. */
+
+#define DELTA_EPOCH 116444736000000000LL
+
+#if 0
+how_to_calc_delta_epoch ()
+{
+ FILETIME f1601, f1970;
+ __FILETIME_from_Year (1601, &f1601);
+ __FILETIME_from_Year (1970, &f1970);
+ DELTA_EPOCH = __FILETIME_to_ll (&f1970) - __FILETIME_to_ll (&f1601);
+}
+#endif
+
+long long
+__FILETIME_to_ll (const FILETIME *f)
+{
+ long long t;
+ t = (long long)f->dwHighDateTime << 32;
+ t |= f->dwLowDateTime;
+ return t;
+}
+
+void
+__ll_to_FILETIME (long long t, FILETIME* f)
+{
+ f->dwHighDateTime = (DWORD)((t >> 32) & 0x00000000FFFFFFFF);
+ f->dwLowDateTime = (DWORD)(t & 0x00000000FFFFFFFF);
+}
+
+void
+__tm_to_SYSTEMTIME (struct tm *t, SYSTEMTIME *s)
+{
+ s->wYear = t->tm_year + 1900;
+ s->wMonth = t->tm_mon + 1;
+ s->wDayOfWeek = t->tm_wday;
+ s->wDay = t->tm_mday;
+ s->wHour = t->tm_hour;
+ s->wMinute = t->tm_min;
+ s->wSecond = t->tm_sec;
+ s->wMilliseconds = 0;
+}
+
+static void
+__FILETIME_from_Year (WORD year, FILETIME *f)
+{
+ SYSTEMTIME s = {0};
+
+ s.wYear = year;
+ s.wMonth = 1;
+ s.wDayOfWeek = 1;
+ s.wDay = 1;
+
+ SystemTimeToFileTime (&s, f);
+}
+
+static int
+__Yday_from_SYSTEMTIME (const SYSTEMTIME *s)
+{
+ long long t;
+ FILETIME f1, f2;
+
+ __FILETIME_from_Year (s->wYear, &f1);
+ SystemTimeToFileTime (s, &f2);
+
+ t = __FILETIME_to_ll (&f2) - __FILETIME_to_ll (&f1);
+
+ return ((t / _onesec_in100ns) / (60 * 60 * 24));
+}
+
+void
+__SYSTEMTIME_to_tm (SYSTEMTIME *s, struct tm *tm)
+{
+ tm->tm_year = s->wYear - 1900;
+ tm->tm_mon = s->wMonth- 1;
+ tm->tm_wday = s->wDayOfWeek;
+ tm->tm_mday = s->wDay;
+ tm->tm_yday = __Yday_from_SYSTEMTIME (s);
+ tm->tm_hour = s->wHour;
+ tm->tm_min = s->wMinute;
+ tm->tm_sec = s->wSecond;
+ tm->tm_isdst = 0;
+}
+
+time_t
+__FILETIME_to_time_t (const FILETIME* f)
+{
+ long long t;
+ t = __FILETIME_to_ll (f);
+ t -= DELTA_EPOCH;
+ return (time_t)(t / _onesec_in100ns);
+}
+
+void
+__time_t_to_FILETIME (time_t t, FILETIME *f)
+{
+ long long time;
+
+ time = t;
+ time *= _onesec_in100ns;
+ time += DELTA_EPOCH;
+
+ __ll_to_FILETIME (time, f);
+}