tz
Threads by month
- ----- 2024 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2000 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1999 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1998 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1997 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1996 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1995 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1994 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1993 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1992 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1991 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1990 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1989 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1988 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1987 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 1986 -----
- December
- November
February 2018
- 54 participants
- 31 discussions
28 Aug '19
Below find proposed time zone package changes; the executive summary:
* Makefile Change LOCALTIME default from "Factory" to "GMT";
do not compile "factory" file
(but keep it in the distribution).
* Theory Remove reference to "Factory" zone.
* australasia Change end of DST in Samoa in 2011 from
2011-04-03 0:00 to 2011-04-03 1:00
(thanks to Raymond Hughes for a reference).
* localtime.c Initialize ttinfo structures filled by tzparse
(thanks to Ravindra for reporting a valgrind warning).
* zic.c Fix generation of POSIX strings for zones with
rules using "weekday<=n" forms of dates
(thanks to Lei Liu for finding the problem).
Also, limit output for non-POSIX-specificable zones
defined to follow the same rules every year.
(Note that no zones of either of the above types
appear in the distribution; these changes cater to
add-on zones).
If no problems are found, 2010n will appear on 2010-10-25.
--ado
diff -r -c old/Makefile new/Makefile
*** old/Makefile Mon Sep 27 09:24:25 2010
--- new/Makefile Tue Oct 12 12:36:50 2010
***************
*** 1,5 ****
# <pre>
! # @(#)Makefile 8.8
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
--- 1,5 ----
# <pre>
! # @(#)Makefile 8.9
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
***************
*** 12,18 ****
# make zonenames
# to get a list of the values you can use for LOCALTIME.
! LOCALTIME= Factory
# If you want something other than Eastern United States time as a template
# for handling POSIX-style time zone environment variables,
--- 12,18 ----
# make zonenames
# to get a list of the values you can use for LOCALTIME.
! LOCALTIME= GMT
# If you want something other than Eastern United States time as a template
# for handling POSIX-style time zone environment variables,
***************
*** 262,269 ****
DOCS= README Theory $(MANS) date.1 Makefile
PRIMARY_YDATA= africa antarctica asia australasia \
europe northamerica southamerica
! YDATA= $(PRIMARY_YDATA) pacificnew etcetera factory backward
! NDATA= systemv
SDATA= solar87 solar88 solar89
TDATA= $(YDATA) $(NDATA) $(SDATA)
TABDATA= iso3166.tab zone.tab
--- 262,269 ----
DOCS= README Theory $(MANS) date.1 Makefile
PRIMARY_YDATA= africa antarctica asia australasia \
europe northamerica southamerica
! YDATA= $(PRIMARY_YDATA) pacificnew etcetera backward
! NDATA= systemv factory
SDATA= solar87 solar88 solar89
TDATA= $(YDATA) $(NDATA) $(SDATA)
TABDATA= iso3166.tab zone.tab
diff -r -c old/Theory new/Theory
*** old/Theory Mon Sep 27 09:24:25 2010
--- new/Theory Tue Oct 12 12:36:50 2010
***************
*** 1,4 ****
! @(#)Theory 8.4
This file is in the public domain, so clarified as of
2009-05-17 by Arthur David Olson.
--- 1,4 ----
! @(#)Theory 8.5
This file is in the public domain, so clarified as of
2009-05-17 by Arthur David Olson.
***************
*** 287,294 ****
See the file `backward' for most of these older names
(e.g. `US/Eastern' instead of `America/New_York').
The other old-fashioned names still supported are
! `WET', `CET', `MET', `EET' (see the file `europe'),
! and `Factory' (see the file `factory').
----- Time zone abbreviations -----
--- 287,293 ----
See the file `backward' for most of these older names
(e.g. `US/Eastern' instead of `America/New_York').
The other old-fashioned names still supported are
! `WET', `CET', `MET', and `EET' (see the file `europe').
----- Time zone abbreviations -----
diff -r -c old/australasia new/australasia
*** old/australasia Mon Sep 27 09:24:27 2010
--- new/australasia Tue Oct 12 13:14:56 2010
***************
*** 1,5 ****
# <pre>
! # @(#)australasia 8.18
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
--- 1,5 ----
# <pre>
! # @(#)australasia 8.19
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
***************
*** 487,497 ****
# http://www.parliament.gov.ws/documents/acts/Daylight%20Saving%20Act%20%2020…
# </a>
Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5
-11:26:56 - LMT 1911
-11:30 - SAMT 1950 # Samoa Time
-11:00 - WST 2010 Sep 26
! -11:00 1:00 WSDT 2011 Apr 3
-11:00 - WST
# Solomon Is
--- 487,507 ----
# http://www.parliament.gov.ws/documents/acts/Daylight%20Saving%20Act%20%2020…
# </a>
+ # From Raymond Hughes (2010-10-07):
+ # Please see
+ # <a href="http://www.mcil.gov.ws">
+ # http://www.mcil.gov.ws
+ # </a>,
+ # the Ministry of Commerce, Industry and Labour (sideframe) "Last Sunday
+ # September 2010 (26/09/10) - adjust clocks forward from 12:00 midnight
+ # to 01:00am and First Sunday April 2011 (03/04/11) - adjust clocks
+ # backwards from 1:00am to 12:00am"
+
Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5
-11:26:56 - LMT 1911
-11:30 - SAMT 1950 # Samoa Time
-11:00 - WST 2010 Sep 26
! -11:00 1:00 WSDT 2011 Apr 3 1:00
-11:00 - WST
# Solomon Is
diff -r -c old/localtime.c new/localtime.c
*** old/localtime.c Mon Sep 27 09:24:26 2010
--- new/localtime.c Tue Oct 12 12:36:51 2010
***************
*** 5,11 ****
#ifndef lint
#ifndef NOID
! static char elsieid[] = "@(#)localtime.c 8.14";
#endif /* !defined NOID */
#endif /* !defined lint */
--- 5,11 ----
#ifndef lint
#ifndef NOID
! static char elsieid[] = "@(#)localtime.c 8.15";
#endif /* !defined NOID */
#endif /* !defined lint */
***************
*** 914,919 ****
--- 914,920 ----
register unsigned char * typep;
register char * cp;
register int load_result;
+ static struct ttinfo zttinfo;
INITIALIZE(dstname);
stdname = name;
***************
*** 986,991 ****
--- 987,993 ----
/*
** Two transitions per year, from EPOCH_YEAR forward.
*/
+ sp->ttis[0] = sp->ttis[1] = zttinfo;
sp->ttis[0].tt_gmtoff = -dstoffset;
sp->ttis[0].tt_isdst = 1;
sp->ttis[0].tt_abbrind = stdlen + 1;
***************
*** 1099,1106 ****
}
/*
** Finally, fill in ttis.
- ** ttisstd and ttisgmt need not be handled.
*/
sp->ttis[0].tt_gmtoff = -stdoffset;
sp->ttis[0].tt_isdst = FALSE;
sp->ttis[0].tt_abbrind = 0;
--- 1101,1108 ----
}
/*
** Finally, fill in ttis.
*/
+ sp->ttis[0] = sp->ttis[1] = zttinfo;
sp->ttis[0].tt_gmtoff = -stdoffset;
sp->ttis[0].tt_isdst = FALSE;
sp->ttis[0].tt_abbrind = 0;
***************
*** 1113,1118 ****
--- 1115,1121 ----
dstlen = 0;
sp->typecnt = 1; /* only standard time */
sp->timecnt = 0;
+ sp->ttis[0] = zttinfo;
sp->ttis[0].tt_gmtoff = -stdoffset;
sp->ttis[0].tt_isdst = 0;
sp->ttis[0].tt_abbrind = 0;
diff -r -c old/zic.c new/zic.c
*** old/zic.c Mon Sep 27 09:24:26 2010
--- new/zic.c Tue Oct 12 13:37:29 2010
***************
*** 3,9 ****
** 2006-07-17 by Arthur David Olson.
*/
! static char elsieid[] = "@(#)zic.c 8.22";
#include "private.h"
#include "locale.h"
--- 3,9 ----
** 2006-07-17 by Arthur David Olson.
*/
! static char elsieid[] = "@(#)zic.c 8.24";
#include "private.h"
#include "locale.h"
***************
*** 1881,1896 ****
register int week;
if (rp->r_dycode == DC_DOWGEQ) {
! week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
! if ((week - 1) * DAYSPERWEEK + 1 != rp->r_dayofmonth)
return -1;
} else if (rp->r_dycode == DC_DOWLEQ) {
if (rp->r_dayofmonth == len_months[1][rp->r_month])
week = 5;
else {
! week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
! if (week * DAYSPERWEEK - 1 != rp->r_dayofmonth)
return -1;
}
} else return -1; /* "cannot happen" */
(void) sprintf(result, "M%d.%d.%d",
--- 1881,1896 ----
register int week;
if (rp->r_dycode == DC_DOWGEQ) {
! if ((rp->r_dayofmonth % DAYSPERWEEK) != 1)
return -1;
+ week = 1 + rp->r_dayofmonth / DAYSPERWEEK;
} else if (rp->r_dycode == DC_DOWLEQ) {
if (rp->r_dayofmonth == len_months[1][rp->r_month])
week = 5;
else {
! if ((rp->r_dayofmonth % DAYSPERWEEK) != 0)
return -1;
+ week = rp->r_dayofmonth / DAYSPERWEEK;
}
} else return -1; /* "cannot happen" */
(void) sprintf(result, "M%d.%d.%d",
***************
*** 2018,2023 ****
--- 2018,2024 ----
register char * envvar;
register int max_abbr_len;
register int max_envvar_len;
+ register int prodstic; /* all rules are min to max */
max_abbr_len = 2 + max_format_len + max_abbrvar_len;
max_envvar_len = 2 * max_abbr_len + 5 * 9;
***************
*** 2032,2037 ****
--- 2033,2039 ----
timecnt = 0;
typecnt = 0;
charcnt = 0;
+ prodstic = zonecount == 1;
/*
** Thanks to Earl Chew
** for noting the need to unconditionally initialize startttisstd.
***************
*** 2053,2058 ****
--- 2055,2062 ----
updateminmax(rp->r_loyear);
if (rp->r_hiwasnum)
updateminmax(rp->r_hiyear);
+ if (rp->r_lowasnum || rp->r_hiwasnum)
+ prodstic = FALSE;
}
}
/*
***************
*** 2075,2080 ****
--- 2079,2094 ----
if (max_year <= INT_MAX - YEARSPERREPEAT)
max_year += YEARSPERREPEAT;
else max_year = INT_MAX;
+ /*
+ ** Regardless of any of the above,
+ ** for a "proDSTic" zone which specifies that its rules
+ ** always have and always will be in effect,
+ ** we only need one cycle to define the zone.
+ */
+ if (prodstic) {
+ min_year = 1900;
+ max_year = min_year + YEARSPERREPEAT;
+ }
}
/*
** For the benefit of older systems,
5
6
According to some news Brazilian state of Goiás may abolish DST:
"The Energy and Mines Commission of the House of Representatives
approved a Legislative Decree that suspends daylight saving time in Goiás."
http://www.infomoney.com.br/minhas-financas/consumo/noticia/7061178/comissa…
Also, ".... this year the federal government even considered not
implementing daylight saving time, but left the decision to 2018."
Alexander Krivenyshev
https://www.WorldTimeZone.com
5
5
[PATCH] Support building zic.exe and zdump.exe natively on Windows with Visual Studio nmake.
by Manuela Friedrich 28 Oct '18
by Manuela Friedrich 28 Oct '18
28 Oct '18
Provide getopt() implementation for Windows as per ftp://ftp.es.ele.tue.nl/pub/users/jos/poster/getopt.c
In localtime.c use native localtime(), gmtime(), ctime() and mktime().
Also use int or __int64 respectively for ssize_t type and check for Windows drive letters in tzloadbody().
In private.h and zdump.c define strotimax depending on Visual Studio version.
It needs to be strtol for up to VS 2010 and stroll for higher versions.
In zdump.c need prototype for gmtime_r() to suffice return type requirements.
Also use __time64_t variables on Windows instead of time_t.
In main() variable declarations had to be moved to the top to avoid compile errors.
In zic.c dolink() need to have an extra mkdirs() call for Windows as we don't have link support here and the previous mkdirs() calls wouldn't have been called therefore.
Also itsdir() needs separate Windows part to check for directory flag as the namesslashdot Linux alternative alway returns directory on Windows.
Add nmake specific Makefile.nmake based on existing Makefile.
It uses different object, library and executable extensions, sets CC and CFLAGS for 64 and 32bit Windows build.
Target root has been added to build zdump and zic.
Version and version.h rules were changed to batch.
---
Makefile.nmake | 934 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
getopt.c | 110 +++++++
localtime.c | 23 ++
private.h | 4 +
zdump.c | 47 ++-
zic.c | 14 +
6 files changed, 1128 insertions(+), 4 deletions(-)
create mode 100644 Makefile.nmake
create mode 100644 getopt.c
diff --git a/Makefile.nmake b/Makefile.nmake
new file mode 100644
index 0000000..730523e
--- /dev/null
+++ b/Makefile.nmake
@@ -0,0 +1,934 @@
+# This file is in the public domain, so clarified as of
+# 2009-05-17 by Arthur David Olson.
+
+# This file supports building zic.exe and zdump.exe with Visual Studio nmake
+
+# Package name for the code distribution.
+PACKAGE= tzcode
+
+# Version number for the distribution, overridden in the 'tarballs' rule below.
+VERSION= unknown
+
+# Email address for bug reports.
+BUGEMAIL= tz(a)iana.org
+
+# Change the line below for your time zone (after finding the zone you want in
+# the time zone files, or adding it to a time zone file).
+# Alternately, if you discover you've got the wrong time zone, you can just
+# zic -l rightzone
+# to correct things.
+# Use the command
+# make zonenames
+# to get a list of the values you can use for LOCALTIME.
+
+LOCALTIME= GMT
+
+# If you want something other than Eastern United States time as a template
+# for handling POSIX-style time zone environment variables,
+# change the line below (after finding the zone you want in the
+# time zone files, or adding it to a time zone file).
+# (When a POSIX-style environment variable is handled, the rules in the
+# template file are used to determine "spring forward" and "fall back" days and
+# times; the environment variable itself specifies UT offsets of standard and
+# summer time.)
+# Alternately, if you discover you've got the wrong time zone, you can just
+# zic -p rightzone
+# to correct things.
+# Use the command
+# make zonenames
+# to get a list of the values you can use for POSIXRULES.
+# If you want POSIX compatibility, use "America/New_York".
+
+POSIXRULES= America/New_York
+
+# Also see TZDEFRULESTRING below, which takes effect only
+# if the time zone files cannot be accessed.
+
+
+# Installation locations.
+#
+# The defaults are suitable for Debian, except that if REDO is
+# posix_right or right_posix then files that Debian puts under
+# /usr/share/zoneinfo/posix and /usr/share/zoneinfo/right are instead
+# put under /usr/share/zoneinfo-posix and /usr/share/zoneinfo-leaps,
+# respectively. Problems with the Debian approach are discussed in
+# the commentary for the right_posix rule (below).
+
+# Destination directory, which can be used for staging.
+# 'make DESTDIR=/stage install' installs under /stage (e.g., to
+# /stage/etc/localtime instead of to /etc/localtime). Files under
+# /stage are not intended to work as-is, but can be copied by hand to
+# the root directory later. If DESTDIR is empty, 'make install' does
+# not stage, but installs directly into production locations.
+DESTDIR =
+
+# Everything is installed into subdirectories of TOPDIR, and used there.
+# TOPDIR should be empty (meaning the root directory),
+# or a directory name that does not end in "/".
+# TOPDIR should be empty or an absolute name unless you're just testing.
+TOPDIR =
+
+# The default local time zone is taken from the file TZDEFAULT.
+TZDEFAULT = $(TOPDIR)/etc/localtime
+
+# The subdirectory containing installed program and data files, and
+# likewise for installed files that can be shared among architectures.
+# These should be relative file names.
+USRDIR = usr
+USRSHAREDIR = $(USRDIR)/share
+
+# "Compiled" time zone information is placed in the "TZDIR" directory
+# (and subdirectories).
+# TZDIR_BASENAME should not contain "/" and should not be ".", ".." or empty.
+TZDIR_BASENAME= zoneinfo
+TZDIR = $(TOPDIR)\\$(USRSHAREDIR)\\$(TZDIR_BASENAME)
+
+# The "tzselect" and (if you do "make INSTALL") "date" commands go in:
+BINDIR = $(TOPDIR)/$(USRDIR)/bin
+
+# The "zdump" command goes in:
+ZDUMPDIR = $(BINDIR)
+
+# The "zic" command goes in:
+ZICDIR = $(TOPDIR)/$(USRDIR)/sbin
+
+# Manual pages go in subdirectories of. . .
+MANDIR = $(TOPDIR)/$(USRSHAREDIR)/man
+
+# Library functions are put in an archive in LIBDIR.
+LIBDIR = $(TOPDIR)/$(USRDIR)/lib
+
+
+# Types to try, as an alternative to time_t. int64_t should be first.
+TIME_T_ALTERNATIVES = int64_t int32_t uint32_t uint64_t
+
+# If you want only POSIX time, with time values interpreted as
+# seconds since the epoch (not counting leap seconds), use
+# REDO= posix_only
+# below. If you want only "right" time, with values interpreted
+# as seconds since the epoch (counting leap seconds), use
+# REDO= right_only
+# below. If you want both sets of data available, with leap seconds not
+# counted normally, use
+# REDO= posix_right
+# below. If you want both sets of data available, with leap seconds counted
+# normally, use
+# REDO= right_posix
+# below. POSIX mandates that leap seconds not be counted; for compatibility
+# with it, use "posix_only" or "posix_right". Use POSIX time on systems with
+# leap smearing; this can work better than unsmeared "right" time with
+# applications that are not leap second aware, and is closer to unsmeared
+# "right" time than unsmeared POSIX time is (e.g., 0.5 vs 1.0 s max error).
+
+REDO= posix_right
+
+# To install data in text form that has all the information of the binary data,
+# (optionally incorporating leap second information), use
+# TZDATA_TEXT= tzdata.zi leapseconds
+# To install text data without leap second information (e.g., because
+# REDO='posix_only'), use
+# TZDATA_TEXT= tzdata.zi
+# To avoid installing text data, use
+# TZDATA_TEXT=
+
+TZDATA_TEXT= leapseconds tzdata.zi
+
+# For backward-compatibility links for old zone names, use
+# BACKWARD= backward
+# If you also want the link US/Pacific-New, even though it is confusing
+# and is planned to be removed from the database eventually, use
+# BACKWARD= backward pacificnew
+# To omit these links, use
+# BACKWARD=
+
+BACKWARD= backward
+
+# If you want out-of-scope and often-wrong data from the file 'backzone', use
+# PACKRATDATA= backzone
+# To omit this data, use
+# PACKRATDATA=
+
+PACKRATDATA=
+
+# The name of a locale using the UTF-8 encoding, used during self-tests.
+# The tests are skipped if the name does not appear to work on this system.
+
+UTF8_LOCALE= en_US.utf8
+
+# Since "." may not be in PATH...
+
+YEARISTYPE= ./yearistype
+
+# Non-default libraries needed to link.
+LDLIBS=
+
+# Add the following to the end of the "CFLAGS=" line as needed to override
+# defaults specified in the source code. "-DFOO" is equivalent to "-DFOO=1".
+# -DBIG_BANG=-9999999LL if the Big Bang occurred at time -9999999 (see zic.c)
+# -DDEPRECATE_TWO_DIGIT_YEARS for optional runtime warnings about strftime
+# formats that generate only the last two digits of year numbers
+# -DEPOCH_LOCAL 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.
+# -DHAVE_DECL_ASCTIME_R=0 if <time.h> does not declare asctime_r
+# -DHAVE_DECL_ENVIRON if <unistd.h> declares 'environ'
+# -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
+# -DHAVE_GENERIC=0 if _Generic does not work
+# -DHAVE_GETTEXT if 'gettext' works (e.g., GNU/Linux, FreeBSD, Solaris)
+# -DHAVE_INCOMPATIBLE_CTIME_R if your system's time.h declares
+# ctime_r and asctime_r incompatibly with the POSIX standard
+# (Solaris when _POSIX_PTHREAD_SEMANTICS is not defined).
+# -DHAVE_INTTYPES_H if you have a non-C99 compiler with <inttypes.h>
+# -DHAVE_LINK=0 if your system lacks a link function
+# -DHAVE_LOCALTIME_R=0 if your system lacks a localtime_r function
+# -DHAVE_LOCALTIME_RZ=0 if you do not want zdump to use localtime_rz
+# localtime_rz can make zdump significantly faster, but is nonstandard.
+# -DHAVE_POSIX_DECLS=0 if your system's include files do not declare
+# functions like 'link' or variables like 'tzname' required by POSIX
+# -DHAVE_SNPRINTF=0 if your system lacks the snprintf function
+# -DHAVE_STDBOOL_H if you have a non-C99 compiler with <stdbool.h>
+# -DHAVE_STDINT_H if you have a non-C99 compiler with <stdint.h>
+# -DHAVE_STRFTIME_L if <time.h> declares locale_t and strftime_l
+# -DHAVE_STRDUP=0 if your system lacks the strdup function
+# -DHAVE_SYMLINK=0 if your system lacks the symlink function
+# -DHAVE_SYS_STAT_H=0 if your compiler lacks a <sys/stat.h>
+# -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>
+# -Dlocale_t=XXX if your system uses XXX instead of locale_t
+# -Dssize_t=long on hosts like MS-Windows that lack ssize_t
+# -DTHREAD_SAFE to make localtime.c thread-safe, as POSIX requires;
+# not needed by the main-program tz code, which is single-threaded.
+# Append other compiler flags as needed, e.g., -pthread on GNU/Linux.
+# -Dtime_tz=\"T\" to use T as the time_t type, rather than the system time_t
+# This is intended for internal use only; it mangles external names.
+# -DTZ_DOMAIN=\"foo\" to use "foo" for gettext domain name; default is "tz"
+# -DTZ_DOMAINDIR=\"/path\" to use "/path" for gettext directory;
+# the default is system-supplied, typically "/usr/lib/locale"
+# -DTZDEFRULESTRING=\",date/time,date/time\" to default to the specified
+# DST transitions if the time zone files cannot be accessed
+# -DUNINIT_TRAP if reading uninitialized storage can cause problems
+# other than simply getting garbage data
+# -DUSE_LTZ=0 to build zdump with the system time zone library
+# Also set TZDOBJS=zdump.o and CHECK_TIME_T_ALTERNATIVES= below.
+# -DZIC_MAX_ABBR_LEN_WO_WARN=3
+# (or some other number) to set the maximum time zone abbreviation length
+# that zic will accept without a warning (the default is 6)
+# $(GCC_DEBUG_FLAGS) if you are using recent GCC and want lots of checking
+# Select instrumentation via "make GCC_INSTRUMENT='whatever'".
+GCC_INSTRUMENT = \
+ -fsanitize=undefined -fsanitize-address-use-after-scope \
+ -fsanitize-undefined-trap-on-error -fstack-protector
+GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
+ $(GCC_INSTRUMENT) \
+ -Wall -Wextra \
+ -Walloc-size-larger-than=100000 -Warray-bounds=2 \
+ -Wbad-function-cast -Wcast-align -Wdate-time \
+ -Wdeclaration-after-statement -Wdouble-promotion \
+ -Wformat=2 -Wformat-overflow=2 -Wformat-signedness -Wformat-truncation \
+ -Winit-self -Wjump-misses-init -Wlogical-op \
+ -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \
+ -Wold-style-definition -Woverlength-strings -Wpointer-arith \
+ -Wshadow -Wshift-overflow=2 -Wstrict-prototypes -Wstringop-overflow=5 \
+ -Wsuggest-attribute=const -Wsuggest-attribute=format \
+ -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure \
+ -Wtrampolines -Wundef -Wuninitialized -Wunused \
+ -Wvariadic-macros -Wvla -Wwrite-strings \
+ -Wno-address -Wno-format-nonliteral -Wno-sign-compare \
+ -Wno-type-limits -Wno-unused-parameter
+#
+# If your system has a "GMT offset" field in its "struct tm"s
+# (or if you decide to add such a field in your system's "time.h" file),
+# add the name to a define such as
+# -DTM_GMTOFF=tm_gmtoff
+# to the end of the "CFLAGS=" line. If not defined, the code attempts to
+# guess TM_GMTOFF from other macros; define NO_TM_GMTOFF to suppress this.
+# Similarly, if your system has a "zone abbreviation" field, define
+# -DTM_ZONE=tm_zone
+# and define NO_TM_ZONE to suppress any guessing. These two fields are not
+# required by POSIX, but are widely available on GNU/Linux and BSD systems.
+#
+# The next batch of options control support for external variables
+# exported by tzcode. In practice these variables are less useful
+# than TM_GMTOFF and TM_ZONE. However, most of them are standardized.
+# #
+# # To omit or support the external variable "tzname", add one of:
+# # -DHAVE_TZNAME=0
+# # -DHAVE_TZNAME=1
+# # to the "CFLAGS=" line. "tzname" is required by POSIX 1988 and later.
+# # If not defined, the code attempts to guess HAVE_TZNAME from other macros.
+# # Warning: unless time_tz is also defined, HAVE_TZNAME=1 can cause
+# # crashes when combined with some platforms' standard libraries,
+# # presumably due to memory allocation issues.
+# #
+# # To omit or support the external variables "timezone" and "daylight", add
+# # -DUSG_COMPAT=0
+# # -DUSG_COMPAT=1
+# # to the "CFLAGS=" line; "timezone" and "daylight" are inspired by
+# # Unix Systems Group code and are required by POSIX 2008 (with XSI) and later.
+# # If not defined, the code attempts to guess USG_COMPAT from other macros.
+# #
+# # To support the external variable "altzone", add
+# # -DALTZONE
+# # to the end of the "CFLAGS=" line; although "altzone" appeared in
+# # System V Release 3.1 it has not been standardized.
+#
+# If you want functions that were inspired by early versions of X3J11's work,
+# add
+# -DSTD_INSPIRED
+# to the end of the "CFLAGS=" line. This arranges for the functions
+# "tzsetwall", "offtime", "timelocal", "timegm", "timeoff",
+# "posix2time", and "time2posix" to be added to the time conversion library.
+# "tzsetwall" is like "tzset" except that it arranges for local wall clock
+# time (rather than the time specified in the TZ environment variable)
+# to be used.
+# "offtime" is like "gmtime" except that it accepts a second (long) argument
+# that gives an offset to add to the time_t when converting it.
+# "timelocal" is equivalent to "mktime".
+# "timegm" is like "timelocal" except that it turns a struct tm into
+# a time_t using UT (rather than local time as "timelocal" does).
+# "timeoff" is like "timegm" except that it accepts a second (long) argument
+# that gives an offset to use when converting to a time_t.
+# "posix2time" and "time2posix" are described in an included manual page.
+# X3J11's work does not describe any of these functions.
+# Sun has provided "tzsetwall", "timelocal", and "timegm" in SunOS 4.0.
+# These functions may well disappear in future releases of the time
+# conversion package.
+#
+# If you don't want functions that were inspired by NetBSD, add
+# -DNETBSD_INSPIRED=0
+# to the end of the "CFLAGS=" line. Otherwise, the functions
+# "localtime_rz", "mktime_z", "tzalloc", and "tzfree" are added to the
+# time library, and if STD_INSPIRED is also defined the functions
+# "posix2time_z" and "time2posix_z" are added as well.
+# The functions ending in "_z" (or "_rz") are like their unsuffixed
+# (or suffixed-by-"_r") counterparts, except with an extra first
+# argument of opaque type timezone_t that specifies the time zone.
+# "tzalloc" allocates a timezone_t value, and "tzfree" frees it.
+#
+# If you want to allocate state structures in localtime, add
+# -DALL_STATE
+# to the end of the "CFLAGS=" line. Storage is obtained by calling malloc.
+#
+# NIST-PCTS:151-2, Version 1.4, (1993-12-03) is a test suite put
+# out by the National Institute of Standards and Technology
+# which claims to test C and Posix conformance. If you want to pass PCTS, add
+# -DPCTS
+# to the end of the "CFLAGS=" line.
+#
+# If you want strict compliance with XPG4 as of 1994-04-09, add
+# -DXPG4_1994_04_09
+# to the end of the "CFLAGS=" line. This causes "strftime" to always return
+# 53 as a week number (rather than 52 or 53) for January days before
+# January's first Monday when a "%V" format is used and January 1
+# falls on a Friday, Saturday, or Sunday.
+
+!IF "$(CPU)" == "AMD64"
+CFLAGS=/Zi -DHAVE_SYS_WAIT_H=0 -DHAVE_UNISTD_H=0 -DHAVE_INTTYPES_H=0 -DHAVE_POSIX_DECLS=0 -DHAVE_LINK=0 -DHAVE_SYMLINK=0 -DTYPECHECK=1 -DHAVE_DECL_ASCTIME_R=0
+!ELSE
+CFLAGS=/Zi -DHAVE_SYS_WAIT_H=0 -DHAVE_UNISTD_H=0 -DHAVE_INTTYPES_H=0 -DHAVE_POSIX_DECLS=0 -DHAVE_LINK=0 -DHAVE_SYMLINK=0 -DSTD_INSPIRED -DTYPECHECK=1 -DHAVE_DECL_ASCTIME_R=0
+!ENDIF
+
+# Linker flags. Default to $(LFLAGS) for backwards compatibility
+# to release 2012h and earlier.
+
+LDFLAGS= $(LFLAGS)
+
+# For leap seconds, this Makefile uses LEAPSECONDS='-L leapseconds' in
+# submake command lines. The default is no leap seconds.
+
+LEAPSECONDS=
+
+# The zic command and its arguments.
+
+zic= ./zic.exe
+ZIC= $(zic) $(ZFLAGS)
+
+ZFLAGS=
+
+# How to use zic to install tz binary files.
+
+ZIC_INSTALL= $(ZIC) -d '$(DESTDIR)$(TZDIR)' $(LEAPSECONDS)
+
+# The name of a Posix-compliant 'awk' on your system.
+AWK= awk
+
+# The full path name of a Posix-compliant shell, preferably one that supports
+# the Korn shell's 'select' statement as an extension.
+# These days, Bash is the most popular.
+# It should be OK to set this to /bin/sh, on platforms where /bin/sh
+# lacks 'select' or doesn't completely conform to Posix, but /bin/bash
+# is typically nicer if it works.
+KSHELL= /bin/bash
+
+# The path where SGML DTDs are kept and the catalog file(s) to use when
+# validating. The default should work on both Debian and Red Hat.
+SGML_TOPDIR= /usr
+SGML_DTDDIR= $(SGML_TOPDIR)/share/xml/w3c-sgml-lib/schema/dtd
+SGML_SEARCH_PATH= $(SGML_DTDDIR)/REC-html401-19991224
+SGML_CATALOG_FILES= \
+ $(SGML_TOPDIR)/share/doc/w3-recs/html/www.w3.org/TR/1999/REC-html401-19991224/HTML4.cat:$(SGML_TOPDIR)/share/sgml/html/4.01/HTML4.cat
+
+# The name, arguments and environment of a program to validate your web pages.
+# See <http://openjade.sourceforge.net/doc/> for a validator, and
+# <https://validator.w3.org/source/> for a validation library.
+# Set VALIDATE=':' if you do not have such a program.
+VALIDATE = nsgmls
+VALIDATE_FLAGS = -s -B -wall -wno-unused-param
+VALIDATE_ENV = \
+ SGML_CATALOG_FILES='$(SGML_CATALOG_FILES)' \
+ SGML_SEARCH_PATH='$(SGML_SEARCH_PATH)' \
+ SP_CHARSET_FIXED=YES \
+ SP_ENCODING=UTF-8
+
+# This expensive test requires USE_LTZ.
+# To suppress it, define this macro to be empty.
+CHECK_TIME_T_ALTERNATIVES = check_time_t_alternatives
+
+# SAFE_CHAR is a regular expression that matches a safe character.
+# Some parts of this distribution are limited to safe characters;
+# others can use any UTF-8 character.
+# For now, the safe characters are a safe subset of ASCII.
+# The caller must set the shell variable 'sharp' to the character '#',
+# since Makefile macros cannot contain '#'.
+# TAB_CHAR is a single tab character, in single quotes.
+TAB_CHAR= ' '
+SAFE_CHARSET1= $(TAB_CHAR)' !\"'$$sharp'$$%&'\''()*+,./0123456789:;<=>?@'
+SAFE_CHARSET2= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_`'
+SAFE_CHARSET3= 'abcdefghijklmnopqrstuvwxyz{|}~'
+SAFE_CHARSET= $(SAFE_CHARSET1)$(SAFE_CHARSET2)$(SAFE_CHARSET3)
+SAFE_CHAR= '[]'$(SAFE_CHARSET)'-]'
+
+# OK_CHAR matches any character allowed in the distributed files.
+# This is the same as SAFE_CHAR, except that multibyte letters are
+# also allowed so that commentary can contain people's names and quote
+# non-English sources. For non-letters the sources are limited to
+# ASCII renderings for the convenience of maintainers whose text editors
+# mishandle UTF-8 by default (e.g., XEmacs 21.4.22).
+OK_CHAR= '[][:alpha:]'$(SAFE_CHARSET)'-]'
+
+# SAFE_LINE matches a line of safe characters.
+# SAFE_SHARP_LINE is similar, except any OK character can follow '#';
+# this is so that comments can contain non-ASCII characters.
+# OK_LINE matches a line of OK characters.
+SAFE_LINE= '^'$(SAFE_CHAR)'*$$'
+SAFE_SHARP_LINE='^'$(SAFE_CHAR)'*('$$sharp$(OK_CHAR)'*)?$$'
+OK_LINE= '^'$(OK_CHAR)'*$$'
+
+# Flags to give 'tar' when making a distribution.
+# Try to use flags appropriate for GNU tar.
+GNUTARFLAGS= --numeric-owner --owner=0 --group=0 --mode=go+u,go-w --sort=name
+TARFLAGS= `if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; \
+ then echo $(GNUTARFLAGS); \
+ else :; \
+ fi`
+
+# Flags to give 'gzip' when making a distribution.
+GZIPFLAGS= -9n
+
+###############################################################################
+
+#MAKE= make
+
+cc= cl
+CC= $(cc) -DTZDIR=\"$(TZDIR)\"
+
+AR= lib
+
+# ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
+RANLIB= :
+
+TZCOBJS= zic.obj getopt.obj
+TZDOBJS= zdump.obj localtime.obj asctime.obj getopt.obj strftime.obj
+DATEOBJS= date.obj localtime.obj strftime.obj asctime.obj
+LIBSRCS= localtime.c asctime.c difftime.c
+LIBOBJS= localtime.obj asctime.obj difftime.obj
+HEADERS= tzfile.h private.h
+NONLIBSRCS= zic.c zdump.c
+NEWUCBSRCS= date.c strftime.c
+SOURCES= $(HEADERS) $(LIBSRCS) $(NONLIBSRCS) $(NEWUCBSRCS) \
+ tzselect.ksh workman.sh
+MANS= newctime.3 newstrftime.3 newtzset.3 time2posix.3 \
+ tzfile.5 tzselect.8 zic.8 zdump.8
+MANTXTS= newctime.3.txt newstrftime.3.txt newtzset.3.txt \
+ time2posix.3.txt \
+ tzfile.5.txt tzselect.8.txt zic.8.txt zdump.8.txt \
+ date.1.txt
+COMMON= calendars CONTRIBUTING LICENSE Makefile \
+ NEWS README theory.html version
+WEB_PAGES= tz-art.html tz-how-to.html tz-link.html
+DOCS= $(MANS) date.1 $(MANTXTS) $(WEB_PAGES)
+PRIMARY_YDATA= africa antarctica asia australasia \
+ europe northamerica southamerica
+YDATA= $(PRIMARY_YDATA) etcetera
+NDATA= systemv factory
+TDATA_TO_CHECK= $(YDATA) $(NDATA) backward pacificnew
+TDATA= $(YDATA) $(NDATA) $(BACKWARD)
+ZONETABLES= zone1970.tab zone.tab
+TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES)
+LEAP_DEPS= leapseconds.awk leap-seconds.list
+TZDATA_ZI_DEPS= zishrink.awk version $(TDATA) $(PACKRATDATA)
+DATA= $(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \
+ leapseconds yearistype.sh $(ZONETABLES)
+AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk zishrink.awk
+MISC= $(AWK_SCRIPTS) zoneinfo2tdf.pl
+TZS_YEAR= 2050
+TZS= to$(TZS_YEAR).tzs
+TZS_NEW= to$(TZS_YEAR)new.tzs
+TZS_DEPS= $(PRIMARY_YDATA) asctime.c localtime.c \
+ private.h tzfile.h zdump.c zic.c
+ENCHILADA= $(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC) $(TZS) tzdata.zi
+
+# Consult these files when deciding whether to rebuild the 'version' file.
+# This list is not the same as the output of 'git ls-files', since
+# .gitignore is not distributed.
+VERSION_DEPS= \
+ calendars CONTRIBUTING LICENSE Makefile NEWS README \
+ africa antarctica asctime.c asia australasia \
+ backward backzone \
+ checklinks.awk checktab.awk \
+ date.1 date.c difftime.c \
+ etcetera europe factory iso3166.tab \
+ leap-seconds.list leapseconds.awk localtime.c \
+ newctime.3 newstrftime.3 newtzset.3 northamerica \
+ pacificnew private.h \
+ southamerica strftime.c systemv theory.html \
+ time2posix.3 tz-art.html tz-how-to.html tz-link.html \
+ tzfile.5 tzfile.h tzselect.8 tzselect.ksh \
+ workman.sh yearistype.sh \
+ zdump.8 zdump.c zic.8 zic.c \
+ zone.tab zone1970.tab zoneinfo2tdf.pl
+
+# And for the benefit of csh users on systems that assume the user
+# shell should be used to handle commands in Makefiles. . .
+
+SHELL= /bin/sh
+
+root: zic.exe zdump.exe
+
+ALL: root date $(ENCHILADA)
+
+install: root $(DATA) $(REDO) $(MANS)
+ mkdir $(DESTDIR)$(ETCDIR) $(DESTDIR)$(TZDIR) \
+ $(DESTDIR)$(LIBDIR) \
+ $(DESTDIR)$(MANDIR)/man3 $(DESTDIR)$(MANDIR)/man5 \
+ $(DESTDIR)$(MANDIR)/man8
+ $(ZIC_INSTALL) -l $(LOCALTIME) -p $(POSIXRULES) \
+ -t '$(DESTDIR)$(TZDEFAULT)'
+ cp -f $(TABDATA) $(DESTDIR)$(TZDIR)/.
+ cp tzselect $(DESTDIR)$(BINDIR)/.
+ cp zdump.exe $(DESTDIR)$(ZDUMPDIR)/.
+ cp zic.exe $(DESTDIR)$(ZICDIR)/.
+ cp libtz.lib $(DESTDIR)$(LIBDIR)/.
+ $(RANLIB) $(DESTDIR)$(LIBDIR)/libtz.lib
+ cp -f newctime.3 newtzset.3 $(DESTDIR)$(MANDIR)/man3/.
+ cp -f tzfile.5 $(DESTDIR)$(MANDIR)/man5/.
+ cp -f tzselect.8 zdump.8 zic.8 $(DESTDIR)$(MANDIR)/man8/.
+
+INSTALL: ALL install date.1
+ mkdir -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR)/man1
+ cp date $(DESTDIR)$(BINDIR)/.
+ cp -f date.1 $(DESTDIR)$(MANDIR)/man1/.
+
+# for version get first token of git describe (e.g. 2018a from 2018a-5-g4a132ae) or $(VERSION)
+# if version file is already present, i.e. downloaded from ftp, skip recreating it
+version: $(VERSION_DEPS)
+!IF [git describe > nul 2>&1] == 0
+ if not exist version for /f "delims=-" %%a in ('git describe') do echo %%a > $@
+!ELSE
+ if not exist version echo $(VERSION) > $@
+!ENDIF
+
+# This file can be tailored by setting BACKWARD, PACKRATDATA, etc.
+tzdata.zi: $(TZDATA_ZI_DEPS)
+ version=`sed 1q version` && \
+ LC_ALL=C $(AWK) -v version="$$version" -f zishrink.awk \
+ $(TDATA) $(PACKRATDATA) >$@.out
+ mv $@.out $@
+
+version.h: version
+ echo static char const PKGVERSION[]="($(PACKAGE)) "; >$@
+ for /F %%H in ('type version') do echo static char const TZVERSION[]="%%H"; >> $@
+ echo static char const REPORT_BUGS_TO[]="$(BUGEMAIL)"; >>$@
+
+zdump.exe: $(TZDOBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(TZDOBJS) $(LDLIBS) /link /out:$@
+
+zic.exe: $(TZCOBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS) /link /out:$@
+
+yearistype: yearistype.sh
+ cp yearistype.sh yearistype
+ chmod +x yearistype
+
+leapseconds: $(LEAP_DEPS)
+ $(AWK) -f leapseconds.awk leap-seconds.list >$@.out
+ mv $@.out $@
+
+# Arguments to pass to submakes of install_data.
+# They can be overridden by later submake arguments.
+INSTALLARGS = \
+ BACKWARD='$(BACKWARD)' \
+ DESTDIR='$(DESTDIR)' \
+ LEAPSECONDS='$(LEAPSECONDS)' \
+ PACKRATDATA='$(PACKRATDATA)' \
+ TZDEFAULT='$(TZDEFAULT)' \
+ TZDIR='$(TZDIR)' \
+ YEARISTYPE='$(YEARISTYPE)' \
+ ZIC='$(ZIC)'
+
+# 'make install_data' installs one set of tz binary files.
+install_data: zic.exe leapseconds yearistype tzdata.zi
+ $(ZIC_INSTALL) tzdata.zi
+
+posix_only:
+ $(MAKE) $(INSTALLARGS) LEAPSECONDS= install_data
+
+right_only:
+ $(MAKE) $(INSTALLARGS) LEAPSECONDS='-L leapseconds' \
+ install_data
+
+# In earlier versions of this makefile, the other two directories were
+# subdirectories of $(TZDIR). However, this led to configuration errors.
+# For example, with posix_right under the earlier scheme,
+# TZ='right/Australia/Adelaide' got you localtime with leap seconds,
+# but gmtime without leap seconds, which led to problems with applications
+# like sendmail that subtract gmtime from localtime.
+# Therefore, the other two directories are now siblings of $(TZDIR).
+# You must replace all of $(TZDIR) to switch from not using leap seconds
+# to using them, or vice versa.
+right_posix: right_only
+ rm -fr '$(DESTDIR)$(TZDIR)-leaps'
+ ln -s '$(TZDIR_BASENAME)' '$(DESTDIR)$(TZDIR)-leaps' || \
+ $(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-leaps' right_only
+ $(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-posix' posix_only
+
+posix_right: posix_only
+ rm -fr '$(DESTDIR)$(TZDIR)-posix'
+ ln -s '$(TZDIR_BASENAME)' '$(DESTDIR)$(TZDIR)-posix' || \
+ $(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-posix' posix_only
+ $(MAKE) $(INSTALLARGS) TZDIR='$(TZDIR)-leaps' right_only
+
+# This obsolescent rule is present for backwards compatibility with
+# tz releases 2014g through 2015g. It should go away eventually.
+posix_packrat:
+ $(MAKE) $(INSTALLARGS) PACKRATDATA=backzone posix_only
+
+zones: $(REDO)
+
+$(TZS_NEW): tzdata.zi zdump zic
+ mkdir -p tzs.dir
+ $(zic) -d tzs.dir tzdata.zi
+ $(AWK) '/^L/{print "Link\t" $$2 "\t" $$3}' \
+ tzdata.zi | LC_ALL=C sort >$@.out
+ wd=`pwd` && \
+ zones=`$(AWK) -v wd="$$wd" \
+ '/^Z/{print wd "/tzs.dir/" $$2}' tzdata.zi \
+ | LC_ALL=C sort` && \
+ ./zdump -i -c $(TZS_YEAR) $$zones >>$@.out
+ sed 's,^TZ=".*tzs\.dir/,TZ=",' $@.out >$@.sed.out
+ rm -fr tzs.dir $@.out
+ mv $@.sed.out $@
+
+# If $(TZS) does not already exist (e.g., old-format tarballs), create it.
+# If it exists but 'make check_tzs' fails, a maintainer should inspect the
+# failed output and fix the inconsistency, perhaps by running 'make force_tzs'.
+$(TZS):
+ $(MAKE) force_tzs
+
+force_tzs: $(TZS_NEW)
+ cp $(TZS_NEW) $(TZS)
+
+libtz.lib: $(LIBOBJS)
+ del $@
+ $(AR) $@ $(LIBOBJS)
+ $(RANLIB) $@
+
+date: $(DATEOBJS)
+ $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
+
+tzselect: tzselect.ksh version
+ VERSION=`cat version` && sed \
+ -e 's|#!/bin/bash|#!$(KSHELL)|g' \
+ -e 's|AWK=[^}]*|AWK=$(AWK)|g' \
+ -e 's|\(PKGVERSION\)=.*|\1='\''($(PACKAGE)) '\''|' \
+ -e 's|\(REPORT_BUGS_TO\)=.*|\1=$(BUGEMAIL)|' \
+ -e 's|TZDIR=[^}]*|TZDIR=$(TZDIR)|' \
+ -e 's|\(TZVERSION\)=.*|\1='"$$VERSION"'|' \
+ <$@.ksh >$@.out
+ chmod +x $@.out
+ mv $@.out $@
+
+check: check_character_set check_white_space check_links \
+ check_name_lengths check_sorted \
+ check_tables check_web check_zishrink check_tzs
+
+check_character_set: $(ENCHILADA)
+ test ! '$(UTF8_LOCALE)' || \
+ ! printf 'A\304\200B\n' | \
+ LC_ALL='$(UTF8_LOCALE)' grep -q '^A.B$$' >/dev/null 2>&1 || { \
+ LC_ALL='$(UTF8_LOCALE)' && export LC_ALL && \
+ sharp='#' && \
+ ! grep -Env $(SAFE_LINE) $(MANS) date.1 $(MANTXTS) \
+ $(MISC) $(SOURCES) $(WEB_PAGES) \
+ CONTRIBUTING LICENSE Makefile README \
+ version tzdata.zi && \
+ ! grep -Env $(SAFE_SHARP_LINE) $(TDATA_TO_CHECK) backzone \
+ leapseconds yearistype.sh zone.tab && \
+ ! grep -Env $(OK_LINE) $(ENCHILADA); \
+ }
+
+check_white_space: $(ENCHILADA)
+ patfmt=' \t|[\f\r\v]' && pat=`printf "$$patfmt\\n"` && \
+ ! grep -En "$$pat" $(ENCHILADA)
+ ! grep -n '[[:space:]]$$' \
+ $$(ls $(ENCHILADA) | grep -Fvx leap-seconds.list)
+
+PRECEDES_FILE_NAME = ^(Zone|Link[[:space:]]+[^[:space:]]+)[[:space:]]+
+FILE_NAME_COMPONENT_TOO_LONG = \
+ $(PRECEDES_FILE_NAME)[^[:space:]]*[^/[:space:]]{15}
+
+check_name_lengths: $(TDATA_TO_CHECK) backzone
+ ! grep -En '$(FILE_NAME_COMPONENT_TOO_LONG)' \
+ $(TDATA_TO_CHECK) backzone
+
+CHECK_CC_LIST = { n = split($$1,a,/,/); for (i=2; i<=n; i++) print a[1], a[i]; }
+
+check_sorted: backward backzone iso3166.tab zone.tab zone1970.tab
+ $(AWK) '/^Link/ {print $$3}' backward | LC_ALL=C sort -cu
+ $(AWK) '/^Zone/ {print $$2}' backzone | LC_ALL=C sort -cu
+ $(AWK) '/^[^#]/ {print $$1}' iso3166.tab | LC_ALL=C sort -cu
+ $(AWK) '/^[^#]/ {print $$1}' zone.tab | LC_ALL=C sort -c
+ $(AWK) '/^[^#]/ {print substr($$0, 1, 2)}' zone1970.tab | \
+ LC_ALL=C sort -c
+ $(AWK) '/^[^#]/ $(CHECK_CC_LIST)' zone1970.tab | \
+ LC_ALL=C sort -cu
+
+check_links: checklinks.awk $(TDATA_TO_CHECK)
+ $(AWK) -f checklinks.awk $(TDATA_TO_CHECK)
+ $(AWK) -f checklinks.awk tzdata.zi
+
+check_tables: checktab.awk $(PRIMARY_YDATA) $(ZONETABLES)
+ for tab in $(ZONETABLES); do \
+ $(AWK) -f checktab.awk -v zone_table=$$tab $(PRIMARY_YDATA) \
+ || exit; \
+ done
+
+check_tzs: $(TZS) $(TZS_NEW)
+ diff -u $(TZS) $(TZS_NEW)
+
+# This checks only the HTML 4.01 strict page.
+# To check the the other pages, use <https://validator.w3.org/>.
+check_web: tz-how-to.html
+ $(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) tz-how-to.html
+
+# Check that tzdata.zi generates the same binary data that its sources do.
+check_zishrink: tzdata.zi zic leapseconds $(PACKRATDATA) $(TDATA)
+ for type in posix right; do \
+ mkdir -p time_t.dir/$$type time_t.dir/$$type-shrunk && \
+ case $$type in \
+ right) leap='-L leapseconds';; \
+ *) leap=;; \
+ esac && \
+ $(ZIC) $$leap -d time_t.dir/$$type $(TDATA) && \
+ $(AWK) '/^Rule/' $(TDATA) | \
+ $(ZIC) $$leap -d time_t.dir/$$type - $(PACKRATDATA) && \
+ $(ZIC) $$leap -d time_t.dir/$$type-shrunk tzdata.zi && \
+ diff -r time_t.dir/$$type time_t.dir/$$type-shrunk || exit; \
+ done
+ rm -fr time_t.dir
+
+clean_misc:
+ del core *.obj *.out \
+ date tzselect version.h zdump.exe zic.exe yearistype libtz.lib
+clean: clean_misc
+ del *.dir tzdata.zi $(TZS_NEW)
+
+maintainer-clean: clean
+ @echo 'This command is intended for maintainers to use; it'
+ @echo 'deletes files that may need special tools to rebuild.'
+ rm -f leapseconds version $(MANTXTS) $(TZS) *.asc *.tar.*
+
+names:
+ @echo $(ENCHILADA)
+
+public: check check_public $(CHECK_TIME_T_ALTERNATIVES) \
+ tarballs signatures
+
+date.1.txt: date.1
+newctime.3.txt: newctime.3
+newstrftime.3.txt: newstrftime.3
+newtzset.3.txt: newtzset.3
+time2posix.3.txt: time2posix.3
+tzfile.5.txt: tzfile.5
+tzselect.8.txt: tzselect.8
+zdump.8.txt: zdump.8
+zic.8.txt: zic.8
+
+$(MANTXTS): workman.sh
+ LC_ALL=C sh workman.sh `expr $@ : '\(.*\)\.txt$$'` >$@.out
+ mv $@.out $@
+
+# Set the time stamps to those of the git repository, if available,
+# and if the files have not changed since then.
+# This uses GNU 'touch' syntax 'touch -d@N FILE',
+# where N is the number of seconds since 1970.
+# If git or GNU 'touch' is absent, don't bother to sync with git timestamps.
+# Also, set the timestamp of each prebuilt file like 'leapseconds'
+# to be the maximum of the files it depends on.
+set-timestamps.out: $(ENCHILADA)
+ rm -f $@
+ if (type git) >/dev/null 2>&1 && \
+ files=`git ls-files $(ENCHILADA)` && \
+ touch -md @1 test.out; then \
+ rm -f test.out && \
+ for file in $$files; do \
+ if git diff --quiet $$file; then \
+ time=`git log -1 --format='tformat:%ct' $$file` && \
+ touch -cmd @$$time $$file; \
+ else \
+ echo >&2 "$$file: warning: does not match repository"; \
+ fi || exit; \
+ done; \
+ fi
+ touch -cmr `ls -t $(LEAP_DEPS) | sed 1q` leapseconds
+ for file in `ls $(MANTXTS) | sed 's/\.txt$$//'`; do \
+ touch -cmr `ls -t $$file workman.sh | sed 1q` $$file.txt || \
+ exit; \
+ done
+ touch -cmr `ls -t $(TZDATA_ZI_DEPS) | sed 1q` tzdata.zi
+ touch -cmr `ls -t $(TZS_DEPS) | sed 1q` $(TZS)
+ touch -cmr `ls -t $(VERSION_DEPS) | sed 1q` version
+ touch $@
+
+# The zics below ensure that each data file can stand on its own.
+# We also do an all-files run to catch links to links.
+
+check_public:
+ $(MAKE) maintainer-clean
+ $(MAKE) CFLAGS='$(GCC_DEBUG_FLAGS)' ALL
+ mkdir -p public.dir
+ for i in $(TDATA_TO_CHECK) tzdata.zi; do \
+ $(zic) -v -d public.dir $$i 2>&1 || exit; \
+ done
+ $(zic) -v -d public.dir $(TDATA_TO_CHECK)
+ rm -fr public.dir
+
+# Check that the code works under various alternative
+# implementations of time_t.
+check_time_t_alternatives:
+ if diff -q Makefile Makefile 2>/dev/null; then \
+ quiet_option='-q'; \
+ else \
+ quiet_option=''; \
+ fi && \
+ wd=`pwd` && \
+ zones=`$(AWK) '/^[^#]/ { print $$3 }' <zone1970.tab` && \
+ for type in $(TIME_T_ALTERNATIVES); do \
+ mkdir -p time_t.dir/$$type && \
+ $(MAKE) clean_misc && \
+ $(MAKE) TOPDIR="$$wd/time_t.dir/$$type" \
+ CFLAGS='$(CFLAGS) -Dtime_tz='"'$$type'" \
+ REDO='$(REDO)' \
+ install && \
+ diff $$quiet_option -r \
+ time_t.dir/int64_t/etc \
+ time_t.dir/$$type/etc && \
+ diff $$quiet_option -r \
+ time_t.dir/int64_t/usr/share \
+ time_t.dir/$$type/usr/share && \
+ case $$type in \
+ int32_t) range=-2147483648,2147483647;; \
+ uint32_t) range=0,4294967296;; \
+ int64_t) continue;; \
+ *u*) range=0,10000000000;; \
+ *) range=-10000000000,10000000000;; \
+ esac && \
+ echo checking $$type zones ... && \
+ time_t.dir/int64_t/usr/bin/zdump -V -t $$range $$zones \
+ >time_t.dir/int64_t.out && \
+ time_t.dir/$$type/usr/bin/zdump -V -t $$range $$zones \
+ >time_t.dir/$$type.out && \
+ diff -u time_t.dir/int64_t.out time_t.dir/$$type.out \
+ || exit; \
+ done
+ rm -fr time_t.dir
+
+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 \
+
+tzcode$(VERSION).tar.gz: set-timestamps.out
+ LC_ALL=C && export LC_ALL && \
+ tar $(TARFLAGS) -cf - \
+ $(COMMON) $(DOCS) $(SOURCES) | \
+ gzip $(GZIPFLAGS) >$@.out
+ mv $@.out $@
+
+tzdata$(VERSION).tar.gz: set-timestamps.out
+ LC_ALL=C && export LC_ALL && \
+ tar $(TARFLAGS) -cf - $(COMMON) $(DATA) $(MISC) | \
+ gzip $(GZIPFLAGS) >$@.out
+ mv $@.out $@
+
+tzdb-$(VERSION).tar.lz: set-timestamps.out
+ rm -fr tzdb-$(VERSION)
+ mkdir tzdb-$(VERSION)
+ ln $(ENCHILADA) tzdb-$(VERSION)
+ touch -cmr `ls -t tzdb-$(VERSION)/* | sed 1q` tzdb-$(VERSION)
+ LC_ALL=C && export LC_ALL && \
+ tar $(TARFLAGS) -cf - tzdb-$(VERSION) | lzip -9 >$@.out
+ mv $@.out $@
+
+tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz
+ gpg --armor --detach-sign $?
+
+tzdata$(VERSION).tar.gz.asc: tzdata$(VERSION).tar.gz
+ gpg --armor --detach-sign $?
+
+tzdb-$(VERSION).tar.lz.asc: tzdb-$(VERSION).tar.lz
+ gpg --armor --detach-sign $?
+
+typecheck:
+ $(MAKE) clean
+ for i in "long long" unsigned; \
+ do \
+ $(MAKE) CFLAGS="-DTYPECHECK -D__time_t_defined -D_TIME_T \"-Dtime_t=$$i\"" ; \
+ ./zdump -v Europe/Rome ; \
+ $(MAKE) clean ; \
+ done
+
+zonenames: tzdata.zi
+ @$(AWK) '/^Z/ { print $$2 } /^L/ { print $$3 }' tzdata.zi
+
+asctime.obj: private.h tzfile.h
+date.obj: private.h
+difftime.obj: private.h
+localtime.obj: private.h tzfile.h
+strftime.obj: private.h tzfile.h
+zdump.obj: version.h
+zic.obj: private.h tzfile.h version.h
+getopt.obj:
+msvcrt.lib:
+
+.KEEP_STATE:
+
+.PHONY: ALL INSTALL root
+.PHONY: check check_character_set check_links
+.PHONY: check_public check_sorted check_tables
+.PHONY: check_time_t_alternatives check_tzs check_web check_white_space
+.PHONY: check_zishrink
+.PHONY: clean clean_misc force_tzs
+.PHONY: install install_data maintainer-clean names
+.PHONY: posix_only posix_packrat posix_right
+.PHONY: public right_only right_posix signatures signatures_version
+.PHONY: tarballs tarballs_version typecheck
+.PHONY: zonenames zones
diff --git a/getopt.c b/getopt.c
new file mode 100644
index 0000000..9608eae
--- /dev/null
+++ b/getopt.c
@@ -0,0 +1,110 @@
+/* transcript/src/getopt.c
+ *
+ * public domain getopt from mod.sources
+ * RCSID: $Header: getopt.c,v 2.1 85/11/24 11:49:10 shore Rel $
+ */
+
+/*
+** This is a public domain version of getopt(3).
+** Bugs, fixes to:
+** Keith Bostic
+** ARPA: keith@seismo
+** UUCP: seismo!keith
+** Added NO_STDIO, opterr handling, Rich $alz (mirror!rs).
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+** Error macro. Maybe we want stdio, maybe we don't.
+** The (undocumented?) variable opterr tells us whether or not
+** to print errors.
+*/
+
+#ifdef NO_STDIO
+
+#define tell(s) \
+ if (opterr) \
+ { \
+ char ebuf[2]; \
+ (void)write(2, nargv, (unsigned int)strlen(nargv)); \
+ (void)write(2, s, (unsigned int)strlen(s)); \
+ ebuf[0] = optopt; \
+ ebuf[1] = '\n'; \
+ (void)write(2, ebuf, 2); \
+ }
+
+#else
+
+#define tell(s) \
+ if (opterr) \
+ (void)fputs(*nargv, stderr), \
+ (void)fputs(s,stderr), \
+ (void)fputc(optopt, stderr), \
+ (void)fputc('\n', stderr)
+
+#endif
+
+
+/* Global variables. */
+static char EMSG[] = "";
+int opterr = 1; /* undocumented error-suppressor*/
+int optind = 1; /* index into argv vector */
+int optopt; /* char checked for validity */
+char *optarg; /* arg associated with option */
+
+
+
+getopt(nargc, nargv, ostr)
+ int nargc;
+ char **nargv;
+ char *ostr;
+{
+ static char *place = EMSG; /* option letter processing */
+ register char *oli; /* option letter list index */
+
+ if (!*place) /* update scanning pointer */
+ {
+ if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place)
+ return(EOF);
+ if (*place == '-') /* found "--" */
+ {
+ optind++;
+ return(EOF);
+ }
+ }
+ /* option letter okay? */
+ if ((optopt = *place++) == ':' || (oli = strchr(ostr, optopt)) == NULL)
+ {
+ if (!*place)
+ optind++;
+ tell(": illegal option -- ");
+ goto Bad;
+ }
+ if (*++oli != ':') /* don't need argument */
+ {
+ optarg = NULL;
+ if (!*place)
+ optind++;
+ }
+ else /* need an argument */
+ {
+ if (*place)
+ optarg = place; /* no white space */
+ else
+ if (nargc <= ++optind)
+ {
+ place = EMSG;
+ tell(": option requires an argument -- ");
+ goto Bad;
+ }
+ else
+ optarg = nargv[optind]; /* white space */
+ place = EMSG;
+ optind++;
+ }
+ return(optopt); /* dump back option letter */
+Bad:
+ return('?');
+}
\ No newline at end of file
diff --git a/localtime.c b/localtime.c
index 9b8266a..06243dd 100644
--- a/localtime.c
+++ b/localtime.c
@@ -58,6 +58,14 @@ static void unlock(void) { }
#define OPEN_MODE O_RDONLY
#endif /* !defined O_BINARY */
+#ifdef _WIN32
+#ifdef _WIN64
+typedef unsigned __int64 ssize_t;
+#else
+typedef unsigned int ssize_t;
+#endif
+#endif
+
#ifndef WILDABBR
/*
** Someone might make incorrect use of a time zone abbreviation:
@@ -401,6 +409,13 @@ tzloadbody(char const *name, struct state *sp, bool doextend,
if (name[0] == ':')
++name;
doaccess = name[0] == '/';
+#ifdef _WIN32
+ /*
+ ** DOS drive specifier?
+ */
+ if (isalpha(name[0]) && name[1]==':' && name[2] == '\\')
+ doaccess = true;
+#endif
if (!doaccess) {
size_t namelen = strlen(name);
if (sizeof lsp->fullname - sizeof tzdirslash <= namelen)
@@ -1529,11 +1544,13 @@ localtime_tzset(time_t const *timep, struct tm *tmp, bool setname)
return tmp;
}
+#ifndef _WIN32
struct tm *
localtime(const time_t *timep)
{
return localtime_tzset(timep, &tm, true);
}
+#endif
struct tm *
localtime_r(const time_t *timep, struct tm *tmp)
@@ -1575,11 +1592,13 @@ gmtime_r(const time_t *timep, struct tm *tmp)
return gmtsub(gmtptr, timep, 0, tmp);
}
+#ifndef _WIN32
struct tm *
gmtime(const time_t *timep)
{
return gmtime_r(timep, &tm);
}
+#endif
#ifdef STD_INSPIRED
@@ -1724,6 +1743,7 @@ timesub(const time_t *timep, int_fast32_t offset,
return NULL;
}
+#ifndef _WIN32
char *
ctime(const time_t *timep)
{
@@ -1736,6 +1756,7 @@ ctime(const time_t *timep)
struct tm *tmp = localtime(timep);
return tmp ? asctime(tmp) : NULL;
}
+#endif
char *
ctime_r(const time_t *timep, char *buf)
@@ -2155,6 +2176,7 @@ mktime_z(struct state *sp, struct tm *tmp)
#endif
+#ifndef _WIN32
time_t
mktime(struct tm *tmp)
{
@@ -2169,6 +2191,7 @@ mktime(struct tm *tmp)
unlock();
return t;
}
+#endif
#ifdef STD_INSPIRED
diff --git a/private.h b/private.h
index 2e8415e..d460ca3 100644
--- a/private.h
+++ b/private.h
@@ -266,7 +266,11 @@ typedef int int_fast32_t;
#ifndef INTMAX_MAX
# ifdef LLONG_MAX
typedef long long intmax_t;
+# if _MSC_VER <= 1600
+# define strtoimax strtol
+# else
# define strtoimax strtoll
+# endif
# define INTMAX_MAX LLONG_MAX
# define INTMAX_MIN LLONG_MIN
# else
diff --git a/zdump.c b/zdump.c
index 60a027e..fc90662 100644
--- a/zdump.c
+++ b/zdump.c
@@ -4,6 +4,9 @@
*/
#include "version.h"
+#ifdef _WIN32
+#include <stdlib.h>
+#endif
/*
** This code has been made independent of the rest of the time
@@ -22,6 +25,12 @@
#include "private.h"
#include <stdio.h>
+#if _MSC_VER <= 1600
+# define strtoimax strtol
+#else
+# define strtoimax strtoll
+#endif
+
#ifndef HAVE_SNPRINTF
# define HAVE_SNPRINTF (199901 <= __STDC_VERSION__)
#endif
@@ -181,6 +190,9 @@ gmtime_r(time_t *tp, struct tm *tmp)
return r;
}
+#endif
+#ifdef _WIN32
+struct tm * gmtime_r(time_t *tp, struct tm *tmp);
#endif
/* Platforms with TM_ZONE don't need tzname, so they can use the
@@ -198,7 +210,11 @@ gmtime_r(time_t *tp, struct tm *tmp)
# undef localtime_r
# define localtime_r zdump_localtime_r
static struct tm *
+#ifdef _WIN32
+localtime_r(__time64_t *tp, struct tm *tmp)
+#else
localtime_r(time_t *tp, struct tm *tmp)
+#endif
{
struct tm *r = localtime(tp);
if (r) {
@@ -212,7 +228,11 @@ localtime_r(time_t *tp, struct tm *tmp)
# undef localtime_rz
# define localtime_rz zdump_localtime_rz
static struct tm *
+#ifdef _WIN32
+localtime_rz(timezone_t rz, __time64_t *tp, struct tm *tmp)
+#else
localtime_rz(timezone_t rz, time_t *tp, struct tm *tmp)
+#endif
{
return localtime_r(tp, tmp);
}
@@ -421,10 +441,22 @@ main(int argc, char *argv[])
register bool Vflag;
register char * cutarg;
register char * cuttimes;
+#ifdef _WIN32
+ register __time64_t cutlotime;
+ register __time64_t cuthitime;
+ __time64_t now;
+ __time64_t t;
+ __time64_t newt;
+#else
register time_t cutlotime;
register time_t cuthitime;
time_t now;
+ time_t t;
+ time_t newt;
+#endif
+ struct tm * newtmp;
bool iflag = false;
+ bool newtm_ok;
cutlotime = absolute_min_time;
cuthitime = absolute_max_time;
@@ -531,7 +563,6 @@ main(int argc, char *argv[])
for (i = optind; i < argc; ++i) {
timezone_t tz = tzalloc(argv[i]);
char const *ab;
- time_t t;
struct tm tm, newtm;
bool tm_ok;
if (!tz) {
@@ -562,12 +593,12 @@ main(int argc, char *argv[])
}
}
while (t < cuthitime) {
- time_t newt = ((t < absolute_max_time - SECSPERDAY / 2
+ newt = ((t < absolute_max_time - SECSPERDAY / 2
&& t + SECSPERDAY / 2 < cuthitime)
? t + SECSPERDAY / 2
: cuthitime);
- struct tm *newtmp = localtime_rz(tz, &newt, &newtm);
- bool newtm_ok = newtmp != NULL;
+ newtmp = localtime_rz(tz, &newt, &newtm);
+ newtm_ok = newtmp != NULL;
if (tm_ok != newtm_ok
|| (tm_ok && (delta(&newtm, &tm) != newt - t
|| newtm.tm_isdst != tm.tm_isdst
@@ -605,11 +636,19 @@ main(int argc, char *argv[])
return EXIT_SUCCESS;
}
+#ifdef _WIN32
+static __time64_t
+#else
static time_t
+#endif
yeartot(intmax_t y)
{
register intmax_t myy, seconds, years;
+#ifdef _WIN32
+ register __time64_t t;
+#else
register time_t t;
+#endif
myy = EPOCH_YEAR;
t = 0;
diff --git a/zic.c b/zic.c
index 304410f..11120ee 100644
--- a/zic.c
+++ b/zic.c
@@ -897,6 +897,11 @@ dolink(char const *fromfield, char const *tofield, bool staysymlink)
mkdirs(tofield, true);
symlink_errno = symlink(contents, tofield) == 0 ? 0 : errno;
}
+#ifdef _WIN32
+ /* there is no link support on Windows */
+ if (symlink_errno == ENOTSUP && !todirs_made)
+ mkdirs(tofield, true);
+#endif
free(linkalloc);
if (symlink_errno == 0) {
if (link_errno != ENOTSUP)
@@ -986,6 +991,14 @@ itsdir(char const *name)
if (res == 0)
return S_ISDIR(st.st_mode) != 0;
#endif
+#ifdef _WIN32
+ if (res == 0 ) {
+ if ((st.st_mode & 0170000) == 0040000)
+ return 1;
+ else
+ return 0;
+ }
+#else
if (res == 0 || errno == EOVERFLOW) {
size_t n = strlen(name);
char *nameslashdot = emalloc(n + 3);
@@ -996,6 +1009,7 @@ itsdir(char const *name)
free(nameslashdot);
return dir;
}
+#endif
return false;
}
--
2.15.1.windows.2
4
16
Dear Sir/ Madam
we would like to inform you that the Republic of Sudan is going to change the time zone from (GMT + 3:00) to (GMT+ 2:00) starting from Wednesday 1 November 2017.
this is for your information and action if required.
Best Regards
Dear Mr. Paul
We would like to inform you as TZ coordinator that the Republic of Sudan is planning to change its time zone from GMT+ 3:00 to GMT +2:00 ( The original time zone ) starting from 1 November 2017
Please if you can update time zone data base
Or you you can tell us what action is needed from Sudan government
Best Regards
Ahmed Atyya
Head of Numbering Section
National Telecomm. Corporation – Sudan
Phone: +249123499988
Email: ahmed.atyya@
----- Original Message -----
From: Sabrina Tanamal via RT <iana-questions(a)iana.org>
To: ahmed atyya <ahmed.atyya(a)ntc.gov.sd>
Sent: Tue, 17 Oct 2017 01:33:06 +0300 (EAT)
Subject: [IANA #985615] Sudan Time Zone change
Dear Ahmed,
Thank you for contacting us.
We host the Time Zone Database, but updates are made by the Time Zone Coordinator in consultation with the Time Zone mailing list, in accordance with RFC 6557. Questions about the contents of the database should be sent to the mailing list.
For mailing list archives and subscription information, please see
http://www.iana.org/time-zones
Best regards,
Sabrina Tanamal
IANA Services Specialist
On Mon Oct 16 09:55:06 2017, ahmed.atyya(a)ntc.gov.sd wrote:
> Dear Sir/ Madam
>
>
>
>
>
> we would like to inform you that the Republic of Sudan is going to
> change the time zone from (GMT + 3:00) to (GMT+ 2:00) starting from
> Wednesday 1 November 2017.
>
>
> this is for your information and action if required.
>
>
>
>
>
> Best Regards
>
>
>
>
>
> Ahmed Atyya
>
>
> Head of Numbering Section
>
> National Telecomm. Corporation – Sudan
>
> Phone: +249123499988
>
> Email: ahmed.atyya(a)ntc.gov.sd
6
19
Hi,
while parsing the data i found the issue in rule Europe/Dublin
Negative DST.. Previous version or not in any other file there is no
negative dst.
DST either start and end .
# The following is like GB-Eire and EU, except with standard time in
# summer and negative daylight saving time in winter.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Eire 1971 only - Oct 31 2:00u -1:00 GMT
Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 IST
Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00
GMT
Rule Eire 1981 max - Mar lastSun 1:00u 0 IST
Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00
GMT
Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00
GMT
Rule Eire 1996 max - Oct lastSun 1:00u -1:00 GMT
Please explain why -ve dst offset compared with other files.
Regards,
Vaibhav
5
6
22 Apr '18
This is intended to provide a way to support both clients that require
data to have only positive DST offsets, and clients that do not have
this restriction.
* Makefile (XDST, SDST): New macros.
(TZDATA_ZI_DEPS): Add zidst.awk.
(DSTDATA_ZI_DEPS): New macro.
(all): Depend on fulldata.zi and pdstdata.zi.
(fulldata.zi pdstdata.zi): New rule.
(tzdata.zi): Use $(XDST)data.zi instead of reading original source.
(check_zishrink): Check zidst.awk, too.
(clean): Remove all *.zi files, not just tzdata.zi.
* NEWS, europe: Mention this.
* zidst.awk: New file.
---
Makefile | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
NEWS | 30 ++++++++++++++++++++++++++++++
europe | 39 ++++++++++++++++++++++-----------------
zidst.awk | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 154 insertions(+), 28 deletions(-)
create mode 100644 zidst.awk
diff --git a/Makefile b/Makefile
index 8c84cd9..92ddb80 100644
--- a/Makefile
+++ b/Makefile
@@ -10,6 +10,26 @@ VERSION= unknown
# Email address for bug reports.
BUGEMAIL= tz(a)iana.org
+# To install the full data, which can contain daylight saving time
+# offsets that are negative (relative to standard time), use
+# XDST= full
+# To install data containing only positive daylight saving time
+# offsets, but otherwise as close to the full data as practical, use
+# XDST= pdst
+XDST= pdst
+# Parsers requiring DST offsets to be positive should use the file
+# pdstdata.zi, which contains almost all the data of 'africa' etc.,
+# except with positive DST offsets. This works around a problem that
+# was discovered in January 2018 with negative DST in tests for ICU
+# and OpenJDK. See:
+# https://mm.icann.org/pipermail/tz/2018-January/025825.html
+# https://mm.icann.org/pipermail/tz/2018-January/025822.html
+# Currently the 'africa' etc. files use pdst form if comments are
+# ignored, to ease transition for parsers that do not support
+# negative DST offsets. This is intended to change to full form at
+# some point, so that full-featured zi parsers that use the 'africa'
+# files will get the full data without changing anything.
+
# Change the line below for your time zone (after finding the zone you want in
# the time zone files, or adding it to a time zone file).
# Alternately, if you discover you've got the wrong time zone, you can just
@@ -463,7 +483,8 @@ TDATA= $(YDATA) $(NDATA) $(BACKWARD)
ZONETABLES= zone1970.tab zone.tab
TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES)
LEAP_DEPS= leapseconds.awk leap-seconds.list
-TZDATA_ZI_DEPS= zishrink.awk version $(TDATA) $(PACKRATDATA)
+TZDATA_ZI_DEPS= zidst.awk zishrink.awk version $(TDATA) $(PACKRATDATA)
+DSTDATA_ZI_DEPS= zidst.awk $(TDATA) $(PACKRATDATA)
DATA= $(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \
leapseconds yearistype.sh $(ZONETABLES)
AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk zishrink.awk
@@ -500,7 +521,8 @@ VERSION_DEPS= \
SHELL= /bin/sh
-all: tzselect yearistype zic zdump libtz.a $(TABDATA)
+all: tzselect yearistype zic zdump libtz.a $(TABDATA) \
+ fulldata.zi pdstdata.zi
ALL: all date $(ENCHILADA)
@@ -535,11 +557,15 @@ version: $(VERSION_DEPS)
printf '%s\n' "$$V" >$@.out
mv $@.out $@
-# This file can be tailored by setting BACKWARD, PACKRATDATA, etc.
-tzdata.zi: $(TZDATA_ZI_DEPS)
+# These files can be tailored by setting BACKWARD, PACKRATDATA, etc.
+fulldata.zi pdstdata.zi: $(DSTDATA_ZI_DEPS)
+ $(AWK) -v outfile='$@' -f zidst.awk $(TDATA) $(PACKRATDATA) \
+ >$@.out
+ mv $@.out $@
+tzdata.zi: $(XDST)data.zi version
version=`sed 1q version` && \
LC_ALL=C $(AWK) -v version="$$version" -f zishrink.awk \
- $(TDATA) $(PACKRATDATA) >$@.out
+ $(XDST)data.zi >$@.out
mv $@.out $@
version.h: version
@@ -721,17 +747,32 @@ check_tzs: $(TZS) $(TZS_NEW)
check_web: tz-how-to.html
$(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) tz-how-to.html
-# Check that tzdata.zi generates the same binary data that its sources do.
-check_zishrink: tzdata.zi zic leapseconds $(PACKRATDATA) $(TDATA)
+# The format of the source files, either full or pdst.
+# Currently they are in pdst format, but this is expected to change.
+SDST = pdst
+
+# Check that zishrink.awk does not alter the data, and that zidst.awk
+# preserves $(SDST) data.
+check_zishrink: zic leapseconds $(PACKRATDATA) $(TDATA) \
+ $(XDST)data.zi tzdata.zi
for type in posix right; do \
- mkdir -p time_t.dir/$$type time_t.dir/$$type-shrunk && \
+ mkdir -p time_t.dir/$$type time_t.dir/$$type-$(SDST) \
+ time_t.dir/$$type-shrunk && \
case $$type in \
right) leap='-L leapseconds';; \
*) leap=;; \
esac && \
- $(ZIC) $$leap -d time_t.dir/$$type $(TDATA) && \
- $(AWK) '/^Rule/' $(TDATA) | \
+ $(ZIC) $$leap -d time_t.dir/$$type $(XDST)data.zi && \
+ $(AWK) '/^Rule/' $(XDST)data.zi | \
$(ZIC) $$leap -d time_t.dir/$$type - $(PACKRATDATA) && \
+ case $(XDST) in \
+ $(SDST)) \
+ $(ZIC) $$leap -d time_t.dir/$$type-$(SDST) $(TDATA) && \
+ $(AWK) '/^Rule/' $(TDATA) | \
+ $(ZIC) $$leap -d time_t.dir/$$type-$(SDST) \
+ $(XDST)data.zi && \
+ diff -r time_t.dir/$$type time_t.dir/$$type-$(SDST);; \
+ esac && \
$(ZIC) $$leap -d time_t.dir/$$type-shrunk tzdata.zi && \
diff -r time_t.dir/$$type time_t.dir/$$type-shrunk || exit; \
done
@@ -741,7 +782,7 @@ clean_misc:
rm -f core *.o *.out \
date tzselect version.h zdump zic yearistype libtz.a
clean: clean_misc
- rm -fr *.dir tzdata.zi tzdb-*/ $(TZS_NEW)
+ rm -fr *.dir *.zi tzdb-*/ $(TZS_NEW)
maintainer-clean: clean
@echo 'This command is intended for maintainers to use; it'
diff --git a/NEWS b/NEWS
index 4f763c0..c455f3c 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,36 @@ News for the tz database
Unreleased, experimental changes
+ Briefly:
+ Support zi parsers that mishandle negative DST offsets
+
+ Changes to build procedure
+
+ The new XDST macro in the Makefile lets the installer choose
+ XDST=full, which allows arbitrary DST offsets in the data, or
+ XDST=pdst, which allows only positive DST offsets. Choosing
+ XDST=full is arguably more correct for Ireland, which observes
+ Irish Standard Time (IST, UTC+01) in summer and GMT (UTC) in
+ winter. Choosing XDST=pdst is better for zoneinfo parsers that do
+ not work well with negative DST offsets, notably OpenJDK+CLDR.
+ On platforms using tzcode or similar APIs, XDST should not affect
+ any behavior other than that depending on the tm_isdst flag.
+
+ For now this change does not affect client-visible behavior by
+ default, as the Makefile defaults to XDST=pdst and uncommented
+ parts of the data source files contain only pdst-format data.
+ After a bit of time for testing, XDST=full and full-format source
+ files are planned to become the default, so that parsers that
+ support negative DST offsets can get full data without changing
+ their build procedures. Parsers requiring positive DST offsets
+ should use the new file pdstdata.zi instead of tzdata.zi or the
+ source files 'africa' etc.: pdstdata.zi is pdst-compatible, it is
+ automatically built from the data source files, and it will
+ continue to be pdst-compatible regardless of XDST. To get
+ full-format data now, use the new file fulldata.zi, which will
+ continue to be full-format regardless of XDST. To get the format
+ selected by XDST, use tzdata.zi.
+
Changes to code
The code is a bit more portable to MS-Windows. (Thanks to Manuela
diff --git a/europe b/europe
index 6c1ccbe..5aeda33 100644
--- a/europe
+++ b/europe
@@ -508,11 +508,27 @@ Link Europe/London Europe/Jersey
Link Europe/London Europe/Guernsey
Link Europe/London Europe/Isle_of_Man
-# From Paul Eggert (2018-01-19):
+# From Paul Eggert (2018-01-30):
+# In January 2018 we discovered that the negative DST offsets in the
+# Eire rules cause problems with tests for ICU:
+# https://mm.icann.org/pipermail/tz/2018-January/025825.html
+# and with tests for OpenJDK:
+# https://mm.icann.org/pipermail/tz/2018-January/025822.html
+# To work around this problem, zidst.awk translates the following data
+# lines into two forms. First, fulldata.zi contains the full data,
+# which includes negative DST offsets. Second, pdstdata.zi uses a
+# traditional approximation for Irish time stamps after 1971-10-31
+# 02:00 UTC; although this approximation has tm_isdst flags that are
+# the reverse of the full data, its UTC offsets are correct and this
+# suffices for ICU and OpenJDK. Although this source file currently
+# has pdstdata.zi lines active and fulldata.zi lines commented out,
+# this is intended to change in the near future and downstream code
+# should not rely on it.
+#
# The following is like GB-Eire and EU, except with standard time in
# summer and negative daylight saving time in winter.
-# Although currently commented out, this will need to become uncommented
-# once the ICU/OpenJDK workaround is removed; see below.
+# This rule set is active in fulldata.zi and is commented out in
+# pdstdata.zi.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
#Rule Eire 1971 only - Oct 31 2:00u -1:00 GMT
#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 IST
@@ -533,24 +549,13 @@ Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2
0:00 1:00 IST 1947 Nov 2 2:00s
0:00 - GMT 1948 Apr 18 2:00s
0:00 GB-Eire GMT/IST 1968 Oct 27
-# From Paul Eggert (2018-01-18):
-# The next line should look like this:
+# The next line is active in fulldata.zi and commented out in pdstdata.zi.
# 1:00 Eire IST/GMT
-# However, in January 2018 we discovered that the Eire rules cause
-# problems with tests for ICU:
-# https://mm.icann.org/pipermail/tz/2018-January/025825.html
-# and with tests for OpenJDK:
-# https://mm.icann.org/pipermail/tz/2018-January/025822.html
-# To work around this problem, use a traditional approximation for
-# time stamps after 1971-10-31 02:00 UTC, to give ICU and OpenJDK
-# developers breathing room to fix bugs. This approximation has
-# correct UTC offsets, but results in tm_isdst flags are the reverse
-# of what they should be. This workaround is temporary and should be
-# removed reasonably soon.
+# These three lines are active in pdstdata.zi and commented out in
+# fulldata.zi.
1:00 - IST 1971 Oct 31 2:00u
0:00 GB-Eire GMT/IST 1996
0:00 EU GMT/IST
-# End of workaround for ICU and OpenJDK bugs.
###############################################################################
diff --git a/zidst.awk b/zidst.awk
new file mode 100644
index 0000000..7885e9a
--- /dev/null
+++ b/zidst.awk
@@ -0,0 +1,50 @@
+# Convert tzdata source into full or positive-DST form
+
+# Contributed by Paul Eggert. This file is in the public domain.
+
+# This is not a general-purpose converter; it is designed for current tzdata.
+#
+# When converting to full form, the output can use negative DST offsets.
+#
+# When converting to positive-DST form, the output uses only positive
+# DST offsets. The idea is for the output data to simulate the
+# behavior of the input data as best it can within the constraints of
+# positive DST offsets.
+#
+# In the input, lines requiring the full format are commented #[full]
+# and the positive DST near-equivalents are commented #[pdst].
+
+BEGIN {
+ dst_type["full"] = 1
+ dst_type["pdst"] = 1
+
+ # The command line should set OUTFILE to the name of the output file,
+ # which should start with either "full" or "pdst".
+ todst = substr(outfile, 1, 4)
+ if (!dst_type[todst]) exit 1
+}
+
+/^Zone/ { zone = $2 }
+
+{
+ in_comment = /^#/
+
+ # Test whether this line should differ between the full and the pdst versions.
+ Rule_Eire = /^#?Rule[\t ]+Eire[\t ]/
+ Zone_Dublin_post_1968 \
+ = (zone == "Europe/Dublin" && /^#?[\t ]+[01]:00[\t ]/ \
+ && (!$(in_comment + 4) || 1968 < $(in_comment + 4)))
+
+ # If so, uncomment the desired version and comment out the undesired one.
+ if (Rule_Eire || Zone_Dublin_post_1968) {
+ if ((Rule_Eire \
+ || (Zone_Dublin_post_1968 && $(in_comment + 3) == "IST/GMT")) \
+ == (todst == "full")) {
+ sub(/^#/, "")
+ } else if (/^[^#]/) {
+ sub(/^/, "#")
+ }
+ }
+}
+
+{ print }
--
2.14.3
7
14
---
australasia | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/australasia b/australasia
index c7c0ea7..32ad61e 100644
--- a/australasia
+++ b/australasia
@@ -1086,6 +1086,13 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901
# South Australian time even though it's located in Western Australia.
# Queensland
+
+# From Paul Eggert (2018-02-26):
+# I lack access to the following source for Queensland DST:
+# Pearce C. History of daylight saving time in Queensland.
+# Queensland Hist J. 2017 Aug;23(6):389-403
+# https://search.informit.com.au/documentSummary;dn=994682348436426;res=IELHSS
+
# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
# # The state of QUEENSLAND.. [ Courtesy Qld. Dept Premier Econ&Trade Devel ]
# # [ Dec 1990 ]
--
2.7.4
1
0
This is a bit of a rambling tangent, so sorry.
I recently had to find tz zones for ~100 American cities, and the process did not go quite as smoothly as I had expected.
I figured that a review of theory.html and tz-link.html would tell me the best way to do this, and it didn't really work out that way.
The result was that I found myself just reading the "northamererica" file and knocking out the states that were unambiguous, and then checking the rest against timeanddate.com or time.is. It seems wrong that this appeared to be the easiest approach at this scale, so I wonder what others would suggest (with the benefit of hindsight).
And then, in most cases, converting the zones via "backward" to the "US/Eastern" American political because doing so seemed more "stable."
* I was expecting theory.html to give me a little more guidance on the "right" way to do this. As best as I can tell, the "right" (no pun intended) answer is that I should geolocate each city to longitude/latitude (using some unspecified resource, which seems fine), then use one of the datasets or tools at https://data.iana.org/time-zones/tz-link.html#boundaries to convert those locations to zones. This seemed a bit much.
* I was also a little surprised to not find someone with a handy list of United States states and territory mappings to tz identifiers (for those cases where the state/territory/district uniquely mapped to a tzid). Other than the comments in "northamerica" (which are not quite as structured as one might like, but are pretty good).
* Then I was faced with the question of what the most stable identifier to use was. For instance, take Boston, Massachusetts. I could record it as America/New_York, or as US/Eastern. For instance, at some point in the future, either Boston or New York might exit the Eastern time zone. Cases:
Case 1: If that New York exited and Boston didn't, picking US/Eastern would clearly be the more stable choice.
Case 2: And if Boston exited and New York didn't, it wouldn't matter which I chose, I'd have to update my mapping when Boston moved.
Case 3: If New York and Boston both exited US/Eastern and went the same way, then America/New_York would be the better choice.
Case 4: If New York and Boston both exited US/Eastern and did different things, it's not clear which is the better choice, but similar to Case 2.
Lather rinse repeat for 50 states + some territories and DC.
My conclusion was that in general, for most locations, the US/* ("backward") form seemed the better choice.
(Both Massachusetts and Florida seem to have current proposals to depart US/Eastern and America/New_York.)
* So, I'm curious if this anecdote triggers any reactions.
Did I miss an obvious way to address this more simply?
Is it horrible to have made use of third party websites that lack any sort of auditable authority but are probably correct anyhow.
Is this just not a problem that people have to solve with any frequency?
Does someone (Paul?) want to convince me that it's Wrong to use the "backward" zones, for the narrow (but common) case of United States of America cities?
Thanks for any thoughts.
--jhawk(a)mit.edu
John Hawkinson
17
32
I would like to propose a change to the database to account for Kansas City, Missouri, USA as having not observed DST between 1946 - 1965.
Please see the source book referenced in the link (page 87 in the actual printed pages, standard PDF is the best way to view it):
https://archive.org/details/time-changes-in-usa-1966 <https://archive.org/details/time-changes-in-usa-1966>
I can also confirm the accuracy of at least this piece of information through testimony. What are the procedures for formally proposing, reviewing & accepting/rejecting such changes?
Thank you.
---
Kevin DeCapite
kevin(a)decapite.net
562.355.8222
2
1
23 Feb '18
http://wfla.com/2018/02/14/florida-house-oks-bill-asking-to-skip-daylight-s…
"The [Florida] House voted 103-11 to approve the bill to ask Congress to let Florida remain in Daylight Saving Time all year, meaning while the rest of the Eastern United States sets their clocks back in the fall, Florida wouldn't."
Regards,
F
7
8