[PATCH] libc/time/gmtime_r.c, libc/time/lcltime_r.c,, libc/time/local.h, libc/time/mktm_r.c: move localtime related functionality, from _mktm_r() to new _mklocaltm_r() to break dependency of gmtime() on, timezones

Freddie Chopin freddie_chopin@op.pl
Fri Sep 12 13:32:00 GMT 2014


W dniu 2014-09-11 23:57, Jeff Johnston pisze:
> Patch checked in.

There's a small problem... You forgot to add two new files - 
month_lengths.c and tzcalc_limits.c, so current repository version will 
fail to build.

I attach patch with just these two files, ChangeLog entry would be a bit 
confusing, as these files were mentioned in the previous ChangeLog entry.

Regards,
FCh
-------------- next part --------------
From 53035a0cfcfc3f3d81ee67122bb3b3ef312939a9 Mon Sep 17 00:00:00 2001
From: Freddie Chopin <freddie.chopin@gmail.com>
Date: Sat, 6 Sep 2014 00:00:12 +0200
Subject: [PATCH] add files missing from previous patch

---
 newlib/libc/time/month_lengths.c | 14 ++++++++
 newlib/libc/time/tzcalc_limits.c | 77 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+)
 create mode 100644 newlib/libc/time/month_lengths.c
 create mode 100644 newlib/libc/time/tzcalc_limits.c

diff --git a/newlib/libc/time/month_lengths.c b/newlib/libc/time/month_lengths.c
new file mode 100644
index 0000000..2871802
--- /dev/null
+++ b/newlib/libc/time/month_lengths.c
@@ -0,0 +1,14 @@
+/*
+ * month_lengths.c
+ *
+ * Array __month_lengths[] is (indirectly) needed by tzset(), mktime(),
+ * gmtime() and localtime(). To break any dependencies, this array is moved to
+ * separate source file.
+ */
+
+#include "local.h"
+
+_CONST int __month_lengths[2][MONSPERYEAR] = {
+  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+  {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
+} ;
diff --git a/newlib/libc/time/tzcalc_limits.c b/newlib/libc/time/tzcalc_limits.c
new file mode 100644
index 0000000..8a0bda3
--- /dev/null
+++ b/newlib/libc/time/tzcalc_limits.c
@@ -0,0 +1,77 @@
+/*
+ * tzcalc_limits.c
+ * Original Author: Adapted from tzcode maintained by Arthur David Olson.
+ * Modifications:
+ * - Changed to mktm_r and added __tzcalc_limits - 04/10/02, Jeff Johnston
+ * - Fixed bug in mday computations - 08/12/04, Alex Mogilnikov <alx@intellectronika.ru>
+ * - Fixed bug in __tzcalc_limits - 08/12/04, Alex Mogilnikov <alx@intellectronika.ru>
+ * - Moved __tzcalc_limits() to separate file - 05/09/14, Freddie Chopin <freddie_chopin@op.pl>
+ */
+
+#include "local.h"
+
+int
+_DEFUN (__tzcalc_limits, (year),
+	int year)
+{
+  int days, year_days, years;
+  int i, j;
+  __tzinfo_type *_CONST tz = __gettzinfo ();
+
+  if (year < EPOCH_YEAR)
+    return 0;
+
+  tz->__tzyear = year;
+
+  years = (year - EPOCH_YEAR);
+
+  year_days = years * 365 +
+    (years - 1 + EPOCH_YEARS_SINCE_LEAP) / 4 -
+    (years - 1 + EPOCH_YEARS_SINCE_CENTURY) / 100 +
+    (years - 1 + EPOCH_YEARS_SINCE_LEAP_CENTURY) / 400;
+
+  for (i = 0; i < 2; ++i)
+    {
+      if (tz->__tzrule[i].ch == 'J')
+	{
+	  /* The Julian day n (1 <= n <= 365). */
+	  days = year_days + tz->__tzrule[i].d +
+	    (isleap(year) && tz->__tzrule[i].d >= 60);
+	  /* Convert to yday */
+	  --days;
+	}
+      else if (tz->__tzrule[i].ch == 'D')
+	days = year_days + tz->__tzrule[i].d;
+      else
+	{
+	  _CONST int yleap = isleap(year);
+	  int m_day, m_wday, wday_diff;
+	  _CONST int *_CONST ip = __month_lengths[yleap];
+
+	  days = year_days;
+
+	  for (j = 1; j < tz->__tzrule[i].m; ++j)
+	    days += ip[j-1];
+
+	  m_wday = (EPOCH_WDAY + days) % DAYSPERWEEK;
+
+	  wday_diff = tz->__tzrule[i].d - m_wday;
+	  if (wday_diff < 0)
+	    wday_diff += DAYSPERWEEK;
+	  m_day = (tz->__tzrule[i].n - 1) * DAYSPERWEEK + wday_diff;
+
+	  while (m_day >= ip[j-1])
+	    m_day -= DAYSPERWEEK;
+
+	  days += m_day;
+	}
+
+      /* store the change-over time in GMT form by adding offset */
+      tz->__tzrule[i].change = days * SECSPERDAY +
+      tz->__tzrule[i].s + tz->__tzrule[i].offset;
+    }
+
+  tz->__tznorth = (tz->__tzrule[0].change < tz->__tzrule[1].change);
+
+  return 1;
+}
-- 
1.8.1.msysgit.1



More information about the Newlib mailing list