Module Name:    src
Committed By:   christos
Date:           Fri Nov  4 19:41:53 UTC 2016

Modified Files:
        src/lib/libc/time: Makefile NEWS localtime.c private.h tz-art.htm
            tz-link.htm version zic.c
Added Files:
        src/lib/libc/time: LICENSE

Log Message:
tzcode2016i


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/lib/libc/time/LICENSE
cvs rdiff -u -r1.35 -r1.36 src/lib/libc/time/Makefile
cvs rdiff -u -r1.18 -r1.19 src/lib/libc/time/NEWS
cvs rdiff -u -r1.104 -r1.105 src/lib/libc/time/localtime.c
cvs rdiff -u -r1.47 -r1.48 src/lib/libc/time/private.h
cvs rdiff -u -r1.14 -r1.15 src/lib/libc/time/tz-art.htm
cvs rdiff -u -r1.28 -r1.29 src/lib/libc/time/tz-link.htm
cvs rdiff -u -r1.1 -r1.2 src/lib/libc/time/version
cvs rdiff -u -r1.64 -r1.65 src/lib/libc/time/zic.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/time/Makefile
diff -u src/lib/libc/time/Makefile:1.35 src/lib/libc/time/Makefile:1.36
--- src/lib/libc/time/Makefile:1.35	Thu Oct 20 13:41:34 2016
+++ src/lib/libc/time/Makefile	Fri Nov  4 15:41:53 2016
@@ -129,6 +129,10 @@ LDLIBS=
 #  -DHAVE_SYS_WAIT_H=0 if your compiler lacks a "sys/wait.h"
 #  -DHAVE_TZSET=0 if your system lacks a tzset function
 #  -DHAVE_UNISTD_H=0 if your compiler lacks a "unistd.h" (Microsoft C++ 7?)
+#  -DEPOCH_LOCAL=1 if the 'time' function returns local time not UT
+#  -DEPOCH_OFFSET=N if the 'time' function returns a value N greater
+#	than what POSIX specifies, assuming local time is UT.
+#	For example, N is 252460800 on AmigaOS.
 #  -DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU=1
 #	if you do not want run time warnings about formats that may cause
 #	year 2000 grief
@@ -714,18 +718,12 @@ check_time_t_alternatives:
 		done
 		rm -fr time_t.dir
 
-tarballs signatures: version
-		$(MAKE) VERSION="$$(cat version)" $@_version
-
 tarballs_version: tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz \
 		tzdb-$(VERSION).tar.lz
 tarballs traditional_tarballs signatures traditional_signatures: version
 		VERSION=`cat version` && \
 		$(MAKE) VERSION="$$VERSION" $@_version
 
-tarballs_version: traditional_tarballs_version tzdb-$(VERSION).tar.lz
-traditional_tarballs_version: \
-  tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz
 signatures_version: traditional_signatures_version tzdb-$(VERSION).tar.lz.asc
 traditional_signatures_version: \
   tzcode$(VERSION).tar.gz.asc tzdata$(VERSION).tar.gz.asc \

Index: src/lib/libc/time/NEWS
diff -u src/lib/libc/time/NEWS:1.18 src/lib/libc/time/NEWS:1.19
--- src/lib/libc/time/NEWS:1.18	Thu Oct 20 13:41:34 2016
+++ src/lib/libc/time/NEWS	Fri Nov  4 15:41:53 2016
@@ -1,5 +1,65 @@
 News for the tz database
 
+Release 2016i - 2016-11-01 23:19:52 -0700
+
+  Briefly: Cyprus split into two time zones on 2016-10-30, and Tonga
+  reintroduces DST on 2016-11-06.
+
+  Changes to future time stamps
+
+    Pacific/Tongatapu begins DST on 2016-11-06 at 02:00, ending on
+    2017-01-15 at 03:00.  Assume future observances in Tonga will be
+    from the first Sunday in November through the third Sunday in
+    January, like Fiji.  (Thanks to Pulu ʻAnau.)  Switch to numeric
+    time zone abbreviations for this zone.
+
+  Changes to past and future time stamps
+
+    Northern Cyprus is now +03 year round, causing a split in Cyprus
+    time zones starting 2016-10-30 at 04:00.  This creates a zone
+    Asia/Famagusta.  (Thanks to Even Scharning and Matt Johnson.)
+
+    Antarctica/Casey switched from +08 to +11 on 2016-10-22.
+    (Thanks to Steffen Thorsen.)
+
+  Changes to past time stamps
+
+    Several corrections were made for pre-1975 time stamps in Italy.
+    These affect Europe/Malta, Europe/Rome, Europe/San_Marino, and
+    Europe/Vatican.
+
+    First, the 1893-11-01 00:00 transition in Italy used the new UT
+    offset (+01), not the old (+00:49:56).  (Thanks to Michael
+    Deckers.)
+
+    Second, rules for daylight saving in Italy were changed to agree
+    with Italy's National Institute of Metrological Research (INRiM)
+    except for 1944, as follows (thanks to Pierpaolo Bernardi, Brian
+    Inglis, and Michael Deckers):
+
+      The 1916-06-03 transition was at 24:00, not 00:00.
+
+      The 1916-10-01, 1919-10-05, and 1920-09-19 transitions were at
+      00:00, not 01:00.
+
+      The 1917-09-30 and 1918-10-06 transitions were at 24:00, not
+      01:00.
+
+      The 1944-09-17 transition was at 03:00, not 01:00.  This
+      particular change is taken from Italian law as INRiM's table,
+      (which says 02:00) appears to have a typo here.  Also, keep the
+      1944-04-03 transition for Europe/Rome, as Rome was controlled by
+      Germany then.
+
+      The 1967-1970 and 1972-1974 fallback transitions were at 01:00,
+      not 00:00.
+
+  Changes to code
+
+    The code should now be buildable on AmigaOS merely by setting the
+    appropriate Makefile variables.  (From a patch by Carsten Larsen.)
+
+
 Release 2016h - 2016-10-19 23:17:57 -0700
 
   Changes to future time stamps

