Merge pull request #25 from remia/fix/non-pod-variadic-warning
[asdcplib.git] / src / KM_tai.cpp
index 7aa7ada1e0e788e27f365a6dce3d07fa61a68b61..00a1231ea253330fceb8bfc5ba8c8081a73a3b6c 100644 (file)
@@ -49,12 +49,17 @@ The libtai source code is in the public domain.
   */
 
 #include <KM_tai.h>
+#ifdef KM_WIN32
+#include <time.h>
+#else
 #include <sys/time.h>
+#endif
 
 //
 void
 caldate_frommjd(Kumu::TAI::caldate* cd, i32_t day)
 {
+  assert(cd);
   i32_t year, month, yday;
 
   year = day / 146097L;
@@ -101,6 +106,7 @@ static ui32_t montab[12] =
 i32_t
 caldate_mjd(const Kumu::TAI::caldate* cd)
 {
+  assert(cd);
   i32_t y, m, d;
 
   d = cd->day - 678882L;
@@ -138,16 +144,10 @@ caldate_mjd(const Kumu::TAI::caldate* cd)
 void
 caltime_utc(Kumu::TAI::caltime* ct, const Kumu::TAI::tai* t)
 {
+  assert(ct&&t);
   Kumu::TAI::tai t2 = *t;
-  ui64_t u;
-  i32_t s;
-
-  /* XXX: check for overfow? */
-
-  u = t2.x;
-
-  u += 58486;
-  s = u % ui64_C(86400);
+  ui64_t u = t2.x + 58486;
+  i32_t s = (i32_t)(u % ui64_C(86400));
 
   ct->second = (s % 60); s /= 60;
   ct->minute = s % 60; s /= 60;
@@ -163,6 +163,7 @@ caltime_utc(Kumu::TAI::caltime* ct, const Kumu::TAI::tai* t)
 void
 caltime_tai(const Kumu::TAI::caltime* ct, Kumu::TAI::tai* t)
 {
+  assert(ct&&t);
   i32_t day, s;
 
   /* XXX: check for overflow? */
@@ -179,16 +180,32 @@ caltime_tai(const Kumu::TAI::caltime* ct, Kumu::TAI::tai* t)
 void
 Kumu::TAI::tai::now()
 {
+#ifdef KM_WIN32
+  SYSTEMTIME st;
+  ::GetSystemTime(&st);
+  TAI::caltime ct;
+  ct.date.year = st.wYear;
+  ct.date.month = st.wMonth;
+  ct.date.day = st.wDay;
+  ct.hour = st.wHour;
+  ct.minute = st.wMinute;
+  ct.second = st.wSecond;
+  ct.offset = 0;
+  caltime_tai(&ct, this);
+#else
   struct timeval now;
   gettimeofday(&now, 0);
   x = ui64_C(4611686018427387914) + (ui64_t)now.tv_sec;
+#endif
 }
 
+
 //
 const Kumu::TAI::tai&
 Kumu::TAI::tai::operator=(const Kumu::TAI::caltime& rhs)
 {
   caltime_tai(&rhs, this);
+  return *this;
 }
 
 //
@@ -196,6 +213,7 @@ const Kumu::TAI::caltime&
 Kumu::TAI::caltime::operator=(const Kumu::TAI::tai& rhs)
 {
   caltime_utc(this, &rhs);
+  return *this;
 }