[tz] [PATCH] Support building zic.exe and zdump.exe natively on Windows with Visual Studio nmake.

Manuela Friedrich manuela.friedrich at actian.com
Thu Jan 25 09:31:16 UTC 2018


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 at 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 at 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 at 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



More information about the tz mailing list