Index: src/lib/libc/time/localtime.c
diff -u src/lib/libc/time/localtime.c:1.104 src/lib/libc/time/localtime.c:1.105
--- src/lib/libc/time/localtime.c:1.104	Fri Oct  7 11:29:42 2016
+++ src/lib/libc/time/localtime.c	Fri Nov  4 15:41:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: localtime.c,v 1.104 2016/10/07 15:29:42 christos Exp $	*/
+/*	$NetBSD: localtime.c,v 1.105 2016/11/04 19:41:53 christos Exp $	*/
 
 /*
 ** This file is in the public domain, so clarified as of
@@ -10,7 +10,7 @@
 #if 0
 static char	elsieid[] = "@(#)localtime.c	8.17";
 #else
-__RCSID("$NetBSD: localtime.c,v 1.104 2016/10/07 15:29:42 christos Exp $");
+__RCSID("$NetBSD: localtime.c,v 1.105 2016/11/04 19:41:53 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -1605,6 +1605,45 @@ offtime_r(const time_t *timep, long offs
 
 #endif /* defined STD_INSPIRED */
 
+#if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0
+
+# ifndef USG_COMPAT
+#  define daylight 0
+#  define timezone 0
+# endif
+# ifndef ALTZONE
+#  define altzone 0
+# endif
+ 
+/* Convert from the underlying system's time_t to the ersatz time_tz,
+   which is called 'time_t' in this file.  Typically, this merely
+   converts the time's integer width.  On some platforms, the system
+   time is local time not UT, or uses some epoch other than the POSIX
+   epoch.
+
+   Although this code appears to define a function named 'time' that
+   returns time_t, the macros in private.h cause this code to actually
+   define a function named 'tz_time' that returns tz_time_t.  The call
+   to sys_time invokes the underlying system's 'time' function.  */
+ 
+time_t
+time(time_t *p)
+{
+  time_t r = sys_time(0);
+  if (r != (time_t) -1) {
+    int_fast32_t offset = EPOCH_LOCAL ? (daylight ? timezone : altzone) : 0;
+    if (increment_overflow32(&offset, -EPOCH_OFFSET)
+	|| increment_overflow_time (&r, offset)) {
+      errno = EOVERFLOW;
+      r = -1;
+    }
+  }
+  if (p)
+    *p = r;
+  return r;
+}
+#endif
+
 /*
 ** Return the number of leap years through the end of the given year
 ** where, to make the math easy, the answer for year zero is defined as zero.

Index: src/lib/libc/time/private.h
diff -u src/lib/libc/time/private.h:1.47 src/lib/libc/time/private.h:1.48
--- src/lib/libc/time/private.h:1.47	Thu Oct 20 13:41:34 2016
+++ src/lib/libc/time/private.h	Fri Nov  4 15:41:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: private.h,v 1.47 2016/10/20 17:41:34 christos Exp $	*/
+/*	$NetBSD: private.h,v 1.48 2016/11/04 19:41:53 christos Exp $	*/
 
 #ifndef PRIVATE_H
 #define PRIVATE_H
@@ -225,14 +225,18 @@ typedef long		int_fast64_t;
 # endif
 #endif
 
-#ifndef SCNdFAST64
+#ifndef PRIdFAST64
 # if INT_FAST64_MAX == LLONG_MAX
-#  define SCNdFAST64 "lld"
+#  define PRIdFAST64 "lld"
 # else
-#  define SCNdFAST64 "ld"
+#  define PRIdFAST64 "ld"
 # endif
 #endif
 
+#ifndef SCNdFAST64
+# define SCNdFAST64 PRIdFAST64
+#endif
+
 #ifndef INT_FAST32_MAX
 # if INT_MAX >> 31 == 0
 typedef long int_fast32_t;
@@ -332,6 +336,13 @@ typedef unsigned long uintmax_t;
 ** Workarounds for compilers/systems.
 */
 
+#ifndef EPOCH_LOCAL
+# define EPOCH_LOCAL 0
+#endif
+#ifndef EPOCH_OFFSET
+# define EPOCH_OFFSET 0
+#endif
+
 /*
 ** Compile with -Dtime_tz=T to build the tz package with a private
 ** time_t type equivalent to T rather than the system-supplied time_t.
@@ -339,7 +350,7 @@ typedef unsigned long uintmax_t;
 ** (e.g., time_t wider than 'long', or unsigned time_t) even on
 ** typical platforms.
 */
-#ifdef time_tz
+#if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0
 # ifdef LOCALTIME_IMPLEMENTATION
 static time_t sys_time(time_t *x) { return time(x); }
 # endif
@@ -527,10 +538,29 @@ time_t time2posix_z(timezone_t __restric
   ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0))
 
 #ifdef LOCALTIME_IMPLEMENTATION
-/* The minimum and maximum finite time values.  This assumes no padding.  */
+/* The minimum and maximum finite time values.  This implementation
+   assumes no padding if time_t is signed and either the compiler is
+   pre-C11 or time_t is not one of the standard signed integer types.  */
+#if (201112 <= __STDC_VERSION__) && !defined(__lint__)
+static time_t const time_t_min
+  = (TYPE_SIGNED(time_t)
+     ? _Generic((time_t) 0,
+		signed char: SCHAR_MIN, short: SHRT_MIN,
+		int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN,
+		default: MINVAL(time_t, TYPE_BIT(time_t)))
+     : 0);
+static time_t const time_t_max
+  = (TYPE_SIGNED(time_t)
+     ? _Generic((time_t) 0,
+		signed char: SCHAR_MAX, short: SHRT_MAX,
+		int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX,
+		default: MAXVAL(time_t, TYPE_BIT(time_t)))
+     : -1);
+#else
 static time_t const time_t_min = MINVAL(time_t, TYPE_BIT(time_t));
 static time_t const time_t_max = MAXVAL(time_t, TYPE_BIT(time_t));
 #endif
+#endif
 
 #ifndef INT_STRLEN_MAXIMUM
 /*

Index: src/lib/libc/time/tz-art.htm
diff -u src/lib/libc/time/tz-art.htm:1.14 src/lib/libc/time/tz-art.htm:1.15
--- src/lib/libc/time/tz-art.htm:1.14	Fri Oct  7 11:29:42 2016
+++ src/lib/libc/time/tz-art.htm	Fri Nov  4 15:41:53 2016
@@ -438,7 +438,8 @@ Supernaw.</td></tr>
 The webcomic <em>xkcd</em> has the strip
 "<a href='http://xkcd.com/673/'>The Sun</a>" (2009-12-09) and the panels
 "<a href='http://xkcd.com/1017/'>Backward in Time</a>" (2012-02-14),
-"<a href='http://xkcd.com/1061/'>EST</a>" (2012-05-28), and
+"<a href='http://xkcd.com/1061/'>EST</a>" (2012-05-28),
+"<a href='http://xkcd.com/1179/'>ISO 8601</a>" (2013-02-27),
 "<a href='http://xkcd.com/1335/'>Now</a>" (2014-02-26), and
 "<a href='http://xkcd.com/1655/'>Doomsday Clock</a>" (2016-03-14).
 The related book <em>What If?</em> has an entry

Index: src/lib/libc/time/tz-link.htm
diff -u src/lib/libc/time/tz-link.htm:1.28 src/lib/libc/time/tz-link.htm:1.29
--- src/lib/libc/time/tz-link.htm:1.28	Thu Oct 20 13:41:34 2016
+++ src/lib/libc/time/tz-link.htm	Fri Nov  4 15:41:53 2016
@@ -10,7 +10,7 @@
  content="Sources for time zone and daylight saving time data">
 <meta name="DC.Creator" content="Eggert, Paul">
 <meta name="DC.Contributor" content="Olson, Arthur David">
-<meta name="DC.Date" content="2016-10-19">
+<meta name="DC.Date" content="2016-11-01">
 <meta name="DC.Description"
  content="Sources of information about time zones and daylight saving time">
 <meta name="DC.Identifier"
@@ -158,9 +158,7 @@ The <code><abbr>tz</abbr></code> code an
 are by no means authoritative. If you find errors, please
 send changes to the <a href="mailto:t...@iana.org">time zone
 mailing list</a>. You can also <a
-href="http://news.gmane.org/gmane.comp.time.tz";>browse recent
-messages</a> sent to the mailing list, <a
-href="https://mm.icann.org/mailman/listinfo/tz";>subscribe</a> to it,
+href="https://mm.icann.org/mailman/listinfo/tz";>subscribe</a> to it
 and browse the <a
 href="http://mm.icann.org/pipermail/tz/";>archive of old
 messages</a>.</p>
@@ -704,6 +702,10 @@ of Legal Time in Germany</a>.</dd>
 <dd>The Interior Ministry periodically issues <a
 href="ftp://ftp.cs.huji.ac.il/pub/tz/announcements";
 hreflang="he">announcements (in Hebrew)</a>.</dd>
+<dt>Italy</dt>
+<dd>The National Institute of Metrological Research maintains a
+<a href="http://www.inrim.it/res/tf/ora_legale_i.shtml";>table of civil time
+(in Italian)</a>.</dd>
 <dt>Mexico</dt>
 <dd>The Investigation and Analysis Service of the Mexican Library of
 Congress has published a <a
@@ -732,7 +734,7 @@ href="https://www.polyomino.org.uk/briti
 legal time in Britain</a> discusses in detail the country
 with perhaps the best-documented history of clock adjustments.
 The National Physical Laboratory also maintains an <a
-href="http://www.npl.co.uk/educate-explore/what-is-time/archive-of-summer-time-dates-1916-2006";>Archive
+href="http://www.npl.co.uk/educate-explore/what-is-time/archive-of-summer-time-dates";>Archive
 of Summer time dates</a>.</dd>
 <dt>United States</dt>
 <dd>The Department of Transportation's <a
@@ -747,7 +749,7 @@ Science of Timekeeping</a> is a thorough
 to the theory and practice of precision timekeeping.</li>
 <li><a href="http://www.ntp.org";><abbr
 title="Network Time Protocol">NTP</abbr>: The Network
-Time Protocol</a>
+Time Protocol</a> (Internet <abbr>RFC</abbr> 5905)
 discusses how to synchronize clocks of
 Internet hosts.</li>
 <li>The <a

Index: src/lib/libc/time/version
diff -u src/lib/libc/time/version:1.1 src/lib/libc/time/version:1.2
--- src/lib/libc/time/version:1.1	Thu Oct 20 13:41:34 2016
+++ src/lib/libc/time/version	Fri Nov  4 15:41:53 2016
@@ -1 +1 @@
-2016h
+2016i

Index: src/lib/libc/time/zic.c
diff -u src/lib/libc/time/zic.c:1.64 src/lib/libc/time/zic.c:1.65
--- src/lib/libc/time/zic.c:1.64	Fri Oct  7 15:47:16 2016
+++ src/lib/libc/time/zic.c	Fri Nov  4 15:41:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: zic.c,v 1.64 2016/10/07 19:47:16 kre Exp $	*/
+/*	$NetBSD: zic.c,v 1.65 2016/11/04 19:41:53 christos Exp $	*/
 /*
 ** This file is in the public domain, so clarified as of
 ** 2006-07-17 by Arthur David Olson.
@@ -10,7 +10,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: zic.c,v 1.64 2016/10/07 19:47:16 kre Exp $");
+__RCSID("$NetBSD: zic.c,v 1.65 2016/11/04 19:41:53 christos Exp $");
 #endif /* !defined lint */
 
 #include "private.h"
@@ -18,6 +18,7 @@ __RCSID("$NetBSD: zic.c,v 1.64 2016/10/0
 #include "tzfile.h"
 
 #include <stdarg.h>
+#include <stddef.h>
 #include <unistd.h>
 #include <util.h>
 
@@ -27,6 +28,7 @@ __RCSID("$NetBSD: zic.c,v 1.64 2016/10/0
 typedef int_fast64_t	zic_t;
 #define ZIC_MIN INT_FAST64_MIN
 #define ZIC_MAX INT_FAST64_MAX
+#define PRIdZIC PRIdFAST64
 #define SCNdZIC SCNdFAST64
 
 #ifndef ZIC_MAX_ABBR_LEN_WO_WARN
@@ -49,9 +51,18 @@ typedef int_fast64_t	zic_t;
 #define MKDIR_UMASK 0755
 #endif
 
+/* The maximum ptrdiff_t value, for pre-C99 platforms.  */
+#ifndef PTRDIFF_MAX
+static ptrdiff_t const PTRDIFF_MAX = MAXVAL(ptrdiff_t, TYPE_BIT(ptrdiff_t));
+#endif
+
+/* The type and printf format for line numbers.  */
+typedef intmax_t lineno;
+#define PRIdLINENO PRIdMAX
+
 struct rule {
 	const char *	r_filename;
-	int		r_linenum;
+	lineno		r_linenum;
 	const char *	r_name;
 
 	zic_t		r_loyear;	/* for example, 1986 */
@@ -74,7 +85,7 @@ struct rule {
 	zic_t		r_stdoff;	/* offset from standard time */
 	const char *	r_abbrvar;	/* variable part of abbreviation */
 
-	int		r_todo;		/* a rule to do (used in outzone) */
+	bool		r_todo;		/* a rule to do (used in outzone) */
 	zic_t		r_temp;		/* used in outzone */
 };
 
@@ -88,7 +99,7 @@ struct rule {
 
 struct zone {
 	const char *	z_filename;
-	int		z_linenum;
+	lineno		z_linenum;
 
 	const char *	z_name;
 	zic_t		z_gmtoff;
@@ -99,7 +110,7 @@ struct zone {
 	zic_t		z_stdoff;
 
 	struct rule *	z_rules;
-	int		z_nrules;
+	ptrdiff_t	z_nrules;
 
 	struct rule	z_untilrule;
 	zic_t		z_untiltime;
@@ -144,14 +155,14 @@ static char	lowerit(char);
 static void	mkdirs(char const *, bool);
 static void	newabbr(const char * abbr);
 static zic_t	oadd(zic_t t1, zic_t t2);
-static void	outzone(const struct zone * zp, int ntzones);
+static void	outzone(const struct zone * zp, ptrdiff_t ntzones);
 static zic_t	rpytime(const struct rule * rp, zic_t wantedy);
 static void	rulesub(struct rule * rp,
 			const char * loyearp, const char * hiyearp,
 			const char * typep, const char * monthp,
 			const char * dayp, const char * timep);
 static zic_t	tadd(zic_t t1, zic_t t2);
-static bool	yearistype(int year, const char * type);
+static bool	yearistype(zic_t year, const char * type);
 
 /* Bound on length of what %z can expand to.  */
 enum { PERCENT_Z_LEN_BOUND = sizeof "+995959" - 1 };
@@ -171,17 +182,17 @@ static int		leapcnt;
 static bool		leapseen;
 static zic_t		leapminyear;
 static zic_t		leapmaxyear;
-static int		linenum;
+static lineno		linenum;
 static size_t		max_abbrvar_len = PERCENT_Z_LEN_BOUND;
 static size_t		max_format_len;
 static zic_t		max_year;
 static zic_t		min_year;
 static bool		noise;
 static const char *	rfilename;
-static int		rlinenum;
+static lineno		rlinenum;
 static const char *	progname;
-static int		timecnt;
-static int		timecnt_alloc;
+static ptrdiff_t	timecnt;
+static ptrdiff_t	timecnt_alloc;
 static int		typecnt;
 
 /*
@@ -266,23 +277,23 @@ static int		typecnt;
 #define YR_ONLY		2
 
 static struct rule *	rules;
-static int		nrules;	/* number of rules */
-static int		nrules_alloc;
+static ptrdiff_t	nrules;	/* number of rules */
+static ptrdiff_t	nrules_alloc;
 
 static struct zone *	zones;
-static int		nzones;	/* number of zones */
-static int		nzones_alloc;
+static ptrdiff_t	nzones;	/* number of zones */
+static ptrdiff_t	nzones_alloc;
 
 struct link {
 	const char *	l_filename;
-	int		l_linenum;
+	lineno		l_linenum;
 	const char *	l_from;
 	const char *	l_to;
 };
 
 static struct link *	links;
-static int		nlinks;
-static int		nlinks_alloc;
+static ptrdiff_t	nlinks;
+static ptrdiff_t	nlinks_alloc;
 
 struct lookup {
 	const char *	l_word;
@@ -436,17 +447,18 @@ ecpyalloc(char const *str)
 }
 
 static void *
-growalloc(void *ptr, size_t itemsize, int nitems, int *nitems_alloc)
+growalloc(void *ptr, size_t itemsize, ptrdiff_t nitems, ptrdiff_t *nitems_alloc)
 {
 	if (nitems < *nitems_alloc)
 		return ptr;
 	else {
 #define IMAX (INT_MAX < SIZE_MAX ? INT_MAX : (int)SIZE_MAX)
-		int nitems_max = IMAX - WORK_AROUND_QTBUG_53071;
-		int amax = nitems_max < IMAX ? nitems_max : IMAX;
+		ptrdiff_t nitems_max = PTRDIFF_MAX - WORK_AROUND_QTBUG_53071;
+		ptrdiff_t amax = nitems_max < (ptrdiff_t)SIZE_MAX ?
+		    nitems_max : (ptrdiff_t)SIZE_MAX;
 		if ((amax - 1) / 3 * 2 < *nitems_alloc)
-			memory_exhausted(_("int overflow"));
-		*nitems_alloc = *nitems_alloc + (*nitems_alloc >> 1) + 1;
+			memory_exhausted(_("integer overflow"));
+		*nitems_alloc += (*nitems_alloc >> 1) + 1;
 		return zic_realloc(ptr, size_product(*nitems_alloc, itemsize));
 	}
 }
@@ -456,8 +468,7 @@ growalloc(void *ptr, size_t itemsize, in
 */
 
 static void
-eats(const char *const name, const int num, const char *const rname,
-    const int rnum)
+eats(char const *name, lineno num, char const *rname, lineno rnum)
 {
 	filename = name;
 	linenum = num;
@@ -466,7 +477,7 @@ eats(const char *const name, const int n
 }
 
 static void
-eat(const char *const name, const int num)
+eat(char const *name, lineno num)
 {
 	eats(name, num, NULL, -1);
 }
@@ -480,10 +491,10 @@ verror(const char *const string, va_list
 	** on BSD systems.
 	*/
 	if (filename)
-	  fprintf(stderr, _("\"%s\", line %d: "), filename, linenum);
+	  fprintf(stderr, _("\"%s\", line %"PRIdLINENO": "), filename, linenum);
 	vfprintf(stderr, string, args);
 	if (rfilename != NULL)
-		fprintf(stderr, _(" (rule from \"%s\", line %d)"),
+		fprintf(stderr, _(" (rule from \"%s\", line %"PRIdLINENO")"),
 			rfilename, rlinenum);
 	fprintf(stderr, "\n");
 }
@@ -566,9 +577,8 @@ static const char *	yitcommand;
 int
 main(int argc, char **argv)
 {
-	int	i;
-	int	j;
-	int	c;
+	int	c, k;
+	ptrdiff_t	i, j;
 
 #ifdef S_IWGRP
 	umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
@@ -586,12 +596,12 @@ main(int argc, char **argv)
 			_("wild compilation-time specification of zic_t"));
 		return EXIT_FAILURE;
 	}
-	for (i = 1; i < argc; ++i)
-		if (strcmp(argv[i], "--version") == 0) {
+	for (k = 1; k < argc; k++)
+		if (strcmp(argv[k], "--version") == 0) {
 			printf("zic %s%s\n", PKGVERSION, TZVERSION);
 			close_file(stdout, NULL, NULL);
 			return EXIT_SUCCESS;
-		} else if (strcmp(argv[i], "--help") == 0) {
+		} else if (strcmp(argv[k], "--help") == 0) {
 			usage(stdout, EXIT_SUCCESS);
 		}
 	while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != EOF && c != -1)
@@ -667,8 +677,8 @@ _("%s: More than one -L option specified
 		adjleap();
 	}
 
-	for (i = optind; i < argc; ++i)
-		infile(argv[i]);
+	for (k = optind; k < argc; k++)
+		infile(argv[k]);
 	if (errors)
 		return EXIT_FAILURE;
 	associate();
@@ -711,7 +721,7 @@ componentcheck(char const *name, char co
 	       char const *component_end)
 {
 	enum { component_len_max = 14 };
-	size_t component_len = component_end - component;
+	ptrdiff_t component_len = component_end - component;
 	if (component_len == 0) {
 	  if (!*name)
 	    error (_("empty file name"));
@@ -726,8 +736,9 @@ componentcheck(char const *name, char co
 	}
 	if (0 < component_len && component_len <= 2
 	    && component[0] == '.' && component_end[-1] == '.') {
+	  int len = component_len;
 	  error(_("file name '%s' contains '%.*s' component"),
-		name, (int) component_len, component);
+		name, len, component);
 	  return false;
 	}
 	if (noise) {
@@ -896,8 +907,8 @@ dolink(char const *fromfield, char const
 
 #define TIME_T_BITS_IN_FILE	64
 
-static zic_t const min_time = MINVAL (zic_t, TIME_T_BITS_IN_FILE);
-static zic_t const max_time = MAXVAL (zic_t, TIME_T_BITS_IN_FILE);
+static zic_t const min_time = MINVAL(zic_t, TIME_T_BITS_IN_FILE);
+static zic_t const max_time = MAXVAL(zic_t, TIME_T_BITS_IN_FILE);
 
 /* Estimated time of the Big Bang, in seconds since the POSIX epoch.
    rounded downward to the negation of a power of two that is
@@ -981,7 +992,7 @@ associate(void)
 {
 	struct zone *	zp;
 	struct rule *	rp;
-	int		base, out;
+	ptrdiff_t	base, out;
 	int		i, j;
 
 	if (nrules != 0) {
@@ -1060,7 +1071,7 @@ infile(const char *name)
 	const struct lookup *	lp;
 	int			nfields;
 	bool			wantcont;
-	int			num;
+	lineno			num;
 	char				buf[BUFSIZ];
 
 	if (strcmp(name, "-") == 0) {
@@ -1101,7 +1112,7 @@ infile(const char *name)
 			lp = byword(fields[0], line_codes);
 			if (lp == NULL)
 				error(_("input line of unknown type"));
-			else switch ((int) (lp->l_value)) {
+			else switch (lp->l_value) {
 				case LC_RULE:
 					inrule(fields, nfields);
 					wantcont = false;
@@ -1213,7 +1224,7 @@ inrule(char **fields, int nfields)
 static bool
 inzone(char **fields, int nfields)
 {
-	int	i;
+	ptrdiff_t	i;
 
 	if (nfields < ZONE_MINFIELDS || nfields > ZONE_MAXFIELDS) {
 		error(_("wrong number of fields on Zone line"));
@@ -1233,13 +1244,13 @@ _("\"Zone %s\" line and -p option are mu
 	}
 	for (i = 0; i < nzones; ++i)
 		if (zones[i].z_name != NULL &&
-			strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
-			error(
-_("duplicate zone name %s (file \"%s\", line %d)"),
-					fields[ZF_NAME],
-					zones[i].z_filename,
-					zones[i].z_linenum);
-				return false;
+		    strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
+			error(_("duplicate zone name %s"
+				" (file \"%s\", line %"PRIdLINENO")"),
+				fields[ZF_NAME],
+				zones[i].z_filename,
+				zones[i].z_linenum);
+			return false;
 		}
 	return inzsub(fields, nfields, false);
 }
@@ -1347,7 +1358,7 @@ inleap(char **fields, int nfields)
 {
 	const char *		cp;
 	const struct lookup *	lp;
-	int			i, j;
+	zic_t			i, j;
 	zic_t			year;
 	int			month, day;
 	zic_t			dayoff, tod;
@@ -1519,7 +1530,7 @@ rulesub(struct rule *rp, const char *loy
 	cp = loyearp;
 	lp = byword(cp, begin_years);
 	rp->r_lowasnum = lp == NULL;
-	if (!rp->r_lowasnum) switch ((int) lp->l_value) {
+	if (!rp->r_lowasnum) switch (lp->l_value) {
 		case YR_MINIMUM:
 			rp->r_loyear = ZIC_MIN;
 			break;
@@ -1538,7 +1549,7 @@ rulesub(struct rule *rp, const char *loy
 	cp = hiyearp;
 	lp = byword(cp, end_years);
 	rp->r_hiwasnum = lp == NULL;
-	if (!rp->r_hiwasnum) switch ((int) lp->l_value) {
+	if (!rp->r_hiwasnum) switch (lp->l_value) {
 		case YR_MINIMUM:
 			rp->r_hiyear = ZIC_MIN;
 			break;
@@ -1676,16 +1687,16 @@ static void
 writezone(const char *const name, const char *const string, char version)
 {
 	FILE *			fp;
-	int			i, j;
+	ptrdiff_t		i, j;
 	int			leapcnt32, leapi32;
-	int			timecnt32, timei32;
+	ptrdiff_t		timecnt32, timei32;
 	int			pass;
 	static const struct tzhead	tzh0;
 	static struct tzhead		tzh;
 	bool dir_checked = false;
 	zic_t one = 1;
 	zic_t y2038_boundary = one << 31;
-	int nats = timecnt + WORK_AROUND_QTBUG_53071;
+	ptrdiff_t nats = timecnt + WORK_AROUND_QTBUG_53071;
 	zic_t *ats = zic_malloc(size_product(nats, sizeof *ats + 1));
 	void *typesptr = ats + nats;
 	unsigned char *types = typesptr;
@@ -1699,8 +1710,7 @@ writezone(const char *const name, const 
 	** Optimize.
 	*/
 	{
-		int	fromi;
-		int	toi;
+		ptrdiff_t fromi, toi;
 
 		toi = 0;
 		fromi = 0;
@@ -1722,9 +1732,16 @@ writezone(const char *const name, const 
 		}
 		timecnt = toi;
 	}
-	if (noise && timecnt > 1200)
+
+	if (noise && timecnt > 1200) {
+	  if (timecnt > TZ_MAX_TIMES)
+		warning(_("reference clients mishandle"
+			  " more than %d transition times"),
+			TZ_MAX_TIMES);
+	  else
 		warning(_("pre-2014 clients may mishandle"
 			  " more than 1200 transition times"));
+	}
 	/*
 	** Transfer.
 	*/
@@ -1809,27 +1826,31 @@ writezone(const char *const name, const 
 	  }
 	}
 	for (pass = 1; pass <= 2; ++pass) {
-		int	thistimei, thistimecnt;
-		int	thisleapi, thisleapcnt;
-		int	thistimelim, thisleaplim;
+		ptrdiff_t	thistimei, thistimecnt, thistimelim;
+		int	thisleapi, thisleapcnt, thisleaplim;
 		int		writetype[TZ_MAX_TYPES];
 		int		typemap[TZ_MAX_TYPES];
 		int	thistypecnt;
 		char		thischars[TZ_MAX_CHARS];
-		char		thischarcnt;
+		int		thischarcnt;
+		bool		toomanytimes;
 		int		indmap[TZ_MAX_CHARS];
 
 		if (pass == 1) {
 			thistimei = timei32;
 			thistimecnt = timecnt32;
+			toomanytimes = thistimecnt >> 31 >> 1 != 0;
 			thisleapi = leapi32;
 			thisleapcnt = leapcnt32;
 		} else {
 			thistimei = 0;
 			thistimecnt = timecnt;
+			toomanytimes = thistimecnt >> 31 >> 31 >> 2 != 0;
 			thisleapi = 0;
 			thisleapcnt = leapcnt;
 		}
+		if (toomanytimes)
+		  error(_("too many transition times"));
 		thistimelim = thistimei + thistimecnt;
 		thisleaplim = thisleapi + thisleapcnt;
 		for (i = 0; i < typecnt; ++i)
@@ -1919,8 +1940,7 @@ writezone(const char *const name, const 
 				if (strcmp(&thischars[j], thisabbr) == 0)
 					break;
 			if (j == thischarcnt) {
-				strcpy(&thischars[(int) thischarcnt],
-					thisabbr);
+				strcpy(&thischars[thischarcnt], thisabbr);
 				thischarcnt += strlen(thisabbr) + 1;
 			}
 			indmap[abbrinds[i]] = j;
@@ -2211,7 +2231,7 @@ stringzone(char *result, const int resul
 	struct rule *		rp;
 	struct rule *		stdrp;
 	struct rule *		dstrp;
-	int			i;
+	ptrdiff_t	i;
 	const char *		abbrvar;
 	int			compat = 0;
 	int			c;
@@ -2324,11 +2344,11 @@ stringzone(char *result, const int resul
 }
 
 static void
-outzone(const struct zone *zpfirst, int zonecount)
+outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
 {
 	const struct zone *	zp;
 	struct rule *		rp;
-	int			i, j;
+	ptrdiff_t		i, j;
 	bool			usestart, useuntil;
 	zic_t			starttime, untiltime;
 	zic_t			gmtoff;
@@ -2347,7 +2367,7 @@ outzone(const struct zone *zpfirst, int 
 	int			compat;
 	bool			do_extend;
 	int			version;
-	int lastatmax = -1;
+	ptrdiff_t lastatmax = -1;
 
 	max_abbr_len = 2 + max_format_len + max_abbrvar_len;
 	max_envvar_len = 2 * max_abbr_len + 5 * 9;
@@ -2492,7 +2512,7 @@ outzone(const struct zone *zpfirst, int 
 					rp->r_temp = rpytime(rp, year);
 			}
 			for ( ; ; ) {
-				int	k;
+				ptrdiff_t	k;
 				zic_t	jtime, ktime;
 				zic_t	offset;
 
@@ -2766,28 +2786,49 @@ adjleap(void)
 	}
 }
 
+static char *
+shellquote(char *b, char const *s)
+{
+  *b++ = '\'';
+  while (*s) {
+    if (*s == '\'')
+      *b++ = '\'', *b++ = '\\', *b++ = '\'';
+    *b++ = *s++;
+  }
+  *b++ = '\'';
+  return b;
+}
+
 static bool
-yearistype(int year, const char *type)
+yearistype(zic_t year, const char *type)
 {
-	static char *	buf;
-	int		result;
+	char *buf;
+	char *b;
+	int result;
+	size_t len;
 
 	if (type == NULL || *type == '\0')
 		return true;
-	buf = zic_realloc(buf, 132 + strlen(yitcommand) + strlen(type));
-	sprintf(buf, "%s %d %s", yitcommand, year, type); /* XXX: sprintf is safe */
+	buf = zic_malloc(len = 1 + 4 * strlen(yitcommand) + 2
+		      + INT_STRLEN_MAXIMUM(zic_t) + 2 + 4 * strlen(type) + 2);
+	b = shellquote(buf, yitcommand);
+	*b++ = ' ';
+	b += snprintf(b, len - (b - buf), "%"PRIdZIC, year);
+	*b++ = ' ';
+	b = shellquote(b, type);
+	*b = '\0';
 	result = system(buf);
-	if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
-		case 0:
-			return true;
-		case 1:
-			return false;
+	if (WIFEXITED(result)) {
+		int status = WEXITSTATUS(result);
+		if (status <= 1) {
+			free(buf);
+			return status == 0;
+		}
 	}
 	error(_("Wild result from command execution"));
 	fprintf(stderr, _("%s: command was '%s', result was %d\n"),
 		progname, buf, result);
-	for ( ; ; )
-		exit(EXIT_FAILURE);
+	exit(EXIT_FAILURE);
 }
 
 /* Is A a space character in the C locale?  */
@@ -2915,10 +2956,8 @@ getfields(char *cp)
 				if (*dp != '\0')
 					++dp;
 				else {
-					error(_(
-						"Odd number of quotation marks"
-						));
-					exit(1);
+				  error(_("Odd number of quotation marks"));
+				  exit(EXIT_FAILURE);
 				}
 		} while (*cp && *cp != '#' && !is_space(*cp));
 		if (is_space(*cp))

Added files:

Index: src/lib/libc/time/LICENSE
diff -u /dev/null src/lib/libc/time/LICENSE:1.1
--- /dev/null	Fri Nov  4 15:41:53 2016
+++ src/lib/libc/time/LICENSE	Fri Nov  4 15:41:53 2016
@@ -0,0 +1,4 @@
+With a few exceptions, all files in the tz code and data (including
+this one) are in the public domain.  The exceptions are date.c,
+newstrftime.3, and strftime.c, which contain material derived from BSD
+and which use the BSD 3-clause license.

Reply via email to