[Midnightbsd-cvs] src [11084] vendor/tzcode/dist: update tzcode
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Tue Jun 19 10:22:45 EDT 2018
Revision: 11084
http://svnweb.midnightbsd.org/src/?rev=11084
Author: laffer1
Date: 2018-06-19 10:22:45 -0400 (Tue, 19 Jun 2018)
Log Message:
-----------
update tzcode
Added Paths:
-----------
vendor/tzcode/dist/stdtime/
vendor/tzcode/dist/stdtime/asctime.c
vendor/tzcode/dist/stdtime/ctime.3
vendor/tzcode/dist/stdtime/difftime.c
vendor/tzcode/dist/stdtime/localtime.c
vendor/tzcode/dist/stdtime/private.h
vendor/tzcode/dist/stdtime/time2posix.3
vendor/tzcode/dist/stdtime/tzfile.5
vendor/tzcode/dist/stdtime/tzfile.h
vendor/tzcode/dist/zic/
vendor/tzcode/dist/zic/README
vendor/tzcode/dist/zic/Theory
vendor/tzcode/dist/zic/ialloc.c
vendor/tzcode/dist/zic/private.h
vendor/tzcode/dist/zic/scheck.c
vendor/tzcode/dist/zic/zdump/
vendor/tzcode/dist/zic/zdump/Makefile
vendor/tzcode/dist/zic/zdump.8
vendor/tzcode/dist/zic/zdump.c
vendor/tzcode/dist/zic/zic/
vendor/tzcode/dist/zic/zic/Makefile
vendor/tzcode/dist/zic/zic.8
vendor/tzcode/dist/zic/zic.c
Removed Paths:
-------------
vendor/tzcode/dist/CONTRIBUTING
vendor/tzcode/dist/LICENSE
vendor/tzcode/dist/Makefile
vendor/tzcode/dist/NEWS
vendor/tzcode/dist/README
vendor/tzcode/dist/Theory
vendor/tzcode/dist/asctime.c
vendor/tzcode/dist/checktab.awk
vendor/tzcode/dist/date.1
vendor/tzcode/dist/date.1.txt
vendor/tzcode/dist/date.c
vendor/tzcode/dist/difftime.c
vendor/tzcode/dist/ialloc.c
vendor/tzcode/dist/localtime.c
vendor/tzcode/dist/newctime.3
vendor/tzcode/dist/newctime.3.txt
vendor/tzcode/dist/newstrftime.3
vendor/tzcode/dist/newstrftime.3.txt
vendor/tzcode/dist/newtzset.3
vendor/tzcode/dist/newtzset.3.txt
vendor/tzcode/dist/private.h
vendor/tzcode/dist/scheck.c
vendor/tzcode/dist/strftime.c
vendor/tzcode/dist/time2posix.3
vendor/tzcode/dist/time2posix.3.txt
vendor/tzcode/dist/tz-art.htm
vendor/tzcode/dist/tz-how-to.html
vendor/tzcode/dist/tz-link.htm
vendor/tzcode/dist/tzfile.5
vendor/tzcode/dist/tzfile.5.txt
vendor/tzcode/dist/tzfile.h
vendor/tzcode/dist/tzselect.8
vendor/tzcode/dist/tzselect.8.txt
vendor/tzcode/dist/tzselect.ksh
vendor/tzcode/dist/usno1988
vendor/tzcode/dist/usno1989
vendor/tzcode/dist/usno1989a
vendor/tzcode/dist/usno1995
vendor/tzcode/dist/usno1997
vendor/tzcode/dist/usno1998
vendor/tzcode/dist/workman.sh
vendor/tzcode/dist/zdump.8
vendor/tzcode/dist/zdump.8.txt
vendor/tzcode/dist/zdump.c
vendor/tzcode/dist/zic.8
vendor/tzcode/dist/zic.8.txt
vendor/tzcode/dist/zic.c
vendor/tzcode/dist/zoneinfo2tdf.pl
Deleted: vendor/tzcode/dist/CONTRIBUTING
===================================================================
--- vendor/tzcode/dist/CONTRIBUTING 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/CONTRIBUTING 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,73 +0,0 @@
-Contributing to the tz code and data
-
-The time zone database is by no means authoritative: governments
-change timekeeping rules erratically and sometimes with little
-warning, the data entries do not cover all of civil time before
-1970, and undoubtedly errors remain in the code and data. Feel
-free to fill gaps or fix mistakes, and please email improvements
-to tz at iana.org for use in the future.
-
-To email small changes, please run a POSIX shell command like
-'diff -u old/europe new/europe >myfix.patch', and attach
-myfix.patch to the email.
-
-For more-elaborate changes, please read the Theory file and browse
-the mailing list archives <http://mm.icann.org/pipermail/tz/> for
-examples of patches that tend to work well. Ideally, additions to
-data should contain commentary citing reliable sources as
-justification.
-
-Please submit changes against either the latest release in
-<ftp://ftp.iana.org/tz/> or the master branch of the experimental
-Git repository. If you use Git the following workflow may be helpful:
-
- * Copy the experimental repository.
-
- git clone https://github.com/eggert/tz.git
- cd tz
-
- * Get current with the master branch.
-
- git checkout master
- git pull
-
- * Switch to a new branch for the changes. Choose a different
- branch name for each change set.
-
- git checkout -b mybranch
-
- * Edit source files. Include commentary that justifies the
- changes by citing reliable sources.
-
- * Debug the changes, e.g.:
-
- make check
- make install
- ./zdump -v America/Los_Angeles
-
- * For each separable change, commit it in the new branch, e.g.:
-
- git add northamerica
- git commit
-
- See recent 'git log' output for the commit-message style.
-
- * Create patch files 0001-*, 0002-*, ...
-
- git format-patch master
-
- * After reviewing the patch files, send the patches to tz at iana.org
- for others to review.
-
- git send-email master
-
- * Start anew by getting current with the master branch again
- (the second step above).
-
-Please do not create issues or pull requests on GitHub, as the
-proper procedure for proposing and distributing patches is via
-email as illustrated above.
-
------
-
-This file is in the public domain.
Deleted: vendor/tzcode/dist/LICENSE
===================================================================
--- vendor/tzcode/dist/LICENSE 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/LICENSE 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,4 +0,0 @@
-With a few exceptions, all files in the tz code and data (including
-this one) are in the public domain. The exceptions are tzcode's
-date.c, newstrftime.3, and strftime.c, which contain material derived
-from BSD and which use the BSD 3-clause license.
Deleted: vendor/tzcode/dist/Makefile
===================================================================
--- vendor/tzcode/dist/Makefile 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/Makefile 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,695 +0,0 @@
-# This file is in the public domain, so clarified as of
-# 2009-05-17 by Arthur David Olson.
-
-# Package name for the code distribution.
-PACKAGE= tzcode
-
-# Version numbers of the code and data distributions.
-VERSION= 2016f
-
-# 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.
-
-# Everything gets put in subdirectories of. . .
-
-TOPDIR= /usr/local
-
-# "Compiled" time zone information is placed in the "TZDIR" directory
-# (and subdirectories).
-# Use an absolute path name for TZDIR unless you're just testing the software.
-
-TZDIR_BASENAME= zoneinfo
-TZDIR= $(TOPDIR)/etc/$(TZDIR_BASENAME)
-
-# 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
-
-# The "tzselect", "zic", and "zdump" commands get installed in. . .
-
-ETCDIR= $(TOPDIR)/etc
-
-# If you "make INSTALL", the "date" command gets installed in. . .
-
-BINDIR= $(TOPDIR)/bin
-
-# Manual pages go in subdirectories of. . .
-
-MANDIR= $(TOPDIR)/man
-
-# Library functions are put in an archive in LIBDIR.
-
-LIBDIR= $(TOPDIR)/lib
-
-# If you always want time values interpreted as "seconds since the epoch
-# (not counting leap seconds)", use
-# REDO= posix_only
-# below. If you always want right time 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".
-
-REDO= posix_right
-
-# If you want out-of-scope and often-wrong data from the file 'backzone', use
-# PACKRATDATA= backzone
-# To omit this data, use
-# PACKRATDATA=
-
-PACKRATDATA=
-
-# Since "." may not be in PATH...
-
-YEARISTYPE= ./yearistype
-
-# Non-default libraries needed to link.
-# Add -lintl if you want to use 'gettext' on Solaris.
-LDLIBS=
-
-# Add the following to the end of the "CFLAGS=" line as needed.
-# -DBIG_BANG=-9999999LL if the Big Bang occurred at time -9999999 (see zic.c)
-# -DHAVE_DECL_ASCTIME_R=0 if <time.h> does not declare asctime_r
-# -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
-# -DHAVE_DOS_FILE_NAMES if file names have drive specifiers etc. (MS-DOS)
-# -DHAVE_GETTEXT=1 if 'gettext' works (GNU, Linux, Solaris); also see LDLIBS
-# -DHAVE_INCOMPATIBLE_CTIME_R=1 if your system's time.h declares
-# ctime_r and asctime_r incompatibly with the POSIX standard (Solaris 8).
-# -DHAVE_INTTYPES_H=1 if you have a pre-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
-# This defaults to 1 if a working localtime_rz seems to be available.
-# 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_STDINT_H=1 if you have a pre-C99 compiler with "stdint.h"
-# -DHAVE_STRFTIME_L=1 if <time.h> declares locale_t and strftime_l
-# This defaults to 0 if _POSIX_VERSION < 200809, 1 otherwise.
-# -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" (Microsoft C++ 7?)
-# -DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU=1
-# if you do not want run time warnings about formats that may cause
-# year 2000 grief
-# -Dssize_t=long on ancient hosts that lack ssize_t
-# -DTHREAD_SAFE=1 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
-# -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=1 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
-GCC_DEBUG_FLAGS = -Dlint -g3 -O3 -fno-common -fstrict-aliasing \
- -Wall -Wextra \
- -Wbad-function-cast -Wcast-align -Wdate-time \
- -Wdeclaration-after-statement \
- -Wdouble-promotion \
- -Wformat=2 -Winit-self -Wjump-misses-init \
- -Wlogical-op -Wmissing-prototypes -Wnested-externs \
- -Wold-style-definition -Woverlength-strings -Wpointer-arith \
- -Wshadow -Wstrict-prototypes -Wsuggest-attribute=const \
- -Wsuggest-attribute=format -Wsuggest-attribute=noreturn \
- -Wsuggest-attribute=pure -Wtrampolines \
- -Wunused -Wwrite-strings \
- -Wno-address -Wno-format-nonliteral -Wno-sign-compare \
- -Wno-type-limits -Wno-unused-parameter
-#
-# If you want to use System V compatibility code, add
-# -DUSG_COMPAT
-# to the end of the "CFLAGS=" line. This arrange for "timezone" and "daylight"
-# variables to be kept up-to-date by the time conversion functions. Neither
-# "timezone" nor "daylight" is described in X3J11's work.
-#
-# 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.
-#
-# 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.
-#
-# If you want an "altzone" variable (a la System V Release 3.1), add
-# -DALTZONE
-# to the end of the "CFLAGS=" line.
-# This variable is not described in X3J11's work.
-#
-# 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 those days in January that
-# before the first Monday in January when a "%V" format is used and January 1
-# falls on a Friday, Saturday, or Sunday.
-
-CFLAGS=
-
-# Linker flags. Default to $(LFLAGS) for backwards compatibility
-# to tzcode2012h 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
-ZIC= $(zic) $(ZFLAGS)
-
-ZFLAGS=
-
-# How to use zic to install tzdata binary files.
-
-ZIC_INSTALL= $(ZIC) -y $(YEARISTYPE) -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 is appropriate for Ubuntu 13.10.
-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
-
-# The name, arguments and environment of a program to validate your web pages.
-# See <http://www.jclark.com/sp/> for a validator, and
-# <http://validator.w3.org/source/> for a validation library.
-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
-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= cc
-CC= $(cc) -DTZDIR=\"$(TZDIR)\"
-
-AR= ar
-
-# ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
-RANLIB= :
-
-TZCOBJS= zic.o
-TZDOBJS= zdump.o localtime.o asctime.o
-DATEOBJS= date.o localtime.o strftime.o asctime.o
-LIBSRCS= localtime.c asctime.c difftime.c
-LIBOBJS= localtime.o asctime.o difftime.o
-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= CONTRIBUTING LICENSE Makefile NEWS README Theory
-WEB_PAGES= tz-art.htm tz-how-to.html tz-link.htm
-DOCS= $(MANS) date.1 $(MANTXTS) $(WEB_PAGES)
-PRIMARY_YDATA= africa antarctica asia australasia \
- europe northamerica southamerica
-YDATA= $(PRIMARY_YDATA) pacificnew etcetera backward
-NDATA= systemv factory
-TDATA= $(YDATA) $(NDATA)
-ZONETABLES= zone1970.tab zone.tab
-TABDATA= iso3166.tab leapseconds $(ZONETABLES)
-LEAP_DEPS= leapseconds.awk leap-seconds.list
-DATA= $(YDATA) $(NDATA) backzone $(TABDATA) \
- leap-seconds.list yearistype.sh
-AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk
-MISC= $(AWK_SCRIPTS) zoneinfo2tdf.pl
-ENCHILADA= $(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC)
-
-# 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
-
-all: tzselect yearistype zic zdump libtz.a $(TABDATA)
-
-ALL: all date $(ENCHILADA)
-
-install: all $(DATA) $(REDO) $(MANS)
- mkdir -p $(DESTDIR)$(ETCDIR) $(DESTDIR)$(TZDIR) \
- $(DESTDIR)$(LIBDIR) \
- $(DESTDIR)$(MANDIR)/man3 $(DESTDIR)$(MANDIR)/man5 \
- $(DESTDIR)$(MANDIR)/man8
- $(ZIC_INSTALL) -l $(LOCALTIME) -p $(POSIXRULES)
- cp -f iso3166.tab $(ZONETABLES) $(DESTDIR)$(TZDIR)/.
- cp tzselect zic zdump $(DESTDIR)$(ETCDIR)/.
- cp libtz.a $(DESTDIR)$(LIBDIR)/.
- $(RANLIB) $(DESTDIR)$(LIBDIR)/libtz.a
- 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/.
-
-version.h:
- (echo 'static char const PKGVERSION[]="($(PACKAGE)) ";' && \
- echo 'static char const TZVERSION[]="$(VERSION)";' && \
- echo 'static char const REPORT_BUGS_TO[]="$(BUGEMAIL)";') >$@
-
-zdump: $(TZDOBJS)
- $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZDOBJS) $(LDLIBS)
-
-zic: $(TZCOBJS)
- $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS)
-
-yearistype: yearistype.sh
- cp yearistype.sh yearistype
- chmod +x yearistype
-
-leapseconds: $(LEAP_DEPS)
- $(AWK) -f leapseconds.awk leap-seconds.list >$@
-
-# Arguments to pass to submakes of install_data.
-# They can be overridden by later submake arguments.
-INSTALLARGS = \
- DESTDIR=$(DESTDIR) \
- LEAPSECONDS='$(LEAPSECONDS)' \
- PACKRATDATA='$(PACKRATDATA)' \
- TZDIR=$(TZDIR) \
- YEARISTYPE=$(YEARISTYPE) \
- ZIC='$(ZIC)'
-
-# 'make install_data' installs one set of tz binary files.
-# It can be tailored by setting LEAPSECONDS, PACKRATDATA, etc.
-install_data: zic leapseconds yearistype $(PACKRATDATA) $(TDATA)
- $(ZIC_INSTALL) $(TDATA)
- $(AWK) '/^Rule/' $(TDATA) | $(ZIC_INSTALL) - $(PACKRATDATA)
-
-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)
-
-libtz.a: $(LIBOBJS)
- $(AR) ru $@ $(LIBOBJS)
- $(RANLIB) $@
-
-date: $(DATEOBJS)
- $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
-
-tzselect: tzselect.ksh
- 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)|' \
- <$? >$@
- chmod +x $@
-
-check: check_character_set check_white_space check_links check_sorted \
- check_tables check_web
-
-check_character_set: $(ENCHILADA)
- LC_ALL=en_US.utf8 && export LC_ALL && \
- sharp='#' && \
- ! grep -Env $(SAFE_LINE) Makefile $(MANS) date.1 $(MANTXTS) \
- $(MISC) $(SOURCES) $(WEB_PAGES) && \
- ! grep -Env $(SAFE_SHARP_LINE) $(TDATA) backzone \
- leapseconds yearistype.sh zone.tab && \
- ! grep -Env $(OK_LINE) $(ENCHILADA)
-
-check_white_space: $(ENCHILADA)
- ! grep -En ' '$(TAB_CHAR)"|$$(printf '[\f\r\v]')" $(ENCHILADA)
- ! grep -n '[[:space:]]$$' $(ENCHILADA)
-
-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)
- $(AWK) -f checklinks.awk $(TDATA)
-
-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_web: $(WEB_PAGES)
- $(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) $(WEB_PAGES)
-
-clean_misc:
- rm -f core *.o *.out \
- date tzselect version.h zdump zic yearistype libtz.a
-clean: clean_misc
- rm -fr tzpublic
-
-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 $(MANTXTS) *.asc *.tar.gz
-
-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$$'` >$@
-
-# 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 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 $@
-
-# 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 tzpublic
- for i in $(TDATA) ; do \
- $(zic) -v -d tzpublic $$i 2>&1 || exit; \
- done
- $(zic) -v -d tzpublic $(TDATA)
- rm -fr tzpublic
-
-# 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 && \
- zones=`$(AWK) '/^[^#]/ { print $$3 }' <zone1970.tab` && \
- for type in $(TIME_T_ALTERNATIVES); do \
- mkdir -p tzpublic/$$type && \
- $(MAKE) clean_misc && \
- $(MAKE) TOPDIR=`pwd`/tzpublic/$$type \
- CFLAGS='$(CFLAGS) -Dtime_tz='"'$$type'" \
- REDO='$(REDO)' \
- install && \
- diff $$quiet_option -r \
- tzpublic/int64_t/etc/zoneinfo \
- tzpublic/$$type/etc/zoneinfo && \
- 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 ... && \
- tzpublic/int64_t/etc/zdump -V -t $$range $$zones \
- >tzpublic/int64_t.out && \
- tzpublic/$$type/etc/zdump -V -t $$range $$zones \
- >tzpublic/$$type.out && \
- diff -u tzpublic/int64_t.out tzpublic/$$type.out \
- || exit; \
- done
- rm -fr tzpublic
-
-tarballs: tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz
-
-tzcode$(VERSION).tar.gz: set-timestamps.out
- LC_ALL=C && export LC_ALL && \
- tar $(TARFLAGS) -cf - \
- $(COMMON) $(DOCS) $(SOURCES) | \
- gzip $(GZIPFLAGS) > $@
-
-tzdata$(VERSION).tar.gz: set-timestamps.out
- LC_ALL=C && export LC_ALL && \
- tar $(TARFLAGS) -cf - $(COMMON) $(DATA) $(MISC) | \
- gzip $(GZIPFLAGS) > $@
-
-signatures: tzcode$(VERSION).tar.gz.asc tzdata$(VERSION).tar.gz.asc
-
-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 $?
-
-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: $(TDATA)
- @$(AWK) '/^Zone/ { print $$2 } /^Link/ { print $$3 }' $(TDATA)
-
-asctime.o: private.h tzfile.h
-date.o: private.h
-difftime.o: private.h
-localtime.o: private.h tzfile.h
-strftime.o: private.h tzfile.h
-zdump.o: version.h
-zic.o: private.h tzfile.h version.h
-
-.KEEP_STATE:
-
-.PHONY: ALL INSTALL all
-.PHONY: check check_character_set check_links
-.PHONY: check_public check_sorted check_tables
-.PHONY: check_time_t_alternatives check_web check_white_space clean clean_misc
-.PHONY: install install_data maintainer-clean names
-.PHONY: posix_only posix_packrat posix_right
-.PHONY: public right_only right_posix signatures tarballs typecheck
-.PHONY: zonenames zones
Deleted: vendor/tzcode/dist/NEWS
===================================================================
--- vendor/tzcode/dist/NEWS 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/NEWS 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,3541 +0,0 @@
-News for the tz database
-
-Release 2016f - 2016-07-05 16:26:51 +0200
-
- Changes affecting future time stamps
-
- The Egyptian government changed its mind on short notice, and
- Africa/Cairo will not introduce DST starting 2016-07-07 after all.
- (Thanks to Mina Samuel.)
-
- Asia/Novosibirsk switches from +06 to +07 on 2016-07-24 at 02:00.
- (Thanks to Stepan Golosunov.)
-
- Changes to past and future time stamps
-
- Asia/Novokuznetsk and Asia/Novosibirsk now use numeric time zone
- abbreviations instead of invented ones.
-
- Changes affecting past time stamps
-
- Europe/Minsk's 1992-03-29 spring-forward transition was at 02:00 not 00:00.
- (Thanks to Stepan Golosunov.)
-
-
-Release 2016e - 2016-06-14 08:46:16 -0700
-
- Changes affecting future time stamps
-
- Africa/Cairo observes DST in 2016 from July 7 to the end of October.
- Guess October 27 and 24:00 transitions. (Thanks to Steffen Thorsen.)
- For future years, guess April's last Thursday to October's last
- Thursday except for Ramadan.
-
- Changes affecting past time stamps
-
- Locations while uninhabited now use '-00', not 'zzz', as a
- placeholder time zone abbreviation. This is inspired by Internet
- RFC 3339 and is more consistent with numeric time zone
- abbreviations already used elsewhere. The change affects several
- arctic and antarctic locations, e.g., America/Cambridge_Bay before
- 1920 and Antarctica/Troll before 2005.
-
- Asia/Baku's 1992-09-27 transition from +04 (DST) to +04 (non-DST) was
- at 03:00, not 23:00 the previous day. (Thanks to Michael Deckers.)
-
- Changes to code
-
- zic now outputs a dummy transition at time 2**31 - 1 in zones
- whose POSIX-style TZ strings contain a '<'. This mostly works
- around Qt bug 53071 <https://bugreports.qt.io/browse/QTBUG-53071>.
- (Thanks to Zhanibek Adilbekov for reporting the Qt bug.)
-
- Changes affecting documentation and commentary
-
- tz-link.htm says why governments should give plenty of notice for
- time zone or DST changes, and refers to Matt Johnson's blog post.
-
- tz-link.htm mentions Tzdata for Elixir. (Thanks to Matt Johnson.)
-
-
-Release 2016d - 2016-04-17 22:50:29 -0700
-
- Changes affecting future time stamps
-
- America/Caracas switches from -0430 to -04 on 2016-05-01 at 02:30.
- (Thanks to Alexander Krivenyshev for the heads-up.)
-
- Asia/Magadan switches from +10 to +11 on 2016-04-24 at 02:00.
- (Thanks to Alexander Krivenyshev and Matt Johnson.)
-
- New zone Asia/Tomsk, split off from Asia/Novosibirsk. It covers
- Tomsk Oblast, Russia, which switches from +06 to +07 on 2016-05-29
- at 02:00. (Thanks to Stepan Golosunov.)
-
- Changes affecting past time stamps
-
- New zone Europe/Kirov, split off from Europe/Volgograd. It covers
- Kirov Oblast, Russia, which switched from +04/+05 to +03/+04 on
- 1989-03-26 at 02:00, roughly a year after Europe/Volgograd made
- the same change. (Thanks to Stepan Golosunov.)
-
- Russia and nearby locations had daylight-saving transitions on
- 1992-03-29 at 02:00 and 1992-09-27 at 03:00, instead of on
- 1992-03-28 at 23:00 and 1992-09-26 at 23:00. (Thanks to Stepan
- Golosunov.)
-
- Many corrections to historical time in Kazakhstan from 1991
- through 2005. (Thanks to Stepan Golosunov.) Replace Kazakhstan's
- invented time zone abbreviations with numeric abbreviations.
-
- Changes to commentary
-
- Mention Internet RFCs 7808 (TZDIST) and 7809 (CalDAV time zone references).
-
-
-Release 2016c - 2016-03-23 00:51:27 -0700
-
- Changes affecting future time stamps
-
- Azerbaijan no longer observes DST. (Thanks to Steffen Thorsen.)
-
- Chile reverts from permanent to seasonal DST. (Thanks to Juan
- Correa for the heads-up, and to Tim Parenti for corrections.)
- Guess that future transitions are August's and May's second
- Saturdays at 24:00 mainland time. Also, call the period from
- 2014-09-07 through 2016-05-14 daylight saving time instead of
- standard time, as that seems more appropriate now.
-
- Changes affecting past time stamps
-
- Europe/Kaliningrad and Europe/Vilnius changed from +03/+04 to
- +02/+03 on 1989-03-26, not 1991-03-31. Europe/Volgograd changed
- from +04/+05 to +03/+04 on 1988-03-27, not 1989-03-26.
- (Thanks to Stepan Golosunov.)
-
- Changes to commentary
-
- Several updates and URLs for historical and proposed Russian changes.
- (Thanks to Stepan Golosunov, Matt Johnson, and Alexander Krivenyshev.)
-
-
-Release 2016b - 2016-03-12 17:30:14 -0800
-
- Compatibility note
-
- Starting with release 2016b, some data entries cause zic implementations
- derived from tz releases 2005j through 2015e to issue warnings like
- "time zone abbreviation differs from POSIX standard (+03)".
- These warnings should not otherwise affect zic's output and can safely be
- ignored on today's platforms, as the warnings refer to a restriction in
- POSIX.1-1988 that was removed in POSIX.1-2001. One way to suppress the
- warnings is to upgrade to zic derived from tz releases 2015f and later.
-
- Changes affecting future time stamps
-
- New zones Europe/Astrakhan and Europe/Ulyanovsk for Astrakhan and
- Ulyanovsk Oblasts, Russia, both of which will switch from +03 to +04 on
- 2016-03-27 at 02:00 local time. They need distinct zones since their
- post-1970 histories disagree. New zone Asia/Barnaul for Altai Krai and
- Altai Republic, Russia, which will switch from +06 to +07 on the same date
- and local time. The Astrakhan change is already official; the others have
- passed the first reading in the State Duma and are extremely likely.
- Also, Asia/Sakhalin moves from +10 to +11 on 2016-03-27 at 02:00.
- (Thanks to Alexander Krivenyshev for the heads-up, and to Matt Johnson
- and Stepan Golosunov for followup.)
-
- As a trial of a new system that needs less information to be made up,
- the new zones use numeric time zone abbreviations like "+04"
- instead of invented abbreviations like "ASTT".
-
- Haiti will not observe DST in 2016. (Thanks to Jean Antoine via
- Steffen Thorsen.)
-
- Palestine's spring-forward transition on 2016-03-26 is at 01:00, not 00:00.
- (Thanks to Hannah Kreitem.) Guess future transitions will be March's last
- Saturday at 01:00, not March's last Friday at 24:00.
-
- Changes affecting past time stamps
-
- Europe/Chisinau observed DST during 1990, and switched from +04 to
- +03 at 1990-05-06 02:00, instead of switching from +03 to +02.
- (Thanks to Stepan Golosunov.)
-
- 1991 abbreviations in Europe/Samara should be SAMT/SAMST, not
- KUYT/KUYST. (Thanks to Stepan Golosunov.)
-
- Changes to code
-
- tzselect's diagnostics and checking, and checktab.awk's checking,
- have been improved. (Thanks to J William Piggott.)
-
- tzcode now builds under MinGW. (Thanks to Ian Abbott and Esben Haabendal.)
-
- tzselect now tests Julian-date TZ settings more accurately.
- (Thanks to J William Piggott.)
-
- Changes to commentary
-
- Comments in zone tables have been improved. (Thanks to J William Piggott.)
-
- tzselect again limits its menu comments so that menus fit on a
- 24x80 alphanumeric display.
-
- A new web page tz-how-to.html. (Thanks to Bill Seymour.)
-
- In the Theory file, the description of possible time zone abbreviations in
- tzdata has been cleaned up, as the old description was unclear and
- inconsistent. (Thanks to Alain Mouette for reporting the problem.)
-
-
-Release 2016a - 2016-01-26 23:28:02 -0800
-
- Changes affecting future time stamps
-
- America/Cayman will not observe daylight saving this year after all.
- Revert our guess that it would. (Thanks to Matt Johnson.)
-
- Asia/Chita switches from +0800 to +0900 on 2016-03-27 at 02:00.
- (Thanks to Alexander Krivenyshev.)
-
- Asia/Tehran now has DST predictions for the year 2038 and later,
- to be March 21 00:00 to September 21 00:00. This is likely better
- than predicting no DST, albeit off by a day every now and then.
-
- Changes affecting past and future time stamps
-
- America/Metlakatla switched from PST all year to AKST/AKDT on
- 2015-11-01 at 02:00. (Thanks to Steffen Thorsen.)
-
- America/Santa_Isabel has been removed, and replaced with a
- backward compatibility link to America/Tijuana. Its contents were
- apparently based on a misreading of Mexican legislation.
-
- Changes affecting past time stamps
-
- Asia/Karachi's two transition times in 2002 were off by a minute.
- (Thanks to Matt Johnson.)
-
- Changes affecting build procedure
-
- An installer can now combine leap seconds with use of the backzone file,
- e.g., with 'make PACKRATDATA=backzone REDO=posix_right zones'.
- The old 'make posix_packrat' rule is now marked as obsolescent.
- (Thanks to Ian Abbott for an initial implementation.)
-
- Changes affecting documentation and commentary
-
- A new file LICENSE makes it easier to see that the code and data
- are mostly public-domain. (Thanks to James Knight.) The three
- non-public-domain files now use the current (3-clause) BSD license
- instead of older versions of that license.
-
- tz-link.htm mentions the BDE library (thanks to Andrew Paprocki),
- CCTZ (thanks to Tim Parenti), TimeJones.com, and has a new section
- on editing tz source files (with a mention of Sublime zoneinfo,
- thanks to Gilmore Davidson).
-
- The Theory and asia files now mention the 2015 book "The Global
- Transformation of Time, 1870-1950", and cite a couple of reviews.
-
- The America/Chicago entry now documents the informal use of US
- central time in Fort Pierre, South Dakota. (Thanks to Rick
- McDermid, Matt Johnson, and Steve Jones.)
-
-
-Release 2015g - 2015-10-01 00:39:51 -0700
-
- Changes affecting future time stamps
-
- Turkey's 2015 fall-back transition is scheduled for Nov. 8, not Oct. 25.
- (Thanks to Fatih.)
-
- Norfolk moves from +1130 to +1100 on 2015-10-04 at 02:00 local time.
- (Thanks to Alexander Krivenyshev.)
-
- Fiji's 2016 fall-back transition is scheduled for January 17, not 24.
- (Thanks to Ken Rylander.)
-
- Fort Nelson, British Columbia will not fall back on 2015-11-01. It has
- effectively been on MST (-0700) since it advanced its clocks on 2015-03-08.
- New zone America/Fort_Nelson. (Thanks to Matt Johnson.)
-
- Changes affecting past time stamps
-
- Norfolk observed DST from 1974-10-27 02:00 to 1975-03-02 02:00.
-
- Changes affecting code
-
- localtime no longer mishandles America/Anchorage after 2037.
- (Thanks to Bradley White for reporting the bug.)
-
- On hosts with signed 32-bit time_t, localtime no longer mishandles
- Pacific/Fiji after 2038-01-16 14:00 UTC.
-
- The localtime module allows the variables 'timezone', 'daylight',
- and 'altzone' to be in common storage shared with other modules,
- and declares them in case the system <time.h> does not.
- (Problems reported by Kees Dekker.)
-
- On platforms with tm_zone, strftime.c now assumes it is not NULL.
- This simplifies the code and is consistent with zdump.c.
- (Problem reported by Christos Zoulas.)
-
- Changes affecting documentation
-
- The tzfile man page now documents that transition times denote the
- starts (not the ends) of the corresponding time periods.
- (Ambiguity reported by Bill Seymour.)
-
-
-Release 2015f - 2015-08-10 18:06:56 -0700
-
- Changes affecting future time stamps
-
- North Korea switches to +0830 on 2015-08-15. (Thanks to Steffen Thorsen.)
- The abbreviation remains "KST". (Thanks to Robert Elz.)
-
- Uruguay no longer observes DST. (Thanks to Steffen Thorsen
- and Pablo Camargo.)
-
- Changes affecting past and future time stamps
-
- Moldova starts and ends DST at 00:00 UTC, not at 01:00 UTC.
- (Thanks to Roman Tudos.)
-
- Changes affecting data format and code
-
- zic's '-y YEARISTYPE' option is no longer documented. The TYPE
- field of a Rule line should now be '-'; the old values 'even',
- 'odd', 'uspres', 'nonpres', 'nonuspres' were already undocumented.
- Although the implementation has not changed, these features do not
- work in the default installation, they are not used in the data,
- and they are now considered obsolescent.
-
- zic now checks that two rules don't take effect at the same time.
- (Thanks to Jon Skeet and Arthur David Olson.) Constraints on
- simultaneity are now documented.
-
- The two characters '%z' in a zone format now stand for the UTC
- offset, e.g., '-07' for seven hours behind UTC and '+0530' for
- five hours and thirty minutes ahead. This better supports time
- zone abbreviations conforming to POSIX.1-2001 and later.
-
- Changes affecting installed data files
-
- Comments for America/Halifax and America/Glace_Bay have been improved.
- (Thanks to Brian Inglis.)
-
- Data entries have been simplified for Atlantic/Canary, Europe/Simferopol,
- Europe/Sofia, and Europe/Tallinn. This yields slightly smaller
- installed data files for Europe/Simferopol and Europe/Tallinn.
- It does not affect timestamps. (Thanks to Howard Hinnant.)
-
- Changes affecting code
-
- zdump and zic no longer warn about valid time zone abbreviations
- like '-05'.
-
- Some Visual Studio 2013 warnings have been suppressed.
- (Thanks to Kees Dekker.)
-
- 'date' no longer sets the time of day and its -a, -d, -n and -t
- options have been removed. Long obsolescent, the implementation
- of these features had porting problems. Builders no longer need
- to configure HAVE_ADJTIME, HAVE_SETTIMEOFDAY, or HAVE_UTMPX_H.
- (Thanks to Kees Dekker for pointing out the problem.)
-
- Changes affecting documentation
-
- The Theory file mentions naming issues earlier, as these seem to be
- poorly publicized (thanks to Gilmore Davidson for reporting the problem).
-
- tz-link.htm mentions Time Zone Database Parser (thanks to Howard Hinnant).
-
- Mention that Herbert Samuel introduced the term "Summer Time".
-
-
-Release 2015e - 2015-06-13 10:56:02 -0700
-
- Changes affecting future time stamps
-
- Morocco will suspend DST from 2015-06-14 03:00 through 2015-07-19 02:00,
- not 06-13 and 07-18 as we had guessed. (Thanks to Milamber.)
-
- Assume Cayman Islands will observe DST starting next year, using US rules.
- Although it isn't guaranteed, it is the most likely.
-
- Changes affecting data format
-
- The file 'iso3166.tab' now uses UTF-8, so that its entries can better
- spell the names of Åland Islands, Côte d'Ivoire, and Réunion.
-
- Changes affecting code
-
- When displaying data, tzselect converts it to the current locale's
- encoding if the iconv command works. (Problem reported by random832.)
-
- tzselect no longer mishandles Dominica, fixing a bug introduced
- in Release 2014f. (Problem reported by Owen Leibman.)
-
- zic -l no longer fails when compiled with -DTZDEFAULT=\"/etc/localtime\".
- This fixes a bug introduced in Release 2014f.
- (Problem reported by Leonardo Chiquitto.)
-
-
-Release 2015d - 2015-04-24 08:09:46 -0700
-
- Changes affecting future time stamps
-
- Egypt will not observe DST in 2015 and will consider canceling it
- permanently. For now, assume no DST indefinitely.
- (Thanks to Ahmed Nazmy and Tim Parenti.)
-
- Changes affecting past time stamps
-
- America/Whitehorse switched from UTC-9 to UTC-8 on 1967-05-28, not
- 1966-07-01. Also, Yukon's time zone history is documented better.
- (Thanks to Brian Inglis and Dennis Ferguson.)
-
- Change affecting past and future time zone abbreviations
-
- The abbreviations for Hawaii-Aleutian standard and daylight times
- have been changed from HAST/HADT to HST/HDT, as per US Government
- Printing Office style. This affects only America/Adak since 1983,
- as America/Honolulu was already using the new style.
-
- Changes affecting code
-
- zic has some minor performance improvements.
-
-
-Release 2015c - 2015-04-11 08:55:55 -0700
-
- Changes affecting future time stamps
-
- Egypt's spring-forward transition is at 24:00 on April's last Thursday,
- not 00:00 on April's last Friday. 2015's transition will therefore be on
- Thursday, April 30 at 24:00, not Friday, April 24 at 00:00. Similar fixes
- apply to 2026, 2037, 2043, etc. (Thanks to Steffen Thorsen.)
-
- Changes affecting past time stamps
-
- The following changes affect some pre-1991 Chile-related time stamps
- in America/Santiago, Antarctica/Palmer, and Pacific/Easter.
-
- The 1910 transition was January 10, not January 1.
-
- The 1918 transition was September 10, not September 1.
-
- The UTC-4 time observed from 1932 to 1942 is now considered to be
- standard time, not year-round DST.
-
- Santiago observed DST (UTC-3) from 1946-07-15 through 1946-08-31,
- then reverted to standard time, then switched its time zone to
- UTC-5 on 1947-04-01.
-
- Assume transitions before 1968 were at 00:00, since we have no data
- saying otherwise.
-
- The spring 1988 transition was 1988-10-09, not 1988-10-02.
- The fall 1990 transition was 1990-03-11, not 1990-03-18.
-
- Assume no UTC offset change for Pacific/Easter on 1890-01-01,
- and omit all transitions on Pacific/Easter from 1942 through 1946
- since we have no data suggesting that they existed.
-
- One more zone has been turned into a link, as it differed
- from an existing zone only for older time stamps. As usual,
- this change affects UTC offsets in pre-1970 time stamps only.
- The zone's old contents have been moved to the 'backzone' file.
- The affected zone is America/Montreal.
-
- Changes affecting commentary
-
- Mention the TZUpdater tool.
-
- Mention "The Time Now". (Thanks to Brandon Ramsey.)
-
-
-Release 2015b - 2015-03-19 23:28:11 -0700
-
- Changes affecting future time stamps
-
- Mongolia will start observing DST again this year, from the last
- Saturday in March at 02:00 to the last Saturday in September at 00:00.
- (Thanks to Ganbold Tsagaankhuu.)
-
- Palestine will start DST on March 28, not March 27. Also,
- correct the fall 2014 transition from September 26 to October 24.
- Adjust future predictions accordingly. (Thanks to Steffen Thorsen.)
-
- Changes affecting past time stamps
-
- The 1982 zone shift in Pacific/Easter has been corrected, fixing a 2015a
- regression. (Thanks to Stuart Bishop for reporting the problem.)
-
- Some more zones have been turned into links, when they differed
- from existing zones only for older time stamps. As usual,
- these changes affect UTC offsets in pre-1970 time stamps only.
- Their old contents have been moved to the 'backzone' file.
- The affected zones are: America/Antigua, America/Cayman,
- Pacific/Midway, and Pacific/Saipan.
-
- Changes affecting time zone abbreviations
-
- Correct the 1992-2010 DST abbreviation in Volgograd from "MSK" to "MSD".
- (Thanks to Hank W.)
-
- Changes affecting code
-
- Fix integer overflow bug in reference 'mktime' implementation.
- (Problem reported by Jörg Richter.)
-
- Allow -Dtime_tz=time_t compilations, and allow -Dtime_tz=... libraries
- to be used in the same executable as standard-library time_t functions.
- (Problems reported by Bradley White.)
-
- Changes affecting commentary
-
- Cite the recent Mexican decree changing Quintana Roo's time zone.
- (Thanks to Carlos Raúl Perasso.)
-
- Likewise for the recent Chilean decree. (Thanks to Eduardo Romero Urra.)
-
- Update info about Mars time.
-
-
-Release 2015a - 2015-01-29 22:35:20 -0800
-
- Changes affecting future time stamps
-
- The Mexican state of Quintana Roo, represented by America/Cancun,
- will shift from Central Time with DST to Eastern Time without DST
- on 2015-02-01 at 02:00. (Thanks to Steffen Thorsen and Gwillim Law.)
-
- Chile will not change clocks in April or thereafter; its new standard time
- will be its old daylight saving time. This affects America/Santiago,
- Pacific/Easter, and Antarctica/Palmer. (Thanks to Juan Correa.)
-
- New leap second 2015-06-30 23:59:60 UTC as per IERS Bulletin C 49.
- (Thanks to Tim Parenti.)
-
- Changes affecting past time stamps
-
- Iceland observed DST in 1919 and 1921, and its 1939 fallback
- transition was Oct. 29, not Nov. 29. Remove incorrect data from
- Shanks about time in Iceland between 1837 and 1908.
-
- Some more zones have been turned into links, when they differed
- from existing zones only for older time stamps. As usual,
- these changes affect UTC offsets in pre-1970 time stamps only.
- Their old contents have been moved to the 'backzone' file.
- The affected zones are: Asia/Aden, Asia/Bahrain, Asia/Kuwait,
- and Asia/Muscat.
-
- Changes affecting code
-
- tzalloc now scrubs time zone abbreviations compatibly with the way
- that tzset always has, by replacing invalid bytes with '_' and by
- shortening too-long abbreviations.
-
- tzselect ports to POSIX awk implementations, no longer mishandles
- POSIX TZ settings when GNU awk is used, and reports POSIX TZ
- settings to the user. (Thanks to Stefan Kuhn.)
-
- Changes affecting build procedure
-
- 'make check' now checks for links to links in the data.
- One such link (for Africa/Asmera) has been fixed.
- (Thanks to Stephen Colebourne for pointing out the problem.)
-
- Changes affecting commentary
-
- The leapseconds file commentary now mentions the expiration date.
- (Problem reported by Martin Burnicki.)
-
- Update Mexican Library of Congress URL.
-
-
-Release 2014j - 2014-11-10 17:37:11 -0800
-
- Changes affecting current and future time stamps
-
- Turks & Caicos' switch from US eastern time to UTC-4 year-round
- did not occur on 2014-11-02 at 02:00. It's currently scheduled
- for 2015-11-01 at 02:00. (Thanks to Chris Walton.)
-
- Changes affecting past time stamps
-
- Many pre-1989 time stamps have been corrected for Asia/Seoul and
- Asia/Pyongyang, based on sources for the Korean-language Wikipedia
- entry for time in Korea. (Thanks to Sanghyuk Jung.) Also, no
- longer guess that Pyongyang mimicked Seoul time after World War II,
- as this is politically implausible.
-
- Some more zones have been turned into links, when they differed
- from existing zones only for older time stamps. As usual,
- these changes affect UTC offsets in pre-1970 time stamps only.
- Their old contents have been moved to the 'backzone' file.
- The affected zones are: Africa/Addis_Ababa, Africa/Asmara,
- Africa/Dar_es_Salaam, Africa/Djibouti, Africa/Kampala,
- Africa/Mogadishu, Indian/Antananarivo, Indian/Comoro, and
- Indian/Mayotte.
-
- Changes affecting commentary
-
- The commentary is less enthusiastic about Shanks as a source,
- and is more careful to distinguish UT from UTC.
-
-
-Release 2014i - 2014-10-21 22:04:57 -0700
-
- Changes affecting future time stamps
-
- Pacific/Fiji will observe DST from 2014-11-02 02:00 to 2015-01-18 03:00.
- (Thanks to Ken Rylander for the heads-up.) Guess that future
- years will use a similar pattern.
-
- A new Zone Pacific/Bougainville, for the part of Papua New Guinea
- that plans to switch from UTC+10 to UTC+11 on 2014-12-28 at 02:00.
- (Thanks to Kiley Walbom for the heads-up.)
-
- Changes affecting time zone abbreviations
-
- Since Belarus is not changing its clocks even though Moscow is,
- the time zone abbreviation in Europe/Minsk is changing from FET
- to its more-traditional value MSK on 2014-10-26 at 01:00.
- (Thanks to Alexander Bokovoy for the heads-up about Belarus.)
-
- The new abbreviation IDT stands for the pre-1976 use of UT+8 in
- Indochina, to distinguish it better from ICT (UT+7).
-
- Changes affecting past time stamps
-
- Many time stamps have been corrected for Asia/Ho_Chi_Minh before 1976
- (thanks to Trần Ngọc Quân for an indirect pointer to Trần Tiến Bình's
- authoritative book). Asia/Ho_Chi_Minh has been added to
- zone1970.tab, to give tzselect users in Vietnam two choices,
- since north and south Vietnam disagreed after our 1970 cutoff.
-
- Asia/Phnom_Penh and Asia/Vientiane have been turned into links, as
- they differed from existing zones only for older time stamps. As
- usual, these changes affect pre-1970 time stamps only. Their old
- contents have been moved to the 'backzone' file.
-
- Changes affecting code
-
- The time-related library functions now set errno on failure, and
- some crashes in the new tzalloc-related library functions have
- been fixed. (Thanks to Christos Zoulas for reporting most of
- these problems and for suggesting fixes.)
-
- If USG_COMPAT is defined and the requested time stamp is standard time,
- the tz library's localtime and mktime functions now set the extern
- variable timezone to a value appropriate for that time stamp; and
- similarly for ALTZONE, daylight saving time, and the altzone variable.
- This change is a companion to the tzname change in 2014h, and is
- designed to make timezone and altzone more compatible with tzname.
-
- The tz library's functions now set errno to EOVERFLOW if they fail
- because the result cannot be represented. ctime and ctime_r now
- return NULL and set errno when a time stamp is out of range, rather
- than having undefined behavior.
-
- Some bugs associated with the new 2014g functions have been fixed.
- This includes a bug that largely incapacitated the new functions
- time2posix_z and posix2time_z. (Thanks to Christos Zoulas.)
- It also includes some uses of uninitialized variables after tzalloc.
- The new code uses the standard type 'ssize_t', which the Makefile
- now gives porting advice about.
-
- Changes affecting commentary
-
- Updated URLs for NRC Canada (thanks to Matt Johnson and Brian Inglis).
-
-
-Release 2014h - 2014-09-25 18:59:03 -0700
-
- Changes affecting past time stamps
-
- America/Jamaica's 1974 spring-forward transition was Jan. 6, not Apr. 28.
-
- Shanks says Asia/Novokuznetsk switched from LMT (not "NMT") on 1924-05-01,
- not 1920-01-06. The old entry was based on a misinterpretation of Shanks.
-
- Some more zones have been turned into links, when they differed
- from existing zones only for older time stamps. As usual,
- these changes affect UTC offsets in pre-1970 time stamps only.
- Their old contents have been moved to the 'backzone' file.
- The affected zones are: Africa/Blantyre, Africa/Bujumbura,
- Africa/Gaborone, Africa/Harare, Africa/Kigali, Africa/Lubumbashi,
- Africa/Lusaka, Africa/Maseru, and Africa/Mbabane.
-
- Changes affecting code
-
- zdump -V and -v now output gmtoff= values on all platforms,
- not merely on platforms defining TM_GMTOFF.
-
- The tz library's localtime and mktime functions now set tzname to a value
- appropriate for the requested time stamp, and zdump now uses this
- on platforms not defining TM_ZONE, fixing a 2014g regression.
- (Thanks to Tim Parenti for reporting the problem.)
-
- The tz library no longer sets tzname if localtime or mktime fails.
-
- zdump -c no longer mishandles transitions near year boundaries.
- (Thanks to Tim Parenti for reporting the problem.)
-
- An access to uninitalized data has been fixed.
- (Thanks to Jörg Richter for reporting the problem.)
-
- When THREAD_SAFE is defined, the code ports to the C11 memory model.
- A memory leak has been fixed if ALL_STATE and THREAD_SAFE are defined
- and two threads race to initialize data used by gmtime-like functions.
- (Thanks to Andy Heninger for reporting the problems.)
-
- Changes affecting build procedure
-
- 'make check' now checks better for properly-sorted data.
-
- Changes affecting documentation and commentary
-
- zdump's gmtoff=N output is now documented, and its isdst=D output
- is now documented to possibly output D values other than 0 or 1.
-
- zdump -c's treatment of years is now documented to use the
- Gregorian calendar and Universal Time without leap seconds,
- and its behavior at cutoff boundaries is now documented better.
- (Thanks to Arthur David Olson and Tim Parenti for reporting the problems.)
-
- Programs are now documented to use the proleptic Gregorian calendar.
- (Thanks to Alan Barrett for the suggestion.)
-
- Fractional-second GMT offsets have been documented for civil time
- in 19th-century Chennai, Jakarta, and New York.
-
-
-Release 2014g - 2014-08-28 12:31:23 -0700
-
- Changes affecting future time stamps
-
- Turks & Caicos is switching from US eastern time to UTC-4 year-round,
- modeled as a switch from EST/EDT to AST on 2014-11-02 at 02:00.
- [As noted in 2014j, this switch was later delayed.]
-
- Changes affecting past time stamps
-
- Time in Russia or the USSR before 1926 or so has been corrected by
- a few seconds in the following zones: Asia/Irkutsk,
- Asia/Krasnoyarsk, Asia/Omsk, Asia/Samarkand, Asia/Tbilisi,
- Asia/Vladivostok, Asia/Yakutsk, Europe/Riga, Europe/Samara. For
- Asia/Yekaterinburg the correction is a few minutes. (Thanks to
- Vladimir Karpinsky.)
-
- The Portuguese decree of 1911-05-26 took effect on 1912-01-01.
- This affects 1911 time stamps in Africa/Bissau, Africa/Luanda,
- Atlantic/Azores, and Atlantic/Madeira. Also, Lisbon's pre-1912
- GMT offset was -0:36:45 (rounded from -0:36:44.68), not -0:36:32.
- (Thanks to Stephen Colebourne for pointing to the decree.)
-
- Asia/Dhaka ended DST on 2009-12-31 at 24:00, not 23:59.
-
- A new file 'backzone' contains data which may appeal to
- connoisseurs of old time stamps, although it is out of scope for
- the tz database, is often poorly sourced, and contains some data
- that is known to be incorrect. The new file is not recommended
- for ordinary use and its entries are not installed by default.
- (Thanks to Lester Caine for the high-quality Jersey, Guernsey, and
- Isle of Man entries.)
-
- Some more zones have been turned into links, when they differed
- from existing zones only for older time stamps. As usual,
- these changes affect UTC offsets in pre-1970 time stamps only.
- Their old contents have been moved to the 'backzone' file.
- The affected zones are: Africa/Bangui, Africa/Brazzaville,
- Africa/Douala, Africa/Kinshasa, Africa/Libreville, Africa/Luanda,
- Africa/Malabo, Africa/Niamey, and Africa/Porto-Novo.
-
- Changes affecting code
-
- Unless NETBSD_INSPIRED is defined to 0, the tz library now
- supplies functions for creating and using objects that represent
- time zones. The new functions are tzalloc, tzfree, localtime_rz,
- mktime_z, and (if STD_INSPIRED is also defined) posix2time_z and
- time2posix_z. They are intended for performance: for example,
- localtime_rz (unlike localtime_r) is trivially thread-safe without
- locking. (Thanks to Christos Zoulas for proposing NetBSD-inspired
- functions, and to Alan Barrett and Jonathan Lennox for helping to
- debug the change.)
-
- zdump now builds with the tz library unless USE_LTZ is defined to 0,
- This lets zdump use tz features even if the system library lacks them.
- To build zdump with the system library, use 'make CFLAGS=-DUSE_LTZ=0
- TZDOBJS=zdump.o CHECK_TIME_T_ALTERNATIVES='.
-
- zdump now uses localtime_rz if available, as it's significantly faster,
- and it can help zdump better diagnose invalid time zone names.
- Define HAVE_LOCALTIME_RZ to 0 to suppress this. HAVE_LOCALTIME_RZ
- defaults to 1 if NETBSD_INSPIRED && USE_LTZ. When localtime_rz is
- not available, zdump now uses localtime_r and tzset if available,
- as this is a bit cleaner and faster than plain localtime. Compile
- with -DHAVE_LOCALTIME_R=0 and/or -DHAVE_TZSET=0 if your system
- lacks these two functions.
-
- If THREAD_SAFE is defined to 1, the tz library is now thread-safe.
- Although not needed for tz's own applications, which are single-threaded,
- this supports POSIX better if the tz library is used in multithreaded apps.
-
- Some crashes have been fixed when zdump or the tz library is given
- invalid or outlandish input.
-
- The tz library no longer mishandles leap seconds on platforms with
- unsigned time_t in time zones that lack ordinary transitions after 1970.
-
- The tz code now attempts to infer TM_GMTOFF and TM_ZONE if not
- already defined, to make it easier to configure on common platforms.
- Define NO_TM_GMTOFF and NO_TM_ZONE to suppress this.
-
- Unless the new macro UNINIT_TRAP is defined to 1, the tz code now
- assumes that reading uninitialized memory yields garbage values
- but does not cause other problems such as traps.
-
- If TM_GMTOFF is defined and UNINIT_TRAP is 0, mktime is now
- more likely to guess right for ambiguous time stamps near
- transitions where tm_isdst does not change.
-
- If HAVE_STRFTIME_L is defined to 1, the tz library now defines
- strftime_l for compatibility with recent versions of POSIX.
- Only the C locale is supported, though. HAVE_STRFTIME_L defaults
- to 1 on recent POSIX versions, and to 0 otherwise.
-
- tzselect -c now uses a hybrid distance measure that works better
- in Africa. (Thanks to Alan Barrett for noting the problem.)
-
- The C source code now ports to NetBSD when GCC_DEBUG_FLAGS is used,
- or when time_tz is defined.
-
- When HAVE_UTMPX_H is set the 'date' command now builds on systems
- whose <utmpx.h> file does not define WTMPX_FILE, and when setting
- the date it updates the wtmpx file if _PATH_WTMPX is defined.
- This affects GNU/Linux and similar systems.
-
- For easier maintenance later, some C code has been simplified,
- some lint has been removed, and the code has been tweaked so that
- plain 'make' is more likely to work.
-
- The C type 'bool' is now used for boolean values, instead of 'int'.
-
- The long-obsolete LOCALE_HOME code has been removed.
-
- The long-obsolete 'gtime' function has been removed.
-
- Changes affecting build procedure
-
- 'zdump' no longer links in ialloc.o, as it's not needed.
-
- 'make check_time_t_alternatives' no longer assumes GNU diff.
-
- Changes affecting distribution tarballs
-
- The files checktab.awk and zoneinfo2tdf.pl are now distributed in
- the tzdata tarball instead of the tzcode tarball, since they help
- maintain the data. The NEWS and Theory files are now also
- distributed in the tzdata tarball, as they're relevant for data.
- (Thanks to Alan Barrett for pointing this out.) Also, the
- leapseconds.awk file is no longer distributed in the tzcode
- tarball, since it belongs in the tzdata tarball (where 2014f
- inadvertently also distributed it).
-
- Changes affecting documentation and commentary
-
- A new file CONTRIBUTING is distributed. (Thanks to Tim Parenti for
- suggesting a CONTRIBUTING file, and to Tony Finch and Walter Harms
- for debugging it.)
-
- The man pages have been updated to use function prototypes,
- to document thread-safe variants like localtime_r, and to document
- the NetBSD-inspired functions tzalloc, tzfree, localtime_rz, and
- mktime_z.
-
- The fields in Link lines have been renamed to be more descriptive
- and more like the parameters of 'ln'. LINK-FROM has become TARGET,
- and LINK-TO has become LINK-NAME.
-
- tz-link.htm mentions the IETF's tzdist working group; Windows
- Runtime etc. (thanks to Matt Johnson); and HP-UX's tztab.
-
- Some broken URLs have been fixed in the commentary. (Thanks to
- Lester Caine.)
-
- Commentary about Philippines DST has been updated, and commentary
- on pre-1970 time in India has been added.
-
-
-Release 2014f - 2014-08-05 17:42:36 -0700
-
- Changes affecting future time stamps
-
- Russia will subtract an hour from most of its time zones on 2014-10-26
- at 02:00 local time. (Thanks to Alexander Krivenyshev.)
- There are a few exceptions: Magadan Oblast (Asia/Magadan) and Zabaykalsky
- Krai are subtracting two hours; conversely, Chukotka Autonomous Okrug
- (Asia/Anadyr), Kamchatka Krai (Asia/Kamchatka), Kemerovo Oblast
- (Asia/Novokuznetsk), and the Samara Oblast and the Udmurt Republic
- (Europe/Samara) are not changing their clocks. The changed zones are
- Europe/Kaliningrad, Europe/Moscow, Europe/Simferopol, Europe/Volgograd,
- Asia/Yekaterinburg, Asia/Omsk, Asia/Novosibirsk, Asia/Krasnoyarsk,
- Asia/Irkutsk, Asia/Yakutsk, Asia/Vladivostok, Asia/Khandyga,
- Asia/Sakhalin, and Asia/Ust-Nera; Asia/Magadan will have two hours
- subtracted; and Asia/Novokuznetsk's time zone abbreviation is affected,
- but not its UTC offset. Two zones are added: Asia/Chita (split
- from Asia/Yakutsk, and also with two hours subtracted) and
- Asia/Srednekolymsk (split from Asia/Magadan, but with only one hour
- subtracted). (Thanks to Tim Parenti for much of the above.)
-
- Changes affecting time zone abbreviations
-
- Australian eastern time zone abbreviations are now AEST/AEDT not EST,
- and similarly for the other Australian zones. That is, for eastern
- standard and daylight saving time the abbreviations are AEST and AEDT
- instead of the former EST for both; similarly, ACST/ACDT, ACWST/ACWDT,
- and AWST/AWDT are now used instead of the former CST, CWST, and WST.
- This change does not affect UTC offsets, only time zone abbreviations.
- (Thanks to Rich Tibbett and many others.)
-
- Asia/Novokuznetsk shifts from NOVT to KRAT (remaining on UTC+7)
- effective 2014-10-26 at 02:00 local time.
-
- The time zone abbreviation for Xinjiang Time (observed in Ürümqi)
- has been changed from URUT to XJT. (Thanks to Luther Ma.)
-
- Prefer MSK/MSD for Moscow time in Russia, even in other cities.
- Similarly, prefer EET/EEST for eastern European time in Russia.
-
- Change time zone abbreviations in (western) Samoa to use "ST" and
- "DT" suffixes, as this is more likely to match common practice.
- Prefix "W" to (western) Samoa time when its standard-time offset
- disagrees with that of American Samoa.
-
- America/Metlakatla now uses PST, not MeST, to abbreviate its time zone.
-
- Time zone abbreviations have been updated for Japan's two time
- zones used 1896-1937. JWST now stands for Western Standard
- Time, and JCST for Central Standard Time (formerly this was CJT).
- These abbreviations are now used for time in Korea, Taiwan,
- and Sakhalin while controlled by Japan.
-
- Changes affecting past time stamps
-
- China's five zones have been simplified to two, since the post-1970
- differences in the other three seem to have been imaginary. The
- zones Asia/Harbin, Asia/Chongqing, and Asia/Kashgar have been
- removed; backwards-compatibility links still work, albeit with
- different behaviors for time stamps before May 1980. Asia/Urumqi's
- 1980 transition to UTC+8 has been removed, so that it is now at
- UTC+6 and not UTC+8. (Thanks to Luther Ma and to Alois Treindl;
- Treindl sent helpful translations of two papers by Guo Qingsheng.)
-
- Some zones have been turned into links, when they differed from existing
- zones only for older UTC offsets where data entries were likely invented.
- These changes affect UTC offsets in pre-1970 time stamps only. This is
- similar to the change in release 2013e, except this time for western
- Africa. The affected zones are: Africa/Bamako, Africa/Banjul,
- Africa/Conakry, Africa/Dakar, Africa/Freetown, Africa/Lome,
- Africa/Nouakchott, Africa/Ouagadougou, Africa/Sao_Tome, and
- Atlantic/St_Helena. This also affects the backwards-compatibility
- link Africa/Timbuktu. (Thanks to Alan Barrett, Stephen Colebourne,
- Tim Parenti, and David Patte for reporting problems in earlier
- versions of this change.)
-
- Asia/Shanghai's pre-standard-time UT offset has been changed from
- 8:05:57 to 8:05:43, the location of Xujiahui Observatory. Its
- transition to standard time has been changed from 1928 to 1901.
-
- Asia/Taipei switched to JWST on 1896-01-01, then to JST on 1937-10-01,
- then to CST on 1945-09-21 at 01:00, and did not observe DST in 1945.
- In 1946 it observed DST from 05-15 through 09-30; in 1947
- from 04-15 through 10-31; and in 1979 from 07-01 through 09-30.
- (Thanks to Yu-Cheng Chuang.)
-
- Asia/Riyadh's transition to standard time is now 1947-03-14, not 1950.
-
- Europe/Helsinki's 1942 fall-back transition was 10-04 at 01:00, not
- 10-03 at 00:00. (Thanks to Konstantin Hyppönen.)
-
- Pacific/Pago_Pago has been changed from UTC-11:30 to UTC-11 for the period
- from 1911 to 1950.
-
- Pacific/Chatham has been changed to New Zealand standard time plus
- 45 minutes for the period before 1957, reflecting a 1956 remark in
- the New Zealand parliament.
-
- Europe/Budapest has several pre-1946 corrections: in 1918 the transition
- out of DST was on 09-16, not 09-29; in 1919 it was on 11-24, not 09-15; in
- 1945 it was on 11-01, not 11-03; in 1941 the transition to DST was 04-08
- not 04-06 at 02:00; and there was no DST in 1920.
-
- Africa/Accra is now assumed to have observed DST from 1920 through 1935.
-
- Time in Russia before 1927 or so has been corrected by a few seconds in
- the following zones: Europe/Moscow, Asia/Irkutsk, Asia/Tbilisi,
- Asia/Tashkent, Asia/Vladivostok, Asia/Yekaterinburg, Europe/Helsinki, and
- Europe/Riga. Also, Moscow's location has been changed to its Kilometer 0
- point. (Thanks to Vladimir Karpinsky for the Moscow changes.)
-
- Changes affecting data format
-
- A new file 'zone1970.tab' supersedes 'zone.tab' in the installed data.
- The new file's extended format allows multiple country codes per zone.
- The older file is still installed but is deprecated; its format is
- not changing and it will still be distributed for a while, but new
- applications should use the new file.
-
- The new file format simplifies maintenance of obscure locations.
- To test this, it adds coverage for the Crozet Islands and the
- Scattered Islands. (Thanks to Tobias Conradi and Antoine Leca.)
-
- The file 'iso3166.tab' is planned to switch from ASCII to UTF-8.
- It is still ASCII now, but commentary about the switch has been added.
- The new file 'zone1970.tab' already uses UTF-8.
-
- Changes affecting code
-
- 'localtime', 'mktime', etc. now use much less stack space if ALL_STATE
- is defined. (Thanks to Elliott Hughes for reporting the problem.)
-
- 'zic' no longer mishandles input when ignoring case in locales that
- are not compatible with English, e.g., unibyte Turkish locales when
- compiled with HAVE_GETTEXT.
-
- Error diagnostics of 'zic' and 'yearistype' have been reworded so that
- they no longer use ASCII '-' as if it were a dash.
-
- 'zic' now rejects output file names that contain '.' or '..' components.
- (Thanks to Tim Parenti for reporting the problem.)
-
- 'zic -v' now warns about output file names that do not follow
- POSIX rules, or that contain a digit or '.'. (Thanks to Arthur
- David Olson for starting the ball rolling on this.)
-
- Some lint has been removed when using GCC_DEBUG_FLAGS with GCC 4.9.0.
-
- Changes affecting build procedure
-
- 'zic' no longer links in localtime.o and asctime.o, as they're not needed.
- (Thanks to John Cochran.)
-
- Changes affecting documentation and commentary
-
- The 'Theory' file documents legacy names, the longstanding
- exceptions to the POSIX-inspired file name rules.
-
- The 'zic' documentation clarifies the role of time types when
- interpreting dates. (Thanks to Arthur David Olson.)
-
- Documentation and commentary now prefer UTF-8 to US-ASCII,
- allowing the use of proper accents in foreign words and names.
- Code and data have not changed because of this. (Thanks to
- Garrett Wollman, Ian Abbott, and Guy Harris for helping to debug
- this.)
-
- Non-HTML documentation and commentary now use plain-text URLs instead of
- HTML insertions, and are more consistent about bracketing URLs when they
- are not already surrounded by white space. (Thanks to suggestions by
- Steffen Nurpmeso.)
-
- There is new commentary about Xujiahui Observatory, the five time-zone
- project in China from 1918 to 1949, timekeeping in Japanese-occupied
- Shanghai, and Tibet Time in the 1950s. The sharp-eyed can spot the
- warlord Jin Shuren in the data.
-
- Commentary about the coverage of each Russian zone has been standardized.
- (Thanks to Tim Parenti).
-
- There is new commentary about contemporary timekeeping in Ethiopia.
-
- Obsolete comments about a 2007 proposal for DST in Kuwait has been removed.
-
- There is new commentary about time in Poland in 1919.
-
- Proper credit has been given to DST inventor George Vernon Hudson.
-
- Commentary about time in Metlakatla, AK and Resolute, NU has been
- improved, with a new source for the former.
-
- In zone.tab, Pacific/Easter no longer mentions Salas y Gómez, as it
- is uninhabited.
-
- Commentary about permanent Antarctic bases has been updated.
-
- Several typos have been corrected. (Thanks to Tim Parenti for
- contributing some of these fixes.)
-
- tz-link.htm now mentions the JavaScript libraries Moment Timezone,
- TimezoneJS.Date, Walltime-js, and Timezone. (Thanks to a heads-up
- from Matt Johnson.) Also, it mentions the Go 'latlong' package.
- (Thanks to a heads-up from Dirkjan Ochtman.)
-
- The files usno1988, usno1989, usno1989a, usno1995, usno1997, and usno1998
- have been removed. These obsolescent US Naval Observatory entries were no
- longer helpful for maintenance. (Thanks to Tim Parenti for the suggestion.)
-
-
-Release 2014e - 2014-06-12 21:53:52 -0700
-
- Changes affecting near-future time stamps
-
- Egypt's 2014 Ramadan-based transitions are June 26 and July 31 at 24:00.
- (Thanks to Imed Chihi.) Guess that from 2015 on Egypt will temporarily
- switch to standard time at 24:00 the last Thursday before Ramadan, and
- back to DST at 00:00 the first Friday after Ramadan.
-
- Similarly, Morocco's are June 28 at 03:00 and August 2 at 02:00. (Thanks
- to Milamber Space Network.) Guess that from 2015 on Morocco will
- temporarily switch to standard time at 03:00 the last Saturday before
- Ramadan, and back to DST at 02:00 the first Saturday after Ramadan.
-
- Changes affecting past time stamps
-
- The abbreviation "MSM" (Moscow Midsummer Time) is now used instead of
- "MSD" for Moscow's double daylight time in summer 1921. Also, a typo
- "VLASST" has been repaired to be "VLAST" for Vladivostok summer time
- in 1991. (Thanks to Hank W. for reporting the problems.)
-
- Changes affecting commentary
-
- tz-link.htm now cites RFC 7265 for jCal, mentions PTP and the
- draft CalDAV extension, updates URLs for TSP, TZInfo, IATA, and
- removes stale pointers to World Time Explorer and WORLDTIME.
-
-
-Release 2014d - 2014-05-27 21:34:40 -0700
-
- Changes affecting code
-
- zic no longer generates files containing time stamps before the Big Bang.
- This works around GNOME bug 730332
- <https://bugzilla.gnome.org/show_bug.cgi?id=730332>.
- (Thanks to Leonardo Chiquitto for reporting the bug, and to
- Arthur David Olson and James Cloos for suggesting improvements to the fix.)
-
- Changes affecting documentation
-
- tz-link.htm now mentions GNOME.
-
-
-Release 2014c - 2014-05-13 07:44:13 -0700
-
- Changes affecting near-future time stamps
-
- Egypt observes DST starting 2014-05-15 at 24:00.
- (Thanks to Ahmad El-Dardiry and Gunther Vermier.)
- Details have not been announced, except that DST will not be observed
- during Ramadan. Guess that DST will stop during the same Ramadan dates as
- Morocco, and that Egypt's future spring and fall transitions will be the
- same as 2010 when it last observed DST, namely April's last Friday at
- 00:00 to September's last Thursday at 23:00 standard time. Also, guess
- that Ramadan transitions will be at 00:00 standard time.
-
- Changes affecting code
-
- zic now generates transitions for minimum time values, eliminating guesswork
- when handling low-valued time stamps. (Thanks to Arthur David Olson.)
-
- Port to Cygwin sans glibc. (Thanks to Arthur David Olson.)
-
- Changes affecting commentary and documentation
-
- Remove now-confusing comment about Jordan. (Thanks to Oleksii Nochovnyi.)
-
-
-Release 2014b - 2014-03-24 21:28:50 -0700
-
- Changes affecting near-future time stamps
-
- Crimea switches to Moscow time on 2014-03-30 at 02:00 local time.
- (Thanks to Alexander Krivenyshev.) Move its zone.tab entry from UA to RU.
-
- New entry for Troll station, Antarctica. (Thanks to Paul-Inge Flakstad and
- Bengt-Inge Larsson.) This is currently an approximation; a better version
- will require the zic and localtime fixes mentioned below, and the plan is
- to wait for a while until at least the zic fixes propagate.
-
- Changes affecting code
-
- 'zic' and 'localtime' no longer reject locations needing four transitions
- per year for the foreseeable future. (Thanks to Andrew Main (Zefram).)
- Also, 'zic' avoids some unlikely failures due to integer overflow.
-
- Changes affecting build procedure
-
- 'make check' now detects Rule lines defined but never used.
- The NZAQ rules, an instance of this problem, have been removed.
-
- Changes affecting commentary and documentation
-
- Fix Tuesday/Thursday typo in description of time in Israel.
- (Thanks to Bert Katz via Pavel Kharitonov and Mike Frysinger.)
-
- Microsoft Windows 8.1 doesn't support tz database names. (Thanks
- to Donald MacQueen.) Instead, the Microsoft Windows Store app
- library supports them.
-
- Add comments about Johnston Island time in the 1960s.
- (Thanks to Lyle McElhaney.)
-
- Morocco's 2014 DST start will be as predicted.
- (Thanks to Sebastien Willemijns.)
-
-
-Release 2014a - 2014-03-07 23:30:29 -0800
-
- Changes affecting near-future time stamps
-
- Turkey begins DST on 2014-03-31, not 03-30. (Thanks to Faruk Pasin for
- the heads-up, and to Tim Parenti for simplifying the update.)
-
- Changes affecting past time stamps
-
- Fiji ended DST on 2014-01-19 at 02:00, not the previously-scheduled 03:00.
- (Thanks to Steffen Thorsen.)
-
- Ukraine switched from Moscow to Eastern European time on 1990-07-01
- (not 1992-01-01), and observed DST during the entire next winter.
- (Thanks to Vladimir in Moscow via Alois Treindl.)
-
- In 1988 Israel observed DST from 04-10 to 09-04, not 04-09 to 09-03.
- (Thanks to Avigdor Finkelstein.)
-
- Changes affecting code
-
- A uninitialized-storage bug in 'localtime' has been fixed.
- (Thanks to Logan Chien.)
-
- Changes affecting the build procedure
-
- The settings for 'make check_web' now default to Ubuntu 13.10.
-
- Changes affecting commentary and documentation
-
- The boundary of the US Pacific time zone is given more accurately.
- (Thanks to Alan Mintz.)
-
- Chile's 2014 DST will be as predicted. (Thanks to José Miguel Garrido.)
-
- Paraguay's 2014 DST will be as predicted. (Thanks to Carlos Raúl Perasso.)
-
- Better descriptions of countries with same time zone history as
- Trinidad and Tobago since 1970. (Thanks to Alan Barrett for suggestion.)
-
- Several changes affect tz-link.htm, the main web page.
-
- Mention Time.is (thanks to Even Scharning) and WX-now (thanks to
- David Braverman).
-
- Mention xCal (Internet RFC 6321) and jCal.
-
- Microsoft has some support for tz database names.
-
- CLDR data formats include both XML and JSON.
-
- Mention Maggiolo's map of solar vs standard time.
- (Thanks to Arthur David Olson.)
-
- Mention TZ4Net. (Thanks to Matt Johnson.)
-
- Mention the timezone-olson Haskell package.
-
- Mention zeitverschiebung.net. (Thanks to Martin Jäger.)
-
- Remove moribund links to daylight-savings-time.info and to
- Simple Timer + Clocks.
-
- Update two links. (Thanks to Oscar van Vlijmen.)
-
- Fix some formatting glitches, e.g., remove random newlines from
- abbr elements' title attributes.
-
-
-Release 2013i - 2013-12-17 07:25:23 -0800
-
- Changes affecting near-future time stamps:
-
- Jordan switches back to standard time at 00:00 on December 20, 2013.
- The 2006-2011 transition schedule is planned to resume in 2014.
- (Thanks to Steffen Thorsen.)
-
- Changes affecting past time stamps:
-
- In 2004, Cuba began DST on March 28, not April 4.
- (Thanks to Steffen Thorsen.)
-
- Changes affecting code
-
- The compile-time flag NOSOLAR has been removed, as nowadays the
- benefit of slightly shrinking runtime table size is outweighed by the
- cost of disallowing potential future updates that exceed old limits.
-
- Changes affecting documentation and commentary
-
- The files solar87, solar88, and solar89 are no longer distributed.
- They were a negative experiment - that is, a demonstration that
- tz data can represent solar time only with some difficulty and error.
- Their presence in the distribution caused confusion, as Riyadh
- civil time was generally not solar time in those years.
-
- tz-link.htm now mentions Noda Time. (Thanks to Matt Johnson.)
-
-
-Release 2013h - 2013-10-25 15:32:32 -0700
-
- Changes affecting current and future time stamps:
-
- Libya has switched its time zone back to UTC+2 without DST,
- instead of UTC+1 with DST. (Thanks to Even Scharning.)
-
- Western Sahara (Africa/El_Aaiun) uses Morocco's DST rules.
- (Thanks to Gwillim Law.)
-
- Changes affecting future time stamps:
-
- Acre and (we guess) western Amazonas will switch from UTC-4 to UTC-5
- on 2013-11-10. This affects America/Rio_Branco and America/Eirunepe.
- (Thanks to Steffen Thorsen.)
-
- Add entries for DST transitions in Morocco in the year 2038.
- This avoids some year-2038 glitches introduced in 2013g.
- (Thanks to Yoshito Umaoka for reporting the problem.)
-
- Changes affecting API
-
- The 'tzselect' command no longer requires the 'select' command,
- and should now work with /bin/sh on more platforms. It also works
- around a bug in BusyBox awk before version 1.21.0. (Thanks to
- Patrick 'P. J.' McDermott and Alan Barrett.)
-
- Changes affecting code
-
- Fix localtime overflow bugs with 32-bit unsigned time_t.
-
- zdump no longer assumes sscanf returns maximal values on overflow.
-
- Changes affecting the build procedure
-
- The builder can specify which programs to use, if any, instead of
- 'ar' and 'ranlib', and libtz.a is now built locally before being
- installed. (Thanks to Michael Forney.)
-
- A dependency typo in the 'zdump' rule has been fixed.
- (Thanks to Andrew Paprocki.)
-
- The Makefile has been simplified by assuming that 'mkdir -p' and 'cp -f'
- work as specified by POSIX.2-1992 or later; this is portable nowadays.
-
- 'make clean' no longer removes 'leapseconds', since it's
- host-independent and is part of the distribution.
-
- The unused makefile macros TZCSRCS, TZDSRCS, DATESRCS have been removed.
-
- Changes affecting documentation and commentary
-
- tz-link.htm now mentions TC TIMEZONE's draft time zone service protocol
- (thanks to Mike Douglass) and TimezoneJS.Date (thanks to Jim Fehrle).
-
- Update URLs in tz-link page. Add URLs for Microsoft Windows, since
- 8.1 introduces tz support. Remove URLs for Tru64 and UnixWare (no
- longer maintained) and for old advisories. SOFA now does C.
-
-Release 2013g - 2013-09-30 21:08:26 -0700
-
- Changes affecting current and near-future time stamps
-
- Morocco now observes DST from the last Sunday in March to the last
- Sunday in October, not April to September respectively. (Thanks
- to Steffen Thorsen.)
-
- Changes affecting 'zic'
-
- 'zic' now runs on platforms that lack both hard links and symlinks.
- (Thanks to Theo Veenker for reporting the problem, for MinGW.)
- Also, fix some bugs on platforms that lack hard links but have symlinks.
-
- 'zic -v' again warns that Asia/Tehran has no POSIX environment variable
- to predict the far future, fixing a bug introduced in 2013e.
-
- Changes affecting the build procedure
-
- The 'leapseconds' file is again put into the tzdata tarball.
- Also, 'leapseconds.awk', so tzdata is self-contained. (Thanks to
- Matt Burgess and Ian Abbott.) The timestamps of these and other
- dependent files in tarballs are adjusted more consistently.
-
- Changes affecting documentation and commentary
-
- The README file is now part of the data tarball as well as the code.
- It now states that files are public domain unless otherwise specified.
- (Thanks to Andrew Main (Zefram) for asking for clarifications.)
- Its details about the 1989 release moved to a place of honor near
- the end of NEWS.
-
-
-Release 2013f - 2013-09-24 23:37:36 -0700
-
- Changes affecting near-future time stamps
-
- Tocantins will very likely not observe DST starting this spring.
- (Thanks to Steffen Thorsen.)
-
- Jordan will likely stay at UTC+3 indefinitely, and will not fall
- back this fall.
-
- Palestine will fall back at 00:00, not 01:00. (Thanks to Steffen Thorsen.)
-
- Changes affecting API
-
- The types of the global variables 'timezone' and 'altzone' (if present)
- have been changed back to 'long'. This is required for 'timezone'
- by POSIX, and for 'altzone' by common practice, e.g., Solaris 11.
- These variables were originally 'long' in the tz code, but were
- mistakenly changed to 'time_t' in 1987; nobody reported the
- incompatibility until now. The difference matters on x32, where
- 'long' is 32 bits and 'time_t' is 64. (Thanks to Elliott Hughes.)
-
- Changes affecting the build procedure
-
- Avoid long strings in leapseconds.awk to work around a mawk bug.
- (Thanks to Cyril Baurand.)
-
- Changes affecting documentation and commentary
-
- New file 'NEWS' that contains release notes like this one.
-
- Paraguay's law does not specify DST transition time; 00:00 is customary.
- (Thanks to Waldemar Villamayor-Venialbo.)
-
- Minor capitalization fixes.
-
- Changes affecting version-control only
-
- The experimental GitHub repository now contains annotated and
- signed tags for recent releases, e.g., '2013e' for Release 2013e.
- Releases are tagged starting with 2012e; earlier releases were
- done differently, and tags would either not have a simple name or
- not exactly match what was released.
-
- 'make set-timestamps' is now simpler and a bit more portable.
-
-
-Release 2013e - 2013-09-19 23:50:04 -0700
-
- Changes affecting near-future time stamps
-
- This year Fiji will start DST on October 27, not October 20.
- (Thanks to David Wheeler for the heads-up.) For now, guess that
- Fiji will continue to spring forward the Sunday before the fourth
- Monday in October.
-
- Changes affecting current and future time zone abbreviations
-
- Use WIB/WITA/WIT rather than WIT/CIT/EIT for alphabetic Indonesian
- time zone abbreviations since 1932. (Thanks to George Ziegler,
- Priyadi Iman Nurcahyo, Zakaria, Jason Grimes, Martin Pitt, and
- Benny Lin.) This affects Asia/Dili, Asia/Jakarta, Asia/Jayapura,
- Asia/Makassar, and Asia/Pontianak.
-
- Use ART (UTC-3, standard time), rather than WARST (also UTC-3, but
- daylight saving time) for San Luis, Argentina since 2009.
-
- Changes affecting Godthåb time stamps after 2037 if version mismatch
-
- Allow POSIX-like TZ strings where the transition time's hour can
- range from -167 through 167, instead of the POSIX-required 0
- through 24. E.g., TZ='FJT-12FJST,M10.3.1/146,M1.3.4/75' for the
- new Fiji rules. This is a more-compact way to represent
- far-future time stamps for America/Godthab, America/Santiago,
- Antarctica/Palmer, Asia/Gaza, Asia/Hebron, Asia/Jerusalem,
- Pacific/Easter, and Pacific/Fiji. Other zones are unaffected by
- this change. (Derived from a suggestion by Arthur David Olson.)
-
- Allow POSIX-like TZ strings where daylight saving time is in
- effect all year. E.g., TZ='WART4WARST,J1/0,J365/25' for Western
- Argentina Summer Time all year. This supports a more-compact way
- to represent the 2013d data for America/Argentina/San_Luis.
- Because of the change for San Luis noted above this change does not
- affect the current data. (Thanks to Andrew Main (Zefram) for
- suggestions that improved this change.)
-
- Where these two TZ changes take effect, there is a minor extension
- to the tz file format in that it allows new values for the
- embedded TZ-format string, and the tz file format version number
- has therefore been increased from 2 to 3 as a precaution.
- Version-2-based client code should continue to work as before for
- all time stamps before 2038. Existing version-2-based client code
- (tzcode, GNU/Linux, Solaris) has been tested on version-3-format
- files, and typically works in practice even for time stamps after
- 2037; the only known exception is America/Godthab.
-
- Changes affecting time stamps before 1970
-
- Pacific/Johnston is now a link to Pacific/Honolulu. This corrects
- some errors before 1947.
-
- Some zones have been turned into links, when they differ from existing
- zones only in older data entries that were likely invented or that
- differ only in LMT or transitions from LMT. These changes affect
- only time stamps before 1943. The affected zones are:
- Africa/Juba, America/Anguilla, America/Aruba, America/Dominica,
- America/Grenada, America/Guadeloupe, America/Marigot,
- America/Montserrat, America/St_Barthelemy, America/St_Kitts,
- America/St_Lucia, America/St_Thomas, America/St_Vincent,
- America/Tortola, and Europe/Vaduz. (Thanks to Alois Treindl for
- confirming that the old Europe/Vaduz zone was wrong and the new
- link is better for WWII-era times.)
-
- Change Kingston Mean Time from -5:07:12 to -5:07:11. This affects
- America/Cayman, America/Jamaica and America/Grand_Turk time stamps
- from 1890 to 1912.
-
- Change the UT offset of Bern Mean Time from 0:29:44 to 0:29:46.
- This affects Europe/Zurich time stamps from 1853 to 1894. (Thanks
- to Alois Treindl).
-
- Change the date of the circa-1850 Zurich transition from 1849-09-12
- to 1853-07-16, overriding Shanks with data from Messerli about
- postal and telegraph time in Switzerland.
-
- Changes affecting time zone abbreviations before 1970
-
- For Asia/Jakarta, use BMT (not JMT) for mean time from 1923 to 1932,
- as Jakarta was called Batavia back then.
-
- Changes affecting API
-
- The 'zic' command now outputs a dummy transition when far-future
- data can't be summarized using a TZ string, and uses a 402-year
- window rather than a 400-year window. For the current data, this
- affects only the Asia/Tehran file. It does not affect any of the
- time stamps that this file represents, so zdump outputs the same
- information as before. (Thanks to Andrew Main (Zefram).)
-
- The 'date' command has a new '-r' option, which lets you specify
- the integer time to display, a la FreeBSD.
-
- The 'tzselect' command has two new options '-c' and '-n', which lets you
- select a zone based on latitude and longitude.
-
- The 'zic' command's '-v' option now warns about constructs that
- require the new version-3 binary file format. (Thanks to Arthur
- David Olson for the suggestion.)
-
- Support for floating-point time_t has been removed.
- It was always dicey, and POSIX no longer requires it.
- (Thanks to Eric Blake for suggesting to the POSIX committee to
- remove it, and thanks to Alan Barrett, Clive D.W. Feather, Andy
- Heninger, Arthur David Olson, and Alois Treindl, for reporting
- bugs and elucidating some of the corners of the old floating-point
- implementation.)
-
- The signatures of 'offtime', 'timeoff', and 'gtime' have been
- changed back to the old practice of using 'long' to represent UT
- offsets. This had been inadvertently and mistakenly changed to
- 'int_fast32_t'. (Thanks to Christos Zoulas.)
-
- The code avoids undefined behavior on integer overflow in some
- more places, including gmtime, localtime, mktime and zdump.
-
- Changes affecting the zdump utility
-
- zdump now outputs "UT" when referring to Universal Time, not "UTC".
- "UTC" does not make sense for time stamps that predate the introduction
- of UTC, whereas "UT", a more-generic term, does. (Thanks to Steve Allen
- for clarifying UT vs UTC.)
-
- Data changes affecting behavior of tzselect and similar programs
-
- Country code BQ is now called the more-common name "Caribbean Netherlands"
- rather than the more-official "Bonaire, St Eustatius & Saba".
-
- Remove from zone.tab the names America/Montreal, America/Shiprock,
- and Antarctica/South_Pole, as they are equivalent to existing
- same-country-code zones for post-1970 time stamps. The data entries for
- these names are unchanged, so the names continue to work as before.
-
- Changes affecting code internals
-
- zic -c now runs way faster on 64-bit hosts when given large numbers.
-
- zic now uses vfprintf to avoid allocating and freeing some memory.
-
- tzselect now computes the list of continents from the data,
- rather than have it hard-coded.
-
- Minor changes pacify GCC 4.7.3 and GCC 4.8.1.
-
- Changes affecting the build procedure
-
- The 'leapseconds' file is now generated automatically from a
- new file 'leap-seconds.list', which is a copy of
- <ftp://time.nist.gov/pub/leap-seconds.list>.
- A new source file 'leapseconds.awk' implements this.
- The goal is simplification of the future maintenance of 'leapseconds'.
-
- When building the 'posix' or 'right' subdirectories, if the
- subdirectory would be a copy of the default subdirectory, it is
- now made a symbolic link if that is supported. This saves about
- 2 MB of file system space.
-
- The links America/Shiprock and Antarctica/South_Pole have been
- moved to the 'backward' file. This affects only nondefault builds
- that omit 'backward'.
-
- Changes affecting version-control only
-
- .gitignore now ignores 'date'.
-
- Changes affecting documentation and commentary
-
- Changes to the 'tzfile' man page
-
- It now mentions that the binary file format may be extended in
- future versions by appending data.
-
- It now refers to the 'zdump' and 'zic' man pages.
-
- Changes to the 'zic' man page
-
- It lists conditions that elicit a warning with '-v'.
-
- It says that the behavior is unspecified when duplicate names
- are given, or if the source of one link is the target of another.
-
- Its examples are updated to match the latest data.
-
- The definition of white space has been clarified slightly.
- (Thanks to Michael Deckers.)
-
- Changes to the 'Theory' file
-
- There is a new section about the accuracy of the tz database,
- describing the many ways that errors can creep in, and
- explaining why so many of the pre-1970 time stamps are wrong or
- misleading (thanks to Steve Allen, Lester Caine, and Garrett
- Wollman for discussions that contributed to this).
-
- The 'Theory' file describes LMT better (this follows a
- suggestion by Guy Harris).
-
- It refers to the 2013 edition of POSIX rather than the 2004 edition.
-
- It's mentioned that excluding 'backward' should not affect the
- other data, and it suggests at least one zone.tab name per
- inhabited country (thanks to Stephen Colebourne).
-
- Some longstanding restrictions on names are documented, e.g.,
- 'America/New_York' precludes 'America/New_York/Bronx'.
-
- It gives more reasons for the 1970 cutoff.
-
- It now mentions which time_t variants are supported, such as
- signed integer time_t. (Thanks to Paul Goyette for reporting
- typos in an experimental version of this change.)
-
- (Thanks to Philip Newton for correcting typos in these changes.)
-
- Documentation and commentary is more careful to distinguish UT in
- general from UTC in particular. (Thanks to Steve Allen.)
-
- Add a better source for the Zurich 1894 transition.
- (Thanks to Pierre-Yves Berger.)
-
- Update shapefile citations in tz-link.htm. (Thanks to Guy Harris.)
-
-
-Release 2013d - 2013-07-05 07:38:01 -0700
-
- Changes affecting future time stamps:
-
- Morocco's midsummer transitions this year are July 7 and August 10,
- not July 9 and August 8. (Thanks to Andrew Paprocki.)
-
- Israel now falls back on the last Sunday of October.
- (Thanks to Ephraim Silverberg.)
-
- Changes affecting past time stamps:
-
- Specify Jerusalem's location more precisely; this changes the pre-1880
- times by 2 s.
-
- Changing affecting metadata only:
-
- Fix typos in the entries for country codes BQ and SX.
-
- Changes affecting code:
-
- Rework the code to fix a bug with handling Australia/Macquarie on
- 32-bit hosts (thanks to Arthur David Olson).
-
- Port to platforms like NetBSD, where time_t can be wider than long.
-
- Add support for testing time_t types other than the system's.
- Run 'make check_time_t_alternatives' to try this out.
- Currently, the tests fail for unsigned time_t;
- this should get fixed at some point.
-
- Changes affecting documentation and commentary:
-
- Deemphasize the significance of national borders.
-
- Update the zdump man page.
-
- Remove obsolete NOID comment (thanks to Denis Excoffier).
-
- Update several URLs and comments in the web pages.
-
- Spelling fixes (thanks to Kevin Lyda and Jonathan Leffler).
-
- Update URL for CLDR Zone->Tzid table (thanks to Yoshito Umaoka).
-
-
-Release 2013c - 2013-04-19 16:17:40 -0700
-
- Changes affecting current and future time stamps:
-
- Palestine observed DST starting March 29, 2013. (Thanks to
- Steffen Thorsen.) From 2013 on, Gaza and Hebron both observe DST,
- with the predicted rules being the last Thursday in March at 24:00
- to the first Friday on or after September 21 at 01:00.
-
- Assume that the recent change to Paraguay's DST rules is permanent,
- by moving the end of DST to the 4th Sunday in March every year.
- (Thanks to Carlos Raúl Perasso.)
-
- Changes affecting past time stamps:
-
- Fix some historical data for Palestine to agree with that of
- timeanddate.com, as follows:
-
- The spring 2008 change in Gaza and Hebron was on 00:00 Mar 28, not
- 00:00 Apr 1.
-
- The fall 2009 change in Gaza and Hebron on Sep 4 was at 01:00, not
- 02:00.
-
- The spring 2010 change in Hebron was 00:00 Mar 26, not 00:01 Mar 27.
-
- The spring 2011 change in Gaza was 00:01 Apr 1, not 12:01 Apr 2.
-
- The spring 2011 change in Hebron on Apr 1 was at 00:01, not 12:01.
-
- The fall 2011 change in Hebron on Sep 30 was at 00:00, not 03:00.
-
- Fix times of habitation for Macquarie to agree with the Tasmania
- Parks & Wildlife Service history, which indicates that permanent
- habitation was 1899-1919 and 1948 on.
-
- Changing affecting metadata only:
-
- Macquarie Island is politically part of Australia, not Antarctica.
- (Thanks to Tobias Conradi.)
-
- Sort Macquarie more-consistently with other parts of Australia.
- (Thanks to Tim Parenti.)
-
-
-Release 2013b - 2013-03-10 22:33:40 -0700
-
- Changes affecting current and future time stamps:
-
- Haiti uses US daylight-saving rules this year, and presumably future years.
- This changes time stamps starting today. (Thanks to Steffen Thorsen.)
-
- Paraguay will end DST on March 24 this year.
- (Thanks to Steffen Thorsen.) For now, assume it's just this year.
-
- Morocco does not observe DST during Ramadan;
- try to predict Ramadan in Morocco as best we can.
- (Thanks to Erik Homoet for the heads-up.)
-
- Changes affecting commentary:
-
- Update URLs in tz-link page. Add URLs for webOS, BB10, iOS.
- Update URL for Solaris. Mention Internet RFC 6557.
- Update Internet RFCs 2445->5545, 2822->5322.
- Switch from FTP to HTTP for Internet RFCs.
-
-
-Release 2013a - 2013-02-27 09:20:35 -0800
-
- Change affecting binary data format:
-
- The zone offset at the end of version-2-format zone files is now
- allowed to be 24:00, as per POSIX.1-2008. (Thanks to Arthur David Olson.)
-
- Changes affecting current and future time stamps:
-
- Chile's 2013 rules, and we guess rules for 2014 and later, will be
- the same as 2012, namely Apr Sun>=23 03:00 UTC to Sep Sun>=2 04:00 UTC.
- (Thanks to Steffen Thorsen and Robert Elz.)
-
- New Zones Asia/Khandyga, Asia/Ust-Nera, Europe/Busingen.
- (Thanks to Tobias Conradi and Arthur David Olson.)
-
- Many changes affect historical time stamps before 1940.
- These were deduced from: Milne J. Civil time. Geogr J. 1899
- Feb;13(2):173-94 <http://www.jstor.org/stable/1774359>.
-
- Changes affecting the code:
-
- Fix zic bug that mishandled Egypt's 2010 changes (this also affected
- the data). (Thanks to Arthur David Olson.)
-
- Fix localtime bug when time_t is unsigned and data files were generated
- by a signed time_t system. (Thanks to Doug Bailey for reporting and
- to Arthur David Olson for fixing.)
-
- Allow the email address for bug reports to be set by the packager.
- The default is tz at iana.org, as before. (Thanks to Joseph S. Myers.)
-
- Update HTML checking to be compatible with Ubuntu 12.10.
-
- Check that files are a safe subset of ASCII. At some point we may
- relax this requirement to a safe subset of UTF-8. Without the
- check, some non-UTF-8 encodings were leaking into the distribution.
-
- Commentary changes:
-
- Restore a comment about copyright notices that was inadvertently deleted.
- (Thanks to Arthur David Olson.)
-
- Improve the commentary about which districts observe what times
- in Russia. (Thanks to Oscar van Vlijmen and Arthur David Olson).
-
- Add web page links to tz.js.
-
- Add "Run by the Monkeys" to tz-art. (Thanks to Arthur David Olson.)
-
-
-Release 2012j - 2012-11-12 18:34:49 -0800
-
- Libya moved to CET this weekend, but with DST planned next year.
- (Thanks to Even Scharning, Steffen Thorsen, and Tim Parenti.)
-
- Signatures now have the extension .asc, not .sign, as that's more
- standard. (Thanks to Phil Pennock.)
-
- The output of 'zdump --version', and of 'zic --version', now
- uses a format that is more typical for --version.
- (Thanks to Joseph S. Myers.)
-
- The output of 'tzselect --help', 'zdump --help', and 'zic --help'
- now uses tz at iana.org rather than the old elsie address.
-
- zic -v now complains about abbreviations that are less than 3
- or more than 6 characters, as per Posix. Formerly, it checked
- for abbreviations that were more than 3.
-
- 'make public' no longer puts its temporary directory under /tmp,
- and uses the just-built zic rather than the system zic.
-
- Various fixes to documentation and commentary.
-
-
-Release 2012i - 2012-11-03 12:57:09 -0700
-
- Cuba switches from DST tomorrow at 01:00. (Thanks to Steffen Thorsen.)
-
- Linker flags can now be specified via LDFLAGS.
- AWK now defaults to 'awk', not 'nawk'.
- The shell in tzselect now defaults to /bin/bash, but this can
- be overridden by specifying KSHELL.
- The main web page now mentions the unofficial GitHub repository.
- (Thanks to Mike Frysinger.)
-
- Tarball signatures can now be built by running 'make signatures'.
- There are also new makefile rules 'tarballs', 'check_public', and
- separate makefile rules for each tarball and signature file.
- A few makefile rules are now more portable to strict POSIX.
-
- The main web page now lists the canonical IANA URL.
-
-
-Release 2012h - 2012-10-26 22:49:10 -0700
-
- Bahia no longer has DST. (Thanks to Kelley Cook.)
-
- Tocantins has DST. (Thanks to Rodrigo Severo.)
-
- Israel has new DST rules next year. (Thanks to Ephraim Silverberg.)
-
- Jordan stays on DST this winter. (Thanks to Steffen Thorsen.)
-
- Web page updates.
-
- More C modernization, except that at Arthur David Olson's suggestion
- the instances of 'register' were kept.
-
-
-Release 2012g - 2012-10-17 20:59:45 -0700
-
- Samoa fall 2012 and later. (Thanks to Nicholas Pereira and Robert Elz.)
-
- Palestine fall 2012. (Thanks to Steffen Thorsen.)
-
- Assume C89.
-
- To attack the version-number problem, this release ships the file
- 'Makefile' (which contains the release number) in both the tzcode and
- the tzdata tarballs. The two Makefiles are identical, and should be
- identical in any matching pair of tarballs, so it shouldn't matter
- which order you extract the tarballs. Perhaps we can come up with a
- better version-number scheme at some point; this scheme does have the
- virtue of not adding more files.
-
-
-Release 2012f - 2012-09-12 23:17:03 -0700
-
- * australasia (Pacific/Fiji): Fiji DST is October 21 through January
- 20 this year. (Thanks to Steffen Thorsen.)
-
-
-Release 2012e - 2012-08-02 20:44:55 -0700
-
- * australasia (Pacific/Fakaofo): Tokelau is UTC+13, not UTC+14.
- (Thanks to Steffen Thorsen.)
-
- * Use a single version number for both code and data.
-
- * .gitignore: New file.
-
- * Remove trailing white space.
-
-
-Release code2012c-data2012d - 2012-07-19 16:35:33 -0700
-
- Changes for Morocco's time stamps, which take effect in a couple of
- hours, along with infrastructure changes to accommodate how the tz
- code and data are released on IANA.
-
-
-Release data2012c - 2012-03-27 12:17:25 -0400
-
- africa
- Summer time changes for Morocco (to start late April 2012)
-
- asia
- Changes for 2012 for Gaza & the West Bank (Hebron) and Syria
-
- northamerica
- Haiti following US/Canada rules for 2012 (and we're assuming,
- for now anyway, for the future).
-
-
-Release 2012b - 2012-03-02 12:29:15 +0700
-
- There is just one change to tzcode2012b (compared with 2012a):
- the Makefile that was accidentally included with 2012a has been
- replaced with the version that should have been there, which is
- identical with the previous version (from tzcode2011i).
-
- There are just two changes in tzdata2012b compared with 2012a.
-
- Most significantly, summer time in Cuba has been delayed 3 weeks
- (now starts April 1 rather than March 11). Since Mar 11 (the old start
- date, as listed in 2012a) is just a little over a week away, this
- change is urgent.
-
- Less importantly, an excess tab in one of the changes in zone.tab
- in 2012a has been removed.
-
-
-Release 2012a - 2012-03-01 18:28:10 +0700
-
- The changes in tzcode2012a (compared to the previous version, 2011i)
- are entirely to the README and tz-art.htm and tz-link.htm files, if
- none of those concern you, you can ignore the code update. The changes
- reflect the changed addresses for the mailing list and the code and
- data distribution points & methods (and a link to DateTime::TimeZone::Tzfile
- has been added to tz-link.htm).
-
- In tzdata2012a (compared to the previous release, which was 2011n)
- the major changes are:
- Chile 2011/2012 and 2012/2013 summer time date adjustments.
- Falkland Islands onto permanent summer time (we're assuming for the
- foreseeable future, though 2012 is all we're fairly certain of.)
- Armenia has abolished Summer Time.
- Tokelau jumped the International Date Line back last December
- (just the same as their near neighbour, Samoa).
- America/Creston is a new zone for a small area of British Columbia
- There will be a leapsecond 2012-06-30 23:59:60 UTC.
-
- Other minor changes are:
- Corrections to 1918 Canadian summer time end dates.
- Updated URL for UK time zone history (in comments)
- A few typos in Le Corre's list of free French place names (comments)
-
-
-Release data2011n - 2011-10-30 14:57:54 +0700
-
- There are three changes of note - most urgently, Cuba (America/Havana)
- has extended summer time by two weeks, now to end on Nov 13, rather than
- the (already past) Oct 30. Second, the Pridnestrovian Moldavian Republic
- (Europe/Tiraspol) decided not to split from the rest of Moldova after
- all, and consequently that zone has been removed (again) and reinstated
- in the "backward" file as a link to Europe/Chisinau. And third, the
- end date for Fiji's summer time this summer was moved forward from the
- earlier planned Feb 26, to Jan 22.
-
- Apart from that, Moldova (MD) returns to a single entry in zone.tab
- (and the incorrect syntax that was in the 2011m version of that file
- is so fixed - it would have been fixed in a different way had this
- change not happened - that's the "missing" sccs version id).
-
-
-Release data2011m - 2011-10-24 21:42:16 +0700
-
- In particular, the typos in comments in the data (2011-11-17 should have
- been 2011-10-17 as Alan Barrett noted, and spelling of Tiraspol that
- Tim Parenti noted) have been fixed, and the change for Ukraine has been
- made in all 4 Ukrainian zones, rather than just Kiev (again, thanks to
- Tim Parenti, and also Denys Gavrysh)
-
- In addition, I added Europe/Tiraspol to zone.tab.
-
- This time, all the files have new version numbers... (including the files
- otherwise unchanged in 2011m that were changed in 2011l but didn't get new
- version numbers there...)
-
-
-Release data2011l - 2011-10-10 11:15:43 +0700
-
- There are just 2 changes that cause different generated tzdata files from
- zic, to Asia/Hebron and Pacific/Fiji - the possible change for Bahia, Brazil
- is included, but commented out. Compared with the diff I sent out last week,
- this version also includes attributions for the sources for the changes
- (in much the same format as ado used, but the html tags have not been
- checked, verified, or used in any way at all, so if there are errors there,
- please let me know.)
-
-
-Release data2011k - 2011-09-20 17:54:03 -0400
-
- [not summarized]
-
-
-Release data2011j - 2011-09-12 09:22:49 -0400
-
- (contemporary changes for Samoa; past changes for Kenya, Uganda, and
- Tanzania); there are also two spelling corrections to comments in
- the australasia file (with thanks to Christos Zoulas).
-
-
-Release 2011i - 2011-08-29 05:56:32 -0400
-
- [not summarized]
-
-
-Release data2011h - 2011-06-15 18:41:48 -0400
-
- Russia and Curaçao changes
-
-
-Release 2011g - 2011-04-25 09:07:22 -0400
-
- update the rules for Egypt to reflect its abandonment of DST this year
-
-
-Release 2011f - 2011-04-06 17:14:53 -0400
-
- [not summarized]
-
-
-Release 2011e - 2011-03-31 16:04:38 -0400
-
- Morocco, Chile, and tz-link changes
-
-
-Release 2011d - 2011-03-14 09:18:01 -0400
-
- changes that impact present-day time stamps in Cuba, Samoa, and Turkey
-
-
-Release 2011c - 2011-03-07 09:30:09 -0500
-
- These do affect current time stamps in Chile and Annette Island, Canada.
-
-
-Release 2011b - 2011-02-07 08:44:50 -0500
-
- [not summarized]
-
-
-Release 2011a - 2011-01-24 10:30:16 -0500
-
- [not summarized]
-
-
-Release data2010o - 2010-11-01 09:18:23 -0400
-
- change to the end of DST in Fiji in 2011
-
-
-Release 2010n - 2010-10-25 08:19:17 -0400
-
- [not summarized]
-
-
-Release 2010m - 2010-09-27 09:24:48 -0400
-
- Hong Kong, Vostok, and zic.c changes
-
-
-Release 2010l - 2010-08-16 06:57:25 -0400
-
- [not summarized]
-
-
-Release 2010k - 2010-07-26 10:42:27 -0400
-
- [not summarized]
-
-
-Release 2010j - 2010-05-10 09:07:48 -0400
-
- changes for Bahía de Banderas and for version naming
-
-
-Release data2010i - 2010-04-16 18:50:45 -0400
-
- the end of DST in Morocco on 2010-08-08
-
-
-Release data2010h - 2010-04-05 09:58:56 -0400
-
- [not summarized]
-
-
-Release data2010g - 2010-03-24 11:14:53 -0400
-
- [not summarized]
-
-
-Release 2010f - 2010-03-22 09:45:46 -0400
-
- [not summarized]
-
-
-Release data2010e - 2010-03-08 14:24:27 -0500
-
- corrects the Dhaka bug found by Danvin Ruangchan
-
-
-Release data2010d - 2010-03-06 07:26:01 -0500
-
- [not summarized]
-
-
-Release 2010c - 2010-03-01 09:20:58 -0500
-
- changes including KRE's suggestion for earlier initialization of
- "goahead" and "goback" structure elements
-
-
-Release code2010a - 2010-02-16 10:40:04 -0500
-
- [not summarized]
-
-
-Release data2010b - 2010-01-20 12:37:01 -0500
-
- Mexico changes
-
-
-Release data2010a - 2010-01-18 08:30:04 -0500
-
- changes to Dhaka
-
-
-Release data2009u - 2009-12-26 08:32:28 -0500
-
- changes to DST in Bangladesh
-
-
-Release 2009t - 2009-12-21 13:24:27 -0500
-
- [not summarized]
-
-
-Release data2009s - 2009-11-14 10:26:32 -0500
-
- (cosmetic) Antarctica change and the DST-in-Fiji-in-2009-and-2010 change
-
-
-Release 2009r - 2009-11-09 10:10:31 -0500
-
- "antarctica" and "tz-link.htm" changes
-
-
-Release 2009q - 2009-11-02 09:12:40 -0500
-
- with two corrections as reported by Eric Muller and Philip Newton
-
-
-Release data2009p - 2009-10-23 15:05:27 -0400
-
- Argentina (including San Luis) changes (with the correction from
- Mariano Absatz)
-
-
-Release data2009o - 2009-10-14 16:49:38 -0400
-
- Samoa (commentary only), Pakistan, and Bangladesh changes
-
-
-Release data2009n - 2009-09-22 15:13:38 -0400
-
- added commentary for Argentina and a change to the end of DST in
- 2009 in Pakistan
-
-
-Release data2009m - 2009-09-03 10:23:43 -0400
-
- Samoa and Palestine changes
-
-
-Release data2009l - 2009-08-14 09:13:07 -0400
-
- Samoa (comments only) and Egypt
-
-
-Release 2009k - 2009-07-20 09:46:08 -0400
-
- [not summarized]
-
-
-Release data2009j - 2009-06-15 06:43:59 -0400
-
- Bangladesh change (with a short turnaround since the DST change is
- impending)
-
-
-Release 2009i - 2009-06-08 09:21:22 -0400
-
- updating for DST in Bangladesh this year
-
-
-Release 2009h - 2009-05-26 09:19:14 -0400
-
- [not summarized]
-
-
-Release data2009g - 2009-04-20 16:34:07 -0400
-
- Cairo
-
-
-Release data2009f - 2009-04-10 11:00:52 -0400
-
- correct DST in Pakistan
-
-
-Release 2009e - 2009-04-06 09:08:11 -0400
-
- [not summarized]
-
-
-Release 2009d - 2009-03-23 09:38:12 -0400
-
- Morocco, Tunisia, Argentina, and American Astronomical Society changes
-
-
-Release data2009c - 2009-03-16 09:47:51 -0400
-
- change to the start of Cuban DST
-
-
-Release 2009b - 2009-02-09 11:15:22 -0500
-
- [not summarized]
-
-
-Release 2009a - 2009-01-21 10:09:39 -0500
-
- [not summarized]
-
-
-Release data2008i - 2008-10-21 12:10:25 -0400
-
- southamerica and zone.tab files, with Argentina DST rule changes and
- United States zone reordering and recommenting
-
-
-Release 2008h - 2008-10-13 07:33:56 -0400
-
- [not summarized]
-
-
-Release 2008g - 2008-10-06 09:03:18 -0400
-
- Fix a broken HTML anchor and update Brazil's DST transitions;
- there's also a slight reordering of information in tz-art.htm.
-
-
-Release data2008f - 2008-09-09 22:33:26 -0400
-
- [not summarized]
-
-
-Release 2008e - 2008-07-28 14:11:17 -0400
-
- changes by Arthur David Olson and Jesper Nørgaard Welen
-
-
-Release data2008d - 2008-07-07 09:51:38 -0400
-
- changes by Arthur David Olson, Paul Eggert, and Rodrigo Severo
-
-
-Release data2008c - 2008-05-19 17:48:03 -0400
-
- Pakistan, Morocco, and Mongolia
-
-
-Release data2008b - 2008-03-24 08:30:59 -0400
-
- including renaming Asia/Calcutta to Asia/Kolkata, with a backward
- link provided
-
-
-Release 2008a - 2008-03-08 05:42:16 -0500
-
- [not summarized]
-
-
-Release 2007k - 2007-12-31 10:25:22 -0500
-
- most importantly, changes to the "southamerica" file based on
- Argentina's readoption of daylight saving time
-
-
-Release 2007j - 2007-12-03 09:51:01 -0500
-
- 1. eliminate the "P" (parameter) macro;
-
- 2. the "noncontroversial" changes circulated on the time zone
- mailing list (less the changes to "logwtmp.c");
-
- 3. eliminate "too many transition" errors when "min" is used in time
- zone rules;
-
- 4. changes by Paul Eggert (including updated information for Venezuela).
-
-
-Release data2007i - 2007-10-30 10:28:11 -0400
-
- changes for Cuba and Syria
-
-
-Release 2007h - 2007-10-01 10:05:51 -0400
-
- changes by Paul Eggert, as well as an updated link to the ICU
- project in tz-link.htm
-
-
-Release 2007g - 2007-08-20 10:47:59 -0400
-
- changes by Paul Eggert
-
- The "leapseconds" file has been updated to incorporate the most
- recent International Earth Rotation and Reference Systems Service
- (IERS) bulletin.
-
- There's an addition to tz-art.htm regarding the television show "Medium".
-
-
-Release 2007f - 2007-05-07 10:46:46 -0400
-
- changes by Paul Eggert (including Haiti, Turks and Caicos, and New
- Zealand)
-
- changes to zic.c to allow hour values greater than 24 (along with
- Paul's improved time value overflow checking)
-
-
-Release 2007e - 2007-04-02 10:11:52 -0400
-
- Syria and Honduras changes by Paul Eggert
-
- zic.c variable renaming changes by Arthur David Olson
-
-
-Release 2007d - 2007-03-20 08:48:30 -0400
-
- changes by Paul Eggert
-
- the elimination of white space at the ends of lines
-
-
-Release 2007c - 2007-02-26 09:09:37 -0500
-
- changes by Paul Eggert
-
-
-Release 2007b - 2007-02-12 09:34:20 -0500
-
- Paul Eggert's proposed change to the quotation handling logic in zic.c.
-
- changes to the commentary in "leapseconds" reflecting the IERS
- announcement that there is to be no positive leap second at the end
- of June 2007.
-
-
-Release 2007a - 2007-01-08 12:28:29 -0500
-
- changes by Paul Eggert
-
- Derick Rethan's Asmara change
-
- Oscar van Vlijmen's Easter Island local mean time change
-
- symbolic link changes
-
-
-Release 2006p - 2006-11-27 08:54:27 -0500
-
- changes by Paul Eggert
-
-
-Release 2006o - 2006-11-06 09:18:07 -0500
-
- changes by Paul Eggert
-
-
-Release 2006n - 2006-10-10 11:32:06 -0400
-
- changes by Paul Eggert
-
-
-Release 2006m - 2006-10-02 15:32:35 -0400
-
- changes for Uruguay, Palestine, and Egypt by Paul Eggert
-
- (minimalist) changes to zic.8 to clarify "until" information
-
-
-Release data2006l - 2006-09-18 12:58:11 -0400
-
- Paul's best-effort work on this coming weekend's Egypt time change
-
-
-Release 2006k - 2006-08-28 12:19:09 -0400
-
- changes by Paul Eggert
-
-
-Release 2006j - 2006-08-21 09:56:32 -0400
-
- changes by Paul Eggert
-
-
-Release code2006i - 2006-08-07 12:30:55 -0400
-
- localtime.c fixes
-
- Ken Pizzini's conversion script
-
-
-Release code2006h - 2006-07-24 09:19:37 -0400
-
- adds public domain notices to four files
-
- includes a fix for transition times being off by a second
-
- adds a new recording to the "arts" file (information courtesy Colin Bowern)
-
-
-Release 2006g - 2006-05-08 17:18:09 -0400
-
- northamerica changes by Paul Eggert
-
-
-Release 2006f - 2006-05-01 11:46:00 -0400
-
- a missing version number problem is fixed (with thanks to Bradley
- White for catching the problem)
-
-
-Release 2006d - 2006-04-17 14:33:43 -0400
-
- changes by Paul Eggert
-
- added new items to tz-arts.htm that were found by Paul
-
-
-Release 2006c - 2006-04-03 10:09:32 -0400
-
- two sets of data changes by Paul Eggert
-
- a fencepost error fix in zic.c
-
- changes to zic.c and the "europe" file to minimize differences
- between output produced by the old 32-bit zic and the new 64-bit
- version
-
-
-Release 2006b - 2006-02-20 10:08:18 -0500
- [tz32code2006b + tz64code2006b + tzdata2006b]
-
- 64-bit code
-
- All SCCS IDs were bumped to "8.1" for this release.
-
-
-Release 2006a - 2006-01-30 08:59:31 -0500
-
- changes by Paul Eggert (in particular, Indiana time zone moves)
-
- an addition to the zic manual page to describe how special-case
- transitions are handled
-
-
-Release 2005r - 2005-12-27 09:27:13 -0500
-
- Canadian changes by Paul Eggert
-
- They also add "<pre>" directives to time zone data files and reflect
- changes to warning message logic in "zdump.c" (but with calls to
- "gettext" kept unbundled at the suggestion of Ken Pizzini).
-
-
-Release 2005q - 2005-12-13 09:17:09 -0500
-
- Nothing earth-shaking here:
- 1. Electronic mail addresses have been removed.
- 2. Casts of the return value of exit have been removed.
- 3. Casts of the argument of is.* macros have been added.
- 4. Indentation in one section of zic.c has been fixed.
- 5. References to dead URLs in the data files have been dealt with.
-
-
-Release 2005p - 2005-12-05 10:30:53 -0500
-
- "systemv", "tz-link.htm", and "zdump.c" changes
- (less the casts of arguments to the is* macros)
-
-
-Release 2005o - 2005-11-28 10:55:26 -0500
-
- Georgia, Cuba, Nicaragua, and Jordan changes by Paul Eggert
-
- zdump.c lint fixes by Arthur David Olson
-
-
-Release 2005n - 2005-10-03 09:44:09 -0400
-
- changes by Paul Eggert (both the Uruguay changes and the Kyrgyzstan
- et al. changes)
-
-
-Release 2005m - 2005-08-29 12:15:40 -0400
-
- changes by Paul Eggert (with a small tweak to the tz-art change)
-
- a declaration of an unused variable has been removed from zdump.c
-
-
-Release 2005l - 2005-08-22 12:06:39 -0400
-
- changes by Paul Eggert
-
- overflow/underflow checks by Arthur David Olson, minus changes to
- the "Theory" file about the pending addition of 64-bit data (I grow
- less confident of the changes being accepted with each passing day,
- and the changes no longer increase the data files nine-fold--there's
- less than a doubling in size by my local Sun's reckoning)
-
-
-Release 2005k - 2005-07-14 14:14:24 -0400
-
- The "leapseconds" file has been edited to reflect the recently
- announced leap second at the end of 2005.
-
- I've also deleted electronic mail addresses from the files as an
- anti-spam measure.
-
-
-Release 2005j - 2005-06-13 14:34:13 -0400
-
- These reflect changes to limit the length of time zone abbreviations
- and the characters used in those abbreviations.
-
- There are also changes to handle POSIX-style "quoted" time zone
- environment variables.
-
- The changes were circulated on the time zone mailing list; the only
- change since then was the removal of a couple of minimum-length of
- abbreviation checks.
-
-
-Release data2005i - 2005-04-21 15:04:16 -0400
-
- changes (most importantly to Nicaragua and Haiti) by Paul Eggert
-
-
-Release 2005h - 2005-04-04 11:24:47 -0400
-
- changes by Paul Eggert
-
- minor changes to Makefile and zdump.c to produce more useful output
- when doing a "make typecheck"
-
-
-Release 2005g - 2005-03-14 10:11:21 -0500
-
- changes by Paul Eggert (a change to current DST rules in Uruguay and
- an update to a link to time zone software)
-
-
-Release 2005f - 2005-03-01 08:45:32 -0500
-
- data and documentation changes by Paul Eggert
-
-
-Release 2005e - 2005-02-10 15:59:44 -0500
-
- [not summarized]
-
-
-Release code2005d - 2005-01-31 09:21:47 -0500
-
- make zic complain about links to links if the -v flag is used
-
- have "make public" do more code checking
-
- add an include to "localtime.c" for the benefit of gcc systems
-
-
-Release 2005c - 2005-01-17 18:36:29 -0500
-
- get better results when mktime runs on a system where time_t is double
-
- changes to the data files (most importantly to Paraguay)
-
-
-Release 2005b - 2005-01-10 09:19:54 -0500
-
- Get localtime and gmtime working on systems with exotic time_t types.
-
- Update the leap second commentary in the "leapseconds" file.
-
-
-Release 2005a - 2005-01-01 13:13:44 -0500
-
- [not summarized]
-
-
-Release code2004i - 2004-12-14 13:42:58 -0500
-
- Deal with systems where time_t is unsigned.
-
-
-Release code2004h - 2004-12-07 11:40:18 -0500
-
- 64-bit-time_t changes
-
-
-Release 2004g - 2004-11-02 09:06:01 -0500
-
- update to Cuba (taking effect this weekend)
-
- other changes by Paul Eggert
-
- correction of the spelling of Oslo
-
- changed versions of difftime.c and private.h
-
-
-Release code2004f - 2004-10-21 10:25:22 -0400
-
- Cope with wide-ranging tm_year values.
-
-
-Release 2004e - 2004-10-11 14:47:21 -0400
-
- Brazil/Argentina/Israel changes by Paul Eggert
-
- changes to tz-link.htm by Paul
-
- one small fix to Makefile
-
-
-Release 2004d - 2004-09-22 08:27:29 -0400
-
- Avoid overflow problems when TM_YEAR_BASE is added to an integer.
-
-
-Release 2004c - 2004-08-11 12:06:26 -0400
-
- asctime-related changes
-
- (variants of) some of the documentation changes suggested by Paul Eggert
-
-
-Release 2004b - 2004-07-19 14:33:35 -0400
-
- data changes by Paul Eggert - most importantly, updates for Argentina
-
-
-Release 2004a - 2004-05-27 12:00:47 -0400
-
- changes by Paul Eggert
-
- Handle DST transitions that occur at the end of a month in some
- years but at the start of the following month in other years.
-
- Add a copy of the correspondence that's the basis for claims about
- DST in the Navajo Nation.
-
-
-Release 2003e - 2003-12-15 09:36:47 -0500
-
- changes by Arthur David Olson (primarily code changes)
-
- changes by Paul Eggert (primarily data changes)
-
- minor changes to "Makefile" and "northamerica" (in the latter case,
- optimization of the "Toronto" rules)
-
-
-Release 2003d - 2003-10-06 09:34:44 -0400
-
- changes by Paul Eggert
-
-
-Release 2003c - 2003-09-16 10:47:05 -0400
-
- Fix bad returns in zic.c's inleap function.
- Thanks to Bradley White for catching the problem!
-
-
-Release 2003b - 2003-09-16 07:13:44 -0400
-
- Add a "--version" option (and documentation) to the zic and zdump commands.
-
- changes to overflow/underflow checking in zic
-
- a localtime typo fix.
-
- Update the leapseconds and tz-art.htm files.
-
-
-Release 2003a - 2003-03-24 09:30:54 -0500
-
- changes by Paul Eggert
-
- a few additions and modifications to the tz-art.htm file
-
-
-Release 2002d - 2002-10-15 13:12:42 -0400
-
- changes by Paul Eggert, less the "Britain (UK)" change in iso3166.tab
-
- There's also a new time zone quote in "tz-art.htm".
-
-
-Release 2002c - 2002-04-04 11:55:20 -0500
-
- changes by Paul Eggert
-
- Change zic.c to avoid creating symlinks to files that don't exist.
-
-
-Release 2002b - 2002-01-28 12:56:03 -0500
-
- [These change notes are for Release 2002a, which was corrupted.
- 2002b was a corrected version of 2002a.]
-
- changes by Paul Eggert
-
- Update the "leapseconds" file to note that there'll be no leap
- second at the end of June, 2002.
-
- Change "zic.c" to deal with a problem in handling the "Asia/Bishkek" zone.
-
- Change to "difftime.c" to avoid sizeof problems.
-
-
-Release 2001d - 2001-10-09 13:31:32 -0400
-
- changes by Paul Eggert
-
-
-Release 2001c - 2001-06-05 13:59:55 -0400
-
- changes by Paul Eggert and Andrew Brown
-
-
-Release 2001b - 2001-04-05 16:44:38 -0400
-
- changes by Paul Eggert (modulo jnorgard's typo fix)
-
- tz-art.htm has been HTMLified.
-
-
-Release 2001a - 2001-03-13 12:57:44 -0500
-
- changes by Paul Eggert
-
- An addition to the "leapseconds" file: comments with the text of the
- latest IERS leap second notice.
-
- Trailing white space has been removed from data file lines, and
- repeated spaces in "Rule Jordan" lines in the "asia" file have been
- converted to tabs.
-
-
-Release 2000h - 2000-12-14 15:33:38 -0500
-
- changes by Paul Eggert
-
- one typo fix in the "art" file
-
- With providence, this is the last update of the millennium.
-
-
-Release 2000g - 2000-10-10 11:35:22 -0400
-
- changes by Paul Eggert
-
- correction of John Mackin's name submitted by Robert Elz
-
- Garry Shandling's Daylight Saving Time joke (!?!) from the recent
- Emmy Awards broadcast.
-
-
-Release 2000f - 2000-08-10 09:31:58 -0400
-
- changes by Paul Eggert
-
- Added information in "tz-art.htm" on a Seinfeld reference to DST.
-
- Error checking and messages in the "yearistype" script have been
- improved.
-
-
-Release 2000e - 2000-07-31 09:27:54 -0400
-
- data changes by Paul Eggert
-
- a change to the default value of the defined constant HAVE_STRERROR
-
- the addition of a Dave Barry quote on DST to the tz-arts file
-
-
-Release 2000d - 2000-04-20 15:43:04 -0400
-
- changes to the documentation and code of strftime for C99 conformance
-
- a bug fix for date.c
-
- These are based on (though modified from) changes by Paul Eggert.
-
-
-Release 2000c - 2000-03-04 10:31:43 -0500
-
- changes by Paul Eggert
-
-
-Release 2000b - 2000-02-21 12:16:29 -0500
-
- changes by Paul Eggert and Joseph Myers
-
- modest tweaks to the tz-art.htm and tz-link.htm files
-
-
-Release 2000a - 2000-01-18 09:21:26 -0500
-
- changes by Paul Eggert
-
- The two hypertext documents have also been renamed.
-
-
-Release code1999i-data1999j - 1999-11-15 18:43:22 -0500
-
- Paul Eggert's changes
-
- additions to the "zic" manual page and the "Arts.htm" file
-
-
-Release code1999h-data1999i - 1999-11-08 14:55:21 -0500
-
- [not summarized]
-
-
-Release data1999h - 1999-10-07 03:50:29 -0400
-
- changes by Paul Eggert to "europe" (most importantly, fixing
- Lithuania and Estonia)
-
-
-Release 1999g - 1999-09-28 11:06:18 -0400
-
- data changes by Paul Eggert (most importantly, the change for
- Lebanon that buys correctness for this coming Sunday)
-
- The "code" file contains changes to "Makefile" and "checktab.awk" to
- allow better checking of time zone files before they are published.
-
-
-Release 1999f - 1999-09-23 09:48:14 -0400
-
- changes by Arthur David Olson and Paul Eggert
-
-
-Release 1999e - 1999-08-17 15:20:54 -0400
-
- changes circulated by Paul Eggert, although the change to handling
- of DST-specifying time zone names has been commented out for now
- (search for "XXX" in "localtime.c" for details). These files also
- do not make any changes to the start of DST in Brazil.
-
- In addition to Paul's changes, there are updates to "Arts.htm" and
- cleanups of URLs.
-
-
-Release 1999d - 1999-03-30 11:31:07 -0500
-
- changes by Paul Eggert
-
- The Makefile's "make public" rule has also been changed to do a test
- compile of each individual time zone data file (which should help
- avoid problems such as the one we had with Nicosia).
-
-
-Release 1999c - 1999-03-25 09:47:47 -0500
-
- changes by Paul Eggert, most importantly the change for Chile.
-
-
-Release 1999b - 1999-02-01 17:51:44 -0500
-
- changes by Paul Eggert
-
- code changes (suggested by Mani Varadarajan, mani at be.com) for
- correct handling of symbolic links when building using a relative directory
-
- code changes to generate correct messages for failed links
-
- updates to the URLs in Arts.htm
-
-
-Release 1999a - 1999-01-19 16:20:29 -0500
-
- error message internationalizations and corrections in zic.c and
- zdump.c (as suggested by Vladimir Michl, vladimir.michl at upol.cz,
- to whom thanks!)
-
-
-Release code1998h-data1998i - 1998-10-01 09:56:10 -0400
-
- changes for Brazil, Chile, and Germany
-
- support for use of "24:00" in the input files for the time zone compiler
-
-
-Release code1998g-data1998h - 1998-09-24 10:50:28 -0400
-
- changes by Paul Eggert
-
- correction to a define in the "private.h" file
-
-
-Release data1998g - 1998-08-11 03:28:35 -0000
- [tzdata1998g.tar.gz is missing!]
-
- Lithuanian change provided by mgedmin at pub.osf.it
-
- Move creation of the GMT link with Etc/GMT to "etcetera" (from
- "backward") to ensure that the GMT file is created even where folks
- don't want the "backward" links (as suggested by Paul Eggert).
-
-
-Release data1998f - 1998-07-20 13:50:00 -0000
- [tzdata1998f.tar.gz is missing!]
-
- Update the "leapseconds" file to include the newly-announced
- insertion at the end of 1998.
-
-
-Release code1998f - 1998-06-01 10:18:31 -0400
-
- addition to localtime.c by Guy Harris
-
-
-Release 1998e - 1998-05-28 09:56:26 -0400
-
- The Makefile is changed to produce zoneinfo-posix rather than
- zoneinfo/posix, and to produce zoneinfo-leaps rather than
- zoneinfo/right.
-
- data changes by Paul Eggert
-
- changes from Guy Harris to provide asctime_r and ctime_r
-
- A usno1998 file (substantially identical to usno1997) has been added.
-
-
-Release 1998d - 1998-05-14 11:58:34 -0400
-
- changes to comments (in particular, elimination of references to CIA maps).
- "Arts.htm", "WWW.htm", "asia", and "australasia" are the only places
- where changes occur.
-
-
-Release 1998c - 1998-02-28 12:32:26 -0500
-
- changes by Paul Eggert (save the "French correction," on which I'll
- wait for the dust to settle)
-
- symlink changes
-
- changes and additions to Arts.htm
-
-
-Release 1998b - 1998-01-17 14:31:51 -0500
-
- URL cleanups and additions
-
-
-Release 1998a - 1998-01-13 12:37:35 -0500
-
- changes by Paul Eggert
-
-
-Release code1997i-data1997k - 1997-12-29 09:53:41 -0500
-
- changes by Paul Eggert, with minor modifications from Arthur David
- Olson to make the files more browser friendly
-
-
-Release code1997h-data1997j - 1997-12-18 17:47:35 -0500
-
- minor changes to put "TZif" at the start of each time zone information file
-
- a rule has also been added to the Makefile so you can
- make zones
- to just recompile the zone information files (rather than doing a
- full "make install" with its other effects).
-
-
-Release data1997i - 1997-10-07 08:45:38 -0400
-
- changes to Africa by Paul Eggert
-
-
-Release code1997g-data1997h - 1997-09-04 16:56:54 -0400
-
- corrections for Uruguay (and other locations)
-
- Arthur David Olson's simple-minded fix allowing mktime to both
- correctly handle leap seconds and correctly handle tm_sec values
- upon which arithmetic has been performed.
-
-
-Release code1997f-data1997g - 1997-07-19 13:15:02 -0400
-
- Paul Eggert's updates
-
- a small change to a function prototype;
-
- "Music" has been renamed "Arts.htm", HTMLified, and augmented to
- include information on Around the World in Eighty Days.
-
-
-Release code1997e-data1997f - 1997-05-03 18:52:34 -0400
-
- fixes to zic's error handling
-
- changes inspired by the item circulated on Slovenia
-
- The description of Web resources has been HTMLified for browsing
- convenience.
-
- A new piece of tz-related music has been added to the "Music" file.
-
-
-Release code1997d-data1997e - 1997-03-29 12:48:52 -0500
-
- Paul Eggert's latest suggestions
-
-
-Release code1997c-data1997d - 1997-03-07 20:37:54 -0500
-
- changes to "zic.c" to correct performance of the "-s" option
-
- a new file "usno1997"
-
-
-Release data1997c - 1997-03-04 09:58:18 -0500
-
- changes in Israel
-
-
-Release 1997b - 1997-02-27 18:34:19 -0500
-
- The data file incorporates the 1997 leap second.
-
- The code file incorporates Arthur David Olson's take on the
- zic/multiprocessor/directory-creation situation.
-
-
-Release 1997a - 1997-01-21 09:11:10 -0500
-
- Paul Eggert's Antarctica (and other changes)
-
- Arthur David Olson finessed the "getopt" issue by checking against
- both -1 and EOF (regardless of POSIX, SunOS 4.1.1's manual says -1
- is returned while SunOS 5.5's manual says EOF is returned).
-
-
-Release code1996o-data1996n - 1996-12-27 21:42:05 -0500
-
- Paul Eggert's latest changes
-
-
-Release code1996n - 1996-12-16 09:42:02 -0500
-
- link snapping fix from Bruce Evans (via Garrett Wollman)
-
-
-Release data1996m - 1996-11-24 02:37:34 -0000
- [tzdata1996m.tar.gz is missing!]
-
- Paul Eggert's batch of changes
-
-
-Release code1996m-data1996l - 1996-11-05 14:00:12 -0500
-
- No functional changes here; the files have simply been changed to
- make more use of ISO style dates in comments. The names of the above
- files now include the year in full.
-
-
-Release code96l - 1996-09-08 17:12:20 -0400
-
- tzcode96k was missing a couple of pieces.
-
-
-Release 96k - 1996-09-08 16:06:22 -0400
-
- the latest round of changes from Paul Eggert
-
- the recent Year 2000 material
-
-
-Release code96j - 1996-07-30 13:18:53 -0400
-
- Set sp->typecnt as suggested by Timothy Patrick Murphy.
-
-
-Release code96i - 1996-07-27 20:11:35 -0400
-
- Paul's suggested patch for strftime %V week numbers
-
-
-Release data96i - 1996-07-01 18:13:04 -0400
-
- "northamerica" and "europe" changes by Paul Eggert
-
-
-Release code96h - 1996-06-05 08:02:21 -0400
-
- fix for handling transitions specified in Universal Time
-
- Some "public domain" notices have also been added.
-
-
-Release code96g - 1996-05-16 14:00:26 -0400
-
- fix for the simultaneous-DST-and-zone-change challenge
-
-
-Release data96h - 1996-05-09 17:40:51 -0400
-
- changes by Paul Eggert
-
-
-Release code96f-data96g - 1996-05-03 03:09:59 -0000
- [tzcode96f.tar.gz + tzdata96g.tar.gz are both missing!]
-
- The changes get us some of the way to fixing the problems noted in Paul
- Eggert's letter yesterday (in addition to a few others). The approach
- has been to make zic a bit smarter about figuring out what time zone
- abbreviations apply just after the time specified in the "UNTIL" part
- of a zone line. Putting the smarts in zic means avoiding having
- transition times show up in both "Zone" lines and "Rule" lines, which
- in turn avoids multiple transition time entries in time zone files.
- (This also makes the zic input files such as "europe" a bit shorter and
- should ease maintenance.)
-
-
-Release data96f - 1996-04-19 19:20:03 -0000
- [tzdata96f.tar.gz is missing!]
-
- The only changes are to the "northamerica" file; the time zone
- abbreviation for Denver is corrected to MST (and MDT), and the
- comments for Mexico have been updated.
-
-
-Release data96e - 1996-03-19 17:37:26 -0500
-
- Proposals by Paul Eggert, in particular the Portugal change that
- comes into play at the end of this month.
-
-
-Release data96d - 1996-03-18 20:49:39 -0500
-
- [not summarized]
-
-
-Release code96e - 1996-02-29 15:43:27 -0000
- [tzcode96e.tar.gz is missing!]
-
- internationalization changes and the fix to the documentation for strftime
-
-
-Release code96d-data96c - 1996-02-12 11:05:27 -0500
-
- The "code" file simply updates Bob Kridle's electronic address.
-
- The "data" file updates rules for Mexico.
-
-
-Release data96b - 1996-01-27 15:44:42 -0500
-
- Kiribati change
-
-
-Release code96c - 1996-01-16 16:58:15 -0500
-
- leap-year streamlining and binary-search changes
-
- fix to newctime.3
-
-
-Release code96b - 1996-01-10 20:42:39 -0500
-
- fixes and enhancements from Paul Eggert, including code that
- emulates the behavior of recent versions of the SunOS "date"
- command.
-
-
-Release 96a - 1996-01-06 09:08:24 -0500
-
- Israel updates
-
- fixes to strftime.c for correct ISO 8601 week number generation,
- plus support for two new formats ('G' and 'g') to give ISO 8601 year
- numbers (which are not necessarily the same as calendar year numbers)
-
-
-Release code95i-data95m - 1995-12-21 12:46:47 -0500
-
- The latest revisions from Paul Eggert are included, the usno1995
- file has been updated, and a new file ("WWW") covering useful URLs
- has been added.
-
-
-Release code95h-data95l - 1995-12-19 18:10:12 -0500
-
- A simplification of a macro definition, a change to data for Sudan,
- and (for last minute shoppers) notes in the "Music" file on the CD
- "Old Man Time".
-
-
-Release code95g-data95k - 1995-10-30 10:32:47 -0500
-
- (slightly reformatted) 8-bit-clean proposed patch
-
- minor patch: US/Eastern -> America/New_York
-
- snapshot of the USNO's latest data ("usno1995")
-
- some other minor cleanups
-
-
-Release code95f-data95j - 1995-10-28 21:01:34 -0000
- [tzcode95f.tar.gz + tzdata95j.tar.gz are both missing!]
-
- European cleanups
-
- support for 64-bit time_t's
-
- optimization in localtime.c
-
-
-Release code95e - 1995-10-13 13:23:57 -0400
-
- the mktime change to scan from future to past when trying to find time zone
- offsets
-
-
-Release data95i - 1995-09-26 10:43:26 -0400
-
- For Canada/Central, guess that the Sun customer's "one week too
- early" was just a approximation, and the true error is one month
- too early. This is consistent with the rest of Canada.
-
-
-Release data95h - 1995-09-21 11:26:48 -0400
-
- latest changes from Paul Eggert
-
-
-Release code95d - 1995-09-14 11:14:45 -0400
-
- the addition of a "Music" file, which documents four recorded
- versions of the tune "Save That Time".
-
-
-Release data95g - 1995-09-01 17:21:36 -0400
-
- "yearistype" correction
-
-
-Release data95f - 1995-08-28 20:46:56 -0400
-
- Paul Eggert's change to the australasia file
-
-
-Release data95e - 1995-07-08 18:02:34 -0400
-
- The only change is a leap second at the end of this year.
- Thanks to Bradley White for forwarding news on the leap second.
-
-
-Release data95d - 1995-07-03 13:26:22 -0400
-
- Paul Eggert's changes
-
-
-Release data95c - 1995-07-02 19:19:28 -0400
-
- changes to "asia", "backward", "europe", and "southamerica"
- (read: northamericacentrics need not apply)
-
-
-Release code95c - 1995-03-13 14:00:46 -0500
-
- one-line fix for sign extension problems in detzcode
-
-
-Release 95b - 1995-03-04 11:22:38 -0500
-
- Minor changes in both:
-
- The "code" file contains a workaround for the lack of "unistd.h" in
- Microsoft C++ version 7.
-
- The "data" file contains a fixed "Link" for America/Shiprock.
-
-
-Release 94h - 1994-12-10 12:51:14 -0500
-
- The files:
-
- * incorporate the changes to "zdump" and "date" to make changes to
- the "TZ" environment variable permanent;
-
- * incorporate the table changes by Paul Eggert;
-
- * include (and document) support for universal time specifications in
- data files - but do not (yet) include use of this feature in the
- data files.
-
- Think of this as "TZ Classic" - the software has been set up not to break if
- universal time shows up in its input, and data entries have been
- left as is so as not to break existing implementations.
-
-
-Release data94f - 1994-08-20 12:56:09 -0400
-
- (with thanks!) the latest data updates from Paul Eggert
-
-
-Release data94e - 1994-06-04 13:13:53 -0400
-
- [not summarized]
-
-
-Release code94g - 1994-05-05 12:14:07 -0400
-
- fix missing "optind.c" and a reference to it in the Makefile
-
-
-Release code94f - 1994-05-05 13:00:33 -0000
- [tzcode94f.tar.gz is missing!]
-
- changes to avoid overflow in difftime, as well as changes to cope
- with the 52/53 challenge in strftime
-
-
-Release code94e - 1994-03-30 23:32:59 -0500
-
- change for the benefit of PCTS
-
-
-Release 94d - 1994-02-24 15:42:25 -0500
-
- Avoid clashes with POSIX semantics for zones such as GMT+4.
-
- Some other very minor housekeeping is also present.
-
-
-Release code94c - 1994-02-10 08:52:40 -0500
-
- Fix bug where mkdirs was broken unless you compile with
- -fwritable-strings (which is generally losing to do).
-
-
-Release 94b - 1994-02-07 10:04:33 -0500
-
- work by Paul Eggert who notes:
-
- I found another book of time zone histories by E W Whitman; it's not
- as extensive as Shanks but has a few goodies of its own. I used it
- to update the tables. I also fixed some more as a result of
- correspondence with Adam David and Peter Ilieve, and move some stray
- links from 'europe' to 'backward'. I corrected some scanning errors
- in usno1989.
-
- As far as the code goes, I fixed zic to allow years in the range
- INT_MIN to INT_MAX; this fixed a few boundary conditions around 1900.
- And I cleaned up the zic documentation a little bit.
-
-
-Release data94a - 1994-02-03 08:58:54 -0500
-
- It simply incorporates the recently announced leap second into the
- "leapseconds" file.
-
-
-Release 93g - 1993-11-22 17:28:27 -0500
-
- Paul Eggert has provided a good deal of historic information (based
- on Shanks), and there are some code changes to deal with the buglets
- that crawled out in dealing with the new information.
-
-
-Release 93f - 1993-10-15 12:27:46 -0400
-
- Paul Eggert's changes
-
-
-Release 93e - 1993-09-05 21:21:44 -0400
-
- This has updated data for Israel, England, and Kwajalein. There's
- also an update to "zdump" to cope with Kwajalein's 24-hour jump.
- Thanks to Paul Eggert and Peter Ilieve for the changes.
-
-
-Release 93d - 1993-06-17 23:34:17 -0400
-
- new fix and new data on Israel
-
-
-Release 93c - 1993-06-06 19:31:55 -0400
-
- [not summarized]
-
-
-Release 93b - 1993-02-02 14:53:58 -0500
-
- updated "leapseconds" file
-
-
-Release 93 - 1993-01-08 07:01:06 -0500
-
- At kre's suggestion, the package has been split in two - a code piece
- (which also includes documentation) that's only of use to folks who
- want to recompile things and a data piece useful to anyone who can
- run "zic".
-
- The new version has a few changes to the data files, a few
- portability changes, and an off-by-one fix (with thanks to
- Tom Karzes at deshaw.com for providing a description and a
- solution).
-
-
-Release 92c - 1992-11-21 17:35:36 -0000
- [tz92c.tar.Z is missing!]
-
- The fallout from the latest round of DST transitions.
-
- There are changes for Portugal, Saskatchewan, and "Pacific-New";
- there's also a change to "zic.c" that makes it portable to more systems.
-
-
-Release 92 - 1992-04-25 18:17:03 -0000
- [tz92.tar.Z is missing!]
-
- By popular demand (well, at any rate, following a request by kre at munnari)
-
-
-The 1989 update of the time zone package featured:
-
- * POSIXization (including interpretation of POSIX-style TZ environment
- variables, provided by Guy Harris),
- * ANSIfication (including versions of "mktime" and "difftime"),
- * SVIDulation (an "altzone" variable)
- * MACHination (the "gtime" function)
- * corrections to some time zone data (including corrections to the rules
- for Great Britain and New Zealand)
- * reference data from the United States Naval Observatory for folks who
- want to do additional time zones
- * and the 1989 data for Saudi Arabia.
-
- (Since this code will be treated as "part of the implementation" in some
- places and as "part of the application" in others, there's no good way to
- name functions, such as timegm, that are not part of the proposed ANSI C
- standard; such functions have kept their old, underscore-free names in this
- update.)
-
- And the "dysize" function has disappeared; it was present to allow
- compilation of the "date" command on old BSD systems, and a version of "date"
- is now provided in the package. The "date" command is not created when you
- "make all" since it may lack options provided by the version distributed with
- your operating system, or may not interact with the system in the same way
- the native version does.
-
- Since POSIX frowns on correct leap second handling, the default behavior of
- the "zic" command (in the absence of a "-L" option) has been changed to omit
- leap second information from its output files.
-
-
------
-Notes
-
-This file contains copies of the part of each release announcement
-that talks about the changes in that release. The text has been
-adapted and reformatted for the purposes of this file.
-
-Typically a release R consists of a pair of tarball files,
-tzcodeR.tar.gz and tzdataR.tar.gz. However, some releases (e.g.,
-code2010a, data2012c) consist of just one or the other tarball, and a
-few (e.g., code2012c-data2012d) have tarballs with mixed version
-numbers.
-
-Release time stamps are taken from the release's commit (for newer,
-git releases), from the newest file in the tarball (for older
-releases, where this info is available) or from the email announcing
-the release (if all else fails; these are marked with a time zone of
--0000 and an "is missing!" comment).
-
-Earlier versions of the code and data were not announced on the tz
-list and are not summarized here.
-
-This file is in the public domain.
-
-Local Variables:
-coding: utf-8
-End:
Deleted: vendor/tzcode/dist/README
===================================================================
--- vendor/tzcode/dist/README 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/README 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,63 +0,0 @@
-README for the tz distribution
-
-"What time is it?" -- Richard Deacon as The King
-"Any time you want it to be." -- Frank Baxter as The Scientist
- (from the Bell System film "About Time")
-
-The Time Zone Database (often called tz or zoneinfo) contains code and
-data that represent the history of local time for many representative
-locations around the globe. It is updated periodically to reflect
-changes made by political bodies to time zone boundaries, UTC offsets,
-and daylight-saving rules.
-
-Here is a recipe for acquiring, building, installing, and testing the
-tz distribution on a GNU/Linux or similar host.
-
- mkdir tz
- cd tz
- wget --retr-symlinks 'ftp://ftp.iana.org/tz/tz*-latest.tar.gz'
- gzip -dc tzcode-latest.tar.gz | tar -xf -
- gzip -dc tzdata-latest.tar.gz | tar -xf -
-
-Be sure to read the comments in "Makefile" and make any changes needed
-to make things right for your system, especially if you are using some
-platform other than GNU/Linux. Then run the following commands,
-substituting your desired installation directory for "$HOME/tzdir":
-
- make TOPDIR=$HOME/tzdir install
- $HOME/tzdir/etc/zdump -v America/Los_Angeles
-
-Historical local time information has been included here to:
-
-* provide a compendium of data about the history of civil time
- that is useful even if not 100% accurate;
-
-* give an idea of the variety of local time rules that have
- existed in the past and thus an idea of the variety that may be
- expected in the future;
-
-* provide a test of the generality of the local time rule description
- system.
-
-The information in the time zone data files is by no means authoritative;
-fixes and enhancements are welcome. Please see the file CONTRIBUTING
-for details.
-
-Thanks to these Time Zone Caballeros who've made major contributions to the
-time conversion package: Keith Bostic; Bob Devine; Paul Eggert; Robert Elz;
-Guy Harris; Mark Horton; John Mackin; and Bradley White. Thanks also to
-Michael Bloom, Art Neilson, Stephen Prince, John Sovereign, and Frank Wales
-for testing work, and to Gwillim Law for checking local mean time data.
-Thanks in particular to Arthur David Olson, the project's founder and first
-maintainer, to whom the time zone community owes the greatest debt of all.
-None of them are responsible for remaining errors.
-
-Look in <ftp://ftp.iana.org/tz/releases/> for updated versions of these files.
-
-Please send comments or information to tz at iana.org.
-
------
-
-This file is in the public domain, so clarified as of 2009-05-17 by
-Arthur David Olson. The other files in this distribution are either
-public domain or BSD licensed; see the file LICENSE for details.
Deleted: vendor/tzcode/dist/Theory
===================================================================
--- vendor/tzcode/dist/Theory 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/Theory 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,796 +0,0 @@
-Theory and pragmatics of the tz code and data
-
-
------ Outline -----
-
- Scope of the tz database
- Names of time zone rules
- Time zone abbreviations
- Accuracy of the tz database
- Time and date functions
- Calendrical issues
- Time and time zones on Mars
-
-
------ Scope of the tz database -----
-
-The tz database attempts to record the history and predicted future of
-all computer-based clocks that track civil time. To represent this
-data, the world is partitioned into regions whose clocks all agree
-about time stamps that occur after the somewhat-arbitrary cutoff point
-of the POSIX Epoch (1970-01-01 00:00:00 UTC). For each such region,
-the database records all known clock transitions, and labels the region
-with a notable location. Although 1970 is a somewhat-arbitrary
-cutoff, there are significant challenges to moving the cutoff earlier
-even by a decade or two, due to the wide variety of local practices
-before computer timekeeping became prevalent.
-
-Clock transitions before 1970 are recorded for each such location,
-because most systems support time stamps before 1970 and could
-misbehave if data entries were omitted for pre-1970 transitions.
-However, the database is not designed for and does not suffice for
-applications requiring accurate handling of all past times everywhere,
-as it would take far too much effort and guesswork to record all
-details of pre-1970 civil timekeeping.
-
-As described below, reference source code for using the tz database is
-also available. The tz code is upwards compatible with POSIX, an
-international standard for UNIX-like systems. As of this writing, the
-current edition of POSIX is:
-
- The Open Group Base Specifications Issue 7
- IEEE Std 1003.1, 2013 Edition
- <http://pubs.opengroup.org/onlinepubs/9699919799/>
-
-
-
------ Names of time zone rules -----
-
-Each of the database's time zone rules has a unique name.
-Inexperienced users are not expected to select these names unaided.
-Distributors should provide documentation and/or a simple selection
-interface that explains the names; for one example, see the 'tzselect'
-program in the tz code. The Unicode Common Locale Data Repository
-<http://cldr.unicode.org/> contains data that may be useful for other
-selection interfaces.
-
-The time zone rule naming conventions attempt to strike a balance
-among the following goals:
-
- * Uniquely identify every region where clocks have agreed since 1970.
- This is essential for the intended use: static clocks keeping local
- civil time.
-
- * Indicate to experts where that region is.
-
- * Be robust in the presence of political changes. For example, names
- of countries are ordinarily not used, to avoid incompatibilities
- when countries change their name (e.g. Zaire->Congo) or when
- locations change countries (e.g. Hong Kong from UK colony to
- China).
-
- * Be portable to a wide variety of implementations.
-
- * Use a consistent naming conventions over the entire world.
-
-Names normally have the form AREA/LOCATION, where AREA is the name
-of a continent or ocean, and LOCATION is the name of a specific
-location within that region. North and South America share the same
-area, 'America'. Typical names are 'Africa/Cairo', 'America/New_York',
-and 'Pacific/Honolulu'.
-
-Here are the general rules used for choosing location names,
-in decreasing order of importance:
-
- Use only valid POSIX file name components (i.e., the parts of
- names other than '/'). Do not use the file name
- components '.' and '..'. Within a file name component,
- use only ASCII letters, '.', '-' and '_'. Do not use
- digits, as that might create an ambiguity with POSIX
- TZ strings. A file name component must not exceed 14
- characters or start with '-'. E.g., prefer 'Brunei'
- to 'Bandar_Seri_Begawan'. Exceptions: see the discussion
- of legacy names below.
- A name must not be empty, or contain '//', or start or end with '/'.
- Do not use names that differ only in case. Although the reference
- implementation is case-sensitive, some other implementations
- are not, and they would mishandle names differing only in case.
- If one name A is an initial prefix of another name AB (ignoring case),
- then B must not start with '/', as a regular file cannot have
- the same name as a directory in POSIX. For example,
- 'America/New_York' precludes 'America/New_York/Bronx'.
- Uninhabited regions like the North Pole and Bouvet Island
- do not need locations, since local time is not defined there.
- There should typically be at least one name for each ISO 3166-1
- officially assigned two-letter code for an inhabited country
- or territory.
- If all the clocks in a region have agreed since 1970,
- don't bother to include more than one location
- even if subregions' clocks disagreed before 1970.
- Otherwise these tables would become annoyingly large.
- If a name is ambiguous, use a less ambiguous alternative;
- e.g. many cities are named San José and Georgetown, so
- prefer 'Costa_Rica' to 'San_Jose' and 'Guyana' to 'Georgetown'.
- Keep locations compact. Use cities or small islands, not countries
- or regions, so that any future time zone changes do not split
- locations into different time zones. E.g. prefer 'Paris'
- to 'France', since France has had multiple time zones.
- Use mainstream English spelling, e.g. prefer 'Rome' to 'Roma', and
- prefer 'Athens' to the Greek 'Αθήνα' or the Romanized 'Athína'.
- The POSIX file name restrictions encourage this rule.
- Use the most populous among locations in a zone,
- e.g. prefer 'Shanghai' to 'Beijing'. Among locations with
- similar populations, pick the best-known location,
- e.g. prefer 'Rome' to 'Milan'.
- Use the singular form, e.g. prefer 'Canary' to 'Canaries'.
- Omit common suffixes like '_Islands' and '_City', unless that
- would lead to ambiguity. E.g. prefer 'Cayman' to
- 'Cayman_Islands' and 'Guatemala' to 'Guatemala_City',
- but prefer 'Mexico_City' to 'Mexico' because the country
- of Mexico has several time zones.
- Use '_' to represent a space.
- Omit '.' from abbreviations in names, e.g. prefer 'St_Helena'
- to 'St._Helena'.
- Do not change established names if they only marginally
- violate the above rules. For example, don't change
- the existing name 'Rome' to 'Milan' merely because
- Milan's population has grown to be somewhat greater
- than Rome's.
- If a name is changed, put its old spelling in the 'backward' file.
- This means old spellings will continue to work.
-
-The file 'zone1970.tab' lists geographical locations used to name time
-zone rules. It is intended to be an exhaustive list of names for
-geographic regions as described above; this is a subset of the names
-in the data. Although a 'zone1970.tab' location's longitude
-corresponds to its LMT offset with one hour for every 15 degrees east
-longitude, this relationship is not exact.
-
-Older versions of this package used a different naming scheme,
-and these older names are still supported.
-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').
-
-Older versions of this package defined legacy names that are
-incompatible with the first rule of location names, but which are
-still supported. These legacy names are mostly defined in the file
-'etcetera'. Also, the file 'backward' defines the legacy names
-'GMT0', 'GMT-0', 'GMT+0' and 'Canada/East-Saskatchewan', and the file
-'northamerica' defines the legacy names 'EST5EDT', 'CST6CDT',
-'MST7MDT', and 'PST8PDT'.
-
-Excluding 'backward' should not affect the other data. If
-'backward' is excluded, excluding 'etcetera' should not affect the
-remaining data.
-
-
------ Time zone abbreviations -----
-
-When this package is installed, it generates time zone abbreviations
-like 'EST' to be compatible with human tradition and POSIX.
-Here are the general rules used for choosing time zone abbreviations,
-in decreasing order of importance:
-
- Use three or more characters that are ASCII alphanumerics or '+' or '-'.
- Previous editions of this database also used characters like
- ' ' and '?', but these characters have a special meaning to
- the shell and cause commands like
- set `date`
- to have unexpected effects.
- Previous editions of this rule required upper-case letters,
- but the Congressman who introduced Chamorro Standard Time
- preferred "ChST", so lower-case letters are now allowed.
- Also, POSIX from 2001 on relaxed the rule to allow '-', '+',
- and alphanumeric characters from the portable character set
- in the current locale. In practice ASCII alphanumerics and
- '+' and '-' are safe in all locales.
-
- In other words, in the C locale the POSIX extended regular
- expression [-+[:alnum:]]{3,} should match the abbreviation.
- This guarantees that all abbreviations could have been
- specified by a POSIX TZ string.
-
- Use abbreviations that are in common use among English-speakers,
- e.g. 'EST' for Eastern Standard Time in North America.
- We assume that applications translate them to other languages
- as part of the normal localization process; for example,
- a French application might translate 'EST' to 'HNE'.
-
- For zones whose times are taken from a city's longitude, use the
- traditional xMT notation, e.g. 'PMT' for Paris Mean Time.
- The only name like this in current use is 'GMT'.
-
- Use 'LMT' for local mean time of locations before the introduction
- of standard time; see "Scope of the tz database".
-
- If there is no common English abbreviation, use numeric offsets like
- -05 and +0830 that are generated by zic's %z notation.
-
- [The remaining guidelines predate the introduction of %z.
- They are problematic as they mean tz data entries invent
- notation rather than record it. These guidelines are now
- deprecated and the plan is to gradually move to %z for
- inhabited locations and to "-00" for uninhabited locations.]
-
- If there is no common English abbreviation, abbreviate the English
- translation of the usual phrase used by native speakers.
- If this is not available or is a phrase mentioning the country
- (e.g. "Cape Verde Time"), then:
-
- When a country is identified with a single or principal zone,
- append 'T' to the country's ISO code, e.g. 'CVT' for
- Cape Verde Time. For summer time append 'ST';
- for double summer time append 'DST'; etc.
- Otherwise, take the first three letters of an English place
- name identifying each zone and append 'T', 'ST', etc.
- as before; e.g. 'VLAST' for VLAdivostok Summer Time.
-
- Use UT (with time zone abbreviation '-00') for locations while
- uninhabited. The leading '-' is a flag that the time
- zone is in some sense undefined; this notation is
- derived from Internet RFC 3339.
-
-Application writers should note that these abbreviations are ambiguous
-in practice: e.g. 'CST' has a different meaning in China than
-it does in the United States. In new applications, it's often better
-to use numeric UT offsets like '-0600' instead of time zone
-abbreviations like 'CST'; this avoids the ambiguity.
-
-
------ Accuracy of the tz database -----
-
-The tz database is not authoritative, and it surely has errors.
-Corrections are welcome and encouraged; see the file CONTRIBUTING.
-Users requiring authoritative data should consult national standards
-bodies and the references cited in the database's comments.
-
-Errors in the tz database arise from many sources:
-
- * The tz database predicts future time stamps, and current predictions
- will be incorrect after future governments change the rules.
- For example, if today someone schedules a meeting for 13:00 next
- October 1, Casablanca time, and tomorrow Morocco changes its
- daylight saving rules, software can mess up after the rule change
- if it blithely relies on conversions made before the change.
-
- * The pre-1970 entries in this database cover only a tiny sliver of how
- clocks actually behaved; the vast majority of the necessary
- information was lost or never recorded. Thousands more zones would
- be needed if the tz database's scope were extended to cover even
- just the known or guessed history of standard time; for example,
- the current single entry for France would need to split into dozens
- of entries, perhaps hundreds. And in most of the world even this
- approach would be misleading due to widespread disagreement or
- indifference about what times should be observed. In her 2015 book
- "The Global Transformation of Time, 1870-1950", Vanessa Ogle writes
- "Outside of Europe and North America there was no system of time
- zones at all, often not even a stable landscape of mean times,
- prior to the middle decades of the twentieth century". See:
- Timothy Shenk, Booked: A Global History of Time. Dissent 2015-12-17
- https://www.dissentmagazine.org/blog/booked-a-global-history-of-time-vanessa-ogle
-
- * Most of the pre-1970 data entries come from unreliable sources, often
- astrology books that lack citations and whose compilers evidently
- invented entries when the true facts were unknown, without
- reporting which entries were known and which were invented.
- These books often contradict each other or give implausible entries,
- and on the rare occasions when they are checked they are
- typically found to be incorrect.
-
- * For the UK the tz database relies on years of first-class work done by
- Joseph Myers and others; see <http://www.polyomino.org.uk/british-time/>.
- Other countries are not done nearly as well.
-
- * Sometimes, different people in the same city would maintain clocks
- that differed significantly. Railway time was used by railroad
- companies (which did not always agree with each other),
- church-clock time was used for birth certificates, etc.
- Often this was merely common practice, but sometimes it was set by law.
- For example, from 1891 to 1911 the UT offset in France was legally
- 0:09:21 outside train stations and 0:04:21 inside.
-
- * Although a named location in the tz database stands for the
- containing region, its pre-1970 data entries are often accurate for
- only a small subset of that region. For example, Europe/London
- stands for the United Kingdom, but its pre-1847 times are valid
- only for locations that have London's exact meridian, and its 1847
- transition to GMT is known to be valid only for the L&NW and the
- Caledonian railways.
-
- * The tz database does not record the earliest time for which a zone's
- data entries are thereafter valid for every location in the region.
- For example, Europe/London is valid for all locations in its
- region after GMT was made the standard time, but the date of
- standardization (1880-08-02) is not in the tz database, other than
- in commentary. For many zones the earliest time of validity is
- unknown.
-
- * The tz database does not record a region's boundaries, and in many
- cases the boundaries are not known. For example, the zone
- America/Kentucky/Louisville represents a region around the city of
- Louisville, the boundaries of which are unclear.
-
- * Changes that are modeled as instantaneous transitions in the tz
- database were often spread out over hours, days, or even decades.
-
- * Even if the time is specified by law, locations sometimes
- deliberately flout the law.
-
- * Early timekeeping practices, even assuming perfect clocks, were
- often not specified to the accuracy that the tz database requires.
-
- * Sometimes historical timekeeping was specified more precisely
- than what the tz database can handle. For example, from 1909 to
- 1937 Netherlands clocks were legally UT+00:19:32.13, but the tz
- database cannot represent the fractional second.
-
- * Even when all the timestamp transitions recorded by the tz database
- are correct, the tz rules that generate them may not faithfully
- reflect the historical rules. For example, from 1922 until World
- War II the UK moved clocks forward the day following the third
- Saturday in April unless that was Easter, in which case it moved
- clocks forward the previous Sunday. Because the tz database has no
- way to specify Easter, these exceptional years are entered as
- separate tz Rule lines, even though the legal rules did not change.
-
- * The tz database models pre-standard time using the proleptic Gregorian
- calendar and local mean time (LMT), but many people used other
- calendars and other timescales. For example, the Roman Empire used
- the Julian calendar, and had 12 varying-length daytime hours with a
- non-hour-based system at night.
-
- * Early clocks were less reliable, and data entries do not represent
- this unreliability.
-
- * As for leap seconds, civil time was not based on atomic time before
- 1972, and we don't know the history of earth's rotation accurately
- enough to map SI seconds to historical solar time to more than
- about one-hour accuracy. See: Morrison LV, Stephenson FR.
- Historical values of the Earth's clock error Delta T and the
- calculation of eclipses. J Hist Astron. 2004;35:327-36
- <http://adsabs.harvard.edu/full/2004JHA....35..327M>;
- Historical values of the Earth's clock error. J Hist Astron. 2005;36:339
- <http://adsabs.harvard.edu/full/2005JHA....36..339M>.
-
- * The relationship between POSIX time (that is, UTC but ignoring leap
- seconds) and UTC is not agreed upon after 1972. Although the POSIX
- clock officially stops during an inserted leap second, at least one
- proposed standard has it jumping back a second instead; and in
- practice POSIX clocks more typically either progress glacially during
- a leap second, or are slightly slowed while near a leap second.
-
- * The tz database does not represent how uncertain its information is.
- Ideally it would contain information about when data entries are
- incomplete or dicey. Partial temporal knowledge is a field of
- active research, though, and it's not clear how to apply it here.
-
-In short, many, perhaps most, of the tz database's pre-1970 and future
-time stamps are either wrong or misleading. Any attempt to pass the
-tz database off as the definition of time should be unacceptable to
-anybody who cares about the facts. In particular, the tz database's
-LMT offsets should not be considered meaningful, and should not prompt
-creation of zones merely because two locations differ in LMT or
-transitioned to standard time at different dates.
-
-
------ Time and date functions -----
-
-The tz code contains time and date functions that are upwards
-compatible with those of POSIX.
-
-POSIX has the following properties and limitations.
-
-* In POSIX, time display in a process is controlled by the
- environment variable TZ. Unfortunately, the POSIX TZ string takes
- a form that is hard to describe and is error-prone in practice.
- Also, POSIX TZ strings can't deal with other (for example, Israeli)
- daylight saving time rules, or situations where more than two
- time zone abbreviations are used in an area.
-
- The POSIX TZ string takes the following form:
-
- stdoffset[dst[offset][,date[/time],date[/time]]]
-
- where:
-
- std and dst
- are 3 or more characters specifying the standard
- and daylight saving time (DST) zone names.
- Starting with POSIX.1-2001, std and dst may also be
- in a quoted form like "<UTC+10>"; this allows
- "+" and "-" in the names.
- offset
- is of the form '[+-]hh:[mm[:ss]]' and specifies the
- offset west of UT. 'hh' may be a single digit; 0<=hh<=24.
- The default DST offset is one hour ahead of standard time.
- date[/time],date[/time]
- specifies the beginning and end of DST. If this is absent,
- the system supplies its own rules for DST, and these can
- differ from year to year; typically US DST rules are used.
- time
- takes the form 'hh:[mm[:ss]]' and defaults to 02:00.
- This is the same format as the offset, except that a
- leading '+' or '-' is not allowed.
- date
- takes one of the following forms:
- Jn (1<=n<=365)
- origin-1 day number not counting February 29
- n (0<=n<=365)
- origin-0 day number counting February 29 if present
- Mm.n.d (0[Sunday]<=d<=6[Saturday], 1<=n<=5, 1<=m<=12)
- for the dth day of week n of month m of the year,
- where week 1 is the first week in which day d appears,
- and '5' stands for the last week in which day d appears
- (which may be either the 4th or 5th week).
- Typically, this is the only useful form;
- the n and Jn forms are rarely used.
-
- Here is an example POSIX TZ string, for US Pacific time using rules
- appropriate from 1987 through 2006:
-
- TZ='PST8PDT,M4.1.0/02:00,M10.5.0/02:00'
-
- This POSIX TZ string is hard to remember, and mishandles time stamps
- before 1987 and after 2006. With this package you can use this
- instead:
-
- TZ='America/Los_Angeles'
-
-* POSIX does not define the exact meaning of TZ values like "EST5EDT".
- Typically the current US DST rules are used to interpret such values,
- but this means that the US DST rules are compiled into each program
- that does time conversion. This means that when US time conversion
- rules change (as in the United States in 1987), all programs that
- do time conversion must be recompiled to ensure proper results.
-
-* In POSIX, there's no tamper-proof way for a process to learn the
- system's best idea of local wall clock. (This is important for
- applications that an administrator wants used only at certain times -
- without regard to whether the user has fiddled the "TZ" environment
- variable. While an administrator can "do everything in UTC" to get
- around the problem, doing so is inconvenient and precludes handling
- daylight saving time shifts - as might be required to limit phone
- calls to off-peak hours.)
-
-* POSIX requires that systems ignore leap seconds.
-
-* The tz code attempts to support all the time_t implementations
- allowed by POSIX. The time_t type represents a nonnegative count of
- seconds since 1970-01-01 00:00:00 UTC, ignoring leap seconds.
- In practice, time_t is usually a signed 64- or 32-bit integer; 32-bit
- signed time_t values stop working after 2038-01-19 03:14:07 UTC, so
- new implementations these days typically use a signed 64-bit integer.
- Unsigned 32-bit integers are used on one or two platforms,
- and 36-bit and 40-bit integers are also used occasionally.
- Although earlier POSIX versions allowed time_t to be a
- floating-point type, this was not supported by any practical
- systems, and POSIX.1-2013 and the tz code both require time_t
- to be an integer type.
-
-These are the extensions that have been made to the POSIX functions:
-
-* The "TZ" environment variable is used in generating the name of a file
- from which time zone information is read (or is interpreted a la
- POSIX); "TZ" is no longer constrained to be a three-letter time zone
- name followed by a number of hours and an optional three-letter
- daylight time zone name. The daylight saving time rules to be used
- for a particular time zone are encoded in the time zone file;
- the format of the file allows U.S., Australian, and other rules to be
- encoded, and allows for situations where more than two time zone
- abbreviations are used.
-
- It was recognized that allowing the "TZ" environment variable to
- take on values such as "America/New_York" might cause "old" programs
- (that expect "TZ" to have a certain form) to operate incorrectly;
- consideration was given to using some other environment variable
- (for example, "TIMEZONE") to hold the string used to generate the
- time zone information file name. In the end, however, it was decided
- to continue using "TZ": it is widely used for time zone purposes;
- separately maintaining both "TZ" and "TIMEZONE" seemed a nuisance;
- and systems where "new" forms of "TZ" might cause problems can simply
- use TZ values such as "EST5EDT" which can be used both by
- "new" programs (a la POSIX) and "old" programs (as zone names and
- offsets).
-
-* To handle places where more than two time zone abbreviations are used,
- the functions "localtime" and "gmtime" set tzname[tmp->tm_isdst]
- (where "tmp" is the value the function returns) to the time zone
- abbreviation to be used. This differs from POSIX, where the elements
- of tzname are only changed as a result of calls to tzset.
-
-* Since the "TZ" environment variable can now be used to control time
- conversion, the "daylight" and "timezone" variables are no longer
- needed. (These variables are defined and set by "tzset"; however, their
- values will not be used by "localtime.")
-
-* The "localtime" function has been set up to deliver correct results
- for near-minimum or near-maximum time_t values. (A comment in the
- source code tells how to get compatibly wrong results).
-
-* A function "tzsetwall" has been added to arrange for the system's
- best approximation to local wall clock time to be delivered by
- subsequent calls to "localtime." Source code for portable
- applications that "must" run on local wall clock time should call
- "tzsetwall();" if such code is moved to "old" systems that don't
- provide tzsetwall, you won't be able to generate an executable program.
- (These time zone functions also arrange for local wall clock time to be
- used if tzset is called - directly or indirectly - and there's no "TZ"
- environment variable; portable applications should not, however, rely
- on this behavior since it's not the way SVR2 systems behave.)
-
-* Negative time_t values are supported, on systems where time_t is signed.
-
-* These functions can account for leap seconds, thanks to Bradley White.
-
-Points of interest to folks with other systems:
-
-* This package is already part of many POSIX-compliant hosts,
- including BSD, HP, Linux, Network Appliance, SCO, SGI, and Sun.
- On such hosts, the primary use of this package
- is to update obsolete time zone rule tables.
- To do this, you may need to compile the time zone compiler
- 'zic' supplied with this package instead of using the system 'zic',
- since the format of zic's input changed slightly in late 1994,
- and many vendors still do not support the new input format.
-
-* The UNIX Version 7 "timezone" function is not present in this package;
- it's impossible to reliably map timezone's arguments (a "minutes west
- of GMT" value and a "daylight saving time in effect" flag) to a
- time zone abbreviation, and we refuse to guess.
- Programs that in the past used the timezone function may now examine
- tzname[localtime(&clock)->tm_isdst] to learn the correct time
- zone abbreviation to use. Alternatively, use
- localtime(&clock)->tm_zone if this has been enabled.
-
-* The 4.2BSD gettimeofday function is not used in this package.
- This formerly let users obtain the current UTC offset and DST flag,
- but this functionality was removed in later versions of BSD.
-
-* In SVR2, time conversion fails for near-minimum or near-maximum
- time_t values when doing conversions for places that don't use UT.
- This package takes care to do these conversions correctly.
-
-The functions that are conditionally compiled if STD_INSPIRED is defined
-should, at this point, be looked on primarily as food for thought. They are
-not in any sense "standard compatible" - some are not, in fact, specified in
-*any* standard. They do, however, represent responses of various authors to
-standardization proposals.
-
-Other time conversion proposals, in particular the one developed by folks at
-Hewlett Packard, offer a wider selection of functions that provide capabilities
-beyond those provided here. The absence of such functions from this package
-is not meant to discourage the development, standardization, or use of such
-functions. Rather, their absence reflects the decision to make this package
-contain valid extensions to POSIX, to ensure its broad acceptability. If
-more powerful time conversion functions can be standardized, so much the
-better.
-
-
------ Calendrical issues -----
-
-Calendrical issues are a bit out of scope for a time zone database,
-but they indicate the sort of problems that we would run into if we
-extended the time zone database further into the past. An excellent
-resource in this area is Nachum Dershowitz and Edward M. Reingold,
-Calendrical Calculations: Third Edition, Cambridge University Press (2008)
-<http://emr.cs.iit.edu/home/reingold/calendar-book/third-edition/>.
-Other information and sources are given below. They sometimes disagree.
-
-
-France
-
-Gregorian calendar adopted 1582-12-20.
-French Revolutionary calendar used 1793-11-24 through 1805-12-31,
-and (in Paris only) 1871-05-06 through 1871-05-23.
-
-
-Russia
-
-From Chris Carrier (1996-12-02):
-On 1929-10-01 the Soviet Union instituted an "Eternal Calendar"
-with 30-day months plus 5 holidays, with a 5-day week.
-On 1931-12-01 it changed to a 6-day week; in 1934 it reverted to the
-Gregorian calendar while retaining the 6-day week; on 1940-06-27 it
-reverted to the 7-day week. With the 6-day week the usual days
-off were the 6th, 12th, 18th, 24th and 30th of the month.
-(Source: Evitiar Zerubavel, _The Seven Day Circle_)
-
-
-Mark Brader reported a similar story in "The Book of Calendars", edited
-by Frank Parise (1982, Facts on File, ISBN 0-8719-6467-8), page 377. But:
-
-From: Petteri Sulonen (via Usenet)
-Date: 14 Jan 1999 00:00:00 GMT
-...
-
-If your source is correct, how come documents between 1929 and 1940 were
-still dated using the conventional, Gregorian calendar?
-
-I can post a scan of a document dated December 1, 1934, signed by
-Yenukidze, the secretary, on behalf of Kalinin, the President of the
-Executive Committee of the Supreme Soviet, if you like.
-
-
-
-Sweden (and Finland)
-
-From: Mark Brader
-Subject: Re: Gregorian reform - a part of locale?
-<news:1996Jul6.012937.29190 at sq.com>
-Date: 1996-07-06
-
-In 1700, Denmark made the transition from Julian to Gregorian. Sweden
-decided to *start* a transition in 1700 as well, but rather than have one of
-those unsightly calendar gaps :-), they simply decreed that the next leap
-year after 1696 would be in 1744 - putting the whole country on a calendar
-different from both Julian and Gregorian for a period of 40 years.
-
-However, in 1704 something went wrong and the plan was not carried through;
-they did, after all, have a leap year that year. And one in 1708. In 1712
-they gave it up and went back to Julian, putting 30 days in February that
-year!...
-
-Then in 1753, Sweden made the transition to Gregorian in the usual manner,
-getting there only 13 years behind the original schedule.
-
-(A previous posting of this story was challenged, and Swedish readers
-produced the following references to support it: "Tideräkning och historia"
-by Natanael Beckman (1924) and "Tid, en bok om tideräkning och
-kalenderväsen" by Lars-Olof Lodén (1968).
-
-
-Grotefend's data
-
-From: "Michael Palmer" [with one obvious typo fixed]
-Subject: Re: Gregorian Calendar (was Re: Another FHC related question
-Newsgroups: soc.genealogy.german
-Date: Tue, 9 Feb 1999 02:32:48 -800
-...
-
-The following is a(n incomplete) listing, arranged chronologically, of
-European states, with the date they converted from the Julian to the
-Gregorian calendar:
-
-04/15 Oct 1582 - Italy (with exceptions), Spain, Portugal, Poland (Roman
- Catholics and Danzig only)
-09/20 Dec 1582 - France, Lorraine
-
-21 Dec 1582/
- 01 Jan 1583 - Holland, Brabant, Flanders, Hennegau
-10/21 Feb 1583 - bishopric of Liege (Lüttich)
-13/24 Feb 1583 - bishopric of Augsburg
-04/15 Oct 1583 - electorate of Trier
-05/16 Oct 1583 - Bavaria, bishoprics of Freising, Eichstedt, Regensburg,
- Salzburg, Brixen
-13/24 Oct 1583 - Austrian Oberelsaß and Breisgau
-20/31 Oct 1583 - bishopric of Basel
-02/13 Nov 1583 - duchy of Jülich-Berg
-02/13 Nov 1583 - electorate and city of Köln
-04/15 Nov 1583 - bishopric of Würzburg
-11/22 Nov 1583 - electorate of Mainz
-16/27 Nov 1583 - bishopric of Strassburg and the margraviate of Baden
-17/28 Nov 1583 - bishopric of Münster and duchy of Cleve
-14/25 Dec 1583 - Steiermark
-
-06/17 Jan 1584 - Austria and Bohemia
-11/22 Jan 1584 - Lucerne, Uri, Schwyz, Zug, Freiburg, Solothurn
-12/23 Jan 1584 - Silesia and the Lausitz
-22 Jan/
- 02 Feb 1584 - Hungary (legally on 21 Oct 1587)
- Jun 1584 - Unterwalden
-01/12 Jul 1584 - duchy of Westfalen
-
-16/27 Jun 1585 - bishopric of Paderborn
-
-14/25 Dec 1590 - Transylvania
-
-22 Aug/
- 02 Sep 1612 - duchy of Prussia
-
-13/24 Dec 1614 - Pfalz-Neuburg
-
- 1617 - duchy of Kurland (reverted to the Julian calendar in
- 1796)
-
- 1624 - bishopric of Osnabrück
-
- 1630 - bishopric of Minden
-
-15/26 Mar 1631 - bishopric of Hildesheim
-
- 1655 - Kanton Wallis
-
-05/16 Feb 1682 - city of Strassburg
-
-18 Feb/
- 01 Mar 1700 - Protestant Germany (including Swedish possessions in
- Germany), Denmark, Norway
-30 Jun/
- 12 Jul 1700 - Gelderland, Zutphen
-10 Nov/
- 12 Dec 1700 - Utrecht, Overijssel
-
-31 Dec 1700/
- 12 Jan 1701 - Friesland, Groningen, Zürich, Bern, Basel, Geneva,
- Turgau, and Schaffhausen
-
- 1724 - Glarus, Appenzell, and the city of St. Gallen
-
-01 Jan 1750 - Pisa and Florence
-
-02/14 Sep 1752 - Great Britain
-
-17 Feb/
- 01 Mar 1753 - Sweden
-
-1760-1812 - Graubünden
-
-The Russian empire (including Finland and the Baltic states) did not
-convert to the Gregorian calendar until the Soviet revolution of 1917.
-
-Source: H. Grotefend, _Taschenbuch der Zeitrechnung des deutschen
-Mittelalters und der Neuzeit_, herausgegeben von Dr. O. Grotefend
-(Hannover: Hahnsche Buchhandlung, 1941), pp. 26-28.
-
-
------ Time and time zones on Mars -----
-
-Some people's work schedules use Mars time. Jet Propulsion Laboratory
-(JPL) coordinators have kept Mars time on and off at least since 1997
-for the Mars Pathfinder mission. Some of their family members have
-also adapted to Mars time. Dozens of special Mars watches were built
-for JPL workers who kept Mars time during the Mars Exploration
-Rovers mission (2004). These timepieces look like normal Seikos and
-Citizens but use Mars seconds rather than terrestrial seconds.
-
-A Mars solar day is called a "sol" and has a mean period equal to
-about 24 hours 39 minutes 35.244 seconds in terrestrial time. It is
-divided into a conventional 24-hour clock, so each Mars second equals
-about 1.02749125 terrestrial seconds.
-
-The prime meridian of Mars goes through the center of the crater
-Airy-0, named in honor of the British astronomer who built the
-Greenwich telescope that defines Earth's prime meridian. Mean solar
-time on the Mars prime meridian is called Mars Coordinated Time (MTC).
-
-Each landed mission on Mars has adopted a different reference for
-solar time keeping, so there is no real standard for Mars time zones.
-For example, the Mars Exploration Rover project (2004) defined two
-time zones "Local Solar Time A" and "Local Solar Time B" for its two
-missions, each zone designed so that its time equals local true solar
-time at approximately the middle of the nominal mission. Such a "time
-zone" is not particularly suited for any application other than the
-mission itself.
-
-Many calendars have been proposed for Mars, but none have achieved
-wide acceptance. Astronomers often use Mars Sol Date (MSD) which is a
-sequential count of Mars solar days elapsed since about 1873-12-29
-12:00 GMT.
-
-The tz database does not currently support Mars time, but it is
-documented here in the hopes that support will be added eventually.
-
-Sources:
-
-Michael Allison and Robert Schmunk,
-"Technical Notes on Mars Solar Time as Adopted by the Mars24 Sunclock"
-<http://www.giss.nasa.gov/tools/mars24/help/notes.html> (2012-08-08).
-
-Jia-Rui Chong, "Workdays Fit for a Martian", Los Angeles Times
-<http://articles.latimes.com/2004/jan/14/science/sci-marstime14>
-(2004-01-14), pp A1, A20-A21.
-
-Tom Chmielewski, "Jet Lag Is Worse on Mars", The Atlantic (2015-02-26)
-<http://www.theatlantic.com/technology/archive/2015/02/jet-lag-is-worse-on-mars/386033/>
-
------
-
-This file is in the public domain, so clarified as of 2009-05-17 by
-Arthur David Olson.
-
------
-Local Variables:
-coding: utf-8
-End:
Deleted: vendor/tzcode/dist/asctime.c
===================================================================
--- vendor/tzcode/dist/asctime.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/asctime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,128 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson.
-*/
-
-/*
-** Avoid the temptation to punt entirely to strftime;
-** the output of strftime is supposed to be locale specific
-** whereas the output of asctime is supposed to be constant.
-*/
-
-/*LINTLIBRARY*/
-
-#include "private.h"
-#include "tzfile.h"
-
-/*
-** Some systems only handle "%.2d"; others only handle "%02d";
-** "%02.2d" makes (most) everybody happy.
-** At least some versions of gcc warn about the %02.2d;
-** we conditionalize below to avoid the warning.
-*/
-/*
-** All years associated with 32-bit time_t values are exactly four digits long;
-** some years associated with 64-bit time_t values are not.
-** Vintage programs are coded for years that are always four digits long
-** and may assume that the newline always lands in the same place.
-** For years that are less than four digits, we pad the output with
-** leading zeroes to get the newline in the traditional place.
-** The -4 ensures that we get four characters of output even if
-** we call a strftime variant that produces fewer characters for some years.
-** The ISO C 1999 and POSIX 1003.1-2004 standards prohibit padding the year,
-** but many implementations pad anyway; most likely the standards are buggy.
-*/
-#ifdef __GNUC__
-#define ASCTIME_FMT "%.3s %.3s%3d %2.2d:%2.2d:%2.2d %-4s\n"
-#else /* !defined __GNUC__ */
-#define ASCTIME_FMT "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %-4s\n"
-#endif /* !defined __GNUC__ */
-/*
-** For years that are more than four digits we put extra spaces before the year
-** so that code trying to overwrite the newline won't end up overwriting
-** a digit within a year and truncating the year (operating on the assumption
-** that no output is better than wrong output).
-*/
-#ifdef __GNUC__
-#define ASCTIME_FMT_B "%.3s %.3s%3d %2.2d:%2.2d:%2.2d %s\n"
-#else /* !defined __GNUC__ */
-#define ASCTIME_FMT_B "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %s\n"
-#endif /* !defined __GNUC__ */
-
-#define STD_ASCTIME_BUF_SIZE 26
-/*
-** Big enough for something such as
-** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n
-** (two three-character abbreviations, five strings denoting integers,
-** seven explicit spaces, two explicit colons, a newline,
-** and a trailing NUL byte).
-** The values above are for systems where an int is 32 bits and are provided
-** as an example; the define below calculates the maximum for the system at
-** hand.
-*/
-#define MAX_ASCTIME_BUF_SIZE (2*3+5*INT_STRLEN_MAXIMUM(int)+7+2+1+1)
-
-static char buf_asctime[MAX_ASCTIME_BUF_SIZE];
-
-/*
-** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
-*/
-
-char *
-asctime_r(register const struct tm *timeptr, char *buf)
-{
- static const char wday_name[][3] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
- };
- static const char mon_name[][3] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
- };
- register const char * wn;
- register const char * mn;
- char year[INT_STRLEN_MAXIMUM(int) + 2];
- char result[MAX_ASCTIME_BUF_SIZE];
-
- if (timeptr == NULL) {
- errno = EINVAL;
- return strcpy(buf, "??? ??? ?? ??:??:?? ????\n");
- }
- if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK)
- wn = "???";
- else wn = wday_name[timeptr->tm_wday];
- if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR)
- mn = "???";
- else mn = mon_name[timeptr->tm_mon];
- /*
- ** Use strftime's %Y to generate the year, to avoid overflow problems
- ** when computing timeptr->tm_year + TM_YEAR_BASE.
- ** Assume that strftime is unaffected by other out-of-range members
- ** (e.g., timeptr->tm_mday) when processing "%Y".
- */
- strftime(year, sizeof year, "%Y", timeptr);
- /*
- ** We avoid using snprintf since it's not available on all systems.
- */
- sprintf(result,
- ((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B),
- wn, mn,
- timeptr->tm_mday, timeptr->tm_hour,
- timeptr->tm_min, timeptr->tm_sec,
- year);
- if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime)
- return strcpy(buf, result);
- else {
- errno = EOVERFLOW;
- return NULL;
- }
-}
-
-/*
-** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
-*/
-
-char *
-asctime(register const struct tm *timeptr)
-{
- return asctime_r(timeptr, buf_asctime);
-}
Deleted: vendor/tzcode/dist/checktab.awk
===================================================================
--- vendor/tzcode/dist/checktab.awk 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/checktab.awk 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,157 +0,0 @@
-# Check tz tables for consistency.
-
-# Contributed by Paul Eggert.
-
-BEGIN {
- FS = "\t"
-
- if (!iso_table) iso_table = "iso3166.tab"
- if (!zone_table) zone_table = "zone.tab"
- if (!want_warnings) want_warnings = -1
-
- while (getline <iso_table) {
- iso_NR++
- if ($0 ~ /^#/) continue
- if (NF != 2) {
- printf "%s:%d: wrong number of columns\n", \
- iso_table, iso_NR >>"/dev/stderr"
- status = 1
- }
- cc = $1
- name = $2
- if (cc !~ /^[A-Z][A-Z]$/) {
- printf "%s:%d: invalid country code `%s'\n", \
- iso_table, iso_NR, cc >>"/dev/stderr"
- status = 1
- }
- if (cc <= cc0) {
- if (cc == cc0) {
- s = "duplicate";
- } else {
- s = "out of order";
- }
-
- printf "%s:%d: country code `%s' is %s\n", \
- iso_table, iso_NR, cc, s \
- >>"/dev/stderr"
- status = 1
- }
- cc0 = cc
- if (name2cc[name]) {
- printf "%s:%d: `%s' and `%s' have the sname name\n", \
- iso_table, iso_NR, name2cc[name], cc \
- >>"/dev/stderr"
- status = 1
- }
- name2cc[name] = cc
- cc2name[cc] = name
- cc2NR[cc] = iso_NR
- }
-
- zone_table = "zone.tab"
- cc0 = ""
-
- while (getline <zone_table) {
- zone_NR++
- if ($0 ~ /^#/) continue
- if (NF != 3 && NF != 4) {
- printf "%s:%d: wrong number of columns\n", \
- zone_table, zone_NR >>"/dev/stderr"
- status = 1
- }
- cc = $1
- coordinates = $2
- tz = $3
- comments = $4
- if (cc < cc0) {
- printf "%s:%d: country code `%s' is out of order\n", \
- zone_table, zone_NR, cc >>"/dev/stderr"
- status = 1
- }
- cc0 = cc
- if (tz2cc[tz]) {
- printf "%s:%d: %s: duplicate TZ column\n", \
- zone_table, zone_NR, tz >>"/dev/stderr"
- status = 1
- }
- tz2cc[tz] = cc
- tz2comments[tz] = comments
- tz2NR[tz] = zone_NR
- if (cc2name[cc]) {
- cc_used[cc]++
- } else {
- printf "%s:%d: %s: unknown country code\n", \
- zone_table, zone_NR, cc >>"/dev/stderr"
- status = 1
- }
- if (coordinates !~ /^[-+][0-9][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9]$/ \
- && coordinates !~ /^[-+][0-9][0-9][0-5][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9][0-5][0-9]$/) {
- printf "%s:%d: %s: invalid coordinates\n", \
- zone_table, zone_NR, coordinates >>"/dev/stderr"
- status = 1
- }
- }
-
- for (tz in tz2cc) {
- if (cc_used[tz2cc[tz]] == 1) {
- if (tz2comments[tz]) {
- printf "%s:%d: unnecessary comment `%s'\n", \
- zone_table, tz2NR[tz], tz2comments[tz] \
- >>"/dev/stderr"
- status = 1
- }
- } else {
- if (!tz2comments[tz]) {
- printf "%s:%d: missing comment\n", \
- zone_table, tz2NR[tz] >>"/dev/stderr"
- status = 1
- }
- }
- }
-
- FS = " "
-}
-
-{
- tz = ""
- if ($1 == "Zone") tz = $2
- if ($1 == "Link") {
- # Ignore Link commands if source and destination basenames
- # are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
- src = $2
- dst = $3
- while ((i = index(src, "/"))) src = substr(src, i+1)
- while ((i = index(dst, "/"))) dst = substr(dst, i+1)
- if (src != dst) tz = $3
- }
- if (tz && tz ~ /\//) {
- if (!tz2cc[tz]) {
- printf "%s: no data for `%s'\n", zone_table, tz \
- >>"/dev/stderr"
- status = 1
- }
- zoneSeen[tz] = 1
- }
-}
-
-END {
- for (tz in tz2cc) {
- if (!zoneSeen[tz]) {
- printf "%s:%d: no Zone table for `%s'\n", \
- zone_table, tz2NR[tz], tz >>"/dev/stderr"
- status = 1
- }
- }
-
- if (0 < want_warnings) {
- for (cc in cc2name) {
- if (!cc_used[cc]) {
- printf "%s:%d: warning: " \
- "no Zone entries for %s (%s)\n", \
- iso_table, cc2NR[cc], cc, cc2name[cc]
- }
- }
- }
-
- exit status
-}
Deleted: vendor/tzcode/dist/date.1
===================================================================
--- vendor/tzcode/dist/date.1 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/date.1 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,164 +0,0 @@
-.TH DATE 1
-.SH NAME
-date \- show and set date and time
-.SH SYNOPSIS
-.if n .nh
-.if n .na
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.B date
-[
-.B \*-u
-] [
-.B \*-c
-] [
-.B \*-r
-.I seconds
-] [
-.BI + format
-] [
-\fR[\fIyyyy\fR]\fImmddhhmm\fR[\fIyy\fR][\fB.\fIss\fR]
-]
-.SH DESCRIPTION
-.ie '\(lq'' .ds lq \&"\"
-.el .ds lq \(lq\"
-.ie '\(rq'' .ds rq \&"\"
-.el .ds rq \(rq\"
-.de q
-\\$3\*(lq\\$1\*(rq\\$2
-..
-.I Date
-without arguments writes the date and time to the standard output in
-the form
-.ce 1
-Wed Mar 8 14:54:40 EST 1989
-.br
-with
-.B EST
-replaced by the local time zone's abbreviation
-(or by the abbreviation for the time zone specified in the
-.B TZ
-environment variable if set).
-The exact output format depends on the locale.
-.PP
-If a command-line argument starts with a plus sign (\c
-.q "\fB+\fP" ),
-the rest of the argument is used as a
-.I format
-that controls what appears in the output.
-In the format, when a percent sign (\c
-.q "\fB%\fP"
-appears,
-it and the character after it are not output,
-but rather identify part of the date or time
-to be output in a particular way
-(or identify a special character to output):
-.nf
-.sp
-.if t .in +.5i
-.if n .in +2
-.ta \w'%M\0\0'u +\w'Wed Mar 8 14:54:40 EST 1989\0\0'u
- Sample output Explanation
-%a Wed Abbreviated weekday name*
-%A Wednesday Full weekday name*
-%b Mar Abbreviated month name*
-%B March Full month name*
-%c Wed Mar 08 14:54:40 1989 Date and time*
-%C 19 Century
-%d 08 Day of month (always two digits)
-%D 03/08/89 Month/day/year (eight characters)
-%e 8 Day of month (leading zero blanked)
-%h Mar Abbreviated month name*
-%H 14 24-hour-clock hour (two digits)
-%I 02 12-hour-clock hour (two digits)
-%j 067 Julian day number (three digits)
-%k 2 12-hour-clock hour (leading zero blanked)
-%l 14 24-hour-clock hour (leading zero blanked)
-%m 03 Month number (two digits)
-%M 54 Minute (two digits)
-%n \\n newline character
-%p PM AM/PM designation
-%r 02:54:40 PM Hour:minute:second AM/PM designation
-%R 14:54 Hour:minute
-%S 40 Second (two digits)
-%t \\t tab character
-%T 14:54:40 Hour:minute:second
-%U 10 Sunday-based week number (two digits)
-%w 3 Day number (one digit, Sunday is 0)
-%W 10 Monday-based week number (two digits)
-%x 03/08/89 Date*
-%X 14:54:40 Time*
-%y 89 Last two digits of year
-%Y 1989 Year in full
-%Z EST Time zone abbreviation
-%+ Wed Mar 8 14:54:40 EST 1989 Default output format*
-.if t .in -.5i
-.if n .in -2
-* The exact output depends on the locale.
-.sp
-.fi
-If a character other than one of those shown above appears after
-a percent sign in the format,
-that following character is output.
-All other characters in the format are copied unchanged to the output;
-a newline character is always added at the end of the output.
-.PP
-In Sunday-based week numbering,
-the first Sunday of the year begins week 1;
-days preceding it are part of
-.q "week 0" .
-In Monday-based week numbering,
-the first Monday of the year begins week 1.
-.PP
-To set the date, use a command line argument with one of the following forms:
-.nf
-.if t .in +.5i
-.if n .in +2
-.ta \w'198903081454\0'u
-1454 24-hour-clock hours (first two digits) and minutes
-081454 Month day (first two digits), hours, and minutes
-03081454 Month (two digits, January is 01), month day, hours, minutes
-8903081454 Year, month, month day, hours, minutes
-0308145489 Month, month day, hours, minutes, year
- (on System V-compatible systems)
-030814541989 Month, month day, hours, minutes, four-digit year
-198903081454 Four-digit year, month, month day, hours, minutes
-.if t .in -.5i
-.if n .in -2
-.fi
-If the century, year, month, or month day is not given,
-the current value is used.
-Any of the above forms may be followed by a period and two digits that give
-the seconds part of the new time; if no seconds are given, zero is assumed.
-.PP
-These options are available:
-.TP
-.BR \*-u " or " \*-c
-Use Universal Time when setting and showing the date and time.
-.TP
-.BI "\*-r " seconds
-Output the date that corresponds to
-.I seconds
-past the epoch of 1970-01-01 00:00:00 UTC, where
-.I seconds
-should be an integer, either decimal, octal (leading 0), or
-hexadecimal (leading 0x), preceded by an optional sign.
-.SH FILES
-.ta \w'/usr/local/etc/zoneinfo/posixrules\0\0'u
-/usr/lib/locale/\f2L\fP/LC_TIME description of time locale \f2L\fP
-.br
-/usr/local/etc/zoneinfo time zone information directory
-.br
-/usr/local/etc/zoneinfo/localtime local time zone file
-.br
-/usr/local/etc/zoneinfo/posixrules used with POSIX-style TZ's
-.br
-/usr/local/etc/zoneinfo/GMT for UTC leap seconds
-.sp
-If
-.B /usr/local/etc/zoneinfo/GMT
-is absent,
-UTC leap seconds are loaded from
-.BR /usr/local/etc/zoneinfo/posixrules .
-.\" This file is in the public domain, so clarified as of
-.\" 2009-05-17 by Arthur David Olson.
Deleted: vendor/tzcode/dist/date.1.txt
===================================================================
--- vendor/tzcode/dist/date.1.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/date.1.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,106 +0,0 @@
-DATE(1) General Commands Manual DATE(1)
-
-NAME
- date - show and set date and time
-
-SYNOPSIS
- date [ -u ] [ -c ] [ -r seconds ] [ +format ] [ [yyyy]mmddhhmm[yy][.ss]
- ]
-
-DESCRIPTION
- Date without arguments writes the date and time to the standard output
- in the form
- Wed Mar 8 14:54:40 EST 1989
- with EST replaced by the local time zone's abbreviation (or by the
- abbreviation for the time zone specified in the TZ environment variable
- if set). The exact output format depends on the locale.
-
- If a command-line argument starts with a plus sign ("+"), the rest of
- the argument is used as a format that controls what appears in the
- output. In the format, when a percent sign ("%" appears, it and the
- character after it are not output, but rather identify part of the date
- or time to be output in a particular way (or identify a special
- character to output):
-
- Sample output Explanation
- %a Wed Abbreviated weekday name*
- %A Wednesday Full weekday name*
- %b Mar Abbreviated month name*
- %B March Full month name*
- %c Wed Mar 08 14:54:40 1989 Date and time*
- %C 19 Century
- %d 08 Day of month (always two digits)
- %D 03/08/89 Month/day/year (eight characters)
- %e 8 Day of month (leading zero blanked)
- %h Mar Abbreviated month name*
- %H 14 24-hour-clock hour (two digits)
- %I 02 12-hour-clock hour (two digits)
- %j 067 Julian day number (three digits)
- %k 2 12-hour-clock hour (leading zero blanked)
- %l 14 24-hour-clock hour (leading zero blanked)
- %m 03 Month number (two digits)
- %M 54 Minute (two digits)
- %n \n newline character
- %p PM AM/PM designation
- %r 02:54:40 PM Hour:minute:second AM/PM designation
- %R 14:54 Hour:minute
- %S 40 Second (two digits)
- %t \t tab character
- %T 14:54:40 Hour:minute:second
- %U 10 Sunday-based week number (two digits)
- %w 3 Day number (one digit, Sunday is 0)
- %W 10 Monday-based week number (two digits)
- %x 03/08/89 Date*
- %X 14:54:40 Time*
- %y 89 Last two digits of year
- %Y 1989 Year in full
- %Z EST Time zone abbreviation
- %+ Wed Mar 8 14:54:40 EST 1989 Default output format*
- * The exact output depends on the locale.
-
- If a character other than one of those shown above appears after a
- percent sign in the format, that following character is output. All
- other characters in the format are copied unchanged to the output; a
- newline character is always added at the end of the output.
-
- In Sunday-based week numbering, the first Sunday of the year begins
- week 1; days preceding it are part of "week 0". In Monday-based week
- numbering, the first Monday of the year begins week 1.
-
- To set the date, use a command line argument with one of the following
- forms:
- 1454 24-hour-clock hours (first two digits) and minutes
- 081454 Month day (first two digits), hours, and minutes
- 03081454 Month (two digits, January is 01), month day, hours, minutes
- 8903081454 Year, month, month day, hours, minutes
- 0308145489 Month, month day, hours, minutes, year
- (on System V-compatible systems)
- 030814541989 Month, month day, hours, minutes, four-digit year
- 198903081454 Four-digit year, month, month day, hours, minutes
- If the century, year, month, or month day is not given, the current
- value is used. Any of the above forms may be followed by a period and
- two digits that give the seconds part of the new time; if no seconds
- are given, zero is assumed.
-
- These options are available:
-
- -u or -c
- Use Universal Time when setting and showing the date and time.
-
- -r seconds
- Output the date that corresponds to seconds past the epoch of
- 1970-01-01 00:00:00 UTC, where seconds should be an integer,
- either decimal, octal (leading 0), or hexadecimal (leading 0x),
- preceded by an optional sign.
-
-FILES
- /usr/lib/locale/L/LC_TIME description of time locale L
- /usr/local/etc/zoneinfo time zone information directory
- /usr/local/etc/zoneinfo/localtime local time zone file
- /usr/local/etc/zoneinfo/posixrules used with POSIX-style TZ's
- /usr/local/etc/zoneinfo/GMT for UTC leap seconds
-
- If /usr/local/etc/zoneinfo/GMT is absent, UTC leap seconds are loaded
- from /usr/local/etc/zoneinfo/posixrules.
-
- DATE(1)
Deleted: vendor/tzcode/dist/date.c
===================================================================
--- vendor/tzcode/dist/date.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/date.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,238 +0,0 @@
-/* Display or set the current time and date. */
-
-/* Copyright 1985, 1987, 1988 The Regents of the University of California.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE. */
-
-#include "private.h"
-#include "locale.h"
-
-/*
-** The two things date knows about time are. . .
-*/
-
-#ifndef TM_YEAR_BASE
-#define TM_YEAR_BASE 1900
-#endif /* !defined TM_YEAR_BASE */
-
-#ifndef SECSPERMIN
-#define SECSPERMIN 60
-#endif /* !defined SECSPERMIN */
-
-#if !HAVE_POSIX_DECLS
-extern char ** environ;
-extern char * optarg;
-extern int optind;
-extern char * tzname[];
-#endif
-
-static int retval = EXIT_SUCCESS;
-
-static void display(const char *, time_t);
-static void dogmt(void);
-static void errensure(void);
-static void timeout(FILE *, const char *, const struct tm *);
-static void usage(void);
-
-int
-main(const int argc, char *argv[])
-{
- register const char * format;
- register const char * cp;
- register int ch;
- register bool rflag = false;
- time_t t;
- intmax_t secs;
- char * endarg;
-
-#ifdef LC_ALL
- setlocale(LC_ALL, "");
-#endif /* defined(LC_ALL) */
-#if HAVE_GETTEXT
-#ifdef TZ_DOMAINDIR
- bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
-#endif /* defined(TEXTDOMAINDIR) */
- textdomain(TZ_DOMAIN);
-#endif /* HAVE_GETTEXT */
- t = time(NULL);
- format = NULL;
- while ((ch = getopt(argc, argv, "ucr:")) != EOF && ch != -1) {
- switch (ch) {
- default:
- usage();
- case 'u': /* do it in UT */
- case 'c':
- dogmt();
- break;
- case 'r': /* seconds since 1970 */
- if (rflag) {
- fprintf(stderr,
- _("date: error: multiple -r's used"));
- usage();
- }
- rflag = true;
- errno = 0;
- secs = strtoimax (optarg, &endarg, 0);
- if (*endarg || optarg == endarg)
- errno = EINVAL;
- else if (! (time_t_min <= secs && secs <= time_t_max))
- errno = ERANGE;
- if (errno) {
- perror(optarg);
- errensure();
- exit(retval);
- }
- t = secs;
- break;
- }
- }
- while (optind < argc) {
- cp = argv[optind++];
- if (*cp == '+')
- if (format == NULL)
- format = cp + 1;
- else {
- fprintf(stderr,
-_("date: error: multiple formats in command line\n"));
- usage();
- }
- else {
- fprintf(stderr, _("date: unknown operand: %s\n"), cp);
- usage();
- }
- }
-
- display(format, t);
- return retval;
-}
-
-static void
-dogmt(void)
-{
- static char ** fakeenv;
-
- if (fakeenv == NULL) {
- register int from;
- register int to;
- register int n;
- static char tzegmt0[] = "TZ=GMT0";
-
- for (n = 0; environ[n] != NULL; ++n)
- continue;
- fakeenv = malloc((n + 2) * sizeof *fakeenv);
- if (fakeenv == NULL) {
- perror(_("Memory exhausted"));
- errensure();
- exit(retval);
- }
- to = 0;
- fakeenv[to++] = tzegmt0;
- for (from = 1; environ[from] != NULL; ++from)
- if (strncmp(environ[from], "TZ=", 3) != 0)
- fakeenv[to++] = environ[from];
- fakeenv[to] = NULL;
- environ = fakeenv;
- }
-}
-
-static void
-errensure(void)
-{
- if (retval == EXIT_SUCCESS)
- retval = EXIT_FAILURE;
-}
-
-static void
-usage(void)
-{
- fprintf(stderr,
- _("date: usage: date [-u] [-c] [-r seconds]"
- " [+format]\n"));
- errensure();
- exit(retval);
-}
-
-static void
-display(char const *format, time_t now)
-{
- struct tm *tmp;
-
- tmp = localtime(&now);
- if (!tmp) {
- fprintf(stderr,
- _("date: error: time out of range\n"));
- errensure();
- return;
- }
- timeout(stdout, format ? format : "%+", tmp);
- putchar('\n');
- fflush(stdout);
- fflush(stderr);
- if (ferror(stdout) || ferror(stderr)) {
- fprintf(stderr,
- _("date: error: couldn't write results\n"));
- errensure();
- }
-}
-
-#define INCR 1024
-
-static void
-timeout(FILE *fp, char const *format, struct tm const *tmp)
-{
- char * cp;
- size_t result;
- size_t size;
- struct tm tm;
-
- if (*format == '\0')
- return;
- if (!tmp) {
- fprintf(stderr, _("date: error: time out of range\n"));
- errensure();
- return;
- }
- tm = *tmp;
- tmp = &tm;
- size = INCR;
- cp = malloc(size);
- for ( ; ; ) {
- if (cp == NULL) {
- fprintf(stderr,
- _("date: error: can't get memory\n"));
- errensure();
- exit(retval);
- }
- cp[0] = '\1';
- result = strftime(cp, size, format, tmp);
- if (result != 0 || cp[0] == '\0')
- break;
- size += INCR;
- cp = realloc(cp, size);
- }
- fwrite(cp, 1, result, fp);
- free(cp);
-}
Deleted: vendor/tzcode/dist/difftime.c
===================================================================
--- vendor/tzcode/dist/difftime.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/difftime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,58 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson.
-*/
-
-/*LINTLIBRARY*/
-
-#include "private.h" /* for time_t and TYPE_SIGNED */
-
-/* Return -X as a double. Using this avoids casting to 'double'. */
-static double
-dminus(double x)
-{
- return -x;
-}
-
-double ATTRIBUTE_CONST
-difftime(time_t time1, time_t time0)
-{
- /*
- ** If double is large enough, simply convert and subtract
- ** (assuming that the larger type has more precision).
- */
- if (sizeof (time_t) < sizeof (double)) {
- double t1 = time1, t0 = time0;
- return t1 - t0;
- }
-
- /*
- ** The difference of two unsigned values can't overflow
- ** if the minuend is greater than or equal to the subtrahend.
- */
- if (!TYPE_SIGNED(time_t))
- return time0 <= time1 ? time1 - time0 : dminus(time0 - time1);
-
- /* Use uintmax_t if wide enough. */
- if (sizeof (time_t) <= sizeof (uintmax_t)) {
- uintmax_t t1 = time1, t0 = time0;
- return time0 <= time1 ? t1 - t0 : dminus(t0 - t1);
- }
-
- /*
- ** Handle cases where both time1 and time0 have the same sign
- ** (meaning that their difference cannot overflow).
- */
- if ((time1 < 0) == (time0 < 0))
- return time1 - time0;
-
- /*
- ** The values have opposite signs and uintmax_t is too narrow.
- ** This suffers from double rounding; attempt to lessen that
- ** by using long double temporaries.
- */
- {
- long double t1 = time1, t0 = time0;
- return t1 - t0;
- }
-}
Deleted: vendor/tzcode/dist/ialloc.c
===================================================================
--- vendor/tzcode/dist/ialloc.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/ialloc.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,32 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 2006-07-17 by Arthur David Olson.
-*/
-
-/*LINTLIBRARY*/
-
-#include "private.h"
-
-char *
-icatalloc(char *const old, const char *const new)
-{
- register char * result;
- register int oldsize, newsize;
-
- newsize = (new == NULL) ? 0 : strlen(new);
- if (old == NULL)
- oldsize = 0;
- else if (newsize == 0)
- return old;
- else oldsize = strlen(old);
- if ((result = realloc(old, oldsize + newsize + 1)) != NULL)
- if (new != NULL)
- (void) strcpy(result + oldsize, new);
- return result;
-}
-
-char *
-icpyalloc(const char *const string)
-{
- return icatalloc(NULL, string);
-}
Deleted: vendor/tzcode/dist/localtime.c
===================================================================
--- vendor/tzcode/dist/localtime.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/localtime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,2271 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson.
-*/
-
-/*
-** Leap second handling from Bradley White.
-** POSIX-style TZ environment variable handling from Guy Harris.
-*/
-
-/*LINTLIBRARY*/
-
-#define LOCALTIME_IMPLEMENTATION
-#include "private.h"
-
-#include "tzfile.h"
-#include "fcntl.h"
-
-#if THREAD_SAFE
-# include <pthread.h>
-static pthread_mutex_t locallock = PTHREAD_MUTEX_INITIALIZER;
-static int lock(void) { return pthread_mutex_lock(&locallock); }
-static void unlock(void) { pthread_mutex_unlock(&locallock); }
-#else
-static int lock(void) { return 0; }
-static void unlock(void) { }
-#endif
-
-/* NETBSD_INSPIRED_EXTERN functions are exported to callers if
- NETBSD_INSPIRED is defined, and are private otherwise. */
-#if NETBSD_INSPIRED
-# define NETBSD_INSPIRED_EXTERN
-#else
-# define NETBSD_INSPIRED_EXTERN static
-#endif
-
-#ifndef TZ_ABBR_MAX_LEN
-#define TZ_ABBR_MAX_LEN 16
-#endif /* !defined TZ_ABBR_MAX_LEN */
-
-#ifndef TZ_ABBR_CHAR_SET
-#define TZ_ABBR_CHAR_SET \
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._"
-#endif /* !defined TZ_ABBR_CHAR_SET */
-
-#ifndef TZ_ABBR_ERR_CHAR
-#define TZ_ABBR_ERR_CHAR '_'
-#endif /* !defined TZ_ABBR_ERR_CHAR */
-
-/*
-** SunOS 4.1.1 headers lack O_BINARY.
-*/
-
-#ifdef O_BINARY
-#define OPEN_MODE (O_RDONLY | O_BINARY)
-#endif /* defined O_BINARY */
-#ifndef O_BINARY
-#define OPEN_MODE O_RDONLY
-#endif /* !defined O_BINARY */
-
-#ifndef WILDABBR
-/*
-** Someone might make incorrect use of a time zone abbreviation:
-** 1. They might reference tzname[0] before calling tzset (explicitly
-** or implicitly).
-** 2. They might reference tzname[1] before calling tzset (explicitly
-** or implicitly).
-** 3. They might reference tzname[1] after setting to a time zone
-** in which Daylight Saving Time is never observed.
-** 4. They might reference tzname[0] after setting to a time zone
-** in which Standard Time is never observed.
-** 5. They might reference tm.TM_ZONE after calling offtime.
-** What's best to do in the above cases is open to debate;
-** for now, we just set things up so that in any of the five cases
-** WILDABBR is used. Another possibility: initialize tzname[0] to the
-** string "tzname[0] used before set", and similarly for the other cases.
-** And another: initialize tzname[0] to "ERA", with an explanation in the
-** manual page of what this "time zone abbreviation" means (doing this so
-** that tzname[0] has the "normal" length of three characters).
-*/
-#define WILDABBR " "
-#endif /* !defined WILDABBR */
-
-static const char wildabbr[] = WILDABBR;
-
-static const char gmt[] = "GMT";
-
-/*
-** The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
-** We default to US rules as of 1999-08-17.
-** POSIX 1003.1 section 8.1.1 says that the default DST rules are
-** implementation dependent; for historical reasons, US rules are a
-** common default.
-*/
-#ifndef TZDEFRULESTRING
-#define TZDEFRULESTRING ",M4.1.0,M10.5.0"
-#endif /* !defined TZDEFDST */
-
-struct ttinfo { /* time type information */
- int_fast32_t tt_gmtoff; /* UT offset in seconds */
- bool tt_isdst; /* used to set tm_isdst */
- int tt_abbrind; /* abbreviation list index */
- bool tt_ttisstd; /* transition is std time */
- bool tt_ttisgmt; /* transition is UT */
-};
-
-struct lsinfo { /* leap second information */
- time_t ls_trans; /* transition time */
- int_fast64_t ls_corr; /* correction to apply */
-};
-
-#define SMALLEST(a, b) (((a) < (b)) ? (a) : (b))
-#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))
-
-#ifdef TZNAME_MAX
-#define MY_TZNAME_MAX TZNAME_MAX
-#endif /* defined TZNAME_MAX */
-#ifndef TZNAME_MAX
-#define MY_TZNAME_MAX 255
-#endif /* !defined TZNAME_MAX */
-
-struct state {
- int leapcnt;
- int timecnt;
- int typecnt;
- int charcnt;
- bool goback;
- bool goahead;
- time_t ats[TZ_MAX_TIMES];
- unsigned char types[TZ_MAX_TIMES];
- struct ttinfo ttis[TZ_MAX_TYPES];
- char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt),
- (2 * (MY_TZNAME_MAX + 1)))];
- struct lsinfo lsis[TZ_MAX_LEAPS];
- int defaulttype; /* for early times or if no transitions */
-};
-
-enum r_type {
- JULIAN_DAY, /* Jn = Julian day */
- DAY_OF_YEAR, /* n = day of year */
- MONTH_NTH_DAY_OF_WEEK /* Mm.n.d = month, week, day of week */
-};
-
-struct rule {
- enum r_type r_type; /* type of rule */
- int r_day; /* day number of rule */
- int r_week; /* week number of rule */
- int r_mon; /* month number of rule */
- int_fast32_t r_time; /* transition time of rule */
-};
-
-static struct tm *gmtsub(struct state const *, time_t const *, int_fast32_t,
- struct tm *);
-static bool increment_overflow(int *, int);
-static bool increment_overflow_time(time_t *, int_fast32_t);
-static bool normalize_overflow32(int_fast32_t *, int *, int);
-static struct tm *timesub(time_t const *, int_fast32_t, struct state const *,
- struct tm *);
-static bool typesequiv(struct state const *, int, int);
-static bool tzparse(char const *, struct state *, bool);
-
-#ifdef ALL_STATE
-static struct state * lclptr;
-static struct state * gmtptr;
-#endif /* defined ALL_STATE */
-
-#ifndef ALL_STATE
-static struct state lclmem;
-static struct state gmtmem;
-#define lclptr (&lclmem)
-#define gmtptr (&gmtmem)
-#endif /* State Farm */
-
-#ifndef TZ_STRLEN_MAX
-#define TZ_STRLEN_MAX 255
-#endif /* !defined TZ_STRLEN_MAX */
-
-static char lcl_TZname[TZ_STRLEN_MAX + 1];
-static int lcl_is_set;
-
-/*
-** Section 4.12.3 of X3.159-1989 requires that
-** Except for the strftime function, these functions [asctime,
-** ctime, gmtime, localtime] return values in one of two static
-** objects: a broken-down time structure and an array of char.
-** Thanks to Paul Eggert for noting this.
-*/
-
-static struct tm tm;
-
-#if !HAVE_POSIX_DECLS
-char * tzname[2] = {
- (char *) wildabbr,
- (char *) wildabbr
-};
-# ifdef USG_COMPAT
-long timezone;
-int daylight;
-# endif
-#endif
-
-#ifdef ALTZONE
-long altzone;
-#endif /* defined ALTZONE */
-
-/* Initialize *S to a value based on GMTOFF, ISDST, and ABBRIND. */
-static void
-init_ttinfo(struct ttinfo *s, int_fast32_t gmtoff, bool isdst, int abbrind)
-{
- s->tt_gmtoff = gmtoff;
- s->tt_isdst = isdst;
- s->tt_abbrind = abbrind;
- s->tt_ttisstd = false;
- s->tt_ttisgmt = false;
-}
-
-static int_fast32_t
-detzcode(const char *const codep)
-{
- register int_fast32_t result;
- register int i;
- int_fast32_t one = 1;
- int_fast32_t halfmaxval = one << (32 - 2);
- int_fast32_t maxval = halfmaxval - 1 + halfmaxval;
- int_fast32_t minval = -1 - maxval;
-
- result = codep[0] & 0x7f;
- for (i = 1; i < 4; ++i)
- result = (result << 8) | (codep[i] & 0xff);
-
- if (codep[0] & 0x80) {
- /* Do two's-complement negation even on non-two's-complement machines.
- If the result would be minval - 1, return minval. */
- result -= !TWOS_COMPLEMENT(int_fast32_t) && result != 0;
- result += minval;
- }
- return result;
-}
-
-static int_fast64_t
-detzcode64(const char *const codep)
-{
- register uint_fast64_t result;
- register int i;
- int_fast64_t one = 1;
- int_fast64_t halfmaxval = one << (64 - 2);
- int_fast64_t maxval = halfmaxval - 1 + halfmaxval;
- int_fast64_t minval = -TWOS_COMPLEMENT(int_fast64_t) - maxval;
-
- result = codep[0] & 0x7f;
- for (i = 1; i < 8; ++i)
- result = (result << 8) | (codep[i] & 0xff);
-
- if (codep[0] & 0x80) {
- /* Do two's-complement negation even on non-two's-complement machines.
- If the result would be minval - 1, return minval. */
- result -= !TWOS_COMPLEMENT(int_fast64_t) && result != 0;
- result += minval;
- }
- return result;
-}
-
-static void
-update_tzname_etc(struct state const *sp, struct ttinfo const *ttisp)
-{
- tzname[ttisp->tt_isdst] = (char *) &sp->chars[ttisp->tt_abbrind];
-#ifdef USG_COMPAT
- if (!ttisp->tt_isdst)
- timezone = - ttisp->tt_gmtoff;
-#endif
-#ifdef ALTZONE
- if (ttisp->tt_isdst)
- altzone = - ttisp->tt_gmtoff;
-#endif
-}
-
-static void
-settzname(void)
-{
- register struct state * const sp = lclptr;
- register int i;
-
- tzname[0] = tzname[1] = (char *) wildabbr;
-#ifdef USG_COMPAT
- daylight = 0;
- timezone = 0;
-#endif /* defined USG_COMPAT */
-#ifdef ALTZONE
- altzone = 0;
-#endif /* defined ALTZONE */
- if (sp == NULL) {
- tzname[0] = tzname[1] = (char *) gmt;
- return;
- }
- /*
- ** And to get the latest zone names into tzname. . .
- */
- for (i = 0; i < sp->typecnt; ++i) {
- register const struct ttinfo * const ttisp = &sp->ttis[i];
- update_tzname_etc(sp, ttisp);
- }
- for (i = 0; i < sp->timecnt; ++i) {
- register const struct ttinfo * const ttisp =
- &sp->ttis[
- sp->types[i]];
- update_tzname_etc(sp, ttisp);
-#ifdef USG_COMPAT
- if (ttisp->tt_isdst)
- daylight = 1;
-#endif /* defined USG_COMPAT */
- }
-}
-
-static void
-scrub_abbrs(struct state *sp)
-{
- int i;
- /*
- ** First, replace bogus characters.
- */
- for (i = 0; i < sp->charcnt; ++i)
- if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL)
- sp->chars[i] = TZ_ABBR_ERR_CHAR;
- /*
- ** Second, truncate long abbreviations.
- */
- for (i = 0; i < sp->typecnt; ++i) {
- register const struct ttinfo * const ttisp = &sp->ttis[i];
- register char * cp = &sp->chars[ttisp->tt_abbrind];
-
- if (strlen(cp) > TZ_ABBR_MAX_LEN &&
- strcmp(cp, GRANDPARENTED) != 0)
- *(cp + TZ_ABBR_MAX_LEN) = '\0';
- }
-}
-
-static bool
-differ_by_repeat(const time_t t1, const time_t t0)
-{
- if (TYPE_BIT(time_t) - TYPE_SIGNED(time_t) < SECSPERREPEAT_BITS)
- return 0;
- return t1 - t0 == SECSPERREPEAT;
-}
-
-/* Input buffer for data read from a compiled tz file. */
-union input_buffer {
- /* The first part of the buffer, interpreted as a header. */
- struct tzhead tzhead;
-
- /* The entire buffer. */
- char buf[2 * sizeof(struct tzhead) + 2 * sizeof (struct state)
- + 4 * TZ_MAX_TIMES];
-};
-
-/* Local storage needed for 'tzloadbody'. */
-union local_storage {
- /* The file name to be opened. */
- char fullname[FILENAME_MAX + 1];
-
- /* The results of analyzing the file's contents after it is opened. */
- struct {
- /* The input buffer. */
- union input_buffer u;
-
- /* A temporary state used for parsing a TZ string in the file. */
- struct state st;
- } u;
-};
-
-/* Load tz data from the file named NAME into *SP. Read extended
- format if DOEXTEND. Use *LSP for temporary storage. Return 0 on
- success, an errno value on failure. */
-static int
-tzloadbody(char const *name, struct state *sp, bool doextend,
- union local_storage *lsp)
-{
- register int i;
- register int fid;
- register int stored;
- register ssize_t nread;
- register bool doaccess;
- register char *fullname = lsp->fullname;
- register union input_buffer *up = &lsp->u.u;
- register int tzheadsize = sizeof (struct tzhead);
-
- sp->goback = sp->goahead = false;
-
- if (! name) {
- name = TZDEFAULT;
- if (! name)
- return EINVAL;
- }
-
- if (name[0] == ':')
- ++name;
- doaccess = name[0] == '/';
- if (!doaccess) {
- char const *p = TZDIR;
- if (! p)
- return EINVAL;
- if (sizeof lsp->fullname - 1 <= strlen(p) + strlen(name))
- return ENAMETOOLONG;
- strcpy(fullname, p);
- strcat(fullname, "/");
- strcat(fullname, name);
- /* Set doaccess if '.' (as in "../") shows up in name. */
- if (strchr(name, '.'))
- doaccess = true;
- name = fullname;
- }
- if (doaccess && access(name, R_OK) != 0)
- return errno;
- fid = open(name, OPEN_MODE);
- if (fid < 0)
- return errno;
-
- nread = read(fid, up->buf, sizeof up->buf);
- if (nread < tzheadsize) {
- int err = nread < 0 ? errno : EINVAL;
- close(fid);
- return err;
- }
- if (close(fid) < 0)
- return errno;
- for (stored = 4; stored <= 8; stored *= 2) {
- int_fast32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt);
- int_fast32_t ttisgmtcnt = detzcode(up->tzhead.tzh_ttisgmtcnt);
- int_fast32_t leapcnt = detzcode(up->tzhead.tzh_leapcnt);
- int_fast32_t timecnt = detzcode(up->tzhead.tzh_timecnt);
- int_fast32_t typecnt = detzcode(up->tzhead.tzh_typecnt);
- int_fast32_t charcnt = detzcode(up->tzhead.tzh_charcnt);
- char const *p = up->buf + tzheadsize;
- if (! (0 <= leapcnt && leapcnt < TZ_MAX_LEAPS
- && 0 < typecnt && typecnt < TZ_MAX_TYPES
- && 0 <= timecnt && timecnt < TZ_MAX_TIMES
- && 0 <= charcnt && charcnt < TZ_MAX_CHARS
- && (ttisstdcnt == typecnt || ttisstdcnt == 0)
- && (ttisgmtcnt == typecnt || ttisgmtcnt == 0)))
- return EINVAL;
- if (nread
- < (tzheadsize /* struct tzhead */
- + timecnt * stored /* ats */
- + timecnt /* types */
- + typecnt * 6 /* ttinfos */
- + charcnt /* chars */
- + leapcnt * (stored + 4) /* lsinfos */
- + ttisstdcnt /* ttisstds */
- + ttisgmtcnt)) /* ttisgmts */
- return EINVAL;
- sp->leapcnt = leapcnt;
- sp->timecnt = timecnt;
- sp->typecnt = typecnt;
- sp->charcnt = charcnt;
-
- /* Read transitions, discarding those out of time_t range.
- But pretend the last transition before time_t_min
- occurred at time_t_min. */
- timecnt = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- int_fast64_t at
- = stored == 4 ? detzcode(p) : detzcode64(p);
- sp->types[i] = at <= time_t_max;
- if (sp->types[i]) {
- time_t attime
- = ((TYPE_SIGNED(time_t) ? at < time_t_min : at < 0)
- ? time_t_min : at);
- if (timecnt && attime <= sp->ats[timecnt - 1]) {
- if (attime < sp->ats[timecnt - 1])
- return EINVAL;
- sp->types[i - 1] = 0;
- timecnt--;
- }
- sp->ats[timecnt++] = attime;
- }
- p += stored;
- }
-
- timecnt = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- unsigned char typ = *p++;
- if (sp->typecnt <= typ)
- return EINVAL;
- if (sp->types[i])
- sp->types[timecnt++] = typ;
- }
- sp->timecnt = timecnt;
- for (i = 0; i < sp->typecnt; ++i) {
- register struct ttinfo * ttisp;
- unsigned char isdst, abbrind;
-
- ttisp = &sp->ttis[i];
- ttisp->tt_gmtoff = detzcode(p);
- p += 4;
- isdst = *p++;
- if (! (isdst < 2))
- return EINVAL;
- ttisp->tt_isdst = isdst;
- abbrind = *p++;
- if (! (abbrind < sp->charcnt))
- return EINVAL;
- ttisp->tt_abbrind = abbrind;
- }
- for (i = 0; i < sp->charcnt; ++i)
- sp->chars[i] = *p++;
- sp->chars[i] = '\0'; /* ensure '\0' at end */
-
- /* Read leap seconds, discarding those out of time_t range. */
- leapcnt = 0;
- for (i = 0; i < sp->leapcnt; ++i) {
- int_fast64_t tr = stored == 4 ? detzcode(p) : detzcode64(p);
- int_fast32_t corr = detzcode(p + stored);
- p += stored + 4;
- if (tr <= time_t_max) {
- time_t trans
- = ((TYPE_SIGNED(time_t) ? tr < time_t_min : tr < 0)
- ? time_t_min : tr);
- if (leapcnt && trans <= sp->lsis[leapcnt - 1].ls_trans) {
- if (trans < sp->lsis[leapcnt - 1].ls_trans)
- return EINVAL;
- leapcnt--;
- }
- sp->lsis[leapcnt].ls_trans = trans;
- sp->lsis[leapcnt].ls_corr = corr;
- leapcnt++;
- }
- }
- sp->leapcnt = leapcnt;
-
- for (i = 0; i < sp->typecnt; ++i) {
- register struct ttinfo * ttisp;
-
- ttisp = &sp->ttis[i];
- if (ttisstdcnt == 0)
- ttisp->tt_ttisstd = false;
- else {
- if (*p != true && *p != false)
- return EINVAL;
- ttisp->tt_ttisstd = *p++;
- }
- }
- for (i = 0; i < sp->typecnt; ++i) {
- register struct ttinfo * ttisp;
-
- ttisp = &sp->ttis[i];
- if (ttisgmtcnt == 0)
- ttisp->tt_ttisgmt = false;
- else {
- if (*p != true && *p != false)
- return EINVAL;
- ttisp->tt_ttisgmt = *p++;
- }
- }
- /*
- ** If this is an old file, we're done.
- */
- if (up->tzhead.tzh_version[0] == '\0')
- break;
- nread -= p - up->buf;
- memmove(up->buf, p, nread);
- }
- if (doextend && nread > 2 &&
- up->buf[0] == '\n' && up->buf[nread - 1] == '\n' &&
- sp->typecnt + 2 <= TZ_MAX_TYPES) {
- struct state *ts = &lsp->u.st;
-
- up->buf[nread - 1] = '\0';
- if (tzparse(&up->buf[1], ts, false)
- && ts->typecnt == 2) {
-
- /* Attempt to reuse existing abbreviations.
- Without this, America/Anchorage would stop
- working after 2037 when TZ_MAX_CHARS is 50, as
- sp->charcnt equals 42 (for LMT CAT CAWT CAPT AHST
- AHDT YST AKDT AKST) and ts->charcnt equals 10
- (for AKST AKDT). Reusing means sp->charcnt can
- stay 42 in this example. */
- int gotabbr = 0;
- int charcnt = sp->charcnt;
- for (i = 0; i < 2; i++) {
- char *tsabbr = ts->chars + ts->ttis[i].tt_abbrind;
- int j;
- for (j = 0; j < charcnt; j++)
- if (strcmp(sp->chars + j, tsabbr) == 0) {
- ts->ttis[i].tt_abbrind = j;
- gotabbr++;
- break;
- }
- if (! (j < charcnt)) {
- int tsabbrlen = strlen(tsabbr);
- if (j + tsabbrlen < TZ_MAX_CHARS) {
- strcpy(sp->chars + j, tsabbr);
- charcnt = j + tsabbrlen + 1;
- ts->ttis[i].tt_abbrind = j;
- gotabbr++;
- }
- }
- }
- if (gotabbr == 2) {
- sp->charcnt = charcnt;
- for (i = 0; i < ts->timecnt; i++)
- if (sp->ats[sp->timecnt - 1] < ts->ats[i])
- break;
- while (i < ts->timecnt
- && sp->timecnt < TZ_MAX_TIMES) {
- sp->ats[sp->timecnt] = ts->ats[i];
- sp->types[sp->timecnt] = (sp->typecnt
- + ts->types[i]);
- sp->timecnt++;
- i++;
- }
- sp->ttis[sp->typecnt++] = ts->ttis[0];
- sp->ttis[sp->typecnt++] = ts->ttis[1];
- }
- }
- }
- if (sp->timecnt > 1) {
- for (i = 1; i < sp->timecnt; ++i)
- if (typesequiv(sp, sp->types[i], sp->types[0]) &&
- differ_by_repeat(sp->ats[i], sp->ats[0])) {
- sp->goback = true;
- break;
- }
- for (i = sp->timecnt - 2; i >= 0; --i)
- if (typesequiv(sp, sp->types[sp->timecnt - 1],
- sp->types[i]) &&
- differ_by_repeat(sp->ats[sp->timecnt - 1],
- sp->ats[i])) {
- sp->goahead = true;
- break;
- }
- }
- /*
- ** If type 0 is is unused in transitions,
- ** it's the type to use for early times.
- */
- for (i = 0; i < sp->timecnt; ++i)
- if (sp->types[i] == 0)
- break;
- i = i < sp->timecnt ? -1 : 0;
- /*
- ** Absent the above,
- ** if there are transition times
- ** and the first transition is to a daylight time
- ** find the standard type less than and closest to
- ** the type of the first transition.
- */
- if (i < 0 && sp->timecnt > 0 && sp->ttis[sp->types[0]].tt_isdst) {
- i = sp->types[0];
- while (--i >= 0)
- if (!sp->ttis[i].tt_isdst)
- break;
- }
- /*
- ** If no result yet, find the first standard type.
- ** If there is none, punt to type zero.
- */
- if (i < 0) {
- i = 0;
- while (sp->ttis[i].tt_isdst)
- if (++i >= sp->typecnt) {
- i = 0;
- break;
- }
- }
- sp->defaulttype = i;
- return 0;
-}
-
-/* Load tz data from the file named NAME into *SP. Read extended
- format if DOEXTEND. Return 0 on success, an errno value on failure. */
-static int
-tzload(char const *name, struct state *sp, bool doextend)
-{
-#ifdef ALL_STATE
- union local_storage *lsp = malloc(sizeof *lsp);
- if (!lsp)
- return errno;
- else {
- int err = tzloadbody(name, sp, doextend, lsp);
- free(lsp);
- return err;
- }
-#else
- union local_storage ls;
- return tzloadbody(name, sp, doextend, &ls);
-#endif
-}
-
-static bool
-typesequiv(const struct state *sp, int a, int b)
-{
- register bool result;
-
- if (sp == NULL ||
- a < 0 || a >= sp->typecnt ||
- b < 0 || b >= sp->typecnt)
- result = false;
- else {
- register const struct ttinfo * ap = &sp->ttis[a];
- register const struct ttinfo * bp = &sp->ttis[b];
- result = ap->tt_gmtoff == bp->tt_gmtoff &&
- ap->tt_isdst == bp->tt_isdst &&
- ap->tt_ttisstd == bp->tt_ttisstd &&
- ap->tt_ttisgmt == bp->tt_ttisgmt &&
- strcmp(&sp->chars[ap->tt_abbrind],
- &sp->chars[bp->tt_abbrind]) == 0;
- }
- return result;
-}
-
-static const int mon_lengths[2][MONSPERYEAR] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-static const int year_lengths[2] = {
- DAYSPERNYEAR, DAYSPERLYEAR
-};
-
-/*
-** Given a pointer into a time zone string, scan until a character that is not
-** a valid character in a zone name is found. Return a pointer to that
-** character.
-*/
-
-static const char * ATTRIBUTE_PURE
-getzname(register const char *strp)
-{
- register char c;
-
- while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' &&
- c != '+')
- ++strp;
- return strp;
-}
-
-/*
-** Given a pointer into an extended time zone string, scan until the ending
-** delimiter of the zone name is located. Return a pointer to the delimiter.
-**
-** As with getzname above, the legal character set is actually quite
-** restricted, with other characters producing undefined results.
-** We don't do any checking here; checking is done later in common-case code.
-*/
-
-static const char * ATTRIBUTE_PURE
-getqzname(register const char *strp, const int delim)
-{
- register int c;
-
- while ((c = *strp) != '\0' && c != delim)
- ++strp;
- return strp;
-}
-
-/*
-** Given a pointer into a time zone string, extract a number from that string.
-** Check that the number is within a specified range; if it is not, return
-** NULL.
-** Otherwise, return a pointer to the first character not part of the number.
-*/
-
-static const char *
-getnum(register const char *strp, int *const nump, const int min, const int max)
-{
- register char c;
- register int num;
-
- if (strp == NULL || !is_digit(c = *strp))
- return NULL;
- num = 0;
- do {
- num = num * 10 + (c - '0');
- if (num > max)
- return NULL; /* illegal value */
- c = *++strp;
- } while (is_digit(c));
- if (num < min)
- return NULL; /* illegal value */
- *nump = num;
- return strp;
-}
-
-/*
-** Given a pointer into a time zone string, extract a number of seconds,
-** in hh[:mm[:ss]] form, from the string.
-** If any error occurs, return NULL.
-** Otherwise, return a pointer to the first character not part of the number
-** of seconds.
-*/
-
-static const char *
-getsecs(register const char *strp, int_fast32_t *const secsp)
-{
- int num;
-
- /*
- ** 'HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like
- ** "M10.4.6/26", which does not conform to Posix,
- ** but which specifies the equivalent of
- ** "02:00 on the first Sunday on or after 23 Oct".
- */
- strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);
- if (strp == NULL)
- return NULL;
- *secsp = num * (int_fast32_t) SECSPERHOUR;
- if (*strp == ':') {
- ++strp;
- strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
- if (strp == NULL)
- return NULL;
- *secsp += num * SECSPERMIN;
- if (*strp == ':') {
- ++strp;
- /* 'SECSPERMIN' allows for leap seconds. */
- strp = getnum(strp, &num, 0, SECSPERMIN);
- if (strp == NULL)
- return NULL;
- *secsp += num;
- }
- }
- return strp;
-}
-
-/*
-** Given a pointer into a time zone string, extract an offset, in
-** [+-]hh[:mm[:ss]] form, from the string.
-** If any error occurs, return NULL.
-** Otherwise, return a pointer to the first character not part of the time.
-*/
-
-static const char *
-getoffset(register const char *strp, int_fast32_t *const offsetp)
-{
- register bool neg = false;
-
- if (*strp == '-') {
- neg = true;
- ++strp;
- } else if (*strp == '+')
- ++strp;
- strp = getsecs(strp, offsetp);
- if (strp == NULL)
- return NULL; /* illegal time */
- if (neg)
- *offsetp = -*offsetp;
- return strp;
-}
-
-/*
-** Given a pointer into a time zone string, extract a rule in the form
-** date[/time]. See POSIX section 8 for the format of "date" and "time".
-** If a valid rule is not found, return NULL.
-** Otherwise, return a pointer to the first character not part of the rule.
-*/
-
-static const char *
-getrule(const char *strp, register struct rule *const rulep)
-{
- if (*strp == 'J') {
- /*
- ** Julian day.
- */
- rulep->r_type = JULIAN_DAY;
- ++strp;
- strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
- } else if (*strp == 'M') {
- /*
- ** Month, week, day.
- */
- rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
- ++strp;
- strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
- if (strp == NULL)
- return NULL;
- if (*strp++ != '.')
- return NULL;
- strp = getnum(strp, &rulep->r_week, 1, 5);
- if (strp == NULL)
- return NULL;
- if (*strp++ != '.')
- return NULL;
- strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
- } else if (is_digit(*strp)) {
- /*
- ** Day of year.
- */
- rulep->r_type = DAY_OF_YEAR;
- strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
- } else return NULL; /* invalid format */
- if (strp == NULL)
- return NULL;
- if (*strp == '/') {
- /*
- ** Time specified.
- */
- ++strp;
- strp = getoffset(strp, &rulep->r_time);
- } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */
- return strp;
-}
-
-/*
-** Given a year, a rule, and the offset from UT at the time that rule takes
-** effect, calculate the year-relative time that rule takes effect.
-*/
-
-static int_fast32_t ATTRIBUTE_PURE
-transtime(const int year, register const struct rule *const rulep,
- const int_fast32_t offset)
-{
- register bool leapyear;
- register int_fast32_t value;
- register int i;
- int d, m1, yy0, yy1, yy2, dow;
-
- INITIALIZE(value);
- leapyear = isleap(year);
- switch (rulep->r_type) {
-
- case JULIAN_DAY:
- /*
- ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap
- ** years.
- ** In non-leap years, or if the day number is 59 or less, just
- ** add SECSPERDAY times the day number-1 to the time of
- ** January 1, midnight, to get the day.
- */
- value = (rulep->r_day - 1) * SECSPERDAY;
- if (leapyear && rulep->r_day >= 60)
- value += SECSPERDAY;
- break;
-
- case DAY_OF_YEAR:
- /*
- ** n - day of year.
- ** Just add SECSPERDAY times the day number to the time of
- ** January 1, midnight, to get the day.
- */
- value = rulep->r_day * SECSPERDAY;
- break;
-
- case MONTH_NTH_DAY_OF_WEEK:
- /*
- ** Mm.n.d - nth "dth day" of month m.
- */
-
- /*
- ** Use Zeller's Congruence to get day-of-week of first day of
- ** month.
- */
- m1 = (rulep->r_mon + 9) % 12 + 1;
- yy0 = (rulep->r_mon <= 2) ? (year - 1) : year;
- yy1 = yy0 / 100;
- yy2 = yy0 % 100;
- dow = ((26 * m1 - 2) / 10 +
- 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7;
- if (dow < 0)
- dow += DAYSPERWEEK;
-
- /*
- ** "dow" is the day-of-week of the first day of the month. Get
- ** the day-of-month (zero-origin) of the first "dow" day of the
- ** month.
- */
- d = rulep->r_day - dow;
- if (d < 0)
- d += DAYSPERWEEK;
- for (i = 1; i < rulep->r_week; ++i) {
- if (d + DAYSPERWEEK >=
- mon_lengths[leapyear][rulep->r_mon - 1])
- break;
- d += DAYSPERWEEK;
- }
-
- /*
- ** "d" is the day-of-month (zero-origin) of the day we want.
- */
- value = d * SECSPERDAY;
- for (i = 0; i < rulep->r_mon - 1; ++i)
- value += mon_lengths[leapyear][i] * SECSPERDAY;
- break;
- }
-
- /*
- ** "value" is the year-relative time of 00:00:00 UT on the day in
- ** question. To get the year-relative time of the specified local
- ** time on that day, add the transition time and the current offset
- ** from UT.
- */
- return value + rulep->r_time + offset;
-}
-
-/*
-** Given a POSIX section 8-style TZ string, fill in the rule tables as
-** appropriate.
-*/
-
-static bool
-tzparse(const char *name, struct state *sp, bool lastditch)
-{
- const char * stdname;
- const char * dstname;
- size_t stdlen;
- size_t dstlen;
- size_t charcnt;
- int_fast32_t stdoffset;
- int_fast32_t dstoffset;
- register char * cp;
- register bool load_ok;
-
- stdname = name;
- if (lastditch) {
- stdlen = sizeof gmt - 1;
- name += stdlen;
- stdoffset = 0;
- } else {
- if (*name == '<') {
- name++;
- stdname = name;
- name = getqzname(name, '>');
- if (*name != '>')
- return false;
- stdlen = name - stdname;
- name++;
- } else {
- name = getzname(name);
- stdlen = name - stdname;
- }
- if (!stdlen)
- return false;
- name = getoffset(name, &stdoffset);
- if (name == NULL)
- return false;
- }
- charcnt = stdlen + 1;
- if (sizeof sp->chars < charcnt)
- return false;
- load_ok = tzload(TZDEFRULES, sp, false) == 0;
- if (!load_ok)
- sp->leapcnt = 0; /* so, we're off a little */
- if (*name != '\0') {
- if (*name == '<') {
- dstname = ++name;
- name = getqzname(name, '>');
- if (*name != '>')
- return false;
- dstlen = name - dstname;
- name++;
- } else {
- dstname = name;
- name = getzname(name);
- dstlen = name - dstname; /* length of DST zone name */
- }
- if (!dstlen)
- return false;
- charcnt += dstlen + 1;
- if (sizeof sp->chars < charcnt)
- return false;
- if (*name != '\0' && *name != ',' && *name != ';') {
- name = getoffset(name, &dstoffset);
- if (name == NULL)
- return false;
- } else dstoffset = stdoffset - SECSPERHOUR;
- if (*name == '\0' && !load_ok)
- name = TZDEFRULESTRING;
- if (*name == ',' || *name == ';') {
- struct rule start;
- struct rule end;
- register int year;
- register int yearlim;
- register int timecnt;
- time_t janfirst;
-
- ++name;
- if ((name = getrule(name, &start)) == NULL)
- return false;
- if (*name++ != ',')
- return false;
- if ((name = getrule(name, &end)) == NULL)
- return false;
- if (*name != '\0')
- return false;
- sp->typecnt = 2; /* standard time and DST */
- /*
- ** Two transitions per year, from EPOCH_YEAR forward.
- */
- init_ttinfo(&sp->ttis[0], -dstoffset, true, stdlen + 1);
- init_ttinfo(&sp->ttis[1], -stdoffset, false, 0);
- sp->defaulttype = 0;
- timecnt = 0;
- janfirst = 0;
- yearlim = EPOCH_YEAR + YEARSPERREPEAT;
- for (year = EPOCH_YEAR; year < yearlim; year++) {
- int_fast32_t
- starttime = transtime(year, &start, stdoffset),
- endtime = transtime(year, &end, dstoffset);
- int_fast32_t
- yearsecs = (year_lengths[isleap(year)]
- * SECSPERDAY);
- bool reversed = endtime < starttime;
- if (reversed) {
- int_fast32_t swap = starttime;
- starttime = endtime;
- endtime = swap;
- }
- if (reversed
- || (starttime < endtime
- && (endtime - starttime
- < (yearsecs
- + (stdoffset - dstoffset))))) {
- if (TZ_MAX_TIMES - 2 < timecnt)
- break;
- yearlim = year + YEARSPERREPEAT + 1;
- sp->ats[timecnt] = janfirst;
- if (increment_overflow_time
- (&sp->ats[timecnt], starttime))
- break;
- sp->types[timecnt++] = reversed;
- sp->ats[timecnt] = janfirst;
- if (increment_overflow_time
- (&sp->ats[timecnt], endtime))
- break;
- sp->types[timecnt++] = !reversed;
- }
- if (increment_overflow_time(&janfirst, yearsecs))
- break;
- }
- sp->timecnt = timecnt;
- if (!timecnt)
- sp->typecnt = 1; /* Perpetual DST. */
- } else {
- register int_fast32_t theirstdoffset;
- register int_fast32_t theirdstoffset;
- register int_fast32_t theiroffset;
- register bool isdst;
- register int i;
- register int j;
-
- if (*name != '\0')
- return false;
- /*
- ** Initial values of theirstdoffset and theirdstoffset.
- */
- theirstdoffset = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- j = sp->types[i];
- if (!sp->ttis[j].tt_isdst) {
- theirstdoffset =
- -sp->ttis[j].tt_gmtoff;
- break;
- }
- }
- theirdstoffset = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- j = sp->types[i];
- if (sp->ttis[j].tt_isdst) {
- theirdstoffset =
- -sp->ttis[j].tt_gmtoff;
- break;
- }
- }
- /*
- ** Initially we're assumed to be in standard time.
- */
- isdst = false;
- theiroffset = theirstdoffset;
- /*
- ** Now juggle transition times and types
- ** tracking offsets as you do.
- */
- for (i = 0; i < sp->timecnt; ++i) {
- j = sp->types[i];
- sp->types[i] = sp->ttis[j].tt_isdst;
- if (sp->ttis[j].tt_ttisgmt) {
- /* No adjustment to transition time */
- } else {
- /*
- ** If summer time is in effect, and the
- ** transition time was not specified as
- ** standard time, add the summer time
- ** offset to the transition time;
- ** otherwise, add the standard time
- ** offset to the transition time.
- */
- /*
- ** Transitions from DST to DDST
- ** will effectively disappear since
- ** POSIX provides for only one DST
- ** offset.
- */
- if (isdst && !sp->ttis[j].tt_ttisstd) {
- sp->ats[i] += dstoffset -
- theirdstoffset;
- } else {
- sp->ats[i] += stdoffset -
- theirstdoffset;
- }
- }
- theiroffset = -sp->ttis[j].tt_gmtoff;
- if (sp->ttis[j].tt_isdst)
- theirdstoffset = theiroffset;
- else theirstdoffset = theiroffset;
- }
- /*
- ** Finally, fill in ttis.
- */
- init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
- init_ttinfo(&sp->ttis[1], -dstoffset, true, stdlen + 1);
- sp->typecnt = 2;
- sp->defaulttype = 0;
- }
- } else {
- dstlen = 0;
- sp->typecnt = 1; /* only standard time */
- sp->timecnt = 0;
- init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
- sp->defaulttype = 0;
- }
- sp->charcnt = charcnt;
- cp = sp->chars;
- memcpy(cp, stdname, stdlen);
- cp += stdlen;
- *cp++ = '\0';
- if (dstlen != 0) {
- memcpy(cp, dstname, dstlen);
- *(cp + dstlen) = '\0';
- }
- return true;
-}
-
-static void
-gmtload(struct state *const sp)
-{
- if (tzload(gmt, sp, true) != 0)
- tzparse(gmt, sp, true);
-}
-
-/* Initialize *SP to a value appropriate for the TZ setting NAME.
- Return 0 on success, an errno value on failure. */
-static int
-zoneinit(struct state *sp, char const *name)
-{
- if (name && ! name[0]) {
- /*
- ** User wants it fast rather than right.
- */
- sp->leapcnt = 0; /* so, we're off a little */
- sp->timecnt = 0;
- sp->typecnt = 0;
- sp->charcnt = 0;
- sp->goback = sp->goahead = false;
- init_ttinfo(&sp->ttis[0], 0, false, 0);
- strcpy(sp->chars, gmt);
- sp->defaulttype = 0;
- return 0;
- } else {
- int err = tzload(name, sp, true);
- if (err != 0 && name && name[0] != ':' && tzparse(name, sp, false))
- err = 0;
- if (err == 0)
- scrub_abbrs(sp);
- return err;
- }
-}
-
-static void
-tzsetlcl(char const *name)
-{
- struct state *sp = lclptr;
- int lcl = name ? strlen(name) < sizeof lcl_TZname : -1;
- if (lcl < 0
- ? lcl_is_set < 0
- : 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)
- return;
-#ifdef ALL_STATE
- if (! sp)
- lclptr = sp = malloc(sizeof *lclptr);
-#endif /* defined ALL_STATE */
- if (sp) {
- if (zoneinit(sp, name) != 0)
- zoneinit(sp, "");
- if (0 < lcl)
- strcpy(lcl_TZname, name);
- }
- settzname();
- lcl_is_set = lcl;
-}
-
-#ifdef STD_INSPIRED
-void
-tzsetwall(void)
-{
- if (lock() != 0)
- return;
- tzsetlcl(NULL);
- unlock();
-}
-#endif
-
-static void
-tzset_unlocked(void)
-{
- tzsetlcl(getenv("TZ"));
-}
-
-void
-tzset(void)
-{
- if (lock() != 0)
- return;
- tzset_unlocked();
- unlock();
-}
-
-static void
-gmtcheck(void)
-{
- static bool gmt_is_set;
- if (lock() != 0)
- return;
- if (! gmt_is_set) {
-#ifdef ALL_STATE
- gmtptr = malloc(sizeof *gmtptr);
-#endif
- if (gmtptr)
- gmtload(gmtptr);
- gmt_is_set = true;
- }
- unlock();
-}
-
-#if NETBSD_INSPIRED
-
-timezone_t
-tzalloc(char const *name)
-{
- timezone_t sp = malloc(sizeof *sp);
- if (sp) {
- int err = zoneinit(sp, name);
- if (err != 0) {
- free(sp);
- errno = err;
- return NULL;
- }
- }
- return sp;
-}
-
-void
-tzfree(timezone_t sp)
-{
- free(sp);
-}
-
-/*
-** NetBSD 6.1.4 has ctime_rz, but omit it because POSIX says ctime and
-** ctime_r are obsolescent and have potential security problems that
-** ctime_rz would share. Callers can instead use localtime_rz + strftime.
-**
-** NetBSD 6.1.4 has tzgetname, but omit it because it doesn't work
-** in zones with three or more time zone abbreviations.
-** Callers can instead use localtime_rz + strftime.
-*/
-
-#endif
-
-/*
-** The easy way to behave "as if no library function calls" localtime
-** is to not call it, so we drop its guts into "localsub", which can be
-** freely called. (And no, the PANS doesn't require the above behavior,
-** but it *is* desirable.)
-**
-** If successful and SETNAME is nonzero,
-** set the applicable parts of tzname, timezone and altzone;
-** however, it's OK to omit this step if the time zone is POSIX-compatible,
-** since in that case tzset should have already done this step correctly.
-** SETNAME's type is intfast32_t for compatibility with gmtsub,
-** but it is actually a boolean and its value should be 0 or 1.
-*/
-
-/*ARGSUSED*/
-static struct tm *
-localsub(struct state const *sp, time_t const *timep, int_fast32_t setname,
- struct tm *const tmp)
-{
- register const struct ttinfo * ttisp;
- register int i;
- register struct tm * result;
- const time_t t = *timep;
-
- if (sp == NULL) {
- /* Don't bother to set tzname etc.; tzset has already done it. */
- return gmtsub(gmtptr, timep, 0, tmp);
- }
- if ((sp->goback && t < sp->ats[0]) ||
- (sp->goahead && t > sp->ats[sp->timecnt - 1])) {
- time_t newt = t;
- register time_t seconds;
- register time_t years;
-
- if (t < sp->ats[0])
- seconds = sp->ats[0] - t;
- else seconds = t - sp->ats[sp->timecnt - 1];
- --seconds;
- years = (seconds / SECSPERREPEAT + 1) * YEARSPERREPEAT;
- seconds = years * AVGSECSPERYEAR;
- if (t < sp->ats[0])
- newt += seconds;
- else newt -= seconds;
- if (newt < sp->ats[0] ||
- newt > sp->ats[sp->timecnt - 1])
- return NULL; /* "cannot happen" */
- result = localsub(sp, &newt, setname, tmp);
- if (result) {
- register int_fast64_t newy;
-
- newy = result->tm_year;
- if (t < sp->ats[0])
- newy -= years;
- else newy += years;
- if (! (INT_MIN <= newy && newy <= INT_MAX))
- return NULL;
- result->tm_year = newy;
- }
- return result;
- }
- if (sp->timecnt == 0 || t < sp->ats[0]) {
- i = sp->defaulttype;
- } else {
- register int lo = 1;
- register int hi = sp->timecnt;
-
- while (lo < hi) {
- register int mid = (lo + hi) >> 1;
-
- if (t < sp->ats[mid])
- hi = mid;
- else lo = mid + 1;
- }
- i = (int) sp->types[lo - 1];
- }
- ttisp = &sp->ttis[i];
- /*
- ** To get (wrong) behavior that's compatible with System V Release 2.0
- ** you'd replace the statement below with
- ** t += ttisp->tt_gmtoff;
- ** timesub(&t, 0L, sp, tmp);
- */
- result = timesub(&t, ttisp->tt_gmtoff, sp, tmp);
- if (result) {
- result->tm_isdst = ttisp->tt_isdst;
-#ifdef TM_ZONE
- result->TM_ZONE = (char *) &sp->chars[ttisp->tt_abbrind];
-#endif /* defined TM_ZONE */
- if (setname)
- update_tzname_etc(sp, ttisp);
- }
- return result;
-}
-
-#if NETBSD_INSPIRED
-
-struct tm *
-localtime_rz(struct state *sp, time_t const *timep, struct tm *tmp)
-{
- return localsub(sp, timep, 0, tmp);
-}
-
-#endif
-
-static struct tm *
-localtime_tzset(time_t const *timep, struct tm *tmp, bool setname)
-{
- int err = lock();
- if (err) {
- errno = err;
- return NULL;
- }
- if (setname || !lcl_is_set)
- tzset_unlocked();
- tmp = localsub(lclptr, timep, setname, tmp);
- unlock();
- return tmp;
-}
-
-struct tm *
-localtime(const time_t *timep)
-{
- return localtime_tzset(timep, &tm, true);
-}
-
-struct tm *
-localtime_r(const time_t *timep, struct tm *tmp)
-{
- return localtime_tzset(timep, tmp, false);
-}
-
-/*
-** gmtsub is to gmtime as localsub is to localtime.
-*/
-
-static struct tm *
-gmtsub(struct state const *sp, time_t const *timep, int_fast32_t offset,
- struct tm *tmp)
-{
- register struct tm * result;
-
- result = timesub(timep, offset, gmtptr, tmp);
-#ifdef TM_ZONE
- /*
- ** Could get fancy here and deliver something such as
- ** "UT+xxxx" or "UT-xxxx" if offset is non-zero,
- ** but this is no time for a treasure hunt.
- */
- tmp->TM_ZONE = ((char *)
- (offset ? wildabbr : gmtptr ? gmtptr->chars : gmt));
-#endif /* defined TM_ZONE */
- return result;
-}
-
-/*
-* Re-entrant version of gmtime.
-*/
-
-struct tm *
-gmtime_r(const time_t *timep, struct tm *tmp)
-{
- gmtcheck();
- return gmtsub(gmtptr, timep, 0, tmp);
-}
-
-struct tm *
-gmtime(const time_t *timep)
-{
- return gmtime_r(timep, &tm);
-}
-
-#ifdef STD_INSPIRED
-
-struct tm *
-offtime(const time_t *timep, long offset)
-{
- gmtcheck();
- return gmtsub(gmtptr, timep, offset, &tm);
-}
-
-#endif /* defined STD_INSPIRED */
-
-/*
-** Return the number of leap years through the end of the given year
-** where, to make the math easy, the answer for year zero is defined as zero.
-*/
-
-static int ATTRIBUTE_PURE
-leaps_thru_end_of(register const int y)
-{
- return (y >= 0) ? (y / 4 - y / 100 + y / 400) :
- -(leaps_thru_end_of(-(y + 1)) + 1);
-}
-
-static struct tm *
-timesub(const time_t *timep, int_fast32_t offset,
- const struct state *sp, struct tm *tmp)
-{
- register const struct lsinfo * lp;
- register time_t tdays;
- register int idays; /* unsigned would be so 2003 */
- register int_fast64_t rem;
- int y;
- register const int * ip;
- register int_fast64_t corr;
- register bool hit;
- register int i;
-
- corr = 0;
- hit = false;
- i = (sp == NULL) ? 0 : sp->leapcnt;
- while (--i >= 0) {
- lp = &sp->lsis[i];
- if (*timep >= lp->ls_trans) {
- if (*timep == lp->ls_trans) {
- hit = ((i == 0 && lp->ls_corr > 0) ||
- lp->ls_corr > sp->lsis[i - 1].ls_corr);
- if (hit)
- while (i > 0 &&
- sp->lsis[i].ls_trans ==
- sp->lsis[i - 1].ls_trans + 1 &&
- sp->lsis[i].ls_corr ==
- sp->lsis[i - 1].ls_corr + 1) {
- ++hit;
- --i;
- }
- }
- corr = lp->ls_corr;
- break;
- }
- }
- y = EPOCH_YEAR;
- tdays = *timep / SECSPERDAY;
- rem = *timep % SECSPERDAY;
- while (tdays < 0 || tdays >= year_lengths[isleap(y)]) {
- int newy;
- register time_t tdelta;
- register int idelta;
- register int leapdays;
-
- tdelta = tdays / DAYSPERLYEAR;
- if (! ((! TYPE_SIGNED(time_t) || INT_MIN <= tdelta)
- && tdelta <= INT_MAX))
- goto out_of_range;
- idelta = tdelta;
- if (idelta == 0)
- idelta = (tdays < 0) ? -1 : 1;
- newy = y;
- if (increment_overflow(&newy, idelta))
- goto out_of_range;
- leapdays = leaps_thru_end_of(newy - 1) -
- leaps_thru_end_of(y - 1);
- tdays -= ((time_t) newy - y) * DAYSPERNYEAR;
- tdays -= leapdays;
- y = newy;
- }
- /*
- ** Given the range, we can now fearlessly cast...
- */
- idays = tdays;
- rem += offset - corr;
- while (rem < 0) {
- rem += SECSPERDAY;
- --idays;
- }
- while (rem >= SECSPERDAY) {
- rem -= SECSPERDAY;
- ++idays;
- }
- while (idays < 0) {
- if (increment_overflow(&y, -1))
- goto out_of_range;
- idays += year_lengths[isleap(y)];
- }
- while (idays >= year_lengths[isleap(y)]) {
- idays -= year_lengths[isleap(y)];
- if (increment_overflow(&y, 1))
- goto out_of_range;
- }
- tmp->tm_year = y;
- if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))
- goto out_of_range;
- tmp->tm_yday = idays;
- /*
- ** The "extra" mods below avoid overflow problems.
- */
- tmp->tm_wday = EPOCH_WDAY +
- ((y - EPOCH_YEAR) % DAYSPERWEEK) *
- (DAYSPERNYEAR % DAYSPERWEEK) +
- leaps_thru_end_of(y - 1) -
- leaps_thru_end_of(EPOCH_YEAR - 1) +
- idays;
- tmp->tm_wday %= DAYSPERWEEK;
- if (tmp->tm_wday < 0)
- tmp->tm_wday += DAYSPERWEEK;
- tmp->tm_hour = (int) (rem / SECSPERHOUR);
- rem %= SECSPERHOUR;
- tmp->tm_min = (int) (rem / SECSPERMIN);
- /*
- ** A positive leap second requires a special
- ** representation. This uses "... ??:59:60" et seq.
- */
- tmp->tm_sec = (int) (rem % SECSPERMIN) + hit;
- ip = mon_lengths[isleap(y)];
- for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon))
- idays -= ip[tmp->tm_mon];
- tmp->tm_mday = (int) (idays + 1);
- tmp->tm_isdst = 0;
-#ifdef TM_GMTOFF
- tmp->TM_GMTOFF = offset;
-#endif /* defined TM_GMTOFF */
- return tmp;
-
- out_of_range:
- errno = EOVERFLOW;
- return NULL;
-}
-
-char *
-ctime(const time_t *timep)
-{
-/*
-** Section 4.12.3.2 of X3.159-1989 requires that
-** The ctime function converts the calendar time pointed to by timer
-** to local time in the form of a string. It is equivalent to
-** asctime(localtime(timer))
-*/
- struct tm *tmp = localtime(timep);
- return tmp ? asctime(tmp) : NULL;
-}
-
-char *
-ctime_r(const time_t *timep, char *buf)
-{
- struct tm mytm;
- struct tm *tmp = localtime_r(timep, &mytm);
- return tmp ? asctime_r(tmp, buf) : NULL;
-}
-
-/*
-** Adapted from code provided by Robert Elz, who writes:
-** The "best" way to do mktime I think is based on an idea of Bob
-** Kridle's (so its said...) from a long time ago.
-** It does a binary search of the time_t space. Since time_t's are
-** just 32 bits, its a max of 32 iterations (even at 64 bits it
-** would still be very reasonable).
-*/
-
-#ifndef WRONG
-#define WRONG (-1)
-#endif /* !defined WRONG */
-
-/*
-** Normalize logic courtesy Paul Eggert.
-*/
-
-static bool
-increment_overflow(int *ip, int j)
-{
- register int const i = *ip;
-
- /*
- ** If i >= 0 there can only be overflow if i + j > INT_MAX
- ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow.
- ** If i < 0 there can only be overflow if i + j < INT_MIN
- ** or if j < INT_MIN - i; given i < 0, INT_MIN - i cannot overflow.
- */
- if ((i >= 0) ? (j > INT_MAX - i) : (j < INT_MIN - i))
- return true;
- *ip += j;
- return false;
-}
-
-static bool
-increment_overflow32(int_fast32_t *const lp, int const m)
-{
- register int_fast32_t const l = *lp;
-
- if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l))
- return true;
- *lp += m;
- return false;
-}
-
-static bool
-increment_overflow_time(time_t *tp, int_fast32_t j)
-{
- /*
- ** This is like
- ** 'if (! (time_t_min <= *tp + j && *tp + j <= time_t_max)) ...',
- ** except that it does the right thing even if *tp + j would overflow.
- */
- if (! (j < 0
- ? (TYPE_SIGNED(time_t) ? time_t_min - j <= *tp : -1 - j < *tp)
- : *tp <= time_t_max - j))
- return true;
- *tp += j;
- return false;
-}
-
-static bool
-normalize_overflow(int *const tensptr, int *const unitsptr, const int base)
-{
- register int tensdelta;
-
- tensdelta = (*unitsptr >= 0) ?
- (*unitsptr / base) :
- (-1 - (-1 - *unitsptr) / base);
- *unitsptr -= tensdelta * base;
- return increment_overflow(tensptr, tensdelta);
-}
-
-static bool
-normalize_overflow32(int_fast32_t *tensptr, int *unitsptr, int base)
-{
- register int tensdelta;
-
- tensdelta = (*unitsptr >= 0) ?
- (*unitsptr / base) :
- (-1 - (-1 - *unitsptr) / base);
- *unitsptr -= tensdelta * base;
- return increment_overflow32(tensptr, tensdelta);
-}
-
-static int
-tmcomp(register const struct tm *const atmp,
- register const struct tm *const btmp)
-{
- register int result;
-
- if (atmp->tm_year != btmp->tm_year)
- return atmp->tm_year < btmp->tm_year ? -1 : 1;
- if ((result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
- (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
- (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
- (result = (atmp->tm_min - btmp->tm_min)) == 0)
- result = atmp->tm_sec - btmp->tm_sec;
- return result;
-}
-
-static time_t
-time2sub(struct tm *const tmp,
- struct tm *(*funcp)(struct state const *, time_t const *,
- int_fast32_t, struct tm *),
- struct state const *sp,
- const int_fast32_t offset,
- bool *okayp,
- bool do_norm_secs)
-{
- register int dir;
- register int i, j;
- register int saved_seconds;
- register int_fast32_t li;
- register time_t lo;
- register time_t hi;
- int_fast32_t y;
- time_t newt;
- time_t t;
- struct tm yourtm, mytm;
-
- *okayp = false;
- yourtm = *tmp;
- if (do_norm_secs) {
- if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,
- SECSPERMIN))
- return WRONG;
- }
- if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR))
- return WRONG;
- if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY))
- return WRONG;
- y = yourtm.tm_year;
- if (normalize_overflow32(&y, &yourtm.tm_mon, MONSPERYEAR))
- return WRONG;
- /*
- ** Turn y into an actual year number for now.
- ** It is converted back to an offset from TM_YEAR_BASE later.
- */
- if (increment_overflow32(&y, TM_YEAR_BASE))
- return WRONG;
- while (yourtm.tm_mday <= 0) {
- if (increment_overflow32(&y, -1))
- return WRONG;
- li = y + (1 < yourtm.tm_mon);
- yourtm.tm_mday += year_lengths[isleap(li)];
- }
- while (yourtm.tm_mday > DAYSPERLYEAR) {
- li = y + (1 < yourtm.tm_mon);
- yourtm.tm_mday -= year_lengths[isleap(li)];
- if (increment_overflow32(&y, 1))
- return WRONG;
- }
- for ( ; ; ) {
- i = mon_lengths[isleap(y)][yourtm.tm_mon];
- if (yourtm.tm_mday <= i)
- break;
- yourtm.tm_mday -= i;
- if (++yourtm.tm_mon >= MONSPERYEAR) {
- yourtm.tm_mon = 0;
- if (increment_overflow32(&y, 1))
- return WRONG;
- }
- }
- if (increment_overflow32(&y, -TM_YEAR_BASE))
- return WRONG;
- if (! (INT_MIN <= y && y <= INT_MAX))
- return WRONG;
- yourtm.tm_year = y;
- if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)
- saved_seconds = 0;
- else if (y + TM_YEAR_BASE < EPOCH_YEAR) {
- /*
- ** We can't set tm_sec to 0, because that might push the
- ** time below the minimum representable time.
- ** Set tm_sec to 59 instead.
- ** This assumes that the minimum representable time is
- ** not in the same minute that a leap second was deleted from,
- ** which is a safer assumption than using 58 would be.
- */
- if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN))
- return WRONG;
- saved_seconds = yourtm.tm_sec;
- yourtm.tm_sec = SECSPERMIN - 1;
- } else {
- saved_seconds = yourtm.tm_sec;
- yourtm.tm_sec = 0;
- }
- /*
- ** Do a binary search (this works whatever time_t's type is).
- */
- lo = time_t_min;
- hi = time_t_max;
- for ( ; ; ) {
- t = lo / 2 + hi / 2;
- if (t < lo)
- t = lo;
- else if (t > hi)
- t = hi;
- if (! funcp(sp, &t, offset, &mytm)) {
- /*
- ** Assume that t is too extreme to be represented in
- ** a struct tm; arrange things so that it is less
- ** extreme on the next pass.
- */
- dir = (t > 0) ? 1 : -1;
- } else dir = tmcomp(&mytm, &yourtm);
- if (dir != 0) {
- if (t == lo) {
- if (t == time_t_max)
- return WRONG;
- ++t;
- ++lo;
- } else if (t == hi) {
- if (t == time_t_min)
- return WRONG;
- --t;
- --hi;
- }
- if (lo > hi)
- return WRONG;
- if (dir > 0)
- hi = t;
- else lo = t;
- continue;
- }
-#if defined TM_GMTOFF && ! UNINIT_TRAP
- if (mytm.TM_GMTOFF != yourtm.TM_GMTOFF
- && (yourtm.TM_GMTOFF < 0
- ? (-SECSPERDAY <= yourtm.TM_GMTOFF
- && (mytm.TM_GMTOFF <=
- (SMALLEST (INT_FAST32_MAX, LONG_MAX)
- + yourtm.TM_GMTOFF)))
- : (yourtm.TM_GMTOFF <= SECSPERDAY
- && ((BIGGEST (INT_FAST32_MIN, LONG_MIN)
- + yourtm.TM_GMTOFF)
- <= mytm.TM_GMTOFF)))) {
- /* MYTM matches YOURTM except with the wrong UTC offset.
- YOURTM.TM_GMTOFF is plausible, so try it instead.
- It's OK if YOURTM.TM_GMTOFF contains uninitialized data,
- since the guess gets checked. */
- time_t altt = t;
- int_fast32_t diff = mytm.TM_GMTOFF - yourtm.TM_GMTOFF;
- if (!increment_overflow_time(&altt, diff)) {
- struct tm alttm;
- if (funcp(sp, &altt, offset, &alttm)
- && alttm.tm_isdst == mytm.tm_isdst
- && alttm.TM_GMTOFF == yourtm.TM_GMTOFF
- && tmcomp(&alttm, &yourtm) == 0) {
- t = altt;
- mytm = alttm;
- }
- }
- }
-#endif
- if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
- break;
- /*
- ** Right time, wrong type.
- ** Hunt for right time, right type.
- ** It's okay to guess wrong since the guess
- ** gets checked.
- */
- if (sp == NULL)
- return WRONG;
- for (i = sp->typecnt - 1; i >= 0; --i) {
- if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)
- continue;
- for (j = sp->typecnt - 1; j >= 0; --j) {
- if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)
- continue;
- newt = t + sp->ttis[j].tt_gmtoff -
- sp->ttis[i].tt_gmtoff;
- if (! funcp(sp, &newt, offset, &mytm))
- continue;
- if (tmcomp(&mytm, &yourtm) != 0)
- continue;
- if (mytm.tm_isdst != yourtm.tm_isdst)
- continue;
- /*
- ** We have a match.
- */
- t = newt;
- goto label;
- }
- }
- return WRONG;
- }
-label:
- newt = t + saved_seconds;
- if ((newt < t) != (saved_seconds < 0))
- return WRONG;
- t = newt;
- if (funcp(sp, &t, offset, tmp))
- *okayp = true;
- return t;
-}
-
-static time_t
-time2(struct tm * const tmp,
- struct tm *(*funcp)(struct state const *, time_t const *,
- int_fast32_t, struct tm *),
- struct state const *sp,
- const int_fast32_t offset,
- bool *okayp)
-{
- time_t t;
-
- /*
- ** First try without normalization of seconds
- ** (in case tm_sec contains a value associated with a leap second).
- ** If that fails, try with normalization of seconds.
- */
- t = time2sub(tmp, funcp, sp, offset, okayp, false);
- return *okayp ? t : time2sub(tmp, funcp, sp, offset, okayp, true);
-}
-
-static time_t
-time1(struct tm *const tmp,
- struct tm *(*funcp) (struct state const *, time_t const *,
- int_fast32_t, struct tm *),
- struct state const *sp,
- const int_fast32_t offset)
-{
- register time_t t;
- register int samei, otheri;
- register int sameind, otherind;
- register int i;
- register int nseen;
- char seen[TZ_MAX_TYPES];
- unsigned char types[TZ_MAX_TYPES];
- bool okay;
-
- if (tmp == NULL) {
- errno = EINVAL;
- return WRONG;
- }
- if (tmp->tm_isdst > 1)
- tmp->tm_isdst = 1;
- t = time2(tmp, funcp, sp, offset, &okay);
- if (okay)
- return t;
- if (tmp->tm_isdst < 0)
-#ifdef PCTS
- /*
- ** POSIX Conformance Test Suite code courtesy Grant Sullivan.
- */
- tmp->tm_isdst = 0; /* reset to std and try again */
-#else
- return t;
-#endif /* !defined PCTS */
- /*
- ** We're supposed to assume that somebody took a time of one type
- ** and did some math on it that yielded a "struct tm" that's bad.
- ** We try to divine the type they started from and adjust to the
- ** type they need.
- */
- if (sp == NULL)
- return WRONG;
- for (i = 0; i < sp->typecnt; ++i)
- seen[i] = false;
- nseen = 0;
- for (i = sp->timecnt - 1; i >= 0; --i)
- if (!seen[sp->types[i]]) {
- seen[sp->types[i]] = true;
- types[nseen++] = sp->types[i];
- }
- for (sameind = 0; sameind < nseen; ++sameind) {
- samei = types[sameind];
- if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)
- continue;
- for (otherind = 0; otherind < nseen; ++otherind) {
- otheri = types[otherind];
- if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)
- continue;
- tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
- sp->ttis[samei].tt_gmtoff;
- tmp->tm_isdst = !tmp->tm_isdst;
- t = time2(tmp, funcp, sp, offset, &okay);
- if (okay)
- return t;
- tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
- sp->ttis[samei].tt_gmtoff;
- tmp->tm_isdst = !tmp->tm_isdst;
- }
- }
- return WRONG;
-}
-
-static time_t
-mktime_tzname(struct state *sp, struct tm *tmp, bool setname)
-{
- if (sp)
- return time1(tmp, localsub, sp, setname);
- else {
- gmtcheck();
- return time1(tmp, gmtsub, gmtptr, 0);
- }
-}
-
-#if NETBSD_INSPIRED
-
-time_t
-mktime_z(struct state *sp, struct tm *tmp)
-{
- return mktime_tzname(sp, tmp, false);
-}
-
-#endif
-
-time_t
-mktime(struct tm *tmp)
-{
- time_t t;
- int err = lock();
- if (err) {
- errno = err;
- return -1;
- }
- tzset_unlocked();
- t = mktime_tzname(lclptr, tmp, true);
- unlock();
- return t;
-}
-
-#ifdef STD_INSPIRED
-
-time_t
-timelocal(struct tm *tmp)
-{
- if (tmp != NULL)
- tmp->tm_isdst = -1; /* in case it wasn't initialized */
- return mktime(tmp);
-}
-
-time_t
-timegm(struct tm *tmp)
-{
- return timeoff(tmp, 0);
-}
-
-time_t
-timeoff(struct tm *tmp, long offset)
-{
- if (tmp)
- tmp->tm_isdst = 0;
- gmtcheck();
- return time1(tmp, gmtsub, gmtptr, offset);
-}
-
-#endif /* defined STD_INSPIRED */
-
-/*
-** XXX--is the below the right way to conditionalize??
-*/
-
-#ifdef STD_INSPIRED
-
-/*
-** IEEE Std 1003.1-1988 (POSIX) legislates that 536457599
-** shall correspond to "Wed Dec 31 23:59:59 UTC 1986", which
-** is not the case if we are accounting for leap seconds.
-** So, we provide the following conversion routines for use
-** when exchanging timestamps with POSIX conforming systems.
-*/
-
-static int_fast64_t
-leapcorr(struct state const *sp, time_t t)
-{
- register struct lsinfo const * lp;
- register int i;
-
- i = sp->leapcnt;
- while (--i >= 0) {
- lp = &sp->lsis[i];
- if (t >= lp->ls_trans)
- return lp->ls_corr;
- }
- return 0;
-}
-
-NETBSD_INSPIRED_EXTERN time_t ATTRIBUTE_PURE
-time2posix_z(struct state *sp, time_t t)
-{
- return t - leapcorr(sp, t);
-}
-
-time_t
-time2posix(time_t t)
-{
- int err = lock();
- if (err) {
- errno = err;
- return -1;
- }
- if (!lcl_is_set)
- tzset_unlocked();
- if (lclptr)
- t = time2posix_z(lclptr, t);
- unlock();
- return t;
-}
-
-NETBSD_INSPIRED_EXTERN time_t ATTRIBUTE_PURE
-posix2time_z(struct state *sp, time_t t)
-{
- time_t x;
- time_t y;
- /*
- ** For a positive leap second hit, the result
- ** is not unique. For a negative leap second
- ** hit, the corresponding time doesn't exist,
- ** so we return an adjacent second.
- */
- x = t + leapcorr(sp, t);
- y = x - leapcorr(sp, x);
- if (y < t) {
- do {
- x++;
- y = x - leapcorr(sp, x);
- } while (y < t);
- x -= y != t;
- } else if (y > t) {
- do {
- --x;
- y = x - leapcorr(sp, x);
- } while (y > t);
- x += y != t;
- }
- return x;
-}
-
-time_t
-posix2time(time_t t)
-{
- int err = lock();
- if (err) {
- errno = err;
- return -1;
- }
- if (!lcl_is_set)
- tzset_unlocked();
- if (lclptr)
- t = posix2time_z(lclptr, t);
- unlock();
- return t;
-}
-
-#endif /* defined STD_INSPIRED */
-
-#ifdef time_tz
-
-/* Convert from the underlying system's time_t to the ersatz time_tz,
- which is called 'time_t' in this file. */
-
-time_t
-time(time_t *p)
-{
- time_t r = sys_time(0);
- if (p)
- *p = r;
- return r;
-}
-
-#endif
Deleted: vendor/tzcode/dist/newctime.3
===================================================================
--- vendor/tzcode/dist/newctime.3 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/newctime.3 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,306 +0,0 @@
-.TH NEWCTIME 3
-.SH NAME
-asctime, ctime, difftime, gmtime, localtime, mktime \- convert date and time
-.SH SYNOPSIS
-.nf
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.B #include <time.h>
-.PP
-.B extern char *tzname[2];
-.PP
-.B char *ctime(time_t const *clock);
-.PP
-.B char *ctime_r(time_t const *clock, char *buf);
-.PP
-.B double difftime(time_t time1, time_t time0);
-.PP
-.B char *asctime(struct tm const *tm);
-.PP
-.B "char *asctime_r(struct tm const *restrict tm,"
-.B " char *restrict result);"
-.PP
-.B struct tm *localtime(time_t const *clock);
-.PP
-.B "struct tm *localtime_r(time_t const *restrict clock,"
-.B " struct tm *restrict result);"
-.PP
-.B "struct tm *localtime_rz(timezone_t restrict zone,"
-.B " time_t const *restrict clock,"
-.B " struct tm *restrict result);"
-.PP
-.B struct tm *gmtime(time_t const *clock);
-.PP
-.B "struct tm *gmtime_r(time_t const *restrict clock,"
-.B " struct tm *restrict result);"
-.PP
-.B time_t mktime(struct tm *tm);
-.PP
-.B "time_t mktime_z(timezone_t restrict zone,"
-.B " struct tm *restrict tm);"
-.PP
-.B cc ... \*-ltz
-.fi
-.SH DESCRIPTION
-.ie '\(en'' .ds en \-
-.el .ds en \(en
-.ie '\(lq'' .ds lq \&"\"
-.el .ds lq \(lq\"
-.ie '\(rq'' .ds rq \&"\"
-.el .ds rq \(rq\"
-.de q
-\\$3\*(lq\\$1\*(rq\\$2
-..
-.I Ctime
-converts a long integer, pointed to by
-.IR clock ,
-and returns a pointer to a
-string of the form
-.br
-.ce
-.eo
-Thu Nov 24 18:22:48 1986\n\0
-.br
-.ec
-Years requiring fewer than four characters are padded with leading zeroes.
-For years longer than four characters, the string is of the form
-.br
-.ce
-.eo
-Thu Nov 24 18:22:48 81986\n\0
-.ec
-.br
-with five spaces before the year.
-These unusual formats are designed to make it less likely that older
-software that expects exactly 26 bytes of output will mistakenly output
-misleading values for out-of-range years.
-.PP
-The
-.BI * clock
-time stamp represents the time in seconds since 1970-01-01 00:00:00
-Coordinated Universal Time (UTC).
-The POSIX standard says that time stamps must be nonnegative
-and must ignore leap seconds.
-Many implementations extend POSIX by allowing negative time stamps,
-and can therefore represent time stamps that predate the
-introduction of UTC and are some other flavor of Universal Time (UT).
-Some implementations support leap seconds, in contradiction to POSIX.
-.PP
-.I Localtime
-and
-.I gmtime
-return pointers to
-.q "tm"
-structures, described below.
-.I Localtime
-corrects for the time zone and any time zone adjustments
-(such as Daylight Saving Time in the United States).
-After filling in the
-.q "tm"
-structure,
-.I localtime
-sets the
-.BR tm_isdst 'th
-element of
-.B tzname
-to a pointer to a string that's the time zone abbreviation to be used with
-.IR localtime 's
-return value.
-.PP
-.I Gmtime
-converts to Coordinated Universal Time.
-.PP
-.I Asctime
-converts a time value contained in a
-.q "tm"
-structure to a string,
-as shown in the above example,
-and returns a pointer to the string.
-.PP
-.I Mktime
-converts the broken-down time,
-expressed as local time,
-in the structure pointed to by
-.I tm
-into a calendar time value with the same encoding as that of the values
-returned by the
-.I time
-function.
-The original values of the
-.B tm_wday
-and
-.B tm_yday
-components of the structure are ignored,
-and the original values of the other components are not restricted
-to their normal ranges.
-(A positive or zero value for
-.B tm_isdst
-causes
-.I mktime
-to presume initially that summer time (for example, Daylight Saving Time
-in the U.S.A.)
-respectively,
-is or is not in effect for the specified time.
-A negative value for
-.B tm_isdst
-causes the
-.I mktime
-function to attempt to divine whether summer time is in effect
-for the specified time; in this case it does not use a consistent
-rule and may give a different answer when later
-presented with the same argument.)
-On successful completion, the values of the
-.B tm_wday
-and
-.B tm_yday
-components of the structure are set appropriately,
-and the other components are set to represent the specified calendar time,
-but with their values forced to their normal ranges; the final value of
-.B tm_mday
-is not set until
-.B tm_mon
-and
-.B tm_year
-are determined.
-.I Mktime
-returns the specified calendar time;
-If the calendar time cannot be represented,
-it returns \-1.
-.PP
-.I Difftime
-returns the difference between two calendar times,
-.RI ( time1
-\-
-.IR time0 ),
-expressed in seconds.
-.PP
-.IR Ctime_r ,
-.IR localtime_r ,
-.IR gmtime_r ,
-and
-.I asctime_r
-are like their unsuffixed counterparts, except that they accept an
-additional argument specifying where to store the result if successful.
-.PP
-.IR Localtime_rz
-and
-.I mktime_z
-are like their unsuffixed counterparts, except that they accept an
-extra initial
-.B zone
-argument specifying the time zone to be used for conversion.
-If
-.B zone
-is null, UTC is used; otherwise,
-.B zone
-should be have been allocated by
-.I tzalloc
-and should not be freed until after all uses (e.g., by calls to
-.IR strftime )
-of the filled-in
-.B tm_zone
-fields.
-.PP
-Declarations of all the functions and externals, and the
-.q "tm"
-structure,
-are in the
-.B <time.h>
-header file.
-The structure (of type)
-.B struct tm
-includes the following fields:
-.RS
-.PP
-.nf
-.ta .5i +\w'long tm_gmtoff;\0\0'u
- int tm_sec; /\(** seconds (0\*(en60) \(**/
- int tm_min; /\(** minutes (0\*(en59) \(**/
- int tm_hour; /\(** hours (0\*(en23) \(**/
- int tm_mday; /\(** day of month (1\*(en31) \(**/
- int tm_mon; /\(** month of year (0\*(en11) \(**/
- int tm_year; /\(** year \- 1900 \(**/
- int tm_wday; /\(** day of week (Sunday = 0) \(**/
- int tm_yday; /\(** day of year (0\*(en365) \(**/
- int tm_isdst; /\(** is summer time in effect? \(**/
- char \(**tm_zone; /\(** abbreviation of time zone name \(**/
- long tm_gmtoff; /\(** offset from UT in seconds \(**/
-.fi
-.RE
-.PP
-The
-.I tm_zone
-and
-.I tm_gmtoff
-fields exist, and are filled in, only if arrangements to do
-so were made when the library containing these functions was
-created.
-There is no guarantee that these fields will continue to exist
-in this form in future releases of this code.
-.PP
-.I Tm_isdst
-is non-zero if summer time is in effect.
-.PP
-.I Tm_gmtoff
-is the offset (in seconds) of the time represented
-from UT, with positive values indicating east
-of the Prime Meridian.
-The field's name is derived from Greenwich Mean Time, a precursor of UT.
-.SH FILES
-.ta \w'/usr/local/etc/zoneinfo/posixrules\0\0'u
-/usr/local/etc/zoneinfo time zone information directory
-.br
-/usr/local/etc/zoneinfo/localtime local time zone file
-.br
-/usr/local/etc/zoneinfo/posixrules used with POSIX-style TZ's
-.br
-/usr/local/etc/zoneinfo/GMT for UTC leap seconds
-.sp
-If
-.B /usr/local/etc/zoneinfo/GMT
-is absent,
-UTC leap seconds are loaded from
-.BR /usr/local/etc/zoneinfo/posixrules .
-.SH SEE ALSO
-getenv(3),
-newstrftime(3),
-newtzset(3),
-time(2),
-tzfile(5)
-.SH NOTES
-The return values of
-.IR asctime ,
-.IR ctime ,
-.IR gmtime ,
-and
-.I localtime
-point to static data
-overwritten by each call.
-The
-.B tm_zone
-field of a returned
-.B "struct tm"
-points to a static array of characters, which
-can be overwritten by later calls to
-.IR tzset .
-The remaining functions and data are thread-safe.
-.PP
-.IR Asctime ,
-.IR asctime_r ,
-.IR ctime ,
-and
-.I ctime_r
-behave strangely for years before 1000 or after 9999.
-The 1989 and 1999 editions of the C Standard say
-that years from \-99 through 999 are converted without
-extra spaces, but this conflicts with longstanding
-tradition and with this implementation.
-The 2011 edition says that the behavior
-is undefined if the year is before 1000 or after 9999.
-Traditional implementations of these two functions are
-restricted to years in the range 1900 through 2099.
-To avoid this portability mess, new programs should use
-.I strftime
-instead.
-.\" This file is in the public domain, so clarified as of
-.\" 2009-05-17 by Arthur David Olson.
Deleted: vendor/tzcode/dist/newctime.3.txt
===================================================================
--- vendor/tzcode/dist/newctime.3.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/newctime.3.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,168 +0,0 @@
-NEWCTIME(3) Library Functions Manual NEWCTIME(3)
-
-NAME
- asctime, ctime, difftime, gmtime, localtime, mktime - convert date and
- time
-
-SYNOPSIS
- #include <time.h>
-
- extern char *tzname[2];
-
- char *ctime(time_t const *clock);
-
- char *ctime_r(time_t const *clock, char *buf);
-
- double difftime(time_t time1, time_t time0);
-
- char *asctime(struct tm const *tm);
-
- char *asctime_r(struct tm const *restrict tm,
- char *restrict result);
-
- struct tm *localtime(time_t const *clock);
-
- struct tm *localtime_r(time_t const *restrict clock,
- struct tm *restrict result);
-
- struct tm *localtime_rz(timezone_t restrict zone,
- time_t const *restrict clock,
- struct tm *restrict result);
-
- struct tm *gmtime(time_t const *clock);
-
- struct tm *gmtime_r(time_t const *restrict clock,
- struct tm *restrict result);
-
- time_t mktime(struct tm *tm);
-
- time_t mktime_z(timezone_t restrict zone,
- struct tm *restrict tm);
-
- cc ... -ltz
-
-DESCRIPTION
- Ctime converts a long integer, pointed to by clock, and returns a
- pointer to a string of the form
- Thu Nov 24 18:22:48 1986\n\0
- Years requiring fewer than four characters are padded with leading
- zeroes. For years longer than four characters, the string is of the
- form
- Thu Nov 24 18:22:48 81986\n\0
- with five spaces before the year. These unusual formats are designed
- to make it less likely that older software that expects exactly 26
- bytes of output will mistakenly output misleading values for out-of-
- range years.
-
- The *clock time stamp represents the time in seconds since 1970-01-01
- 00:00:00 Coordinated Universal Time (UTC). The POSIX standard says
- that time stamps must be nonnegative and must ignore leap seconds.
- Many implementations extend POSIX by allowing negative time stamps, and
- can therefore represent time stamps that predate the introduction of
- UTC and are some other flavor of Universal Time (UT). Some
- implementations support leap seconds, in contradiction to POSIX.
-
- Localtime and gmtime return pointers to "tm" structures, described
- below. Localtime corrects for the time zone and any time zone
- adjustments (such as Daylight Saving Time in the United States). After
- filling in the "tm" structure, localtime sets the tm_isdst'th element
- of tzname to a pointer to a string that's the time zone abbreviation to
- be used with localtime's return value.
-
- Gmtime converts to Coordinated Universal Time.
-
- Asctime converts a time value contained in a "tm" structure to a
- string, as shown in the above example, and returns a pointer to the
- string.
-
- Mktime converts the broken-down time, expressed as local time, in the
- structure pointed to by tm into a calendar time value with the same
- encoding as that of the values returned by the time function. The
- original values of the tm_wday and tm_yday components of the structure
- are ignored, and the original values of the other components are not
- restricted to their normal ranges. (A positive or zero value for
- tm_isdst causes mktime to presume initially that summer time (for
- example, Daylight Saving Time in the U.S.A.) respectively, is or is
- not in effect for the specified time. A negative value for tm_isdst
- causes the mktime function to attempt to divine whether summer time is
- in effect for the specified time; in this case it does not use a
- consistent rule and may give a different answer when later presented
- with the same argument.) On successful completion, the values of the
- tm_wday and tm_yday components of the structure are set appropriately,
- and the other components are set to represent the specified calendar
- time, but with their values forced to their normal ranges; the final
- value of tm_mday is not set until tm_mon and tm_year are determined.
- Mktime returns the specified calendar time; If the calendar time cannot
- be represented, it returns -1.
-
- Difftime returns the difference between two calendar times, (time1 -
- time0), expressed in seconds.
-
- Ctime_r, localtime_r, gmtime_r, and asctime_r are like their unsuffixed
- counterparts, except that they accept an additional argument specifying
- where to store the result if successful.
-
- Localtime_rz and mktime_z are like their unsuffixed counterparts,
- except that they accept an extra initial zone argument specifying the
- time zone to be used for conversion. If zone is null, UTC is used;
- otherwise, zone should be have been allocated by tzalloc and should not
- be freed until after all uses (e.g., by calls to strftime) of the
- filled-in tm_zone fields.
-
- Declarations of all the functions and externals, and the "tm"
- structure, are in the <time.h> header file. The structure (of type)
- struct tm includes the following fields:
-
- int tm_sec; /* seconds (0-60) */
- int tm_min; /* minutes (0-59) */
- int tm_hour; /* hours (0-23) */
- int tm_mday; /* day of month (1-31) */
- int tm_mon; /* month of year (0-11) */
- int tm_year; /* year - 1900 */
- int tm_wday; /* day of week (Sunday = 0) */
- int tm_yday; /* day of year (0-365) */
- int tm_isdst; /* is summer time in effect? */
- char *tm_zone; /* abbreviation of time zone name */
- long tm_gmtoff; /* offset from UT in seconds */
-
- The tm_zone and tm_gmtoff fields exist, and are filled in, only if
- arrangements to do so were made when the library containing these
- functions was created. There is no guarantee that these fields will
- continue to exist in this form in future releases of this code.
-
- Tm_isdst is non-zero if summer time is in effect.
-
- Tm_gmtoff is the offset (in seconds) of the time represented from UT,
- with positive values indicating east of the Prime Meridian. The
- field's name is derived from Greenwich Mean Time, a precursor of UT.
-
-FILES
- /usr/local/etc/zoneinfo time zone information directory
- /usr/local/etc/zoneinfo/localtime local time zone file
- /usr/local/etc/zoneinfo/posixrules used with POSIX-style TZ's
- /usr/local/etc/zoneinfo/GMT for UTC leap seconds
-
- If /usr/local/etc/zoneinfo/GMT is absent, UTC leap seconds are loaded
- from /usr/local/etc/zoneinfo/posixrules.
-
-SEE ALSO
- getenv(3), newstrftime(3), newtzset(3), time(2), tzfile(5)
-
-NOTES
- The return values of asctime, ctime, gmtime, and localtime point to
- static data overwritten by each call. The tm_zone field of a returned
- struct tm points to a static array of characters, which can be
- overwritten by later calls to tzset. The remaining functions and data
- are thread-safe.
-
- Asctime, asctime_r, ctime, and ctime_r behave strangely for years
- before 1000 or after 9999. The 1989 and 1999 editions of the C
- Standard say that years from -99 through 999 are converted without
- extra spaces, but this conflicts with longstanding tradition and with
- this implementation. The 2011 edition says that the behavior is
- undefined if the year is before 1000 or after 9999. Traditional
- implementations of these two functions are restricted to years in the
- range 1900 through 2099. To avoid this portability mess, new programs
- should use strftime instead.
-
- NEWCTIME(3)
Deleted: vendor/tzcode/dist/newstrftime.3
===================================================================
--- vendor/tzcode/dist/newstrftime.3 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/newstrftime.3 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,226 +0,0 @@
-.\" Based on the UCB file whose copyright information appears below.
-.\" Copyright (c) 1989, 1991 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the American National Standards Committee X3, on Information
-.\" Processing Systems.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" from: @(#)strftime.3 5.12 (Berkeley) 6/29/91
-.\" $Id: strftime.3,v 1.4 1993/12/15 20:33:00 jtc Exp $
-.\"
-.TH NEWSTRFTIME 3
-.SH NAME
-strftime \- format date and time
-.SH SYNOPSIS
-.nf
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.B #include <time.h>
-.PP
-.B "size_t strftime(char *restrict buf, size_t maxsize,"
-.B " char const *restrict format, struct tm const *restrict timeptr);"
-.PP
-.B cc ... \-ltz
-.fi
-.SH DESCRIPTION
-.ie '\(en'' .ds en \-
-.el .ds en \(en
-The
-.I strftime
-function formats the information from
-.I timeptr
-into the buffer
-.I buf
-according to the string pointed to by
-.IR format .
-.PP
-The
-.I format
-string consists of zero or more conversion specifications and
-ordinary characters.
-All ordinary characters are copied directly into the buffer.
-A conversion specification consists of a percent sign
-.Ql %
-and one other character.
-.PP
-No more than
-.I maxsize
-characters are placed into the array.
-If the total number of resulting characters, including the terminating
-null character, is not more than
-.IR maxsize ,
-.I strftime
-returns the number of characters in the array, not counting the
-terminating null.
-Otherwise, zero is returned.
-.PP
-Each conversion specification is replaced by the characters as
-follows which are then copied into the buffer.
-.TP
-%A
-is replaced by the locale's full weekday name.
-.TP
-%a
-is replaced by the locale's abbreviated weekday name.
-.TP
-%B
-is replaced by the locale's full month name.
-.TP
-%b or %h
-is replaced by the locale's abbreviated month name.
-.TP
-%C
-is replaced by the century (a year divided by 100 and truncated to an integer)
-as a decimal number (00\*(en99).
-.TP
-%c
-is replaced by the locale's appropriate date and time representation.
-.TP
-%D
-is replaced by the date in the format %m/%d/%y.
-.TP
-%d
-is replaced by the day of the month as a decimal number (01\*(en31).
-.TP
-%e
-is replaced by the day of month as a decimal number (1\*(en31);
-single digits are preceded by a blank.
-.TP
-%F
-is replaced by the date in the format %Y\*-%m\*-%d.
-.TP
-%G
-is replaced by the ISO 8601 year with century as a decimal number.
-.TP
-%g
-is replaced by the ISO 8601 year without century as a decimal number (00\*(en99).
-.TP
-%H
-is replaced by the hour (24-hour clock) as a decimal number (00\*(en23).
-.TP
-%I
-is replaced by the hour (12-hour clock) as a decimal number (01\*(en12).
-.TP
-%j
-is replaced by the day of the year as a decimal number (001\*(en366).
-.TP
-%k
-is replaced by the hour (24-hour clock) as a decimal number (0\*(en23);
-single digits are preceded by a blank.
-.TP
-%l
-is replaced by the hour (12-hour clock) as a decimal number (1\*(en12);
-single digits are preceded by a blank.
-.TP
-%M
-is replaced by the minute as a decimal number (00\*(en59).
-.TP
-%m
-is replaced by the month as a decimal number (01\*(en12).
-.TP
-%n
-is replaced by a newline.
-.TP
-%p
-is replaced by the locale's equivalent of either AM or PM.
-.TP
-%R
-is replaced by the time in the format %H:%M.
-.TP
-%r
-is replaced by the locale's representation of 12-hour clock time
-using AM/PM notation.
-.TP
-%S
-is replaced by the second as a decimal number (00\*(en60).
-.TP
-%s
-is replaced by the number of seconds since the Epoch (see newctime(3)).
-.TP
-%T
-is replaced by the time in the format %H:%M:%S.
-.TP
-%t
-is replaced by a tab.
-.TP
-%U
-is replaced by the week number of the year (Sunday as the first day of
-the week) as a decimal number (00\*(en53).
-.TP
-%u
-is replaced by the weekday (Monday as the first day of the week)
-as a decimal number (1\*(en7).
-.TP
-%V
-is replaced by the week number of the year (Monday as the first day of
-the week) as a decimal number (01\*(en53). If the week containing January
-1 has four or more days in the new year, then it is week 1; otherwise
-it is week 53 of the previous year, and the next week is week 1.
-.TP
-%W
-is replaced by the week number of the year (Monday as the first day of
-the week) as a decimal number (00\*(en53).
-.TP
-%w
-is replaced by the weekday (Sunday as the first day of the week)
-as a decimal number (0\*(en6).
-.TP
-%X
-is replaced by the locale's appropriate time representation.
-.TP
-%x
-is replaced by the locale's appropriate date representation.
-.TP
-%Y
-is replaced by the year with century as a decimal number.
-.TP
-%y
-is replaced by the year without century as a decimal number (00\*(en99).
-.TP
-%Z
-is replaced by the time zone name,
-or by the empty string if this is not determinable.
-.TP
-%z
-is replaced by the offset from the Prime Meridian
-in the format +HHMM or \*-HHMM as appropriate,
-with positive values representing locations east of Greenwich,
-or by the empty string if this is not determinable.
-.TP
-%%
-is replaced by a single %.
-.TP
-%+
-is replaced by the date and time in date(1) format.
-.SH SEE ALSO
-date(1),
-getenv(3),
-newctime(3),
-newtzset(3),
-time(2),
-tzfile(5)
Deleted: vendor/tzcode/dist/newstrftime.3.txt
===================================================================
--- vendor/tzcode/dist/newstrftime.3.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/newstrftime.3.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,141 +0,0 @@
-NEWSTRFTIME(3) Library Functions Manual NEWSTRFTIME(3)
-
-NAME
- strftime - format date and time
-
-SYNOPSIS
- #include <time.h>
-
- size_t strftime(char *restrict buf, size_t maxsize,
- char const *restrict format, struct tm const *restrict timeptr);
-
- cc ... -ltz
-
-DESCRIPTION
- The strftime function formats the information from timeptr into the
- buffer buf according to the string pointed to by format.
-
- The format string consists of zero or more conversion specifications
- and ordinary characters. All ordinary characters are copied directly
- into the buffer. A conversion specification consists of a percent sign
- and one other character.
-
- No more than maxsize characters are placed into the array. If the
- total number of resulting characters, including the terminating null
- character, is not more than maxsize, strftime returns the number of
- characters in the array, not counting the terminating null. Otherwise,
- zero is returned.
-
- Each conversion specification is replaced by the characters as follows
- which are then copied into the buffer.
-
- %A is replaced by the locale's full weekday name.
-
- %a is replaced by the locale's abbreviated weekday name.
-
- %B is replaced by the locale's full month name.
-
- %b or %h
- is replaced by the locale's abbreviated month name.
-
- %C is replaced by the century (a year divided by 100 and truncated
- to an integer) as a decimal number (00-99).
-
- %c is replaced by the locale's appropriate date and time
- representation.
-
- %D is replaced by the date in the format %m/%d/%y.
-
- %d is replaced by the day of the month as a decimal number (01-31).
-
- %e is replaced by the day of month as a decimal number (1-31);
- single digits are preceded by a blank.
-
- %F is replaced by the date in the format %Y-%m-%d.
-
- %G is replaced by the ISO 8601 year with century as a decimal
- number.
-
- %g is replaced by the ISO 8601 year without century as a decimal
- number (00-99).
-
- %H is replaced by the hour (24-hour clock) as a decimal number
- (00-23).
-
- %I is replaced by the hour (12-hour clock) as a decimal number
- (01-12).
-
- %j is replaced by the day of the year as a decimal number
- (001-366).
-
- %k is replaced by the hour (24-hour clock) as a decimal number
- (0-23); single digits are preceded by a blank.
-
- %l is replaced by the hour (12-hour clock) as a decimal number
- (1-12); single digits are preceded by a blank.
-
- %M is replaced by the minute as a decimal number (00-59).
-
- %m is replaced by the month as a decimal number (01-12).
-
- %n is replaced by a newline.
-
- %p is replaced by the locale's equivalent of either AM or PM.
-
- %R is replaced by the time in the format %H:%M.
-
- %r is replaced by the locale's representation of 12-hour clock time
- using AM/PM notation.
-
- %S is replaced by the second as a decimal number (00-60).
-
- %s is replaced by the number of seconds since the Epoch (see
- newctime(3)).
-
- %T is replaced by the time in the format %H:%M:%S.
-
- %t is replaced by a tab.
-
- %U is replaced by the week number of the year (Sunday as the first
- day of the week) as a decimal number (00-53).
-
- %u is replaced by the weekday (Monday as the first day of the week)
- as a decimal number (1-7).
-
- %V is replaced by the week number of the year (Monday as the first
- day of the week) as a decimal number (01-53). If the week
- containing January 1 has four or more days in the new year, then
- it is week 1; otherwise it is week 53 of the previous year, and
- the next week is week 1.
-
- %W is replaced by the week number of the year (Monday as the first
- day of the week) as a decimal number (00-53).
-
- %w is replaced by the weekday (Sunday as the first day of the week)
- as a decimal number (0-6).
-
- %X is replaced by the locale's appropriate time representation.
-
- %x is replaced by the locale's appropriate date representation.
-
- %Y is replaced by the year with century as a decimal number.
-
- %y is replaced by the year without century as a decimal number
- (00-99).
-
- %Z is replaced by the time zone name, or by the empty string if
- this is not determinable.
-
- %z is replaced by the offset from the Prime Meridian in the format
- +HHMM or -HHMM as appropriate, with positive values representing
- locations east of Greenwich, or by the empty string if this is
- not determinable.
-
- %% is replaced by a single %.
-
- %+ is replaced by the date and time in date(1) format.
-
-SEE ALSO
- date(1), getenv(3), newctime(3), newtzset(3), time(2), tzfile(5)
-
- NEWSTRFTIME(3)
Deleted: vendor/tzcode/dist/newtzset.3
===================================================================
--- vendor/tzcode/dist/newtzset.3 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/newtzset.3 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,326 +0,0 @@
-.TH NEWTZSET 3
-.SH NAME
-tzset \- initialize time conversion information
-.SH SYNOPSIS
-.nf
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.B #include <time.h>
-.PP
-.B timezone_t tzalloc(char const *TZ);
-.PP
-.B void tzfree(timezone_t tz);
-.PP
-.B void tzset(void);
-.PP
-.B cc ... \*-ltz
-.fi
-.SH DESCRIPTION
-.ie '\(en'' .ds en \-
-.el .ds en \(en
-.ie '\(lq'' .ds lq \&"\"
-.el .ds lq \(lq\"
-.ie '\(rq'' .ds rq \&"\"
-.el .ds rq \(rq\"
-.de q
-\\$3\*(lq\\$1\*(rq\\$2
-..
-.I Tzalloc
-allocates and returns a time zone object described by
-.BR TZ .
-If
-.B TZ
-is not a valid time zone description, or if the object cannot be allocated,
-.I tzalloc
-returns a null pointer and sets
-.BR errno .
-.PP
-.I Tzfree
-frees a time zone object
-.BR tz ,
-which should have been successfully allocated by
-.IR tzalloc .
-This invalidates any
-.B tm_zone
-pointers that
-.B tz
-was used to set.
-.PP
-.I Tzset
-acts like
-.BR tzalloc(getenv("TZ")) ,
-except it saves any resulting time zone object into internal
-storage that is accessed by
-.IR localtime ,
-.IR localtime_r ,
-and
-.IR mktime .
-The anonymous shared time zone object is freed by the next call to
-.IR tzset .
-If the implied call to
-.B tzalloc
-fails,
-.I tzset
-falls back on UTC.
-.PP
-If
-.B TZ
-is null, the best available approximation to local wall
-clock time, as specified by the
-.IR tzfile (5)-format
-file
-.B localtime
-in the system time conversion information directory, is used.
-If
-.B TZ
-is the empty string,
-Universal Time (UT) is used, with the abbreviation "UTC"
-and without leap second correction; please see
-.IR newctime (3)
-for more about UT, UTC, and leap seconds. If
-.B TZ
-is nonnull and nonempty:
-.IP
-if the value begins with a colon, it is used as a pathname of a file
-from which to read the time conversion information;
-.IP
-if the value does not begin with a colon, it is first used as the
-pathname of a file from which to read the time conversion information,
-and, if that file cannot be read, is used directly as a specification of
-the time conversion information.
-.PP
-When
-.B TZ
-is used as a pathname, if it begins with a slash,
-it is used as an absolute pathname; otherwise,
-it is used as a pathname relative to a system time conversion information
-directory.
-The file must be in the format specified in
-.IR tzfile (5).
-.PP
-When
-.B TZ
-is used directly as a specification of the time conversion information,
-it must have the following syntax (spaces inserted for clarity):
-.IP
-\fIstd\|offset\fR[\fIdst\fR[\fIoffset\fR][\fB,\fIrule\fR]]
-.PP
-Where:
-.RS
-.TP 15
-.IR std " and " dst
-Three or more bytes that are the designation for the standard
-.RI ( std )
-or summer
-.RI ( dst )
-time zone. Only
-.I std
-is required; if
-.I dst
-is missing, then summer time does not apply in this locale.
-Upper- and lowercase letters are explicitly allowed. Any characters
-except a leading colon
-.RB ( : ),
-digits, comma
-.RB ( , ),
-ASCII minus
-.RB ( \*- ),
-ASCII plus
-.RB ( + ),
-and NUL bytes are allowed.
-.TP
-.I offset
-Indicates the value one must add to the local time to arrive at
-Coordinated Universal Time. The
-.I offset
-has the form:
-.RS
-.IP
-\fIhh\fR[\fB:\fImm\fR[\fB:\fIss\fR]]
-.RE
-.IP
-The minutes
-.RI ( mm )
-and seconds
-.RI ( ss )
-are optional. The hour
-.RI ( hh )
-is required and may be a single digit. The
-.I offset
-following
-.I std
-is required. If no
-.I offset
-follows
-.IR dst ,
-summer time is assumed to be one hour ahead of standard time. One or
-more digits may be used; the value is always interpreted as a decimal
-number. The hour must be between zero and 24, and the minutes (and
-seconds) \*(en if present \*(en between zero and 59. If preceded by a
-.q "\*-" ,
-the time zone shall be east of the Prime Meridian; otherwise it shall be
-west (which may be indicated by an optional preceding
-.q "+" .
-.TP
-.I rule
-Indicates when to change to and back from summer time. The
-.I rule
-has the form:
-.RS
-.IP
-\fIdate\fB/\fItime\fB,\fIdate\fB/\fItime\fR
-.RE
-.IP
-where the first
-.I date
-describes when the change from standard to summer time occurs and the
-second
-.I date
-describes when the change back happens. Each
-.I time
-field describes when, in current local time, the change to the other
-time is made.
-As an extension to POSIX, daylight saving is assumed to be in effect
-all year if it begins January 1 at 00:00 and ends December 31 at
-24:00 plus the difference between daylight saving and standard time,
-leaving no room for standard time in the calendar.
-.IP
-The format of
-.I date
-is one of the following:
-.RS
-.TP 10
-.BI J n
-The Julian day
-.I n
-.RI "(1\ \(<=" "\ n\ " "\(<=\ 365).
-Leap days are not counted; that is, in all years \*(en including leap
-years \*(en February 28 is day 59 and March 1 is day 60. It is
-impossible to explicitly refer to the occasional February 29.
-.TP
-.I n
-The zero-based Julian day
-.RI "(0\ \(<=" "\ n\ " "\(<=\ 365).
-Leap days are counted, and it is possible to refer to February 29.
-.TP
-.BI M m . n . d
-The
-.IR d' th
-day
-.RI "(0\ \(<=" "\ d\ " "\(<=\ 6)
-of week
-.I n
-of month
-.I m
-of the year
-.RI "(1\ \(<=" "\ n\ " "\(<=\ 5,
-.RI "1\ \(<=" "\ m\ " "\(<=\ 12,
-where week 5 means
-.q "the last \fId\fP day in month \fIm\fP"
-which may occur in either the fourth or the fifth week). Week 1 is the
-first week in which the
-.IR d' th
-day occurs. Day zero is Sunday.
-.RE
-.IP "" 15
-The
-.I time
-has the same format as
-.I offset
-except that POSIX does not allow a leading sign (\c
-.q "\*-"
-or
-.q "+" ).
-As an extension to POSIX, the hours part of
-.I time
-can range from \-167 through 167; this allows for unusual rules such
-as
-.q "the Saturday before the first Sunday of March" .
-The default, if
-.I time
-is not given, is
-.BR 02:00:00 .
-.RE
-.LP
-Here are some examples of
-.B TZ
-values that directly specify the time zone rules; they use some of the
-extensions to POSIX.
-.TP
-.B EST5
-stands for US Eastern Standard
-Time (EST), 5 hours behind UTC, without daylight saving.
-.TP
-.B FJT\*-12FJST,M11.1.0,M1.3.4/75
-stands for Fiji Time (FJT) and Fiji Summer Time (FJST), 12 hours ahead
-of UTC, springing forward on November's first Sunday at 02:00, and
-falling back on January's third Thursday at 75:00 (i.e., 03:00 on the
-first Sunday on or after January 18).
-.TP
-.B IST\*-2IDT,M3.4.4/26,M10.5.0
-stands for Israel Standard Time (IST) and Israel Daylight Time (IDT),
-2 hours ahead of UTC, springing forward on March's fourth
-Thursday at 26:00 (i.e., 02:00 on the first Friday on or after March
-23), and falling back on October's last Sunday at 02:00.
-.TP
-.B WART4WARST,J1/0,J365/25
-stands for Western Argentina Summer Time (WARST), 3 hours behind UTC.
-There is a dummy fall-back transition on December 31 at 25:00 daylight
-saving time (i.e., 24:00 standard time, equivalent to January 1 at
-00:00 standard time), and a simultaneous spring-forward transition on
-January 1 at 00:00 standard time, so daylight saving time is in effect
-all year and the initial
-.B WART
-is a placeholder.
-.TP
-.B WGT3WGST,M3.5.0/\*-2,M10.5.0/\*-1
-stands for Western Greenland Time (WGT) and Western Greenland Summer
-Time (WGST), 3 hours behind UTC, where clocks follow the EU rules of
-springing forward on March's last Sunday at 01:00 UTC (\-02:00 local
-time) and falling back on October's last Sunday at 01:00 UTC
-(\-01:00 local time).
-.PP
-If no
-.I rule
-is present in
-.BR TZ ,
-the rules specified
-by the
-.IR tzfile (5)-format
-file
-.B posixrules
-in the system time conversion information directory are used, with the
-standard and summer time offsets from UTC replaced by those specified by
-the
-.I offset
-values in
-.BR TZ .
-.PP
-For compatibility with System V Release 3.1, a semicolon
-.RB ( ; )
-may be used to separate the
-.I rule
-from the rest of the specification.
-.SH FILES
-.ta \w'/usr/local/etc/zoneinfo/posixrules\0\0'u
-/usr/local/etc/zoneinfo time zone information directory
-.br
-/usr/local/etc/zoneinfo/localtime local time zone file
-.br
-/usr/local/etc/zoneinfo/posixrules used with POSIX-style TZ's
-.br
-/usr/local/etc/zoneinfo/GMT for UTC leap seconds
-.sp
-If
-.B /usr/local/etc/zoneinfo/GMT
-is absent,
-UTC leap seconds are loaded from
-.BR /usr/local/etc/zoneinfo/posixrules .
-.SH SEE ALSO
-getenv(3),
-newctime(3),
-newstrftime(3),
-time(2),
-tzfile(5)
-.\" This file is in the public domain, so clarified as of
-.\" 2009-05-17 by Arthur David Olson.
Deleted: vendor/tzcode/dist/newtzset.3.txt
===================================================================
--- vendor/tzcode/dist/newtzset.3.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/newtzset.3.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,192 +0,0 @@
-NEWTZSET(3) Library Functions Manual NEWTZSET(3)
-
-NAME
- tzset - initialize time conversion information
-
-SYNOPSIS
- #include <time.h>
-
- timezone_t tzalloc(char const *TZ);
-
- void tzfree(timezone_t tz);
-
- void tzset(void);
-
- cc ... -ltz
-
-DESCRIPTION
- Tzalloc allocates and returns a time zone object described by TZ. If
- TZ is not a valid time zone description, or if the object cannot be
- allocated, tzalloc returns a null pointer and sets errno.
-
- Tzfree frees a time zone object tz, which should have been successfully
- allocated by tzalloc. This invalidates any tm_zone pointers that tz
- was used to set.
-
- Tzset acts like tzalloc(getenv("TZ")), except it saves any resulting
- time zone object into internal storage that is accessed by localtime,
- localtime_r, and mktime. The anonymous shared time zone object is
- freed by the next call to tzset. If the implied call to tzalloc fails,
- tzset falls back on UTC.
-
- If TZ is null, the best available approximation to local wall clock
- time, as specified by the tzfile(5)-format file localtime in the system
- time conversion information directory, is used. If TZ is the empty
- string, Universal Time (UT) is used, with the abbreviation "UTC" and
- without leap second correction; please see newctime(3) for more about
- UT, UTC, and leap seconds. If TZ is nonnull and nonempty:
-
- if the value begins with a colon, it is used as a pathname of a
- file from which to read the time conversion information;
-
- if the value does not begin with a colon, it is first used as
- the pathname of a file from which to read the time conversion
- information, and, if that file cannot be read, is used directly
- as a specification of the time conversion information.
-
- When TZ is used as a pathname, if it begins with a slash, it is used as
- an absolute pathname; otherwise, it is used as a pathname relative to a
- system time conversion information directory. The file must be in the
- format specified in tzfile(5).
-
- When TZ is used directly as a specification of the time conversion
- information, it must have the following syntax (spaces inserted for
- clarity):
-
- stdoffset[dst[offset][,rule]]
-
- Where:
-
- std and dst Three or more bytes that are the designation for
- the standard (std) or summer (dst) time zone.
- Only std is required; if dst is missing, then
- summer time does not apply in this locale.
- Upper- and lowercase letters are explicitly
- allowed. Any characters except a leading colon
- (:), digits, comma (,), ASCII minus (-), ASCII
- plus (+), and NUL bytes are allowed.
-
- offset Indicates the value one must add to the local
- time to arrive at Coordinated Universal Time.
- The offset has the form:
-
- hh[:mm[:ss]]
-
- The minutes (mm) and seconds (ss) are optional.
- The hour (hh) is required and may be a single
- digit. The offset following std is required. If
- no offset follows dst, summer time is assumed to
- be one hour ahead of standard time. One or more
- digits may be used; the value is always
- interpreted as a decimal number. The hour must
- be between zero and 24, and the minutes (and
- seconds) - if present - between zero and 59. If
- preceded by a "-", the time zone shall be east of
- the Prime Meridian; otherwise it shall be west
- (which may be indicated by an optional preceding
- "+".
-
- rule Indicates when to change to and back from summer
- time. The rule has the form:
-
- date/time,date/time
-
- where the first date describes when the change
- from standard to summer time occurs and the
- second date describes when the change back
- happens. Each time field describes when, in
- current local time, the change to the other time
- is made. As an extension to POSIX, daylight
- saving is assumed to be in effect all year if it
- begins January 1 at 00:00 and ends December 31 at
- 24:00 plus the difference between daylight saving
- and standard time, leaving no room for standard
- time in the calendar.
-
- The format of date is one of the following:
-
- Jn The Julian day n (1 <= n <= 365). Leap
- days are not counted; that is, in all
- years - including leap years - February
- 28 is day 59 and March 1 is day 60. It
- is impossible to explicitly refer to
- the occasional February 29.
-
- n The zero-based Julian day
- (0 <= n <= 365). Leap days are
- counted, and it is possible to refer to
- February 29.
-
- Mm.n.d The d'th day (0 <= d <= 6) of week n of
- month m of the year (1 <= n <= 5,
- 1 <= m <= 12, where week 5 means "the
- last d day in month m" which may occur
- in either the fourth or the fifth
- week). Week 1 is the first week in
- which the d'th day occurs. Day zero is
- Sunday.
-
- The time has the same format as offset except
- that POSIX does not allow a leading sign ("-" or
- "+"). As an extension to POSIX, the hours part
- of time can range from -167 through 167; this
- allows for unusual rules such as "the Saturday
- before the first Sunday of March". The default,
- if time is not given, is 02:00:00.
-
- Here are some examples of TZ values that directly specify the time zone
- rules; they use some of the extensions to POSIX.
-
- EST5 stands for US Eastern Standard Time (EST), 5 hours behind UTC,
- without daylight saving.
-
- FJT-12FJST,M11.1.0,M1.3.4/75
- stands for Fiji Time (FJT) and Fiji Summer Time (FJST), 12 hours
- ahead of UTC, springing forward on November's first Sunday at
- 02:00, and falling back on January's third Thursday at 75:00
- (i.e., 03:00 on the first Sunday on or after January 18).
-
- IST-2IDT,M3.4.4/26,M10.5.0
- stands for Israel Standard Time (IST) and Israel Daylight Time
- (IDT), 2 hours ahead of UTC, springing forward on March's fourth
- Thursday at 26:00 (i.e., 02:00 on the first Friday on or after
- March 23), and falling back on October's last Sunday at 02:00.
-
- WART4WARST,J1/0,J365/25
- stands for Western Argentina Summer Time (WARST), 3 hours behind
- UTC. There is a dummy fall-back transition on December 31 at
- 25:00 daylight saving time (i.e., 24:00 standard time,
- equivalent to January 1 at 00:00 standard time), and a
- simultaneous spring-forward transition on January 1 at 00:00
- standard time, so daylight saving time is in effect all year and
- the initial WART is a placeholder.
-
- WGT3WGST,M3.5.0/-2,M10.5.0/-1
- stands for Western Greenland Time (WGT) and Western Greenland
- Summer Time (WGST), 3 hours behind UTC, where clocks follow the
- EU rules of springing forward on March's last Sunday at 01:00
- UTC (-02:00 local time) and falling back on October's last
- Sunday at 01:00 UTC (-01:00 local time).
-
- If no rule is present in TZ, the rules specified by the
- tzfile(5)-format file posixrules in the system time conversion
- information directory are used, with the standard and summer time
- offsets from UTC replaced by those specified by the offset values in
- TZ.
-
- For compatibility with System V Release 3.1, a semicolon (;) may be
- used to separate the rule from the rest of the specification.
-
-FILES
- /usr/local/etc/zoneinfo time zone information directory
- /usr/local/etc/zoneinfo/localtime local time zone file
- /usr/local/etc/zoneinfo/posixrules used with POSIX-style TZ's
- /usr/local/etc/zoneinfo/GMT for UTC leap seconds
-
- If /usr/local/etc/zoneinfo/GMT is absent, UTC leap seconds are loaded
- from /usr/local/etc/zoneinfo/posixrules.
-
-SEE ALSO
- getenv(3), newctime(3), newstrftime(3), time(2), tzfile(5)
-
- NEWTZSET(3)
Deleted: vendor/tzcode/dist/private.h
===================================================================
--- vendor/tzcode/dist/private.h 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/private.h 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,585 +0,0 @@
-#ifndef PRIVATE_H
-
-#define PRIVATE_H
-
-/*
-** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson.
-*/
-
-/*
-** This header is for use ONLY with the time conversion code.
-** There is no guarantee that it will remain unchanged,
-** or that it will remain at all.
-** Do NOT copy it to any system include directory.
-** Thank you!
-*/
-
-#define GRANDPARENTED "Local time zone must be set--see zic manual page"
-
-/*
-** Defaults for preprocessor symbols.
-** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
-*/
-
-#ifndef HAVE_DECL_ASCTIME_R
-#define HAVE_DECL_ASCTIME_R 1
-#endif
-
-#ifndef HAVE_GETTEXT
-#define HAVE_GETTEXT 0
-#endif /* !defined HAVE_GETTEXT */
-
-#ifndef HAVE_INCOMPATIBLE_CTIME_R
-#define HAVE_INCOMPATIBLE_CTIME_R 0
-#endif /* !defined INCOMPATIBLE_CTIME_R */
-
-#ifndef HAVE_LINK
-#define HAVE_LINK 1
-#endif /* !defined HAVE_LINK */
-
-#ifndef HAVE_POSIX_DECLS
-#define HAVE_POSIX_DECLS 1
-#endif
-
-#ifndef HAVE_STRDUP
-#define HAVE_STRDUP 1
-#endif
-
-#ifndef HAVE_SYMLINK
-#define HAVE_SYMLINK 1
-#endif /* !defined HAVE_SYMLINK */
-
-#ifndef HAVE_SYS_STAT_H
-#define HAVE_SYS_STAT_H 1
-#endif /* !defined HAVE_SYS_STAT_H */
-
-#ifndef HAVE_SYS_WAIT_H
-#define HAVE_SYS_WAIT_H 1
-#endif /* !defined HAVE_SYS_WAIT_H */
-
-#ifndef HAVE_UNISTD_H
-#define HAVE_UNISTD_H 1
-#endif /* !defined HAVE_UNISTD_H */
-
-#ifndef HAVE_UTMPX_H
-#define HAVE_UTMPX_H 1
-#endif /* !defined HAVE_UTMPX_H */
-
-#ifndef NETBSD_INSPIRED
-# define NETBSD_INSPIRED 1
-#endif
-
-#if HAVE_INCOMPATIBLE_CTIME_R
-#define asctime_r _incompatible_asctime_r
-#define ctime_r _incompatible_ctime_r
-#endif /* HAVE_INCOMPATIBLE_CTIME_R */
-
-/* Enable tm_gmtoff and tm_zone on GNUish systems. */
-#define _GNU_SOURCE 1
-/* Fix asctime_r on Solaris 10. */
-#define _POSIX_PTHREAD_SEMANTICS 1
-/* Enable strtoimax on Solaris 10. */
-#define __EXTENSIONS__ 1
-
-/*
-** Nested includes
-*/
-
-/* Avoid clashes with NetBSD by renaming NetBSD's declarations. */
-#define localtime_rz sys_localtime_rz
-#define mktime_z sys_mktime_z
-#define posix2time_z sys_posix2time_z
-#define time2posix_z sys_time2posix_z
-#define timezone_t sys_timezone_t
-#define tzalloc sys_tzalloc
-#define tzfree sys_tzfree
-#include <time.h>
-#undef localtime_rz
-#undef mktime_z
-#undef posix2time_z
-#undef time2posix_z
-#undef timezone_t
-#undef tzalloc
-#undef tzfree
-
-#include "sys/types.h" /* for time_t */
-#include "stdio.h"
-#include "string.h"
-#include "limits.h" /* for CHAR_BIT et al. */
-#include "stdlib.h"
-
-#include "errno.h"
-
-#ifndef ENAMETOOLONG
-# define ENAMETOOLONG EINVAL
-#endif
-#ifndef ENOTSUP
-# define ENOTSUP EINVAL
-#endif
-#ifndef EOVERFLOW
-# define EOVERFLOW EINVAL
-#endif
-
-#if HAVE_GETTEXT
-#include "libintl.h"
-#endif /* HAVE_GETTEXT */
-
-#if HAVE_SYS_WAIT_H
-#include <sys/wait.h> /* for WIFEXITED and WEXITSTATUS */
-#endif /* HAVE_SYS_WAIT_H */
-
-#ifndef WIFEXITED
-#define WIFEXITED(status) (((status) & 0xff) == 0)
-#endif /* !defined WIFEXITED */
-#ifndef WEXITSTATUS
-#define WEXITSTATUS(status) (((status) >> 8) & 0xff)
-#endif /* !defined WEXITSTATUS */
-
-#if HAVE_UNISTD_H
-#include "unistd.h" /* for F_OK, R_OK, and other POSIX goodness */
-#endif /* HAVE_UNISTD_H */
-
-#ifndef HAVE_STRFTIME_L
-# if _POSIX_VERSION < 200809
-# define HAVE_STRFTIME_L 0
-# else
-# define HAVE_STRFTIME_L 1
-# endif
-#endif
-
-#ifndef F_OK
-#define F_OK 0
-#endif /* !defined F_OK */
-#ifndef R_OK
-#define R_OK 4
-#endif /* !defined R_OK */
-
-/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
-#define is_digit(c) ((unsigned)(c) - '0' <= 9)
-
-/*
-** Define HAVE_STDINT_H's default value here, rather than at the
-** start, since __GLIBC__'s value depends on previously-included
-** files.
-** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
-*/
-#ifndef HAVE_STDINT_H
-#define HAVE_STDINT_H \
- (199901 <= __STDC_VERSION__ \
- || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
- || __CYGWIN__)
-#endif /* !defined HAVE_STDINT_H */
-
-#if HAVE_STDINT_H
-#include "stdint.h"
-#endif /* !HAVE_STDINT_H */
-
-#ifndef HAVE_INTTYPES_H
-# define HAVE_INTTYPES_H HAVE_STDINT_H
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-
-/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */
-#ifdef __LONG_LONG_MAX__
-# ifndef LLONG_MAX
-# define LLONG_MAX __LONG_LONG_MAX__
-# endif
-# ifndef LLONG_MIN
-# define LLONG_MIN (-1 - LLONG_MAX)
-# endif
-#endif
-
-#ifndef INT_FAST64_MAX
-# ifdef LLONG_MAX
-typedef long long int_fast64_t;
-# define INT_FAST64_MIN LLONG_MIN
-# define INT_FAST64_MAX LLONG_MAX
-# else
-# if LONG_MAX >> 31 < 0xffffffff
-Please use a compiler that supports a 64-bit integer type (or wider);
-you may need to compile with "-DHAVE_STDINT_H".
-# endif
-typedef long int_fast64_t;
-# define INT_FAST64_MIN LONG_MIN
-# define INT_FAST64_MAX LONG_MAX
-# endif
-#endif
-
-#ifndef SCNdFAST64
-# if INT_FAST64_MAX == LLONG_MAX
-# define SCNdFAST64 "lld"
-# else
-# define SCNdFAST64 "ld"
-# endif
-#endif
-
-#ifndef INT_FAST32_MAX
-# if INT_MAX >> 31 == 0
-typedef long int_fast32_t;
-# define INT_FAST32_MAX LONG_MAX
-# define INT_FAST32_MIN LONG_MIN
-# else
-typedef int int_fast32_t;
-# define INT_FAST32_MAX INT_MAX
-# define INT_FAST32_MIN INT_MIN
-# endif
-#endif
-
-#ifndef INTMAX_MAX
-# ifdef LLONG_MAX
-typedef long long intmax_t;
-# define strtoimax strtoll
-# define INTMAX_MAX LLONG_MAX
-# define INTMAX_MIN LLONG_MIN
-# else
-typedef long intmax_t;
-# define strtoimax strtol
-# define INTMAX_MAX LONG_MAX
-# define INTMAX_MIN LONG_MIN
-# endif
-#endif
-
-#ifndef PRIdMAX
-# if INTMAX_MAX == LLONG_MAX
-# define PRIdMAX "lld"
-# else
-# define PRIdMAX "ld"
-# endif
-#endif
-
-#ifndef UINT_FAST64_MAX
-# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
-typedef unsigned long long uint_fast64_t;
-# else
-# if ULONG_MAX >> 31 >> 1 < 0xffffffff
-Please use a compiler that supports a 64-bit integer type (or wider);
-you may need to compile with "-DHAVE_STDINT_H".
-# endif
-typedef unsigned long uint_fast64_t;
-# endif
-#endif
-
-#ifndef UINTMAX_MAX
-# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
-typedef unsigned long long uintmax_t;
-# else
-typedef unsigned long uintmax_t;
-# endif
-#endif
-
-#ifndef PRIuMAX
-# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
-# define PRIuMAX "llu"
-# else
-# define PRIuMAX "lu"
-# endif
-#endif
-
-#ifndef INT32_MAX
-#define INT32_MAX 0x7fffffff
-#endif /* !defined INT32_MAX */
-#ifndef INT32_MIN
-#define INT32_MIN (-1 - INT32_MAX)
-#endif /* !defined INT32_MIN */
-
-#ifndef SIZE_MAX
-#define SIZE_MAX ((size_t) -1)
-#endif
-
-#if 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
-# define ATTRIBUTE_CONST __attribute__ ((const))
-# define ATTRIBUTE_PURE __attribute__ ((__pure__))
-# define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-#else
-# define ATTRIBUTE_CONST /* empty */
-# define ATTRIBUTE_PURE /* empty */
-# define ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
-#if !defined _Noreturn && __STDC_VERSION__ < 201112
-# if 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
-# define _Noreturn __attribute__ ((__noreturn__))
-# else
-# define _Noreturn
-# endif
-#endif
-
-#if __STDC_VERSION__ < 199901 && !defined restrict
-# define restrict /* empty */
-#endif
-
-/*
-** Workarounds for compilers/systems.
-*/
-
-/*
-** Compile with -Dtime_tz=T to build the tz package with a private
-** time_t type equivalent to T rather than the system-supplied time_t.
-** This debugging feature can test unusual design decisions
-** (e.g., time_t wider than 'long', or unsigned time_t) even on
-** typical platforms.
-*/
-#ifdef time_tz
-# ifdef LOCALTIME_IMPLEMENTATION
-static time_t sys_time(time_t *x) { return time(x); }
-# endif
-
-typedef time_tz tz_time_t;
-
-# undef ctime
-# define ctime tz_ctime
-# undef ctime_r
-# define ctime_r tz_ctime_r
-# undef difftime
-# define difftime tz_difftime
-# undef gmtime
-# define gmtime tz_gmtime
-# undef gmtime_r
-# define gmtime_r tz_gmtime_r
-# undef localtime
-# define localtime tz_localtime
-# undef localtime_r
-# define localtime_r tz_localtime_r
-# undef localtime_rz
-# define localtime_rz tz_localtime_rz
-# undef mktime
-# define mktime tz_mktime
-# undef mktime_z
-# define mktime_z tz_mktime_z
-# undef offtime
-# define offtime tz_offtime
-# undef posix2time
-# define posix2time tz_posix2time
-# undef posix2time_z
-# define posix2time_z tz_posix2time_z
-# undef time
-# define time tz_time
-# undef time2posix
-# define time2posix tz_time2posix
-# undef time2posix_z
-# define time2posix_z tz_time2posix_z
-# undef time_t
-# define time_t tz_time_t
-# undef timegm
-# define timegm tz_timegm
-# undef timelocal
-# define timelocal tz_timelocal
-# undef timeoff
-# define timeoff tz_timeoff
-# undef tzalloc
-# define tzalloc tz_tzalloc
-# undef tzfree
-# define tzfree tz_tzfree
-# undef tzset
-# define tzset tz_tzset
-# undef tzsetwall
-# define tzsetwall tz_tzsetwall
-
-char *ctime(time_t const *);
-char *ctime_r(time_t const *, char *);
-double difftime(time_t, time_t);
-struct tm *gmtime(time_t const *);
-struct tm *gmtime_r(time_t const *restrict, struct tm *restrict);
-struct tm *localtime(time_t const *);
-struct tm *localtime_r(time_t const *restrict, struct tm *restrict);
-time_t mktime(struct tm *);
-time_t time(time_t *);
-void tzset(void);
-#endif
-
-#if !HAVE_DECL_ASCTIME_R && !defined asctime_r
-extern char *asctime_r(struct tm const *restrict, char *restrict);
-#endif
-
-#if !HAVE_POSIX_DECLS
-# ifdef USG_COMPAT
-# ifndef timezone
-extern long timezone;
-# endif
-# ifndef daylight
-extern int daylight;
-# endif
-# endif
-#endif
-
-#if defined ALTZONE && !defined altzone
-extern long altzone;
-#endif
-
-/*
-** The STD_INSPIRED functions are similar, but most also need
-** declarations if time_tz is defined.
-*/
-
-#ifdef STD_INSPIRED
-# if !defined tzsetwall || defined time_tz
-void tzsetwall(void);
-# endif
-# if !defined offtime || defined time_tz
-struct tm *offtime(time_t const *, long);
-# endif
-# if !defined timegm || defined time_tz
-time_t timegm(struct tm *);
-# endif
-# if !defined timelocal || defined time_tz
-time_t timelocal(struct tm *);
-# endif
-# if !defined timeoff || defined time_tz
-time_t timeoff(struct tm *, long);
-# endif
-# if !defined time2posix || defined time_tz
-time_t time2posix(time_t);
-# endif
-# if !defined posix2time || defined time_tz
-time_t posix2time(time_t);
-# endif
-#endif
-
-/* Infer TM_ZONE on systems where this information is known, but suppress
- guessing if NO_TM_ZONE is defined. Similarly for TM_GMTOFF. */
-#if (defined __GLIBC__ \
- || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
- || (defined __APPLE__ && defined __MACH__))
-# if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
-# define TM_GMTOFF tm_gmtoff
-# endif
-# if !defined TM_ZONE && !defined NO_TM_ZONE
-# define TM_ZONE tm_zone
-# endif
-#endif
-
-/*
-** Define functions that are ABI compatible with NetBSD but have
-** better prototypes. NetBSD 6.1.4 defines a pointer type timezone_t
-** and labors under the misconception that 'const timezone_t' is a
-** pointer to a constant. This use of 'const' is ineffective, so it
-** is not done here. What we call 'struct state' NetBSD calls
-** 'struct __state', but this is a private name so it doesn't matter.
-*/
-#if NETBSD_INSPIRED
-typedef struct state *timezone_t;
-struct tm *localtime_rz(timezone_t restrict, time_t const *restrict,
- struct tm *restrict);
-time_t mktime_z(timezone_t restrict, struct tm *restrict);
-timezone_t tzalloc(char const *);
-void tzfree(timezone_t);
-# ifdef STD_INSPIRED
-# if !defined posix2time_z || defined time_tz
-time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE;
-# endif
-# if !defined time2posix_z || defined time_tz
-time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE;
-# endif
-# endif
-#endif
-
-/*
-** Finally, some convenience items.
-*/
-
-#if __STDC_VERSION__ < 199901
-# define true 1
-# define false 0
-# define bool int
-#else
-# include <stdbool.h>
-#endif
-
-#ifndef TYPE_BIT
-#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT)
-#endif /* !defined TYPE_BIT */
-
-#ifndef TYPE_SIGNED
-#define TYPE_SIGNED(type) (((type) -1) < 0)
-#endif /* !defined TYPE_SIGNED */
-
-#define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
-
-/* Max and min values of the integer type T, of which only the bottom
- B bits are used, and where the highest-order used bit is considered
- to be a sign bit if T is signed. */
-#define MAXVAL(t, b) \
- ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t))) \
- - 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))))
-#define MINVAL(t, b) \
- ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0))
-
-/* The minimum and maximum finite time values. This assumes no padding. */
-static time_t const time_t_min = MINVAL(time_t, TYPE_BIT(time_t));
-static time_t const time_t_max = MAXVAL(time_t, TYPE_BIT(time_t));
-
-#ifndef INT_STRLEN_MAXIMUM
-/*
-** 302 / 1000 is log10(2.0) rounded up.
-** Subtract one for the sign bit if the type is signed;
-** add one for integer division truncation;
-** add one more for a minus sign if the type is signed.
-*/
-#define INT_STRLEN_MAXIMUM(type) \
- ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
- 1 + TYPE_SIGNED(type))
-#endif /* !defined INT_STRLEN_MAXIMUM */
-
-/*
-** INITIALIZE(x)
-*/
-
-#ifdef lint
-# define INITIALIZE(x) ((x) = 0)
-#else
-# define INITIALIZE(x)
-#endif
-
-#ifndef UNINIT_TRAP
-# define UNINIT_TRAP 0
-#endif
-
-/*
-** For the benefit of GNU folk...
-** '_(MSGID)' uses the current locale's message library string for MSGID.
-** The default is to use gettext if available, and use MSGID otherwise.
-*/
-
-#ifndef _
-#if HAVE_GETTEXT
-#define _(msgid) gettext(msgid)
-#else /* !HAVE_GETTEXT */
-#define _(msgid) msgid
-#endif /* !HAVE_GETTEXT */
-#endif /* !defined _ */
-
-#if !defined TZ_DOMAIN && defined HAVE_GETTEXT
-# define TZ_DOMAIN "tz"
-#endif
-
-#if HAVE_INCOMPATIBLE_CTIME_R
-#undef asctime_r
-#undef ctime_r
-char *asctime_r(struct tm const *, char *);
-char *ctime_r(time_t const *, char *);
-#endif /* HAVE_INCOMPATIBLE_CTIME_R */
-
-#ifndef YEARSPERREPEAT
-#define YEARSPERREPEAT 400 /* years before a Gregorian repeat */
-#endif /* !defined YEARSPERREPEAT */
-
-/*
-** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
-*/
-
-#ifndef AVGSECSPERYEAR
-#define AVGSECSPERYEAR 31556952L
-#endif /* !defined AVGSECSPERYEAR */
-
-#ifndef SECSPERREPEAT
-#define SECSPERREPEAT ((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
-#endif /* !defined SECSPERREPEAT */
-
-#ifndef SECSPERREPEAT_BITS
-#define SECSPERREPEAT_BITS 34 /* ceil(log2(SECSPERREPEAT)) */
-#endif /* !defined SECSPERREPEAT_BITS */
-
-#endif /* !defined PRIVATE_H */
Deleted: vendor/tzcode/dist/scheck.c
===================================================================
--- vendor/tzcode/dist/scheck.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/scheck.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,55 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 2006-07-17 by Arthur David Olson.
-*/
-
-/*LINTLIBRARY*/
-
-#include "private.h"
-
-const char *
-scheck(const char *const string, const char *const format)
-{
- register char * fbuf;
- register const char * fp;
- register char * tp;
- register int c;
- register const char * result;
- char dummy;
-
- result = "";
- if (string == NULL || format == NULL)
- return result;
- fbuf = malloc(2 * strlen(format) + 4);
- if (fbuf == NULL)
- return result;
- fp = format;
- tp = fbuf;
- while ((*tp++ = c = *fp++) != '\0') {
- if (c != '%')
- continue;
- if (*fp == '%') {
- *tp++ = *fp++;
- continue;
- }
- *tp++ = '*';
- if (*fp == '*')
- ++fp;
- while (is_digit(*fp))
- *tp++ = *fp++;
- if (*fp == 'l' || *fp == 'h')
- *tp++ = *fp++;
- else if (*fp == '[')
- do *tp++ = *fp++;
- while (*fp != '\0' && *fp != ']');
- if ((*tp++ = *fp++) == '\0')
- break;
- }
- *(tp - 1) = '%';
- *tp++ = 'c';
- *tp = '\0';
- if (sscanf(string, fbuf, &dummy) != 1)
- result = format;
- free(fbuf);
- return result;
-}
Added: vendor/tzcode/dist/stdtime/asctime.c
===================================================================
--- vendor/tzcode/dist/stdtime/asctime.c (rev 0)
+++ vendor/tzcode/dist/stdtime/asctime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,145 @@
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+/*
+** Avoid the temptation to punt entirely to strftime;
+** the output of strftime is supposed to be locale specific
+** whereas the output of asctime is supposed to be constant.
+*/
+
+#include <sys/cdefs.h>
+#ifndef lint
+#ifndef NOID
+static char elsieid[] __unused = "@(#)asctime.c 8.5";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+__FBSDID("$FreeBSD: stable/10/contrib/tzcode/stdtime/asctime.c 214411 2010-10-27 07:14:46Z edwin $");
+
+/*LINTLIBRARY*/
+
+#include "namespace.h"
+#include "private.h"
+#include "un-namespace.h"
+#include "tzfile.h"
+
+/*
+** Some systems only handle "%.2d"; others only handle "%02d";
+** "%02.2d" makes (most) everybody happy.
+** At least some versions of gcc warn about the %02.2d;
+** we conditionalize below to avoid the warning.
+*/
+/*
+** All years associated with 32-bit time_t values are exactly four digits long;
+** some years associated with 64-bit time_t values are not.
+** Vintage programs are coded for years that are always four digits long
+** and may assume that the newline always lands in the same place.
+** For years that are less than four digits, we pad the output with
+** leading zeroes to get the newline in the traditional place.
+** The -4 ensures that we get four characters of output even if
+** we call a strftime variant that produces fewer characters for some years.
+** The ISO C 1999 and POSIX 1003.1-2004 standards prohibit padding the year,
+** but many implementations pad anyway; most likely the standards are buggy.
+*/
+#ifdef __GNUC__
+#define ASCTIME_FMT "%.3s %.3s%3d %2.2d:%2.2d:%2.2d %-4s\n"
+#else /* !defined __GNUC__ */
+#define ASCTIME_FMT "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %-4s\n"
+#endif /* !defined __GNUC__ */
+/*
+** For years that are more than four digits we put extra spaces before the year
+** so that code trying to overwrite the newline won't end up overwriting
+** a digit within a year and truncating the year (operating on the assumption
+** that no output is better than wrong output).
+*/
+#ifdef __GNUC__
+#define ASCTIME_FMT_B "%.3s %.3s%3d %2.2d:%2.2d:%2.2d %s\n"
+#else /* !defined __GNUC__ */
+#define ASCTIME_FMT_B "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %s\n"
+#endif /* !defined __GNUC__ */
+
+#define STD_ASCTIME_BUF_SIZE 26
+/*
+** Big enough for something such as
+** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n
+** (two three-character abbreviations, five strings denoting integers,
+** seven explicit spaces, two explicit colons, a newline,
+** and a trailing ASCII nul).
+** The values above are for systems where an int is 32 bits and are provided
+** as an example; the define below calculates the maximum for the system at
+** hand.
+*/
+#define MAX_ASCTIME_BUF_SIZE (2*3+5*INT_STRLEN_MAXIMUM(int)+7+2+1+1)
+
+static char buf_asctime[MAX_ASCTIME_BUF_SIZE];
+
+/*
+** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
+*/
+
+char *
+asctime_r(timeptr, buf)
+const struct tm * timeptr;
+char * buf;
+{
+ static const char wday_name[][3] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+ static const char mon_name[][3] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+ const char * wn;
+ const char * mn;
+ char year[INT_STRLEN_MAXIMUM(int) + 2];
+ char result[MAX_ASCTIME_BUF_SIZE];
+
+ if (timeptr == NULL) {
+ errno = EINVAL;
+ return strcpy(buf, "??? ??? ?? ??:??:?? ????\n");
+ }
+ if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK)
+ wn = "???";
+ else wn = wday_name[timeptr->tm_wday];
+ if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR)
+ mn = "???";
+ else mn = mon_name[timeptr->tm_mon];
+ /*
+ ** Use strftime's %Y to generate the year, to avoid overflow problems
+ ** when computing timeptr->tm_year + TM_YEAR_BASE.
+ ** Assume that strftime is unaffected by other out-of-range members
+ ** (e.g., timeptr->tm_mday) when processing "%Y".
+ */
+ (void) strftime(year, sizeof year, "%Y", timeptr);
+ /*
+ ** We avoid using snprintf since it's not available on all systems.
+ */
+ (void) sprintf(result,
+ ((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B),
+ wn, mn,
+ timeptr->tm_mday, timeptr->tm_hour,
+ timeptr->tm_min, timeptr->tm_sec,
+ year);
+ if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime)
+ return strcpy(buf, result);
+ else {
+#ifdef EOVERFLOW
+ errno = EOVERFLOW;
+#else /* !defined EOVERFLOW */
+ errno = EINVAL;
+#endif /* !defined EOVERFLOW */
+ return NULL;
+ }
+}
+
+/*
+** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
+*/
+
+char *
+asctime(timeptr)
+const struct tm * timeptr;
+{
+ return asctime_r(timeptr, buf_asctime);
+}
Added: vendor/tzcode/dist/stdtime/ctime.3
===================================================================
--- vendor/tzcode/dist/stdtime/ctime.3 (rev 0)
+++ vendor/tzcode/dist/stdtime/ctime.3 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,374 @@
+.\" Copyright (c) 1989, 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" Arthur Olson.
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" From: @(#)ctime.3 8.1 (Berkeley) 6/4/93
+.\" $FreeBSD: stable/10/contrib/tzcode/stdtime/ctime.3 266557 2014-05-22 20:55:57Z gavin $
+.\"
+.Dd January 2, 1999
+.Dt CTIME 3
+.Os
+.Sh NAME
+.Nm asctime ,
+.Nm asctime_r ,
+.Nm ctime ,
+.Nm ctime_r ,
+.Nm difftime ,
+.Nm gmtime ,
+.Nm gmtime_r ,
+.Nm localtime ,
+.Nm localtime_r ,
+.Nm mktime ,
+.Nm timegm
+.Nd transform binary date and time values
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In time.h
+.Vt extern char *tzname[2] ;
+.Ft char *
+.Fn ctime "const time_t *clock"
+.Ft double
+.Fn difftime "time_t time1" "time_t time0"
+.Ft char *
+.Fn asctime "const struct tm *tm"
+.Ft struct tm *
+.Fn localtime "const time_t *clock"
+.Ft struct tm *
+.Fn gmtime "const time_t *clock"
+.Ft time_t
+.Fn mktime "struct tm *tm"
+.Ft time_t
+.Fn timegm "struct tm *tm"
+.Ft char *
+.Fn ctime_r "const time_t *clock" "char *buf"
+.Ft struct tm *
+.Fn localtime_r "const time_t *clock" "struct tm *result"
+.Ft struct tm *
+.Fn gmtime_r "const time_t *clock" "struct tm *result"
+.Ft char *
+.Fn asctime_r "const struct tm *tm" "char *buf"
+.Sh DESCRIPTION
+The functions
+.Fn ctime ,
+.Fn gmtime
+and
+.Fn localtime
+all take as an argument a time value representing the time in seconds since
+the Epoch (00:00:00
+.Tn UTC ,
+January 1, 1970; see
+.Xr time 3 ) .
+.Pp
+The function
+.Fn localtime
+converts the time value pointed at by
+.Fa clock ,
+and returns a pointer to a
+.Dq Fa struct tm
+(described below) which contains
+the broken-out time information for the value after adjusting for the current
+time zone (and any other factors such as Daylight Saving Time).
+Time zone adjustments are performed as specified by the
+.Ev TZ
+environment variable (see
+.Xr tzset 3 ) .
+The function
+.Fn localtime
+uses
+.Xr tzset 3
+to initialize time conversion information if
+.Xr tzset 3
+has not already been called by the process.
+.Pp
+After filling in the tm structure,
+.Fn localtime
+sets the
+.Fa tm_isdst Ns 'th
+element of
+.Fa tzname
+to a pointer to an
+.Tn ASCII
+string that is the time zone abbreviation to be
+used with
+.Fn localtime Ns 's
+return value.
+.Pp
+The function
+.Fn gmtime
+similarly converts the time value, but without any time zone adjustment,
+and returns a pointer to a tm structure (described below).
+.Pp
+The
+.Fn ctime
+function
+adjusts the time value for the current time zone in the same manner as
+.Fn localtime ,
+and returns a pointer to a 26-character string of the form:
+.Bd -literal -offset indent
+Thu Nov 24 18:22:48 1986\en\e0
+.Ed
+.Pp
+All the fields have constant width.
+.Pp
+The
+.Fn ctime_r
+function
+provides the same functionality as
+.Fn ctime
+except the caller must provide the output buffer
+.Fa buf
+to store the result, which must be at least 26 characters long.
+The
+.Fn localtime_r
+and
+.Fn gmtime_r
+functions
+provide the same functionality as
+.Fn localtime
+and
+.Fn gmtime
+respectively, except the caller must provide the output buffer
+.Fa result .
+.Pp
+The
+.Fn asctime
+function
+converts the broken down time in the structure
+.Fa tm
+pointed at by
+.Fa *tm
+to the form
+shown in the example above.
+.Pp
+The
+.Fn asctime_r
+function
+provides the same functionality as
+.Fn asctime
+except the caller provide the output buffer
+.Fa buf
+to store the result, which must be at least 26 characters long.
+.Pp
+The functions
+.Fn mktime
+and
+.Fn timegm
+convert the broken-down time in the structure
+pointed to by tm into a time value with the same encoding as that of the
+values returned by the
+.Xr time 3
+function (that is, seconds from the Epoch,
+.Tn UTC ) .
+The
+.Fn mktime
+function
+interprets the input structure according to the current timezone setting
+(see
+.Xr tzset 3 ) .
+The
+.Fn timegm
+function
+interprets the input structure as representing Universal Coordinated Time
+.Pq Tn UTC .
+.Pp
+The original values of the
+.Fa tm_wday
+and
+.Fa tm_yday
+components of the structure are ignored, and the original values of the
+other components are not restricted to their normal ranges, and will be
+normalized if needed.
+For example,
+October 40 is changed into November 9,
+a
+.Fa tm_hour
+of \-1 means 1 hour before midnight,
+.Fa tm_mday
+of 0 means the day preceding the current month, and
+.Fa tm_mon
+of \-2 means 2 months before January of
+.Fa tm_year .
+(A positive or zero value for
+.Fa tm_isdst
+causes
+.Fn mktime
+to presume initially that summer time (for example, Daylight Saving Time)
+is or is not in effect for the specified time, respectively.
+A negative value for
+.Fa tm_isdst
+causes the
+.Fn mktime
+function to attempt to divine whether summer time is in effect for the
+specified time.
+The
+.Fa tm_isdst
+and
+.Fa tm_gmtoff
+members are forced to zero by
+.Fn timegm . )
+.Pp
+On successful completion, the values of the
+.Fa tm_wday
+and
+.Fa tm_yday
+components of the structure are set appropriately, and the other components
+are set to represent the specified calendar time, but with their values
+forced to their normal ranges; the final value of
+.Fa tm_mday
+is not set until
+.Fa tm_mon
+and
+.Fa tm_year
+are determined.
+The
+.Fn mktime
+function
+returns the specified calendar time; if the calendar time cannot be
+represented, it returns \-1;
+.Pp
+The
+.Fn difftime
+function
+returns the difference between two calendar times,
+.Pf ( Fa time1
+-
+.Fa time0 ) ,
+expressed in seconds.
+.Pp
+External declarations as well as the tm structure definition are in the
+.In time.h
+include file.
+The tm structure includes at least the following fields:
+.Bd -literal -offset indent
+int tm_sec; /\(** seconds (0 - 60) \(**/
+int tm_min; /\(** minutes (0 - 59) \(**/
+int tm_hour; /\(** hours (0 - 23) \(**/
+int tm_mday; /\(** day of month (1 - 31) \(**/
+int tm_mon; /\(** month of year (0 - 11) \(**/
+int tm_year; /\(** year \- 1900 \(**/
+int tm_wday; /\(** day of week (Sunday = 0) \(**/
+int tm_yday; /\(** day of year (0 - 365) \(**/
+int tm_isdst; /\(** is summer time in effect? \(**/
+char \(**tm_zone; /\(** abbreviation of timezone name \(**/
+long tm_gmtoff; /\(** offset from UTC in seconds \(**/
+.Ed
+.Pp
+The
+field
+.Fa tm_isdst
+is non-zero if summer time is in effect.
+.Pp
+The field
+.Fa tm_gmtoff
+is the offset (in seconds) of the time represented from
+.Tn UTC ,
+with positive
+values indicating east of the Prime Meridian.
+.Sh SEE ALSO
+.Xr date 1 ,
+.Xr gettimeofday 2 ,
+.Xr getenv 3 ,
+.Xr time 3 ,
+.Xr tzset 3 ,
+.Xr tzfile 5
+.Sh STANDARDS
+The
+.Fn asctime ,
+.Fn ctime ,
+.Fn difftime ,
+.Fn gmtime ,
+.Fn localtime ,
+and
+.Fn mktime
+functions conform to
+.St -isoC ,
+and conform to
+.St -p1003.1-96
+provided the selected local timezone does not contain a leap-second table
+(see
+.Xr zic 8 ) .
+.Pp
+The
+.Fn asctime_r ,
+.Fn ctime_r ,
+.Fn gmtime_r ,
+and
+.Fn localtime_r
+functions are expected to conform to
+.St -p1003.1-96
+(again provided the selected local timezone does not contain a leap-second
+table).
+.Pp
+The
+.Fn timegm
+function is not specified by any standard; its function cannot be
+completely emulated using the standard functions described above.
+.Sh HISTORY
+This manual page is derived from
+the time package contributed to Berkeley by
+.An Arthur Olson
+and which appeared in
+.Bx 4.3 .
+.Sh BUGS
+Except for
+.Fn difftime ,
+.Fn mktime ,
+and the
+.Fn \&_r
+variants of the other functions,
+these functions leave their result in an internal static object and return
+a pointer to that object.
+Subsequent calls to these
+function will modify the same object.
+.Pp
+The C Standard provides no mechanism for a program to modify its current
+local timezone setting, and the
+.Tn POSIX Ns No \&-standard
+method is not reentrant.
+(However, thread-safe implementations are provided
+in the
+.Tn POSIX
+threaded environment.)
+.Pp
+The
+.Va tm_zone
+field of a returned
+.Vt tm
+structure points to a static array of characters,
+which will also be overwritten by any subsequent calls (as well as by
+subsequent calls to
+.Xr tzset 3
+and
+.Xr tzsetwall 3 ) .
+.Pp
+Use of the external variable
+.Fa tzname
+is discouraged; the
+.Fa tm_zone
+entry in the tm structure is preferred.
Added: vendor/tzcode/dist/stdtime/difftime.c
===================================================================
--- vendor/tzcode/dist/stdtime/difftime.c (rev 0)
+++ vendor/tzcode/dist/stdtime/difftime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,69 @@
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+#include <sys/cdefs.h>
+#ifndef lint
+#ifndef NOID
+static char elsieid[] __unused = "@(#)difftime.c 8.1";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+__FBSDID("$FreeBSD: stable/10/contrib/tzcode/stdtime/difftime.c 192625 2009-05-23 06:31:50Z edwin $");
+
+/*LINTLIBRARY*/
+
+#include "namespace.h"
+#include "private.h" /* for time_t, TYPE_INTEGRAL, and TYPE_SIGNED */
+#include "un-namespace.h"
+
+double
+difftime(time1, time0)
+const time_t time1;
+const time_t time0;
+{
+ /*
+ ** If (sizeof (double) > sizeof (time_t)) simply convert and subtract
+ ** (assuming that the larger type has more precision).
+ ** This is the common real-world case circa 2004.
+ */
+ if (sizeof (double) > sizeof (time_t))
+ return (double) time1 - (double) time0;
+ if (!TYPE_INTEGRAL(time_t)) {
+ /*
+ ** time_t is floating.
+ */
+ return time1 - time0;
+ }
+ if (!TYPE_SIGNED(time_t)) {
+ /*
+ ** time_t is integral and unsigned.
+ ** The difference of two unsigned values can't overflow
+ ** if the minuend is greater than or equal to the subtrahend.
+ */
+ if (time1 >= time0)
+ return time1 - time0;
+ else return -((double) (time0 - time1));
+ }
+ /*
+ ** time_t is integral and signed.
+ ** Handle cases where both time1 and time0 have the same sign
+ ** (meaning that their difference cannot overflow).
+ */
+ if ((time1 < 0) == (time0 < 0))
+ return time1 - time0;
+ /*
+ ** time1 and time0 have opposite signs.
+ ** Punt if unsigned long is too narrow.
+ */
+ if (sizeof (unsigned long) < sizeof (time_t))
+ return (double) time1 - (double) time0;
+ /*
+ ** Stay calm...decent optimizers will eliminate the complexity below.
+ */
+ if (time1 >= 0 /* && time0 < 0 */)
+ return (unsigned long) time1 +
+ (unsigned long) (-(time0 + 1)) + 1;
+ return -(double) ((unsigned long) time0 +
+ (unsigned long) (-(time1 + 1)) + 1);
+}
Added: vendor/tzcode/dist/stdtime/localtime.c
===================================================================
--- vendor/tzcode/dist/stdtime/localtime.c (rev 0)
+++ vendor/tzcode/dist/stdtime/localtime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,2276 @@
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+#include <sys/cdefs.h>
+#ifndef lint
+#ifndef NOID
+static char elsieid[] __unused = "@(#)localtime.c 8.14";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+__FBSDID("$FreeBSD: stable/10/contrib/tzcode/stdtime/localtime.c 314446 2017-03-01 01:44:40Z emaste $");
+
+/*
+** Leap second handling from Bradley White.
+** POSIX-style TZ environment variable handling from Guy Harris.
+*/
+
+/*LINTLIBRARY*/
+
+#include "namespace.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include "private.h"
+#include "un-namespace.h"
+
+#include "tzfile.h"
+#include "float.h" /* for FLT_MAX and DBL_MAX */
+
+#ifndef TZ_ABBR_MAX_LEN
+#define TZ_ABBR_MAX_LEN 16
+#endif /* !defined TZ_ABBR_MAX_LEN */
+
+#ifndef TZ_ABBR_CHAR_SET
+#define TZ_ABBR_CHAR_SET \
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._"
+#endif /* !defined TZ_ABBR_CHAR_SET */
+
+#ifndef TZ_ABBR_ERR_CHAR
+#define TZ_ABBR_ERR_CHAR '_'
+#endif /* !defined TZ_ABBR_ERR_CHAR */
+
+#include "libc_private.h"
+
+#define _MUTEX_LOCK(x) if (__isthreaded) _pthread_mutex_lock(x)
+#define _MUTEX_UNLOCK(x) if (__isthreaded) _pthread_mutex_unlock(x)
+
+#define _RWLOCK_RDLOCK(x) \
+ do { \
+ if (__isthreaded) _pthread_rwlock_rdlock(x); \
+ } while (0)
+
+#define _RWLOCK_WRLOCK(x) \
+ do { \
+ if (__isthreaded) _pthread_rwlock_wrlock(x); \
+ } while (0)
+
+#define _RWLOCK_UNLOCK(x) \
+ do { \
+ if (__isthreaded) _pthread_rwlock_unlock(x); \
+ } while (0)
+
+/*
+** SunOS 4.1.1 headers lack O_BINARY.
+*/
+
+#ifdef O_BINARY
+#define OPEN_MODE (O_RDONLY | O_BINARY)
+#endif /* defined O_BINARY */
+#ifndef O_BINARY
+#define OPEN_MODE O_RDONLY
+#endif /* !defined O_BINARY */
+
+#ifndef WILDABBR
+/*
+** Someone might make incorrect use of a time zone abbreviation:
+** 1. They might reference tzname[0] before calling tzset (explicitly
+** or implicitly).
+** 2. They might reference tzname[1] before calling tzset (explicitly
+** or implicitly).
+** 3. They might reference tzname[1] after setting to a time zone
+** in which Daylight Saving Time is never observed.
+** 4. They might reference tzname[0] after setting to a time zone
+** in which Standard Time is never observed.
+** 5. They might reference tm.TM_ZONE after calling offtime.
+** What's best to do in the above cases is open to debate;
+** for now, we just set things up so that in any of the five cases
+** WILDABBR is used. Another possibility: initialize tzname[0] to the
+** string "tzname[0] used before set", and similarly for the other cases.
+** And another: initialize tzname[0] to "ERA", with an explanation in the
+** manual page of what this "time zone abbreviation" means (doing this so
+** that tzname[0] has the "normal" length of three characters).
+*/
+#define WILDABBR " "
+#endif /* !defined WILDABBR */
+
+static char wildabbr[] = WILDABBR;
+
+/*
+ * In June 2004 it was decided UTC was a more appropriate default time
+ * zone than GMT.
+ */
+
+static const char gmt[] = "UTC";
+
+/*
+** The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
+** We default to US rules as of 1999-08-17.
+** POSIX 1003.1 section 8.1.1 says that the default DST rules are
+** implementation dependent; for historical reasons, US rules are a
+** common default.
+*/
+#ifndef TZDEFRULESTRING
+#define TZDEFRULESTRING ",M4.1.0,M10.5.0"
+#endif /* !defined TZDEFDST */
+
+struct ttinfo { /* time type information */
+ long tt_gmtoff; /* UTC offset in seconds */
+ int tt_isdst; /* used to set tm_isdst */
+ int tt_abbrind; /* abbreviation list index */
+ int tt_ttisstd; /* TRUE if transition is std time */
+ int tt_ttisgmt; /* TRUE if transition is UTC */
+};
+
+struct lsinfo { /* leap second information */
+ time_t ls_trans; /* transition time */
+ long ls_corr; /* correction to apply */
+};
+
+#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))
+
+#ifdef TZNAME_MAX
+#define MY_TZNAME_MAX TZNAME_MAX
+#endif /* defined TZNAME_MAX */
+#ifndef TZNAME_MAX
+#define MY_TZNAME_MAX 255
+#endif /* !defined TZNAME_MAX */
+
+struct state {
+ int leapcnt;
+ int timecnt;
+ int typecnt;
+ int charcnt;
+ int goback;
+ int goahead;
+ time_t ats[TZ_MAX_TIMES];
+ unsigned char types[TZ_MAX_TIMES];
+ struct ttinfo ttis[TZ_MAX_TYPES];
+ char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt),
+ (2 * (MY_TZNAME_MAX + 1)))];
+ struct lsinfo lsis[TZ_MAX_LEAPS];
+};
+
+struct rule {
+ int r_type; /* type of rule--see below */
+ int r_day; /* day number of rule */
+ int r_week; /* week number of rule */
+ int r_mon; /* month number of rule */
+ long r_time; /* transition time of rule */
+};
+
+#define JULIAN_DAY 0 /* Jn - Julian day */
+#define DAY_OF_YEAR 1 /* n - day of year */
+#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */
+
+/*
+** Prototypes for static functions.
+*/
+
+static long detzcode(const char * codep);
+static time_t detzcode64(const char * codep);
+static int differ_by_repeat(time_t t1, time_t t0);
+static const char * getzname(const char * strp);
+static const char * getqzname(const char * strp, const int delim);
+static const char * getnum(const char * strp, int * nump, int min,
+ int max);
+static const char * getsecs(const char * strp, long * secsp);
+static const char * getoffset(const char * strp, long * offsetp);
+static const char * getrule(const char * strp, struct rule * rulep);
+static void gmtload(struct state * sp);
+static struct tm * gmtsub(const time_t * timep, long offset,
+ struct tm * tmp);
+static struct tm * localsub(const time_t * timep, long offset,
+ struct tm * tmp);
+static int increment_overflow(int * number, int delta);
+static int leaps_thru_end_of(int y);
+static int long_increment_overflow(long * number, int delta);
+static int long_normalize_overflow(long * tensptr,
+ int * unitsptr, int base);
+static int normalize_overflow(int * tensptr, int * unitsptr,
+ int base);
+static void settzname(void);
+static time_t time1(struct tm * tmp,
+ struct tm * (*funcp)(const time_t *,
+ long, struct tm *),
+ long offset);
+static time_t time2(struct tm *tmp,
+ struct tm * (*funcp)(const time_t *,
+ long, struct tm*),
+ long offset, int * okayp);
+static time_t time2sub(struct tm *tmp,
+ struct tm * (*funcp)(const time_t *,
+ long, struct tm*),
+ long offset, int * okayp, int do_norm_secs);
+static struct tm * timesub(const time_t * timep, long offset,
+ const struct state * sp, struct tm * tmp);
+static int tmcomp(const struct tm * atmp,
+ const struct tm * btmp);
+static time_t transtime(time_t janfirst, int year,
+ const struct rule * rulep, long offset);
+static int typesequiv(const struct state * sp, int a, int b);
+static int tzload(const char * name, struct state * sp,
+ int doextend);
+static int tzparse(const char * name, struct state * sp,
+ int lastditch);
+
+#ifdef ALL_STATE
+static struct state * lclptr;
+static struct state * gmtptr;
+#endif /* defined ALL_STATE */
+
+#ifndef ALL_STATE
+static struct state lclmem;
+static struct state gmtmem;
+#define lclptr (&lclmem)
+#define gmtptr (&gmtmem)
+#endif /* State Farm */
+
+#ifndef TZ_STRLEN_MAX
+#define TZ_STRLEN_MAX 255
+#endif /* !defined TZ_STRLEN_MAX */
+
+static char lcl_TZname[TZ_STRLEN_MAX + 1];
+static int lcl_is_set;
+static pthread_once_t gmt_once = PTHREAD_ONCE_INIT;
+static pthread_rwlock_t lcl_rwlock = PTHREAD_RWLOCK_INITIALIZER;
+static pthread_once_t gmtime_once = PTHREAD_ONCE_INIT;
+static pthread_key_t gmtime_key;
+static int gmtime_key_error;
+static pthread_once_t localtime_once = PTHREAD_ONCE_INIT;
+static pthread_key_t localtime_key;
+static int localtime_key_error;
+
+char * tzname[2] = {
+ wildabbr,
+ wildabbr
+};
+
+/*
+** Section 4.12.3 of X3.159-1989 requires that
+** Except for the strftime function, these functions [asctime,
+** ctime, gmtime, localtime] return values in one of two static
+** objects: a broken-down time structure and an array of char.
+** Thanks to Paul Eggert for noting this.
+*/
+
+static struct tm tm;
+
+#ifdef USG_COMPAT
+time_t timezone = 0;
+int daylight = 0;
+#endif /* defined USG_COMPAT */
+
+#ifdef ALTZONE
+time_t altzone = 0;
+#endif /* defined ALTZONE */
+
+static long
+detzcode(codep)
+const char * const codep;
+{
+ long result;
+ int i;
+
+ result = (codep[0] & 0x80) ? ~0L : 0;
+ for (i = 0; i < 4; ++i)
+ result = (result << 8) | (codep[i] & 0xff);
+ return result;
+}
+
+static time_t
+detzcode64(codep)
+const char * const codep;
+{
+ register time_t result;
+ register int i;
+
+ result = (codep[0] & 0x80) ? (~(int_fast64_t) 0) : 0;
+ for (i = 0; i < 8; ++i)
+ result = result * 256 + (codep[i] & 0xff);
+ return result;
+}
+
+static void
+settzname(void)
+{
+ struct state * sp = lclptr;
+ int i;
+
+ tzname[0] = wildabbr;
+ tzname[1] = wildabbr;
+#ifdef USG_COMPAT
+ daylight = 0;
+ timezone = 0;
+#endif /* defined USG_COMPAT */
+#ifdef ALTZONE
+ altzone = 0;
+#endif /* defined ALTZONE */
+#ifdef ALL_STATE
+ if (sp == NULL) {
+ tzname[0] = tzname[1] = gmt;
+ return;
+ }
+#endif /* defined ALL_STATE */
+ /*
+ ** And to get the latest zone names into tzname. . .
+ */
+ for (i = 0; i < sp->typecnt; ++i) {
+ const struct ttinfo * const ttisp = &sp->ttis[sp->types[i]];
+
+ tzname[ttisp->tt_isdst] =
+ &sp->chars[ttisp->tt_abbrind];
+#ifdef USG_COMPAT
+ if (ttisp->tt_isdst)
+ daylight = 1;
+ if (!ttisp->tt_isdst)
+ timezone = -(ttisp->tt_gmtoff);
+#endif /* defined USG_COMPAT */
+#ifdef ALTZONE
+ if (ttisp->tt_isdst)
+ altzone = -(ttisp->tt_gmtoff);
+#endif /* defined ALTZONE */
+ }
+ /*
+ ** Finally, scrub the abbreviations.
+ ** First, replace bogus characters.
+ */
+ for (i = 0; i < sp->charcnt; ++i)
+ if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL)
+ sp->chars[i] = TZ_ABBR_ERR_CHAR;
+ /*
+ ** Second, truncate long abbreviations.
+ */
+ for (i = 0; i < sp->typecnt; ++i) {
+ register const struct ttinfo * const ttisp = &sp->ttis[i];
+ register char * cp = &sp->chars[ttisp->tt_abbrind];
+
+ if (strlen(cp) > TZ_ABBR_MAX_LEN &&
+ strcmp(cp, GRANDPARENTED) != 0)
+ *(cp + TZ_ABBR_MAX_LEN) = '\0';
+ }
+}
+
+static int
+differ_by_repeat(t1, t0)
+const time_t t1;
+const time_t t0;
+{
+ int_fast64_t _t0 = t0;
+ int_fast64_t _t1 = t1;
+
+ if (TYPE_INTEGRAL(time_t) &&
+ TYPE_BIT(time_t) - TYPE_SIGNED(time_t) < SECSPERREPEAT_BITS)
+ return 0;
+ //turn ((int_fast64_t)(t1 - t0) == SECSPERREPEAT);
+ return _t1 - _t0 == SECSPERREPEAT;
+}
+
+static int
+tzload(name, sp, doextend)
+const char * name;
+struct state * const sp;
+register const int doextend;
+{
+ const char * p;
+ int i;
+ int fid;
+ int stored;
+ int nread;
+ int res;
+ union {
+ struct tzhead tzhead;
+ char buf[2 * sizeof(struct tzhead) +
+ 2 * sizeof *sp +
+ 4 * TZ_MAX_TIMES];
+ } *u;
+
+ u = NULL;
+ res = -1;
+ sp->goback = sp->goahead = FALSE;
+
+ /* XXX The following is from OpenBSD, and I'm not sure it is correct */
+ if (name != NULL && issetugid() != 0)
+ if ((name[0] == ':' && name[1] == '/') ||
+ name[0] == '/' || strchr(name, '.'))
+ name = NULL;
+ if (name == NULL && (name = TZDEFAULT) == NULL)
+ return -1;
+ {
+ int doaccess;
+ struct stat stab;
+ /*
+ ** Section 4.9.1 of the C standard says that
+ ** "FILENAME_MAX expands to an integral constant expression
+ ** that is the size needed for an array of char large enough
+ ** to hold the longest file name string that the implementation
+ ** guarantees can be opened."
+ */
+ char *fullname;
+
+ fullname = malloc(FILENAME_MAX + 1);
+ if (fullname == NULL)
+ goto out;
+
+ if (name[0] == ':')
+ ++name;
+ doaccess = name[0] == '/';
+ if (!doaccess) {
+ if ((p = TZDIR) == NULL) {
+ free(fullname);
+ return -1;
+ }
+ if (strlen(p) + 1 + strlen(name) >= FILENAME_MAX) {
+ free(fullname);
+ return -1;
+ }
+ (void) strcpy(fullname, p);
+ (void) strcat(fullname, "/");
+ (void) strcat(fullname, name);
+ /*
+ ** Set doaccess if '.' (as in "../") shows up in name.
+ */
+ if (strchr(name, '.') != NULL)
+ doaccess = TRUE;
+ name = fullname;
+ }
+ if (doaccess && access(name, R_OK) != 0) {
+ free(fullname);
+ return -1;
+ }
+ if ((fid = _open(name, OPEN_MODE)) == -1) {
+ free(fullname);
+ return -1;
+ }
+ if ((_fstat(fid, &stab) < 0) || !S_ISREG(stab.st_mode)) {
+ free(fullname);
+ _close(fid);
+ return -1;
+ }
+ free(fullname);
+ }
+ u = malloc(sizeof(*u));
+ if (u == NULL)
+ goto out;
+ nread = _read(fid, u->buf, sizeof u->buf);
+ if (_close(fid) < 0 || nread <= 0)
+ goto out;
+ for (stored = 4; stored <= 8; stored *= 2) {
+ int ttisstdcnt;
+ int ttisgmtcnt;
+
+ ttisstdcnt = (int) detzcode(u->tzhead.tzh_ttisstdcnt);
+ ttisgmtcnt = (int) detzcode(u->tzhead.tzh_ttisgmtcnt);
+ sp->leapcnt = (int) detzcode(u->tzhead.tzh_leapcnt);
+ sp->timecnt = (int) detzcode(u->tzhead.tzh_timecnt);
+ sp->typecnt = (int) detzcode(u->tzhead.tzh_typecnt);
+ sp->charcnt = (int) detzcode(u->tzhead.tzh_charcnt);
+ p = u->tzhead.tzh_charcnt + sizeof u->tzhead.tzh_charcnt;
+ if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS ||
+ sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES ||
+ sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES ||
+ sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS ||
+ (ttisstdcnt != sp->typecnt && ttisstdcnt != 0) ||
+ (ttisgmtcnt != sp->typecnt && ttisgmtcnt != 0))
+ goto out;
+ if (nread - (p - u->buf) <
+ sp->timecnt * stored + /* ats */
+ sp->timecnt + /* types */
+ sp->typecnt * 6 + /* ttinfos */
+ sp->charcnt + /* chars */
+ sp->leapcnt * (stored + 4) + /* lsinfos */
+ ttisstdcnt + /* ttisstds */
+ ttisgmtcnt) /* ttisgmts */
+ goto out;
+ for (i = 0; i < sp->timecnt; ++i) {
+ sp->ats[i] = (stored == 4) ?
+ detzcode(p) : detzcode64(p);
+ p += stored;
+ }
+ for (i = 0; i < sp->timecnt; ++i) {
+ sp->types[i] = (unsigned char) *p++;
+ if (sp->types[i] >= sp->typecnt)
+ goto out;
+ }
+ for (i = 0; i < sp->typecnt; ++i) {
+ struct ttinfo * ttisp;
+
+ ttisp = &sp->ttis[i];
+ ttisp->tt_gmtoff = detzcode(p);
+ p += 4;
+ ttisp->tt_isdst = (unsigned char) *p++;
+ if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1)
+ goto out;
+ ttisp->tt_abbrind = (unsigned char) *p++;
+ if (ttisp->tt_abbrind < 0 ||
+ ttisp->tt_abbrind > sp->charcnt)
+ goto out;
+ }
+ for (i = 0; i < sp->charcnt; ++i)
+ sp->chars[i] = *p++;
+ sp->chars[i] = '\0'; /* ensure '\0' at end */
+ for (i = 0; i < sp->leapcnt; ++i) {
+ struct lsinfo * lsisp;
+
+ lsisp = &sp->lsis[i];
+ lsisp->ls_trans = (stored == 4) ?
+ detzcode(p) : detzcode64(p);
+ p += stored;
+ lsisp->ls_corr = detzcode(p);
+ p += 4;
+ }
+ for (i = 0; i < sp->typecnt; ++i) {
+ struct ttinfo * ttisp;
+
+ ttisp = &sp->ttis[i];
+ if (ttisstdcnt == 0)
+ ttisp->tt_ttisstd = FALSE;
+ else {
+ ttisp->tt_ttisstd = *p++;
+ if (ttisp->tt_ttisstd != TRUE &&
+ ttisp->tt_ttisstd != FALSE)
+ goto out;
+ }
+ }
+ for (i = 0; i < sp->typecnt; ++i) {
+ struct ttinfo * ttisp;
+
+ ttisp = &sp->ttis[i];
+ if (ttisgmtcnt == 0)
+ ttisp->tt_ttisgmt = FALSE;
+ else {
+ ttisp->tt_ttisgmt = *p++;
+ if (ttisp->tt_ttisgmt != TRUE &&
+ ttisp->tt_ttisgmt != FALSE)
+ goto out;
+ }
+ }
+ /*
+ ** Out-of-sort ats should mean we're running on a
+ ** signed time_t system but using a data file with
+ ** unsigned values (or vice versa).
+ */
+ for (i = 0; i < sp->timecnt - 2; ++i)
+ if (sp->ats[i] > sp->ats[i + 1]) {
+ ++i;
+ if (TYPE_SIGNED(time_t)) {
+ /*
+ ** Ignore the end (easy).
+ */
+ sp->timecnt = i;
+ } else {
+ /*
+ ** Ignore the beginning (harder).
+ */
+ register int j;
+
+ for (j = 0; j + i < sp->timecnt; ++j) {
+ sp->ats[j] = sp->ats[j + i];
+ sp->types[j] = sp->types[j + i];
+ }
+ sp->timecnt = j;
+ }
+ break;
+ }
+ /*
+ ** If this is an old file, we're done.
+ */
+ if (u->tzhead.tzh_version[0] == '\0')
+ break;
+ nread -= p - u->buf;
+ for (i = 0; i < nread; ++i)
+ u->buf[i] = p[i];
+ /*
+ ** If this is a narrow integer time_t system, we're done.
+ */
+ if (stored >= (int) sizeof(time_t) && TYPE_INTEGRAL(time_t))
+ break;
+ }
+ if (doextend && nread > 2 &&
+ u->buf[0] == '\n' && u->buf[nread - 1] == '\n' &&
+ sp->typecnt + 2 <= TZ_MAX_TYPES) {
+ struct state *ts;
+ register int result;
+
+ ts = malloc(sizeof(*ts));
+ if (ts == NULL)
+ goto out;
+ u->buf[nread - 1] = '\0';
+ result = tzparse(&u->buf[1], ts, FALSE);
+ if (result == 0 && ts->typecnt == 2 &&
+ sp->charcnt + ts->charcnt <= TZ_MAX_CHARS) {
+ for (i = 0; i < 2; ++i)
+ ts->ttis[i].tt_abbrind +=
+ sp->charcnt;
+ for (i = 0; i < ts->charcnt; ++i)
+ sp->chars[sp->charcnt++] =
+ ts->chars[i];
+ i = 0;
+ while (i < ts->timecnt &&
+ ts->ats[i] <=
+ sp->ats[sp->timecnt - 1])
+ ++i;
+ while (i < ts->timecnt &&
+ sp->timecnt < TZ_MAX_TIMES) {
+ sp->ats[sp->timecnt] =
+ ts->ats[i];
+ sp->types[sp->timecnt] =
+ sp->typecnt +
+ ts->types[i];
+ ++sp->timecnt;
+ ++i;
+ }
+ sp->ttis[sp->typecnt++] = ts->ttis[0];
+ sp->ttis[sp->typecnt++] = ts->ttis[1];
+ }
+ free(ts);
+ }
+ if (sp->timecnt > 1) {
+ for (i = 1; i < sp->timecnt; ++i)
+ if (typesequiv(sp, sp->types[i], sp->types[0]) &&
+ differ_by_repeat(sp->ats[i], sp->ats[0])) {
+ sp->goback = TRUE;
+ break;
+ }
+ for (i = sp->timecnt - 2; i >= 0; --i)
+ if (typesequiv(sp, sp->types[sp->timecnt - 1],
+ sp->types[i]) &&
+ differ_by_repeat(sp->ats[sp->timecnt - 1],
+ sp->ats[i])) {
+ sp->goahead = TRUE;
+ break;
+ }
+ }
+ res = 0;
+out:
+ free(u);
+ return (res);
+}
+
+static int
+typesequiv(sp, a, b)
+const struct state * const sp;
+const int a;
+const int b;
+{
+ register int result;
+
+ if (sp == NULL ||
+ a < 0 || a >= sp->typecnt ||
+ b < 0 || b >= sp->typecnt)
+ result = FALSE;
+ else {
+ register const struct ttinfo * ap = &sp->ttis[a];
+ register const struct ttinfo * bp = &sp->ttis[b];
+ result = ap->tt_gmtoff == bp->tt_gmtoff &&
+ ap->tt_isdst == bp->tt_isdst &&
+ ap->tt_ttisstd == bp->tt_ttisstd &&
+ ap->tt_ttisgmt == bp->tt_ttisgmt &&
+ strcmp(&sp->chars[ap->tt_abbrind],
+ &sp->chars[bp->tt_abbrind]) == 0;
+ }
+ return result;
+}
+
+static const int mon_lengths[2][MONSPERYEAR] = {
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+static const int year_lengths[2] = {
+ DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+/*
+** Given a pointer into a time zone string, scan until a character that is not
+** a valid character in a zone name is found. Return a pointer to that
+** character.
+*/
+
+static const char *
+getzname(strp)
+const char * strp;
+{
+ char c;
+
+ while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' &&
+ c != '+')
+ ++strp;
+ return strp;
+}
+
+/*
+** Given a pointer into an extended time zone string, scan until the ending
+** delimiter of the zone name is located. Return a pointer to the delimiter.
+**
+** As with getzname above, the legal character set is actually quite
+** restricted, with other characters producing undefined results.
+** We don't do any checking here; checking is done later in common-case code.
+*/
+
+static const char *
+getqzname(register const char *strp, const int delim)
+{
+ register int c;
+
+ while ((c = *strp) != '\0' && c != delim)
+ ++strp;
+ return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a number from that string.
+** Check that the number is within a specified range; if it is not, return
+** NULL.
+** Otherwise, return a pointer to the first character not part of the number.
+*/
+
+static const char *
+getnum(strp, nump, min, max)
+const char * strp;
+int * const nump;
+const int min;
+const int max;
+{
+ char c;
+ int num;
+
+ if (strp == NULL || !is_digit(c = *strp))
+ return NULL;
+ num = 0;
+ do {
+ num = num * 10 + (c - '0');
+ if (num > max)
+ return NULL; /* illegal value */
+ c = *++strp;
+ } while (is_digit(c));
+ if (num < min)
+ return NULL; /* illegal value */
+ *nump = num;
+ return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a number of seconds,
+** in hh[:mm[:ss]] form, from the string.
+** If any error occurs, return NULL.
+** Otherwise, return a pointer to the first character not part of the number
+** of seconds.
+*/
+
+static const char *
+getsecs(strp, secsp)
+const char * strp;
+long * const secsp;
+{
+ int num;
+
+ /*
+ ** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like
+ ** "M10.4.6/26", which does not conform to Posix,
+ ** but which specifies the equivalent of
+ ** ``02:00 on the first Sunday on or after 23 Oct''.
+ */
+ strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);
+ if (strp == NULL)
+ return NULL;
+ *secsp = num * (long) SECSPERHOUR;
+ if (*strp == ':') {
+ ++strp;
+ strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
+ if (strp == NULL)
+ return NULL;
+ *secsp += num * SECSPERMIN;
+ if (*strp == ':') {
+ ++strp;
+ /* `SECSPERMIN' allows for leap seconds. */
+ strp = getnum(strp, &num, 0, SECSPERMIN);
+ if (strp == NULL)
+ return NULL;
+ *secsp += num;
+ }
+ }
+ return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract an offset, in
+** [+-]hh[:mm[:ss]] form, from the string.
+** If any error occurs, return NULL.
+** Otherwise, return a pointer to the first character not part of the time.
+*/
+
+static const char *
+getoffset(strp, offsetp)
+const char * strp;
+long * const offsetp;
+{
+ int neg = 0;
+
+ if (*strp == '-') {
+ neg = 1;
+ ++strp;
+ } else if (*strp == '+')
+ ++strp;
+ strp = getsecs(strp, offsetp);
+ if (strp == NULL)
+ return NULL; /* illegal time */
+ if (neg)
+ *offsetp = -*offsetp;
+ return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a rule in the form
+** date[/time]. See POSIX section 8 for the format of "date" and "time".
+** If a valid rule is not found, return NULL.
+** Otherwise, return a pointer to the first character not part of the rule.
+*/
+
+static const char *
+getrule(strp, rulep)
+const char * strp;
+struct rule * const rulep;
+{
+ if (*strp == 'J') {
+ /*
+ ** Julian day.
+ */
+ rulep->r_type = JULIAN_DAY;
+ ++strp;
+ strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
+ } else if (*strp == 'M') {
+ /*
+ ** Month, week, day.
+ */
+ rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
+ ++strp;
+ strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
+ if (strp == NULL)
+ return NULL;
+ if (*strp++ != '.')
+ return NULL;
+ strp = getnum(strp, &rulep->r_week, 1, 5);
+ if (strp == NULL)
+ return NULL;
+ if (*strp++ != '.')
+ return NULL;
+ strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
+ } else if (is_digit(*strp)) {
+ /*
+ ** Day of year.
+ */
+ rulep->r_type = DAY_OF_YEAR;
+ strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
+ } else return NULL; /* invalid format */
+ if (strp == NULL)
+ return NULL;
+ if (*strp == '/') {
+ /*
+ ** Time specified.
+ */
+ ++strp;
+ strp = getsecs(strp, &rulep->r_time);
+ } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */
+ return strp;
+}
+
+/*
+** Given the Epoch-relative time of January 1, 00:00:00 UTC, in a year, the
+** year, a rule, and the offset from UTC at the time that rule takes effect,
+** calculate the Epoch-relative time that rule takes effect.
+*/
+
+static time_t
+transtime(janfirst, year, rulep, offset)
+const time_t janfirst;
+const int year;
+const struct rule * const rulep;
+const long offset;
+{
+ int leapyear;
+ time_t value;
+ int i;
+ int d, m1, yy0, yy1, yy2, dow;
+
+ INITIALIZE(value);
+ leapyear = isleap(year);
+ switch (rulep->r_type) {
+
+ case JULIAN_DAY:
+ /*
+ ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap
+ ** years.
+ ** In non-leap years, or if the day number is 59 or less, just
+ ** add SECSPERDAY times the day number-1 to the time of
+ ** January 1, midnight, to get the day.
+ */
+ value = janfirst + (rulep->r_day - 1) * SECSPERDAY;
+ if (leapyear && rulep->r_day >= 60)
+ value += SECSPERDAY;
+ break;
+
+ case DAY_OF_YEAR:
+ /*
+ ** n - day of year.
+ ** Just add SECSPERDAY times the day number to the time of
+ ** January 1, midnight, to get the day.
+ */
+ value = janfirst + rulep->r_day * SECSPERDAY;
+ break;
+
+ case MONTH_NTH_DAY_OF_WEEK:
+ /*
+ ** Mm.n.d - nth "dth day" of month m.
+ */
+ value = janfirst;
+ for (i = 0; i < rulep->r_mon - 1; ++i)
+ value += mon_lengths[leapyear][i] * SECSPERDAY;
+
+ /*
+ ** Use Zeller's Congruence to get day-of-week of first day of
+ ** month.
+ */
+ m1 = (rulep->r_mon + 9) % 12 + 1;
+ yy0 = (rulep->r_mon <= 2) ? (year - 1) : year;
+ yy1 = yy0 / 100;
+ yy2 = yy0 % 100;
+ dow = ((26 * m1 - 2) / 10 +
+ 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7;
+ if (dow < 0)
+ dow += DAYSPERWEEK;
+
+ /*
+ ** "dow" is the day-of-week of the first day of the month. Get
+ ** the day-of-month (zero-origin) of the first "dow" day of the
+ ** month.
+ */
+ d = rulep->r_day - dow;
+ if (d < 0)
+ d += DAYSPERWEEK;
+ for (i = 1; i < rulep->r_week; ++i) {
+ if (d + DAYSPERWEEK >=
+ mon_lengths[leapyear][rulep->r_mon - 1])
+ break;
+ d += DAYSPERWEEK;
+ }
+
+ /*
+ ** "d" is the day-of-month (zero-origin) of the day we want.
+ */
+ value += d * SECSPERDAY;
+ break;
+ }
+
+ /*
+ ** "value" is the Epoch-relative time of 00:00:00 UTC on the day in
+ ** question. To get the Epoch-relative time of the specified local
+ ** time on that day, add the transition time and the current offset
+ ** from UTC.
+ */
+ return value + rulep->r_time + offset;
+}
+
+/*
+** Given a POSIX section 8-style TZ string, fill in the rule tables as
+** appropriate.
+*/
+
+static int
+tzparse(name, sp, lastditch)
+const char * name;
+struct state * const sp;
+const int lastditch;
+{
+ const char * stdname;
+ const char * dstname;
+ size_t stdlen;
+ size_t dstlen;
+ long stdoffset;
+ long dstoffset;
+ time_t * atp;
+ unsigned char * typep;
+ char * cp;
+ int load_result;
+
+ INITIALIZE(dstname);
+ stdname = name;
+ if (lastditch) {
+ stdlen = strlen(name); /* length of standard zone name */
+ name += stdlen;
+ if (stdlen >= sizeof sp->chars)
+ stdlen = (sizeof sp->chars) - 1;
+ stdoffset = 0;
+ } else {
+ if (*name == '<') {
+ name++;
+ stdname = name;
+ name = getqzname(name, '>');
+ if (*name != '>')
+ return (-1);
+ stdlen = name - stdname;
+ name++;
+ } else {
+ name = getzname(name);
+ stdlen = name - stdname;
+ }
+ if (*name == '\0')
+ return -1; /* was "stdoffset = 0;" */
+ else {
+ name = getoffset(name, &stdoffset);
+ if (name == NULL)
+ return -1;
+ }
+ }
+ load_result = tzload(TZDEFRULES, sp, FALSE);
+ if (load_result != 0)
+ sp->leapcnt = 0; /* so, we're off a little */
+ if (*name != '\0') {
+ if (*name == '<') {
+ dstname = ++name;
+ name = getqzname(name, '>');
+ if (*name != '>')
+ return -1;
+ dstlen = name - dstname;
+ name++;
+ } else {
+ dstname = name;
+ name = getzname(name);
+ dstlen = name - dstname; /* length of DST zone name */
+ }
+ if (*name != '\0' && *name != ',' && *name != ';') {
+ name = getoffset(name, &dstoffset);
+ if (name == NULL)
+ return -1;
+ } else dstoffset = stdoffset - SECSPERHOUR;
+ if (*name == '\0' && load_result != 0)
+ name = TZDEFRULESTRING;
+ if (*name == ',' || *name == ';') {
+ struct rule start;
+ struct rule end;
+ int year;
+ time_t janfirst;
+ time_t starttime;
+ time_t endtime;
+
+ ++name;
+ if ((name = getrule(name, &start)) == NULL)
+ return -1;
+ if (*name++ != ',')
+ return -1;
+ if ((name = getrule(name, &end)) == NULL)
+ return -1;
+ if (*name != '\0')
+ return -1;
+ sp->typecnt = 2; /* standard time and DST */
+ /*
+ ** Two transitions per year, from EPOCH_YEAR forward.
+ */
+ sp->ttis[0].tt_gmtoff = -dstoffset;
+ sp->ttis[0].tt_isdst = 1;
+ sp->ttis[0].tt_abbrind = stdlen + 1;
+ sp->ttis[1].tt_gmtoff = -stdoffset;
+ sp->ttis[1].tt_isdst = 0;
+ sp->ttis[1].tt_abbrind = 0;
+ atp = sp->ats;
+ typep = sp->types;
+ janfirst = 0;
+ sp->timecnt = 0;
+ for (year = EPOCH_YEAR;
+ sp->timecnt + 2 <= TZ_MAX_TIMES;
+ ++year) {
+ time_t newfirst;
+
+ starttime = transtime(janfirst, year, &start,
+ stdoffset);
+ endtime = transtime(janfirst, year, &end,
+ dstoffset);
+ if (starttime > endtime) {
+ *atp++ = endtime;
+ *typep++ = 1; /* DST ends */
+ *atp++ = starttime;
+ *typep++ = 0; /* DST begins */
+ } else {
+ *atp++ = starttime;
+ *typep++ = 0; /* DST begins */
+ *atp++ = endtime;
+ *typep++ = 1; /* DST ends */
+ }
+ sp->timecnt += 2;
+ newfirst = janfirst;
+ newfirst += year_lengths[isleap(year)] *
+ SECSPERDAY;
+ if (newfirst <= janfirst)
+ break;
+ janfirst = newfirst;
+ }
+ } else {
+ long theirstdoffset;
+ long theirdstoffset;
+ long theiroffset;
+ int isdst;
+ int i;
+ int j;
+
+ if (*name != '\0')
+ return -1;
+ /*
+ ** Initial values of theirstdoffset and theirdstoffset.
+ */
+ theirstdoffset = 0;
+ for (i = 0; i < sp->timecnt; ++i) {
+ j = sp->types[i];
+ if (!sp->ttis[j].tt_isdst) {
+ theirstdoffset =
+ -sp->ttis[j].tt_gmtoff;
+ break;
+ }
+ }
+ theirdstoffset = 0;
+ for (i = 0; i < sp->timecnt; ++i) {
+ j = sp->types[i];
+ if (sp->ttis[j].tt_isdst) {
+ theirdstoffset =
+ -sp->ttis[j].tt_gmtoff;
+ break;
+ }
+ }
+ /*
+ ** Initially we're assumed to be in standard time.
+ */
+ isdst = FALSE;
+ theiroffset = theirstdoffset;
+ /*
+ ** Now juggle transition times and types
+ ** tracking offsets as you do.
+ */
+ for (i = 0; i < sp->timecnt; ++i) {
+ j = sp->types[i];
+ sp->types[i] = sp->ttis[j].tt_isdst;
+ if (sp->ttis[j].tt_ttisgmt) {
+ /* No adjustment to transition time */
+ } else {
+ /*
+ ** If summer time is in effect, and the
+ ** transition time was not specified as
+ ** standard time, add the summer time
+ ** offset to the transition time;
+ ** otherwise, add the standard time
+ ** offset to the transition time.
+ */
+ /*
+ ** Transitions from DST to DDST
+ ** will effectively disappear since
+ ** POSIX provides for only one DST
+ ** offset.
+ */
+ if (isdst && !sp->ttis[j].tt_ttisstd) {
+ sp->ats[i] += dstoffset -
+ theirdstoffset;
+ } else {
+ sp->ats[i] += stdoffset -
+ theirstdoffset;
+ }
+ }
+ theiroffset = -sp->ttis[j].tt_gmtoff;
+ if (sp->ttis[j].tt_isdst)
+ theirdstoffset = theiroffset;
+ else theirstdoffset = theiroffset;
+ }
+ /*
+ ** 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;
+ sp->ttis[1].tt_gmtoff = -dstoffset;
+ sp->ttis[1].tt_isdst = TRUE;
+ sp->ttis[1].tt_abbrind = stdlen + 1;
+ sp->typecnt = 2;
+ }
+ } else {
+ dstlen = 0;
+ sp->typecnt = 1; /* only standard time */
+ sp->timecnt = 0;
+ sp->ttis[0].tt_gmtoff = -stdoffset;
+ sp->ttis[0].tt_isdst = 0;
+ sp->ttis[0].tt_abbrind = 0;
+ }
+ sp->charcnt = stdlen + 1;
+ if (dstlen != 0)
+ sp->charcnt += dstlen + 1;
+ if ((size_t) sp->charcnt > sizeof sp->chars)
+ return -1;
+ cp = sp->chars;
+ (void) strncpy(cp, stdname, stdlen);
+ cp += stdlen;
+ *cp++ = '\0';
+ if (dstlen != 0) {
+ (void) strncpy(cp, dstname, dstlen);
+ *(cp + dstlen) = '\0';
+ }
+ return 0;
+}
+
+static void
+gmtload(sp)
+struct state * const sp;
+{
+ if (tzload(gmt, sp, TRUE) != 0)
+ (void) tzparse(gmt, sp, TRUE);
+}
+
+static void
+tzsetwall_basic(int rdlocked)
+{
+ if (!rdlocked)
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ if (lcl_is_set < 0) {
+ if (!rdlocked)
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ return;
+ }
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+
+ _RWLOCK_WRLOCK(&lcl_rwlock);
+ lcl_is_set = -1;
+
+#ifdef ALL_STATE
+ if (lclptr == NULL) {
+ lclptr = (struct state *) calloc(1, sizeof *lclptr);
+ if (lclptr == NULL) {
+ settzname(); /* all we can do */
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ if (rdlocked)
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ return;
+ }
+ }
+#endif /* defined ALL_STATE */
+ if (tzload((char *) NULL, lclptr, TRUE) != 0)
+ gmtload(lclptr);
+ settzname();
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+
+ if (rdlocked)
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+}
+
+void
+tzsetwall(void)
+{
+ tzsetwall_basic(0);
+}
+
+static void
+tzset_basic(int rdlocked)
+{
+ const char * name;
+
+ name = getenv("TZ");
+ if (name == NULL) {
+ tzsetwall_basic(rdlocked);
+ return;
+ }
+
+ if (!rdlocked)
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0) {
+ if (!rdlocked)
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ return;
+ }
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+
+ _RWLOCK_WRLOCK(&lcl_rwlock);
+ lcl_is_set = strlen(name) < sizeof lcl_TZname;
+ if (lcl_is_set)
+ (void) strcpy(lcl_TZname, name);
+
+#ifdef ALL_STATE
+ if (lclptr == NULL) {
+ lclptr = (struct state *) calloc(1, sizeof *lclptr);
+ if (lclptr == NULL) {
+ settzname(); /* all we can do */
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ if (rdlocked)
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ return;
+ }
+ }
+#endif /* defined ALL_STATE */
+ if (*name == '\0') {
+ /*
+ ** User wants it fast rather than right.
+ */
+ lclptr->leapcnt = 0; /* so, we're off a little */
+ lclptr->timecnt = 0;
+ lclptr->typecnt = 0;
+ lclptr->ttis[0].tt_isdst = 0;
+ lclptr->ttis[0].tt_gmtoff = 0;
+ lclptr->ttis[0].tt_abbrind = 0;
+ (void) strcpy(lclptr->chars, gmt);
+ } else if (tzload(name, lclptr, TRUE) != 0)
+ if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0)
+ (void) gmtload(lclptr);
+ settzname();
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+
+ if (rdlocked)
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+}
+
+void
+tzset(void)
+{
+ tzset_basic(0);
+}
+
+/*
+** The easy way to behave "as if no library function calls" localtime
+** is to not call it--so we drop its guts into "localsub", which can be
+** freely called. (And no, the PANS doesn't require the above behavior--
+** but it *is* desirable.)
+**
+** The unused offset argument is for the benefit of mktime variants.
+*/
+
+/*ARGSUSED*/
+static struct tm *
+localsub(timep, offset, tmp)
+const time_t * const timep;
+const long offset;
+struct tm * const tmp;
+{
+ struct state * sp;
+ const struct ttinfo * ttisp;
+ int i;
+ struct tm * result;
+ const time_t t = *timep;
+
+ sp = lclptr;
+#ifdef ALL_STATE
+ if (sp == NULL)
+ return gmtsub(timep, offset, tmp);
+#endif /* defined ALL_STATE */
+ if ((sp->goback && t < sp->ats[0]) ||
+ (sp->goahead && t > sp->ats[sp->timecnt - 1])) {
+ time_t newt = t;
+ register time_t seconds;
+ register time_t tcycles;
+ register int_fast64_t icycles;
+
+ if (t < sp->ats[0])
+ seconds = sp->ats[0] - t;
+ else seconds = t - sp->ats[sp->timecnt - 1];
+ --seconds;
+ tcycles = seconds / YEARSPERREPEAT / AVGSECSPERYEAR;
+ ++tcycles;
+ icycles = tcycles;
+ if (tcycles - icycles >= 1 || icycles - tcycles >= 1)
+ return NULL;
+ seconds = icycles;
+ seconds *= YEARSPERREPEAT;
+ seconds *= AVGSECSPERYEAR;
+ if (t < sp->ats[0])
+ newt += seconds;
+ else newt -= seconds;
+ if (newt < sp->ats[0] ||
+ newt > sp->ats[sp->timecnt - 1])
+ return NULL; /* "cannot happen" */
+ result = localsub(&newt, offset, tmp);
+ if (result == tmp) {
+ register time_t newy;
+
+ newy = tmp->tm_year;
+ if (t < sp->ats[0])
+ newy -= icycles * YEARSPERREPEAT;
+ else newy += icycles * YEARSPERREPEAT;
+ tmp->tm_year = newy;
+ if (tmp->tm_year != newy)
+ return NULL;
+ }
+ return result;
+ }
+ if (sp->timecnt == 0 || t < sp->ats[0]) {
+ i = 0;
+ while (sp->ttis[i].tt_isdst)
+ if (++i >= sp->typecnt) {
+ i = 0;
+ break;
+ }
+ } else {
+ register int lo = 1;
+ register int hi = sp->timecnt;
+
+ while (lo < hi) {
+ register int mid = (lo + hi) >> 1;
+
+ if (t < sp->ats[mid])
+ hi = mid;
+ else lo = mid + 1;
+ }
+ i = (int) sp->types[lo - 1];
+ }
+ ttisp = &sp->ttis[i];
+ /*
+ ** To get (wrong) behavior that's compatible with System V Release 2.0
+ ** you'd replace the statement below with
+ ** t += ttisp->tt_gmtoff;
+ ** timesub(&t, 0L, sp, tmp);
+ */
+ result = timesub(&t, ttisp->tt_gmtoff, sp, tmp);
+ tmp->tm_isdst = ttisp->tt_isdst;
+ tzname[tmp->tm_isdst] = &sp->chars[ttisp->tt_abbrind];
+#ifdef TM_ZONE
+ tmp->TM_ZONE = &sp->chars[ttisp->tt_abbrind];
+#endif /* defined TM_ZONE */
+ return result;
+}
+
+static void
+localtime_key_init(void)
+{
+
+ localtime_key_error = _pthread_key_create(&localtime_key, free);
+}
+
+struct tm *
+localtime(timep)
+const time_t * const timep;
+{
+ struct tm *p_tm;
+
+ if (__isthreaded != 0) {
+ _pthread_once(&localtime_once, localtime_key_init);
+ if (localtime_key_error != 0) {
+ errno = localtime_key_error;
+ return(NULL);
+ }
+ p_tm = _pthread_getspecific(localtime_key);
+ if (p_tm == NULL) {
+ if ((p_tm = (struct tm *)malloc(sizeof(struct tm)))
+ == NULL)
+ return(NULL);
+ _pthread_setspecific(localtime_key, p_tm);
+ }
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ tzset_basic(1);
+ p_tm = localsub(timep, 0L, p_tm);
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ } else {
+ tzset_basic(0);
+ p_tm = localsub(timep, 0L, &tm);
+ }
+ return(p_tm);
+}
+
+/*
+** Re-entrant version of localtime.
+*/
+
+struct tm *
+localtime_r(timep, tmp)
+const time_t * const timep;
+struct tm * tmp;
+{
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ tzset_basic(1);
+ tmp = localsub(timep, 0L, tmp);
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ return tmp;
+}
+
+static void
+gmt_init(void)
+{
+
+#ifdef ALL_STATE
+ gmtptr = (struct state *) calloc(1, sizeof *gmtptr);
+ if (gmtptr != NULL)
+#endif /* defined ALL_STATE */
+ gmtload(gmtptr);
+}
+
+/*
+** gmtsub is to gmtime as localsub is to localtime.
+*/
+
+static struct tm *
+gmtsub(timep, offset, tmp)
+const time_t * const timep;
+const long offset;
+struct tm * const tmp;
+{
+ register struct tm * result;
+
+ _once(&gmt_once, gmt_init);
+ result = timesub(timep, offset, gmtptr, tmp);
+#ifdef TM_ZONE
+ /*
+ ** Could get fancy here and deliver something such as
+ ** "UTC+xxxx" or "UTC-xxxx" if offset is non-zero,
+ ** but this is no time for a treasure hunt.
+ */
+ if (offset != 0)
+ tmp->TM_ZONE = wildabbr;
+ else {
+#ifdef ALL_STATE
+ if (gmtptr == NULL)
+ tmp->TM_ZONE = gmt;
+ else tmp->TM_ZONE = gmtptr->chars;
+#endif /* defined ALL_STATE */
+#ifndef ALL_STATE
+ tmp->TM_ZONE = gmtptr->chars;
+#endif /* State Farm */
+ }
+#endif /* defined TM_ZONE */
+ return result;
+}
+
+static void
+gmtime_key_init(void)
+{
+
+ gmtime_key_error = _pthread_key_create(&gmtime_key, free);
+}
+
+struct tm *
+gmtime(timep)
+const time_t * const timep;
+{
+ struct tm *p_tm;
+
+ if (__isthreaded != 0) {
+ _pthread_once(&gmtime_once, gmtime_key_init);
+ if (gmtime_key_error != 0) {
+ errno = gmtime_key_error;
+ return(NULL);
+ }
+ /*
+ * Changed to follow POSIX.1 threads standard, which
+ * is what BSD currently has.
+ */
+ if ((p_tm = _pthread_getspecific(gmtime_key)) == NULL) {
+ if ((p_tm = (struct tm *)malloc(sizeof(struct tm)))
+ == NULL) {
+ return(NULL);
+ }
+ _pthread_setspecific(gmtime_key, p_tm);
+ }
+ gmtsub(timep, 0L, p_tm);
+ return(p_tm);
+ }
+ else {
+ gmtsub(timep, 0L, &tm);
+ return(&tm);
+ }
+}
+
+/*
+* Re-entrant version of gmtime.
+*/
+
+struct tm *
+gmtime_r(timep, tmp)
+const time_t * const timep;
+struct tm * tmp;
+{
+ return gmtsub(timep, 0L, tmp);
+}
+
+#ifdef STD_INSPIRED
+
+struct tm *
+offtime(timep, offset)
+const time_t * const timep;
+const long offset;
+{
+ return gmtsub(timep, offset, &tm);
+}
+
+#endif /* defined STD_INSPIRED */
+
+/*
+** Return the number of leap years through the end of the given year
+** where, to make the math easy, the answer for year zero is defined as zero.
+*/
+
+static int
+leaps_thru_end_of(y)
+register const int y;
+{
+ return (y >= 0) ? (y / 4 - y / 100 + y / 400) :
+ -(leaps_thru_end_of(-(y + 1)) + 1);
+}
+
+static struct tm *
+timesub(timep, offset, sp, tmp)
+const time_t * const timep;
+const long offset;
+const struct state * const sp;
+struct tm * const tmp;
+{
+ const struct lsinfo * lp;
+ time_t tdays;
+ int idays; /* unsigned would be so 2003 */
+ long rem;
+ int y;
+ const int * ip;
+ long corr;
+ int hit;
+ int i;
+
+ corr = 0;
+ hit = 0;
+#ifdef ALL_STATE
+ i = (sp == NULL) ? 0 : sp->leapcnt;
+#endif /* defined ALL_STATE */
+#ifndef ALL_STATE
+ i = sp->leapcnt;
+#endif /* State Farm */
+ while (--i >= 0) {
+ lp = &sp->lsis[i];
+ if (*timep >= lp->ls_trans) {
+ if (*timep == lp->ls_trans) {
+ hit = ((i == 0 && lp->ls_corr > 0) ||
+ lp->ls_corr > sp->lsis[i - 1].ls_corr);
+ if (hit)
+ while (i > 0 &&
+ sp->lsis[i].ls_trans ==
+ sp->lsis[i - 1].ls_trans + 1 &&
+ sp->lsis[i].ls_corr ==
+ sp->lsis[i - 1].ls_corr + 1) {
+ ++hit;
+ --i;
+ }
+ }
+ corr = lp->ls_corr;
+ break;
+ }
+ }
+ y = EPOCH_YEAR;
+ tdays = *timep / SECSPERDAY;
+ rem = *timep - tdays * SECSPERDAY;
+ while (tdays < 0 || tdays >= year_lengths[isleap(y)]) {
+ int newy;
+ register time_t tdelta;
+ register int idelta;
+ register int leapdays;
+
+ tdelta = tdays / DAYSPERLYEAR;
+ idelta = tdelta;
+ if (tdelta - idelta >= 1 || idelta - tdelta >= 1)
+ return NULL;
+ if (idelta == 0)
+ idelta = (tdays < 0) ? -1 : 1;
+ newy = y;
+ if (increment_overflow(&newy, idelta))
+ return NULL;
+ leapdays = leaps_thru_end_of(newy - 1) -
+ leaps_thru_end_of(y - 1);
+ tdays -= ((time_t) newy - y) * DAYSPERNYEAR;
+ tdays -= leapdays;
+ y = newy;
+ }
+ {
+ register long seconds;
+
+ seconds = tdays * SECSPERDAY + 0.5;
+ tdays = seconds / SECSPERDAY;
+ rem += seconds - tdays * SECSPERDAY;
+ }
+ /*
+ ** Given the range, we can now fearlessly cast...
+ */
+ idays = tdays;
+ rem += offset - corr;
+ while (rem < 0) {
+ rem += SECSPERDAY;
+ --idays;
+ }
+ while (rem >= SECSPERDAY) {
+ rem -= SECSPERDAY;
+ ++idays;
+ }
+ while (idays < 0) {
+ if (increment_overflow(&y, -1))
+ return NULL;
+ idays += year_lengths[isleap(y)];
+ }
+ while (idays >= year_lengths[isleap(y)]) {
+ idays -= year_lengths[isleap(y)];
+ if (increment_overflow(&y, 1))
+ return NULL;
+ }
+ tmp->tm_year = y;
+ if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))
+ return NULL;
+ tmp->tm_yday = idays;
+ /*
+ ** The "extra" mods below avoid overflow problems.
+ */
+ tmp->tm_wday = EPOCH_WDAY +
+ ((y - EPOCH_YEAR) % DAYSPERWEEK) *
+ (DAYSPERNYEAR % DAYSPERWEEK) +
+ leaps_thru_end_of(y - 1) -
+ leaps_thru_end_of(EPOCH_YEAR - 1) +
+ idays;
+ tmp->tm_wday %= DAYSPERWEEK;
+ if (tmp->tm_wday < 0)
+ tmp->tm_wday += DAYSPERWEEK;
+ tmp->tm_hour = (int) (rem / SECSPERHOUR);
+ rem %= SECSPERHOUR;
+ tmp->tm_min = (int) (rem / SECSPERMIN);
+ /*
+ ** A positive leap second requires a special
+ ** representation. This uses "... ??:59:60" et seq.
+ */
+ tmp->tm_sec = (int) (rem % SECSPERMIN) + hit;
+ ip = mon_lengths[isleap(y)];
+ for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon))
+ idays -= ip[tmp->tm_mon];
+ tmp->tm_mday = (int) (idays + 1);
+ tmp->tm_isdst = 0;
+#ifdef TM_GMTOFF
+ tmp->TM_GMTOFF = offset;
+#endif /* defined TM_GMTOFF */
+ return tmp;
+}
+
+char *
+ctime(timep)
+const time_t * const timep;
+{
+/*
+** Section 4.12.3.2 of X3.159-1989 requires that
+** The ctime function converts the calendar time pointed to by timer
+** to local time in the form of a string. It is equivalent to
+** asctime(localtime(timer))
+*/
+ return asctime(localtime(timep));
+}
+
+char *
+ctime_r(timep, buf)
+const time_t * const timep;
+char * buf;
+{
+ struct tm mytm;
+
+ return asctime_r(localtime_r(timep, &mytm), buf);
+}
+
+/*
+** Adapted from code provided by Robert Elz, who writes:
+** The "best" way to do mktime I think is based on an idea of Bob
+** Kridle's (so its said...) from a long time ago.
+** It does a binary search of the time_t space. Since time_t's are
+** just 32 bits, its a max of 32 iterations (even at 64 bits it
+** would still be very reasonable).
+*/
+
+#ifndef WRONG
+#define WRONG (-1)
+#endif /* !defined WRONG */
+
+/*
+** Simplified normalize logic courtesy Paul Eggert.
+*/
+
+static int
+increment_overflow(number, delta)
+int * number;
+int delta;
+{
+ int number0;
+
+ number0 = *number;
+ *number += delta;
+ return (*number < number0) != (delta < 0);
+}
+
+static int
+long_increment_overflow(number, delta)
+long * number;
+int delta;
+{
+ long number0;
+
+ number0 = *number;
+ *number += delta;
+ return (*number < number0) != (delta < 0);
+}
+
+static int
+normalize_overflow(tensptr, unitsptr, base)
+int * const tensptr;
+int * const unitsptr;
+const int base;
+{
+ int tensdelta;
+
+ tensdelta = (*unitsptr >= 0) ?
+ (*unitsptr / base) :
+ (-1 - (-1 - *unitsptr) / base);
+ *unitsptr -= tensdelta * base;
+ return increment_overflow(tensptr, tensdelta);
+}
+
+static int
+long_normalize_overflow(tensptr, unitsptr, base)
+long * const tensptr;
+int * const unitsptr;
+const int base;
+{
+ register int tensdelta;
+
+ tensdelta = (*unitsptr >= 0) ?
+ (*unitsptr / base) :
+ (-1 - (-1 - *unitsptr) / base);
+ *unitsptr -= tensdelta * base;
+ return long_increment_overflow(tensptr, tensdelta);
+}
+
+static int
+tmcomp(atmp, btmp)
+const struct tm * const atmp;
+const struct tm * const btmp;
+{
+ int result;
+
+ if ((result = (atmp->tm_year - btmp->tm_year)) == 0 &&
+ (result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
+ (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
+ (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
+ (result = (atmp->tm_min - btmp->tm_min)) == 0)
+ result = atmp->tm_sec - btmp->tm_sec;
+ return result;
+}
+
+static time_t
+time2sub(tmp, funcp, offset, okayp, do_norm_secs)
+struct tm * const tmp;
+struct tm * (* const funcp)(const time_t*, long, struct tm*);
+const long offset;
+int * const okayp;
+const int do_norm_secs;
+{
+ const struct state * sp;
+ int dir;
+ int i, j;
+ int saved_seconds;
+ long li;
+ time_t lo;
+ time_t hi;
+ long y;
+ time_t newt;
+ time_t t;
+ struct tm yourtm, mytm;
+
+ *okayp = FALSE;
+ yourtm = *tmp;
+ if (do_norm_secs) {
+ if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,
+ SECSPERMIN))
+ return WRONG;
+ }
+ if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR))
+ return WRONG;
+ if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY))
+ return WRONG;
+ y = yourtm.tm_year;
+ if (long_normalize_overflow(&y, &yourtm.tm_mon, MONSPERYEAR))
+ return WRONG;
+ /*
+ ** Turn y into an actual year number for now.
+ ** It is converted back to an offset from TM_YEAR_BASE later.
+ */
+ if (long_increment_overflow(&y, TM_YEAR_BASE))
+ return WRONG;
+ while (yourtm.tm_mday <= 0) {
+ if (long_increment_overflow(&y, -1))
+ return WRONG;
+ li = y + (1 < yourtm.tm_mon);
+ yourtm.tm_mday += year_lengths[isleap(li)];
+ }
+ while (yourtm.tm_mday > DAYSPERLYEAR) {
+ li = y + (1 < yourtm.tm_mon);
+ yourtm.tm_mday -= year_lengths[isleap(li)];
+ if (long_increment_overflow(&y, 1))
+ return WRONG;
+ }
+ for ( ; ; ) {
+ i = mon_lengths[isleap(y)][yourtm.tm_mon];
+ if (yourtm.tm_mday <= i)
+ break;
+ yourtm.tm_mday -= i;
+ if (++yourtm.tm_mon >= MONSPERYEAR) {
+ yourtm.tm_mon = 0;
+ if (long_increment_overflow(&y, 1))
+ return WRONG;
+ }
+ }
+ if (long_increment_overflow(&y, -TM_YEAR_BASE))
+ return WRONG;
+ yourtm.tm_year = y;
+ if (yourtm.tm_year != y)
+ return WRONG;
+ /* Don't go below 1900 for POLA */
+ if (yourtm.tm_year < 0)
+ return WRONG;
+ if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)
+ saved_seconds = 0;
+ else if (y + TM_YEAR_BASE < EPOCH_YEAR) {
+ /*
+ ** We can't set tm_sec to 0, because that might push the
+ ** time below the minimum representable time.
+ ** Set tm_sec to 59 instead.
+ ** This assumes that the minimum representable time is
+ ** not in the same minute that a leap second was deleted from,
+ ** which is a safer assumption than using 58 would be.
+ */
+ if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN))
+ return WRONG;
+ saved_seconds = yourtm.tm_sec;
+ yourtm.tm_sec = SECSPERMIN - 1;
+ } else {
+ saved_seconds = yourtm.tm_sec;
+ yourtm.tm_sec = 0;
+ }
+ /*
+ ** Do a binary search (this works whatever time_t's type is).
+ */
+ if (!TYPE_SIGNED(time_t)) {
+ lo = 0;
+ hi = lo - 1;
+ } else if (!TYPE_INTEGRAL(time_t)) {
+ if (sizeof(time_t) > sizeof(float))
+ hi = (time_t) DBL_MAX;
+ else hi = (time_t) FLT_MAX;
+ lo = -hi;
+ } else {
+ lo = 1;
+ for (i = 0; i < (int) TYPE_BIT(time_t) - 1; ++i)
+ lo *= 2;
+ hi = -(lo + 1);
+ }
+ for ( ; ; ) {
+ t = lo / 2 + hi / 2;
+ if (t < lo)
+ t = lo;
+ else if (t > hi)
+ t = hi;
+ if ((*funcp)(&t, offset, &mytm) == NULL) {
+ /*
+ ** Assume that t is too extreme to be represented in
+ ** a struct tm; arrange things so that it is less
+ ** extreme on the next pass.
+ */
+ dir = (t > 0) ? 1 : -1;
+ } else dir = tmcomp(&mytm, &yourtm);
+ if (dir != 0) {
+ if (t == lo) {
+ ++t;
+ if (t <= lo)
+ return WRONG;
+ ++lo;
+ } else if (t == hi) {
+ --t;
+ if (t >= hi)
+ return WRONG;
+ --hi;
+ }
+ if (lo > hi)
+ return WRONG;
+ if (dir > 0)
+ hi = t;
+ else lo = t;
+ continue;
+ }
+ if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
+ break;
+ /*
+ ** Right time, wrong type.
+ ** Hunt for right time, right type.
+ ** It's okay to guess wrong since the guess
+ ** gets checked.
+ */
+ sp = (const struct state *)
+ ((funcp == localsub) ? lclptr : gmtptr);
+#ifdef ALL_STATE
+ if (sp == NULL)
+ return WRONG;
+#endif /* defined ALL_STATE */
+ for (i = sp->typecnt - 1; i >= 0; --i) {
+ if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)
+ continue;
+ for (j = sp->typecnt - 1; j >= 0; --j) {
+ if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)
+ continue;
+ newt = t + sp->ttis[j].tt_gmtoff -
+ sp->ttis[i].tt_gmtoff;
+ if ((*funcp)(&newt, offset, &mytm) == NULL)
+ continue;
+ if (tmcomp(&mytm, &yourtm) != 0)
+ continue;
+ if (mytm.tm_isdst != yourtm.tm_isdst)
+ continue;
+ /*
+ ** We have a match.
+ */
+ t = newt;
+ goto label;
+ }
+ }
+ return WRONG;
+ }
+label:
+ newt = t + saved_seconds;
+ if ((newt < t) != (saved_seconds < 0))
+ return WRONG;
+ t = newt;
+ if ((*funcp)(&t, offset, tmp))
+ *okayp = TRUE;
+ return t;
+}
+
+static time_t
+time2(tmp, funcp, offset, okayp)
+struct tm * const tmp;
+struct tm * (* const funcp)(const time_t*, long, struct tm*);
+const long offset;
+int * const okayp;
+{
+ time_t t;
+
+ /*
+ ** First try without normalization of seconds
+ ** (in case tm_sec contains a value associated with a leap second).
+ ** If that fails, try with normalization of seconds.
+ */
+ t = time2sub(tmp, funcp, offset, okayp, FALSE);
+ return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE);
+}
+
+static time_t
+time1(tmp, funcp, offset)
+struct tm * const tmp;
+struct tm * (* const funcp)(const time_t *, long, struct tm *);
+const long offset;
+{
+ time_t t;
+ const struct state * sp;
+ int samei, otheri;
+ int sameind, otherind;
+ int i;
+ int nseen;
+ int seen[TZ_MAX_TYPES];
+ int types[TZ_MAX_TYPES];
+ int okay;
+
+ if (tmp == NULL) {
+ errno = EINVAL;
+ return WRONG;
+ }
+
+ if (tmp->tm_isdst > 1)
+ tmp->tm_isdst = 1;
+ t = time2(tmp, funcp, offset, &okay);
+#ifdef PCTS
+ /*
+ ** PCTS code courtesy Grant Sullivan.
+ */
+ if (okay)
+ return t;
+ if (tmp->tm_isdst < 0)
+ tmp->tm_isdst = 0; /* reset to std and try again */
+#endif /* defined PCTS */
+#ifndef PCTS
+ if (okay || tmp->tm_isdst < 0)
+ return t;
+#endif /* !defined PCTS */
+ /*
+ ** We're supposed to assume that somebody took a time of one type
+ ** and did some math on it that yielded a "struct tm" that's bad.
+ ** We try to divine the type they started from and adjust to the
+ ** type they need.
+ */
+ sp = (const struct state *) ((funcp == localsub) ? lclptr : gmtptr);
+#ifdef ALL_STATE
+ if (sp == NULL)
+ return WRONG;
+#endif /* defined ALL_STATE */
+ for (i = 0; i < sp->typecnt; ++i)
+ seen[i] = FALSE;
+ nseen = 0;
+ for (i = sp->timecnt - 1; i >= 0; --i)
+ if (!seen[sp->types[i]]) {
+ seen[sp->types[i]] = TRUE;
+ types[nseen++] = sp->types[i];
+ }
+ for (sameind = 0; sameind < nseen; ++sameind) {
+ samei = types[sameind];
+ if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)
+ continue;
+ for (otherind = 0; otherind < nseen; ++otherind) {
+ otheri = types[otherind];
+ if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)
+ continue;
+ tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
+ sp->ttis[samei].tt_gmtoff;
+ tmp->tm_isdst = !tmp->tm_isdst;
+ t = time2(tmp, funcp, offset, &okay);
+ if (okay)
+ return t;
+ tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
+ sp->ttis[samei].tt_gmtoff;
+ tmp->tm_isdst = !tmp->tm_isdst;
+ }
+ }
+ return WRONG;
+}
+
+time_t
+mktime(tmp)
+struct tm * const tmp;
+{
+ time_t mktime_return_value;
+ _RWLOCK_RDLOCK(&lcl_rwlock);
+ tzset_basic(1);
+ mktime_return_value = time1(tmp, localsub, 0L);
+ _RWLOCK_UNLOCK(&lcl_rwlock);
+ return(mktime_return_value);
+}
+
+#ifdef STD_INSPIRED
+
+time_t
+timelocal(tmp)
+struct tm * const tmp;
+{
+ if (tmp != NULL)
+ tmp->tm_isdst = -1; /* in case it wasn't initialized */
+ return mktime(tmp);
+}
+
+time_t
+timegm(tmp)
+struct tm * const tmp;
+{
+ if (tmp != NULL)
+ tmp->tm_isdst = 0;
+ return time1(tmp, gmtsub, 0L);
+}
+
+time_t
+timeoff(tmp, offset)
+struct tm * const tmp;
+const long offset;
+{
+ if (tmp != NULL)
+ tmp->tm_isdst = 0;
+ return time1(tmp, gmtsub, offset);
+}
+
+#endif /* defined STD_INSPIRED */
+
+#ifdef CMUCS
+
+/*
+** The following is supplied for compatibility with
+** previous versions of the CMUCS runtime library.
+*/
+
+long
+gtime(tmp)
+struct tm * const tmp;
+{
+ const time_t t = mktime(tmp);
+
+ if (t == WRONG)
+ return -1;
+ return t;
+}
+
+#endif /* defined CMUCS */
+
+/*
+** XXX--is the below the right way to conditionalize??
+*/
+
+#ifdef STD_INSPIRED
+
+/*
+** IEEE Std 1003.1-1988 (POSIX) legislates that 536457599
+** shall correspond to "Wed Dec 31 23:59:59 UTC 1986", which
+** is not the case if we are accounting for leap seconds.
+** So, we provide the following conversion routines for use
+** when exchanging timestamps with POSIX conforming systems.
+*/
+
+static long
+leapcorr(timep)
+time_t * timep;
+{
+ struct state * sp;
+ struct lsinfo * lp;
+ int i;
+
+ sp = lclptr;
+ i = sp->leapcnt;
+ while (--i >= 0) {
+ lp = &sp->lsis[i];
+ if (*timep >= lp->ls_trans)
+ return lp->ls_corr;
+ }
+ return 0;
+}
+
+time_t
+time2posix(t)
+time_t t;
+{
+ tzset();
+ return t - leapcorr(&t);
+}
+
+time_t
+posix2time(t)
+time_t t;
+{
+ time_t x;
+ time_t y;
+
+ tzset();
+ /*
+ ** For a positive leap second hit, the result
+ ** is not unique. For a negative leap second
+ ** hit, the corresponding time doesn't exist,
+ ** so we return an adjacent second.
+ */
+ x = t + leapcorr(&t);
+ y = x - leapcorr(&x);
+ if (y < t) {
+ do {
+ x++;
+ y = x - leapcorr(&x);
+ } while (y < t);
+ if (t != y)
+ return x - 1;
+ } else if (y > t) {
+ do {
+ --x;
+ y = x - leapcorr(&x);
+ } while (y > t);
+ if (t != y)
+ return x + 1;
+ }
+ return x;
+}
+
+#endif /* defined STD_INSPIRED */
Added: vendor/tzcode/dist/stdtime/private.h
===================================================================
--- vendor/tzcode/dist/stdtime/private.h (rev 0)
+++ vendor/tzcode/dist/stdtime/private.h 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,326 @@
+#ifndef PRIVATE_H
+
+#define PRIVATE_H
+
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+**
+** $FreeBSD: stable/10/contrib/tzcode/stdtime/private.h 192625 2009-05-23 06:31:50Z edwin $
+*/
+
+/* Stuff moved from Makefile.inc to reduce clutter */
+#ifndef TM_GMTOFF
+#define TM_GMTOFF tm_gmtoff
+#define TM_ZONE tm_zone
+#define STD_INSPIRED 1
+#define PCTS 1
+#define HAVE_LONG_DOUBLE 1
+#define HAVE_STRERROR 1
+#define HAVE_UNISTD_H 1
+#define LOCALE_HOME _PATH_LOCALE
+#define TZDIR "/usr/share/zoneinfo"
+#endif /* ndef TM_GMTOFF */
+
+/*
+** This header is for use ONLY with the time conversion code.
+** There is no guarantee that it will remain unchanged,
+** or that it will remain at all.
+** Do NOT copy it to any system include directory.
+** Thank you!
+*/
+
+/*
+** ID
+*/
+
+#ifndef lint
+#ifndef NOID
+/*
+static char privatehid[] = "@(#)private.h 8.6";
+*/
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+#define GRANDPARENTED "Local time zone must be set--see zic manual page"
+
+/*
+** Defaults for preprocessor symbols.
+** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.
+*/
+
+#ifndef HAVE_ADJTIME
+#define HAVE_ADJTIME 1
+#endif /* !defined HAVE_ADJTIME */
+
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif /* !defined HAVE_GETTEXT */
+
+#ifndef HAVE_INCOMPATIBLE_CTIME_R
+#define HAVE_INCOMPATIBLE_CTIME_R 0
+#endif /* !defined INCOMPATIBLE_CTIME_R */
+
+#ifndef HAVE_SETTIMEOFDAY
+#define HAVE_SETTIMEOFDAY 3
+#endif /* !defined HAVE_SETTIMEOFDAY */
+
+#ifndef HAVE_SYMLINK
+#define HAVE_SYMLINK 1
+#endif /* !defined HAVE_SYMLINK */
+
+#ifndef HAVE_SYS_STAT_H
+#define HAVE_SYS_STAT_H 1
+#endif /* !defined HAVE_SYS_STAT_H */
+
+#ifndef HAVE_SYS_WAIT_H
+#define HAVE_SYS_WAIT_H 1
+#endif /* !defined HAVE_SYS_WAIT_H */
+
+#ifndef HAVE_UNISTD_H
+#define HAVE_UNISTD_H 1
+#endif /* !defined HAVE_UNISTD_H */
+
+#ifndef HAVE_UTMPX_H
+#define HAVE_UTMPX_H 0
+#endif /* !defined HAVE_UTMPX_H */
+
+#ifndef LOCALE_HOME
+#define LOCALE_HOME "/usr/lib/locale"
+#endif /* !defined LOCALE_HOME */
+
+#if HAVE_INCOMPATIBLE_CTIME_R
+#define asctime_r _incompatible_asctime_r
+#define ctime_r _incompatible_ctime_r
+#endif /* HAVE_INCOMPATIBLE_CTIME_R */
+
+/*
+** Nested includes
+*/
+
+#include "sys/types.h" /* for time_t */
+#include "stdio.h"
+#include "errno.h"
+#include "string.h"
+#include "limits.h" /* for CHAR_BIT et al. */
+#include "time.h"
+#include "stdlib.h"
+
+#if HAVE_GETTEXT
+#include "libintl.h"
+#endif /* HAVE_GETTEXT */
+
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h> /* for WIFEXITED and WEXITSTATUS */
+#endif /* HAVE_SYS_WAIT_H */
+
+#ifndef WIFEXITED
+#define WIFEXITED(status) (((status) & 0xff) == 0)
+#endif /* !defined WIFEXITED */
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(status) (((status) >> 8) & 0xff)
+#endif /* !defined WEXITSTATUS */
+
+#if HAVE_UNISTD_H
+#include "unistd.h" /* for F_OK, R_OK, and other POSIX goodness */
+#endif /* HAVE_UNISTD_H */
+
+#if !(HAVE_UNISTD_H)
+#ifndef F_OK
+#define F_OK 0
+#endif /* !defined F_OK */
+#ifndef R_OK
+#define R_OK 4
+#endif /* !defined R_OK */
+#endif /* !(HAVE_UNISTD_H) */
+
+/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
+#define is_digit(c) ((unsigned)(c) - '0' <= 9)
+
+/*
+** Define HAVE_STDINT_H's default value here, rather than at the
+** start, since __GLIBC__'s value depends on previously-included
+** files.
+** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
+*/
+#ifndef HAVE_STDINT_H
+#define HAVE_STDINT_H \
+ (199901 <= __STDC_VERSION__ || \
+ 2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
+#endif /* !defined HAVE_STDINT_H */
+
+#if HAVE_STDINT_H
+#include "stdint.h"
+#endif /* !HAVE_STDINT_H */
+
+#ifndef INT_FAST64_MAX
+/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */
+#if defined LLONG_MAX || defined __LONG_LONG_MAX__
+typedef long long int_fast64_t;
+#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
+#if (LONG_MAX >> 31) < 0xffffffff
+Please use a compiler that supports a 64-bit integer type (or wider);
+you may need to compile with "-DHAVE_STDINT_H".
+#endif /* (LONG_MAX >> 31) < 0xffffffff */
+typedef long int_fast64_t;
+#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
+#endif /* !defined INT_FAST64_MAX */
+
+#ifndef INT32_MAX
+#define INT32_MAX 0x7fffffff
+#endif /* !defined INT32_MAX */
+#ifndef INT32_MIN
+#define INT32_MIN (-1 - INT32_MAX)
+#endif /* !defined INT32_MIN */
+
+/*
+** Workarounds for compilers/systems.
+*/
+
+/*
+** Some time.h implementations don't declare asctime_r.
+** Others might define it as a macro.
+** Fix the former without affecting the latter.
+*/
+
+#ifndef asctime_r
+extern char * asctime_r(struct tm const *, char *);
+#endif
+
+/*
+** Private function declarations.
+*/
+
+char * icalloc(int nelem, int elsize);
+char * icatalloc(char * old, const char * new);
+char * icpyalloc(const char * string);
+char * imalloc(int n);
+void * irealloc(void * pointer, int size);
+void icfree(char * pointer);
+void ifree(char * pointer);
+const char * scheck(const char * string, const char * format);
+
+/*
+** Finally, some convenience items.
+*/
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* !defined TRUE */
+
+#ifndef FALSE
+#define FALSE 0
+#endif /* !defined FALSE */
+
+#ifndef TYPE_BIT
+#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT)
+#endif /* !defined TYPE_BIT */
+
+#ifndef TYPE_SIGNED
+#define TYPE_SIGNED(type) (((type) -1) < 0)
+#endif /* !defined TYPE_SIGNED */
+
+/*
+** Since the definition of TYPE_INTEGRAL contains floating point numbers,
+** it cannot be used in preprocessor directives.
+*/
+
+#ifndef TYPE_INTEGRAL
+#define TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
+#endif /* !defined TYPE_INTEGRAL */
+
+/*
+** Since the definition of TYPE_INTEGRAL contains floating point numbers,
+** it cannot be used in preprocessor directives.
+*/
+
+#ifndef TYPE_INTEGRAL
+#define TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
+#endif /* !defined TYPE_INTEGRAL */
+
+#ifndef INT_STRLEN_MAXIMUM
+/*
+** 302 / 1000 is log10(2.0) rounded up.
+** Subtract one for the sign bit if the type is signed;
+** add one for integer division truncation;
+** add one more for a minus sign if the type is signed.
+*/
+#define INT_STRLEN_MAXIMUM(type) \
+ ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
+ 1 + TYPE_SIGNED(type))
+#endif /* !defined INT_STRLEN_MAXIMUM */
+
+/*
+** INITIALIZE(x)
+*/
+
+#ifndef GNUC_or_lint
+#ifdef lint
+#define GNUC_or_lint
+#endif /* defined lint */
+#ifndef lint
+#ifdef __GNUC__
+#define GNUC_or_lint
+#endif /* defined __GNUC__ */
+#endif /* !defined lint */
+#endif /* !defined GNUC_or_lint */
+
+#ifndef INITIALIZE
+#ifdef GNUC_or_lint
+#define INITIALIZE(x) ((x) = 0)
+#endif /* defined GNUC_or_lint */
+#ifndef GNUC_or_lint
+#define INITIALIZE(x)
+#endif /* !defined GNUC_or_lint */
+#endif /* !defined INITIALIZE */
+
+/*
+** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
+*/
+
+#ifndef _
+#if HAVE_GETTEXT
+#define _(msgid) gettext(msgid)
+#else /* !HAVE_GETTEXT */
+#define _(msgid) msgid
+#endif /* !HAVE_GETTEXT */
+#endif /* !defined _ */
+
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
+#if HAVE_INCOMPATIBLE_CTIME_R
+#undef asctime_r
+#undef ctime_r
+char *asctime_r(struct tm const *, char *);
+char *ctime_r(time_t const *, char *);
+#endif /* HAVE_INCOMPATIBLE_CTIME_R */
+
+#ifndef YEARSPERREPEAT
+#define YEARSPERREPEAT 400 /* years before a Gregorian repeat */
+#endif /* !defined YEARSPERREPEAT */
+
+/*
+** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
+*/
+
+#ifndef AVGSECSPERYEAR
+#define AVGSECSPERYEAR 31556952L
+#endif /* !defined AVGSECSPERYEAR */
+
+#ifndef SECSPERREPEAT
+#define SECSPERREPEAT ((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
+#endif /* !defined SECSPERREPEAT */
+
+#ifndef SECSPERREPEAT_BITS
+#define SECSPERREPEAT_BITS 34 /* ceil(log2(SECSPERREPEAT)) */
+#endif /* !defined SECSPERREPEAT_BITS */
+
+/*
+** UNIX was a registered trademark of The Open Group in 2003.
+*/
+
+#endif /* !defined PRIVATE_H */
Added: vendor/tzcode/dist/stdtime/time2posix.3
===================================================================
--- vendor/tzcode/dist/stdtime/time2posix.3 (rev 0)
+++ vendor/tzcode/dist/stdtime/time2posix.3 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,123 @@
+.\" $FreeBSD: stable/10/contrib/tzcode/stdtime/time2posix.3 192890 2009-05-27 12:18:39Z edwin $
+.\"
+.Dd September 11, 2005
+.Dt TIME2POSIX 3
+.Os
+.Sh NAME
+.Nm time2posix ,
+.Nm posix2time
+.Nd convert seconds since the Epoch
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In time.h
+.Ft time_t
+.Fn time2posix "time_t t"
+.Ft time_t
+.Fn posix2time "time_t t"
+.Sh DESCRIPTION
+.St -p1003.1-88
+legislates that a time_t value of
+536457599 shall correspond to "Wed Dec 31 23:59:59 GMT 1986."
+This effectively implies that POSIX time_t's cannot include leap
+seconds and,
+therefore,
+that the system time must be adjusted as each leap occurs.
+.Pp
+If the time package is configured with leap-second support
+enabled,
+however,
+no such adjustment is needed and
+time_t values continue to increase over leap events
+(as a true `seconds since...' value).
+This means that these values will differ from those required by POSIX
+by the net number of leap seconds inserted since the Epoch.
+.Pp
+Typically this is not a problem as the type time_t is intended
+to be
+(mostly)
+opaque\(emtime_t values should only be obtained-from and
+passed-to functions such as
+.Xr time 3 ,
+.Xr localtime 3 ,
+.Xr mktime 3
+and
+.Xr difftime 3 .
+However,
+.St -p1003.1-88
+gives an arithmetic
+expression for directly computing a time_t value from a given date/time,
+and the same relationship is assumed by some
+(usually older)
+applications.
+Any programs creating/dissecting time_t's
+using such a relationship will typically not handle intervals
+over leap seconds correctly.
+.Pp
+The
+.Fn time2posix
+and
+.Fn posix2time
+functions are provided to address this time_t mismatch by converting
+between local time_t values and their POSIX equivalents.
+This is done by accounting for the number of time-base changes that
+would have taken place on a POSIX system as leap seconds were inserted
+or deleted.
+These converted values can then be used in lieu of correcting the older
+applications,
+or when communicating with POSIX-compliant systems.
+.Pp
+The
+.Fn time2posix
+function is single-valued.
+That is,
+every local time_t
+corresponds to a single POSIX time_t.
+The
+.Fn posix2time
+function is less well-behaved:
+for a positive leap second hit the result is not unique,
+and for a negative leap second hit the corresponding
+POSIX time_t does not exist so an adjacent value is returned.
+Both of these are good indicators of the inferiority of the
+POSIX representation.
+.Pp
+The following table summarizes the relationship between time_t
+and its conversion to,
+and back from,
+the POSIX representation over the leap second inserted at the end of June,
+1993.
+.Bl -column "93/06/30" "23:59:59" "A+0" "X=time2posix(T)"
+.It Sy "DATE TIME T X=time2posix(T) posix2time(X)"
+.It "93/06/30 23:59:59 A+0 B+0 A+0"
+.It "93/06/30 23:59:60 A+1 B+1 A+1 or A+2"
+.It "93/07/01 00:00:00 A+2 B+1 A+1 or A+2"
+.It "93/07/01 00:00:01 A+3 B+2 A+3"
+.El
+.Pp
+A leap second deletion would look like...
+.Bl -column "??/06/30" "23:59:58" "A+0" "X=time2posix(T)"
+.It Sy "DATE TIME T X=time2posix(T) posix2time(X)"
+.It "??/06/30 23:59:58 A+0 B+0 A+0"
+.It "??/07/01 00:00:00 A+1 B+2 A+1"
+.It "??/07/01 00:00:01 A+2 B+3 A+2"
+.El
+.Pp
+.D1 No "[Note: posix2time(B+1) => A+0 or A+1]"
+.Pp
+If leap-second support is not enabled,
+local time_t's and
+POSIX time_t's are equivalent,
+and both
+.Fn time2posix
+and
+.Fn posix2time
+degenerate to the identity function.
+.Sh "SEE ALSO"
+.Xr difftime 3 ,
+.Xr localtime 3 ,
+.Xr mktime 3 ,
+.Xr time 3
+.\" @(#)time2posix.3 8.2
+.\" This file is in the public domain, so clarified as of
+.\" 1996-06-05 by Arthur David Olson.
Added: vendor/tzcode/dist/stdtime/tzfile.5
===================================================================
--- vendor/tzcode/dist/stdtime/tzfile.5 (rev 0)
+++ vendor/tzcode/dist/stdtime/tzfile.5 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,152 @@
+.\" $FreeBSD: stable/10/contrib/tzcode/stdtime/tzfile.5 200832 2009-12-22 11:17:10Z edwin $
+.Dd September 13, 1994
+.Dt TZFILE 5
+.Os
+.Sh NAME
+.Nm tzfile
+.Nd timezone information
+.Sh SYNOPSIS
+.Fd #include \&"/usr/src/lib/libc/stdtime/tzfile.h\&"
+.Sh DESCRIPTION
+The time zone information files used by
+.Xr tzset 3
+begin with the magic characters
+.Dq Li TZif
+to identify them as
+time zone information files,
+followed by a character identifying the version of the file's format
+(as of 2005, either an ASCII NUL or a '2')
+followed by fifteen bytes containing zeroes reserved for future use,
+followed by four four-byte values
+written in a ``standard'' byte order
+(the high-order byte of the value is written first).
+These values are,
+in order:
+.Pp
+.Bl -tag -compact -width tzh_ttisstdcnt
+.It Va tzh_ttisgmtcnt
+The number of UTC/local indicators stored in the file.
+.It Va tzh_ttisstdcnt
+The number of standard/wall indicators stored in the file.
+.It Va tzh_leapcnt
+The number of leap seconds for which data is stored in the file.
+.It Va tzh_timecnt
+The number of ``transition times'' for which data is stored
+in the file.
+.It Va tzh_typecnt
+The number of ``local time types'' for which data is stored
+in the file (must not be zero).
+.It Va tzh_charcnt
+The number of characters of ``time zone abbreviation strings''
+stored in the file.
+.El
+.Pp
+The above header is followed by
+.Va tzh_timecnt
+four-byte values of type
+.Fa long ,
+sorted in ascending order.
+These values are written in ``standard'' byte order.
+Each is used as a transition time (as returned by
+.Xr time 3 )
+at which the rules for computing local time change.
+Next come
+.Va tzh_timecnt
+one-byte values of type
+.Fa "unsigned char" ;
+each one tells which of the different types of ``local time'' types
+described in the file is associated with the same-indexed transition time.
+These values serve as indices into an array of
+.Fa ttinfo
+structures (with
+.Fa tzh_typecnt
+entries) that appears next in the file;
+these structures are defined as follows:
+.Pp
+.Bd -literal -offset indent
+struct ttinfo {
+ long tt_gmtoff;
+ int tt_isdst;
+ unsigned int tt_abbrind;
+};
+.Ed
+.Pp
+Each structure is written as a four-byte value for
+.Va tt_gmtoff
+of type
+.Fa long ,
+in a standard byte order, followed by a one-byte value for
+.Va tt_isdst
+and a one-byte value for
+.Va tt_abbrind .
+In each structure,
+.Va tt_gmtoff
+gives the number of seconds to be added to UTC,
+.Li tt_isdst
+tells whether
+.Li tm_isdst
+should be set by
+.Xr localtime 3
+and
+.Va tt_abbrind
+serves as an index into the array of time zone abbreviation characters
+that follow the
+.Li ttinfo
+structure(s) in the file.
+.Pp
+Then there are
+.Va tzh_leapcnt
+pairs of four-byte values, written in standard byte order;
+the first value of each pair gives the time
+(as returned by
+.Xr time 3 )
+at which a leap second occurs;
+the second gives the
+.Em total
+number of leap seconds to be applied after the given time.
+The pairs of values are sorted in ascending order by time.
+.Pp
+Then there are
+.Va tzh_ttisstdcnt
+standard/wall indicators, each stored as a one-byte value;
+they tell whether the transition times associated with local time types
+were specified as standard time or wall clock time,
+and are used when a time zone file is used in handling POSIX-style
+time zone environment variables.
+.Pp
+Finally there are
+.Va tzh_ttisgmtcnt
+UTC/local indicators, each stored as a one-byte value;
+they tell whether the transition times associated with local time types
+were specified as UTC or local time,
+and are used when a time zone file is used in handling POSIX-style
+time zone environment variables.
+.Pp
+.Nm localtime
+uses the first standard-time
+.Li ttinfo
+structure in the file
+(or simply the first
+.Li ttinfo
+structure in the absence of a standard-time structure)
+if either
+.Li tzh_timecnt
+is zero or the time argument is less than the first transition time recorded
+in the file.
+.Pp
+For version-2-format time zone files,
+the above header and data is followed by a second header and data,
+identical in format except that eight bytes are used for each
+transition time or leap second time.
+After the second header and data comes a newline-enclosed,
+POSIX-TZ-environment-variable-style string for use in handling instants
+after the last transition time stored in the file
+(with nothing between the newlines if there is no POSIX representation for
+such instants).
+.Sh SEE ALSO
+.Xr ctime 3 ,
+.Xr time2posix 3 ,
+.Xr zic 8
+.\" @(#)tzfile.5 8.3
+.\" This file is in the public domain, so clarified as of
+.\" 1996-06-05 by Arthur David Olson.
Added: vendor/tzcode/dist/stdtime/tzfile.h
===================================================================
--- vendor/tzcode/dist/stdtime/tzfile.h (rev 0)
+++ vendor/tzcode/dist/stdtime/tzfile.h 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,184 @@
+#ifndef TZFILE_H
+#define TZFILE_H
+
+
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+**
+** $FreeBSD: stable/10/contrib/tzcode/stdtime/tzfile.h 192625 2009-05-23 06:31:50Z edwin $
+*/
+
+/*
+** This header is for use ONLY with the time conversion code.
+** There is no guarantee that it will remain unchanged,
+** or that it will remain at all.
+** Do NOT copy it to any system include directory.
+** Thank you!
+*/
+
+/*
+** ID
+*/
+
+#ifndef lint
+#ifndef NOID
+/*
+static char tzfilehid[] = "@(#)tzfile.h 8.1";
+*/
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*
+** Information about time zone files.
+*/
+
+#ifndef TZDIR
+#define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */
+#endif /* !defined TZDIR */
+
+#ifndef TZDEFAULT
+#define TZDEFAULT "/etc/localtime"
+#endif /* !defined TZDEFAULT */
+
+#ifndef TZDEFRULES
+#define TZDEFRULES "posixrules"
+#endif /* !defined TZDEFRULES */
+
+/*
+** Each file begins with. . .
+*/
+
+#define TZ_MAGIC "TZif"
+
+struct tzhead {
+ char tzh_magic[4]; /* TZ_MAGIC */
+ char tzh_version[1]; /* '\0' or '2' as of 2005 */
+ char tzh_reserved[15]; /* reserved--must be zero */
+ char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */
+ char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
+ char tzh_leapcnt[4]; /* coded number of leap seconds */
+ char tzh_timecnt[4]; /* coded number of transition times */
+ char tzh_typecnt[4]; /* coded number of local time types */
+ char tzh_charcnt[4]; /* coded number of abbr. chars */
+};
+
+/*
+** . . .followed by. . .
+**
+** tzh_timecnt (char [4])s coded transition times a la time(2)
+** tzh_timecnt (unsigned char)s types of local time starting at above
+** tzh_typecnt repetitions of
+** one (char [4]) coded UTC offset in seconds
+** one (unsigned char) used to set tm_isdst
+** one (unsigned char) that's an abbreviation list index
+** tzh_charcnt (char)s '\0'-terminated zone abbreviations
+** tzh_leapcnt repetitions of
+** one (char [4]) coded leap second transition times
+** one (char [4]) total correction after above
+** tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition
+** time is standard time, if FALSE,
+** transition time is wall clock time
+** if absent, transition times are
+** assumed to be wall clock time
+** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition
+** time is UTC, if FALSE,
+** transition time is local time
+** if absent, transition times are
+** assumed to be local time
+*/
+
+/*
+** If tzh_version is '2' or greater, the above is followed by a second instance
+** of tzhead and a second instance of the data in which each coded transition
+** time uses 8 rather than 4 chars,
+** then a POSIX-TZ-environment-variable-style string for use in handling
+** instants after the last transition time stored in the file
+** (with nothing between the newlines if there is no POSIX representation for
+** such instants).
+*/
+
+/*
+** In the current implementation, "tzset()" refuses to deal with files that
+** exceed any of the limits below.
+*/
+
+#ifndef TZ_MAX_TIMES
+#define TZ_MAX_TIMES 1200
+#endif /* !defined TZ_MAX_TIMES */
+
+#ifndef TZ_MAX_TYPES
+#ifndef NOSOLAR
+#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
+#endif /* !defined NOSOLAR */
+#ifdef NOSOLAR
+/*
+** Must be at least 14 for Europe/Riga as of Jan 12 1995,
+** as noted by Earl Chew.
+*/
+#define TZ_MAX_TYPES 20 /* Maximum number of local time types */
+#endif /* !defined NOSOLAR */
+#endif /* !defined TZ_MAX_TYPES */
+
+#ifndef TZ_MAX_CHARS
+#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
+ /* (limited by what unsigned chars can hold) */
+#endif /* !defined TZ_MAX_CHARS */
+
+#ifndef TZ_MAX_LEAPS
+#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
+#endif /* !defined TZ_MAX_LEAPS */
+
+#define SECSPERMIN 60
+#define MINSPERHOUR 60
+#define HOURSPERDAY 24
+#define DAYSPERWEEK 7
+#define DAYSPERNYEAR 365
+#define DAYSPERLYEAR 366
+#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
+#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
+#define MONSPERYEAR 12
+
+#define TM_SUNDAY 0
+#define TM_MONDAY 1
+#define TM_TUESDAY 2
+#define TM_WEDNESDAY 3
+#define TM_THURSDAY 4
+#define TM_FRIDAY 5
+#define TM_SATURDAY 6
+
+#define TM_JANUARY 0
+#define TM_FEBRUARY 1
+#define TM_MARCH 2
+#define TM_APRIL 3
+#define TM_MAY 4
+#define TM_JUNE 5
+#define TM_JULY 6
+#define TM_AUGUST 7
+#define TM_SEPTEMBER 8
+#define TM_OCTOBER 9
+#define TM_NOVEMBER 10
+#define TM_DECEMBER 11
+
+#define TM_YEAR_BASE 1900
+
+#define EPOCH_YEAR 1970
+#define EPOCH_WDAY TM_THURSDAY
+
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+
+/*
+** Since everything in isleap is modulo 400 (or a factor of 400), we know that
+** isleap(y) == isleap(y % 400)
+** and so
+** isleap(a + b) == isleap((a + b) % 400)
+** or
+** isleap(a + b) == isleap(a % 400 + b % 400)
+** This is true even if % means modulo rather than Fortran remainder
+** (which is allowed by C89 but not C99).
+** We use this to avoid addition overflow problems.
+*/
+
+#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
+
+#endif /* !defined TZFILE_H */
Deleted: vendor/tzcode/dist/strftime.c
===================================================================
--- vendor/tzcode/dist/strftime.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/strftime.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,626 +0,0 @@
-/* Convert a broken-down time stamp to a string. */
-
-/* Copyright 1989 The Regents of the University of California.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE. */
-
-/*
-** Based on the UCB version with the copyright notice appearing above.
-**
-** This is ANSIish only when "multibyte character == plain character".
-*/
-
-#include "private.h"
-
-#include "tzfile.h"
-#include "fcntl.h"
-#include "locale.h"
-
-struct lc_time_T {
- const char * mon[MONSPERYEAR];
- const char * month[MONSPERYEAR];
- const char * wday[DAYSPERWEEK];
- const char * weekday[DAYSPERWEEK];
- const char * X_fmt;
- const char * x_fmt;
- const char * c_fmt;
- const char * am;
- const char * pm;
- const char * date_fmt;
-};
-
-#define Locale (&C_time_locale)
-
-static const struct lc_time_T C_time_locale = {
- {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
- }, {
- "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December"
- }, {
- "Sun", "Mon", "Tue", "Wed",
- "Thu", "Fri", "Sat"
- }, {
- "Sunday", "Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday"
- },
-
- /* X_fmt */
- "%H:%M:%S",
-
- /*
- ** x_fmt
- ** C99 requires this format.
- ** Using just numbers (as here) makes Quakers happier;
- ** it's also compatible with SVR4.
- */
- "%m/%d/%y",
-
- /*
- ** c_fmt
- ** C99 requires this format.
- ** Previously this code used "%D %X", but we now conform to C99.
- ** Note that
- ** "%a %b %d %H:%M:%S %Y"
- ** is used by Solaris 2.3.
- */
- "%a %b %e %T %Y",
-
- /* am */
- "AM",
-
- /* pm */
- "PM",
-
- /* date_fmt */
- "%a %b %e %H:%M:%S %Z %Y"
-};
-
-static char * _add(const char *, char *, const char *);
-static char * _conv(int, const char *, char *, const char *);
-static char * _fmt(const char *, const struct tm *, char *, const char *,
- int *);
-static char * _yconv(int, int, bool, bool, char *, char const *);
-
-#if !HAVE_POSIX_DECLS
-extern char * tzname[];
-#endif
-
-#ifndef YEAR_2000_NAME
-#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
-#endif /* !defined YEAR_2000_NAME */
-
-#define IN_NONE 0
-#define IN_SOME 1
-#define IN_THIS 2
-#define IN_ALL 3
-
-#if HAVE_STRFTIME_L
-size_t
-strftime_l(char *s, size_t maxsize, char const *format, struct tm const *t,
- locale_t locale)
-{
- /* Just call strftime, as only the C locale is supported. */
- return strftime(s, maxsize, format, t);
-}
-#endif
-
-size_t
-strftime(char *s, size_t maxsize, const char *format, const struct tm *t)
-{
- char * p;
- int warn;
-
- tzset();
- warn = IN_NONE;
- p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn);
-#ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
- if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
- fprintf(stderr, "\n");
- if (format == NULL)
- fprintf(stderr, "NULL strftime format ");
- else fprintf(stderr, "strftime format \"%s\" ",
- format);
- fprintf(stderr, "yields only two digits of years in ");
- if (warn == IN_SOME)
- fprintf(stderr, "some locales");
- else if (warn == IN_THIS)
- fprintf(stderr, "the current locale");
- else fprintf(stderr, "all locales");
- fprintf(stderr, "\n");
- }
-#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
- if (p == s + maxsize)
- return 0;
- *p = '\0';
- return p - s;
-}
-
-static char *
-_fmt(const char *format, const struct tm *t, char *pt,
- const char *ptlim, int *warnp)
-{
- for ( ; *format; ++format) {
- if (*format == '%') {
-label:
- switch (*++format) {
- case '\0':
- --format;
- break;
- case 'A':
- pt = _add((t->tm_wday < 0 ||
- t->tm_wday >= DAYSPERWEEK) ?
- "?" : Locale->weekday[t->tm_wday],
- pt, ptlim);
- continue;
- case 'a':
- pt = _add((t->tm_wday < 0 ||
- t->tm_wday >= DAYSPERWEEK) ?
- "?" : Locale->wday[t->tm_wday],
- pt, ptlim);
- continue;
- case 'B':
- pt = _add((t->tm_mon < 0 ||
- t->tm_mon >= MONSPERYEAR) ?
- "?" : Locale->month[t->tm_mon],
- pt, ptlim);
- continue;
- case 'b':
- case 'h':
- pt = _add((t->tm_mon < 0 ||
- t->tm_mon >= MONSPERYEAR) ?
- "?" : Locale->mon[t->tm_mon],
- pt, ptlim);
- continue;
- case 'C':
- /*
- ** %C used to do a...
- ** _fmt("%a %b %e %X %Y", t);
- ** ...whereas now POSIX 1003.2 calls for
- ** something completely different.
- ** (ado, 1993-05-24)
- */
- pt = _yconv(t->tm_year, TM_YEAR_BASE,
- true, false, pt, ptlim);
- continue;
- case 'c':
- {
- int warn2 = IN_SOME;
-
- pt = _fmt(Locale->c_fmt, t, pt, ptlim, &warn2);
- if (warn2 == IN_ALL)
- warn2 = IN_THIS;
- if (warn2 > *warnp)
- *warnp = warn2;
- }
- continue;
- case 'D':
- pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp);
- continue;
- case 'd':
- pt = _conv(t->tm_mday, "%02d", pt, ptlim);
- continue;
- case 'E':
- case 'O':
- /*
- ** C99 locale modifiers.
- ** The sequences
- ** %Ec %EC %Ex %EX %Ey %EY
- ** %Od %oe %OH %OI %Om %OM
- ** %OS %Ou %OU %OV %Ow %OW %Oy
- ** are supposed to provide alternate
- ** representations.
- */
- goto label;
- case 'e':
- pt = _conv(t->tm_mday, "%2d", pt, ptlim);
- continue;
- case 'F':
- pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp);
- continue;
- case 'H':
- pt = _conv(t->tm_hour, "%02d", pt, ptlim);
- continue;
- case 'I':
- pt = _conv((t->tm_hour % 12) ?
- (t->tm_hour % 12) : 12,
- "%02d", pt, ptlim);
- continue;
- case 'j':
- pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
- continue;
- case 'k':
- /*
- ** This used to be...
- ** _conv(t->tm_hour % 12 ?
- ** t->tm_hour % 12 : 12, 2, ' ');
- ** ...and has been changed to the below to
- ** match SunOS 4.1.1 and Arnold Robbins'
- ** strftime version 3.0. That is, "%k" and
- ** "%l" have been swapped.
- ** (ado, 1993-05-24)
- */
- pt = _conv(t->tm_hour, "%2d", pt, ptlim);
- continue;
-#ifdef KITCHEN_SINK
- case 'K':
- /*
- ** After all this time, still unclaimed!
- */
- pt = _add("kitchen sink", pt, ptlim);
- continue;
-#endif /* defined KITCHEN_SINK */
- case 'l':
- /*
- ** This used to be...
- ** _conv(t->tm_hour, 2, ' ');
- ** ...and has been changed to the below to
- ** match SunOS 4.1.1 and Arnold Robbin's
- ** strftime version 3.0. That is, "%k" and
- ** "%l" have been swapped.
- ** (ado, 1993-05-24)
- */
- pt = _conv((t->tm_hour % 12) ?
- (t->tm_hour % 12) : 12,
- "%2d", pt, ptlim);
- continue;
- case 'M':
- pt = _conv(t->tm_min, "%02d", pt, ptlim);
- continue;
- case 'm':
- pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim);
- continue;
- case 'n':
- pt = _add("\n", pt, ptlim);
- continue;
- case 'p':
- pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
- Locale->pm :
- Locale->am,
- pt, ptlim);
- continue;
- case 'R':
- pt = _fmt("%H:%M", t, pt, ptlim, warnp);
- continue;
- case 'r':
- pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp);
- continue;
- case 'S':
- pt = _conv(t->tm_sec, "%02d", pt, ptlim);
- continue;
- case 's':
- {
- struct tm tm;
- char buf[INT_STRLEN_MAXIMUM(
- time_t) + 1];
- time_t mkt;
-
- tm = *t;
- mkt = mktime(&tm);
- if (TYPE_SIGNED(time_t))
- sprintf(buf, "%"PRIdMAX,
- (intmax_t) mkt);
- else sprintf(buf, "%"PRIuMAX,
- (uintmax_t) mkt);
- pt = _add(buf, pt, ptlim);
- }
- continue;
- case 'T':
- pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp);
- continue;
- case 't':
- pt = _add("\t", pt, ptlim);
- continue;
- case 'U':
- pt = _conv((t->tm_yday + DAYSPERWEEK -
- t->tm_wday) / DAYSPERWEEK,
- "%02d", pt, ptlim);
- continue;
- case 'u':
- /*
- ** From Arnold Robbins' strftime version 3.0:
- ** "ISO 8601: Weekday as a decimal number
- ** [1 (Monday) - 7]"
- ** (ado, 1993-05-24)
- */
- pt = _conv((t->tm_wday == 0) ?
- DAYSPERWEEK : t->tm_wday,
- "%d", pt, ptlim);
- continue;
- case 'V': /* ISO 8601 week number */
- case 'G': /* ISO 8601 year (four digits) */
- case 'g': /* ISO 8601 year (two digits) */
-/*
-** From Arnold Robbins' strftime version 3.0: "the week number of the
-** year (the first Monday as the first day of week 1) as a decimal number
-** (01-53)."
-** (ado, 1993-05-24)
-**
-** From <http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html> by Markus Kuhn:
-** "Week 01 of a year is per definition the first week which has the
-** Thursday in this year, which is equivalent to the week which contains
-** the fourth day of January. In other words, the first week of a new year
-** is the week which has the majority of its days in the new year. Week 01
-** might also contain days from the previous year and the week before week
-** 01 of a year is the last week (52 or 53) of the previous year even if
-** it contains days from the new year. A week starts with Monday (day 1)
-** and ends with Sunday (day 7). For example, the first week of the year
-** 1997 lasts from 1996-12-30 to 1997-01-05..."
-** (ado, 1996-01-02)
-*/
- {
- int year;
- int base;
- int yday;
- int wday;
- int w;
-
- year = t->tm_year;
- base = TM_YEAR_BASE;
- yday = t->tm_yday;
- wday = t->tm_wday;
- for ( ; ; ) {
- int len;
- int bot;
- int top;
-
- len = isleap_sum(year, base) ?
- DAYSPERLYEAR :
- DAYSPERNYEAR;
- /*
- ** What yday (-3 ... 3) does
- ** the ISO year begin on?
- */
- bot = ((yday + 11 - wday) %
- DAYSPERWEEK) - 3;
- /*
- ** What yday does the NEXT
- ** ISO year begin on?
- */
- top = bot -
- (len % DAYSPERWEEK);
- if (top < -3)
- top += DAYSPERWEEK;
- top += len;
- if (yday >= top) {
- ++base;
- w = 1;
- break;
- }
- if (yday >= bot) {
- w = 1 + ((yday - bot) /
- DAYSPERWEEK);
- break;
- }
- --base;
- yday += isleap_sum(year, base) ?
- DAYSPERLYEAR :
- DAYSPERNYEAR;
- }
-#ifdef XPG4_1994_04_09
- if ((w == 52 &&
- t->tm_mon == TM_JANUARY) ||
- (w == 1 &&
- t->tm_mon == TM_DECEMBER))
- w = 53;
-#endif /* defined XPG4_1994_04_09 */
- if (*format == 'V')
- pt = _conv(w, "%02d",
- pt, ptlim);
- else if (*format == 'g') {
- *warnp = IN_ALL;
- pt = _yconv(year, base,
- false, true,
- pt, ptlim);
- } else pt = _yconv(year, base,
- true, true,
- pt, ptlim);
- }
- continue;
- case 'v':
- /*
- ** From Arnold Robbins' strftime version 3.0:
- ** "date as dd-bbb-YYYY"
- ** (ado, 1993-05-24)
- */
- pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp);
- continue;
- case 'W':
- pt = _conv((t->tm_yday + DAYSPERWEEK -
- (t->tm_wday ?
- (t->tm_wday - 1) :
- (DAYSPERWEEK - 1))) / DAYSPERWEEK,
- "%02d", pt, ptlim);
- continue;
- case 'w':
- pt = _conv(t->tm_wday, "%d", pt, ptlim);
- continue;
- case 'X':
- pt = _fmt(Locale->X_fmt, t, pt, ptlim, warnp);
- continue;
- case 'x':
- {
- int warn2 = IN_SOME;
-
- pt = _fmt(Locale->x_fmt, t, pt, ptlim, &warn2);
- if (warn2 == IN_ALL)
- warn2 = IN_THIS;
- if (warn2 > *warnp)
- *warnp = warn2;
- }
- continue;
- case 'y':
- *warnp = IN_ALL;
- pt = _yconv(t->tm_year, TM_YEAR_BASE,
- false, true,
- pt, ptlim);
- continue;
- case 'Y':
- pt = _yconv(t->tm_year, TM_YEAR_BASE,
- true, true,
- pt, ptlim);
- continue;
- case 'Z':
-#ifdef TM_ZONE
- pt = _add(t->TM_ZONE, pt, ptlim);
-#else
- if (t->tm_isdst >= 0)
- pt = _add(tzname[t->tm_isdst != 0],
- pt, ptlim);
-#endif
- /*
- ** C99 says that %Z must be replaced by the
- ** empty string if the time zone is not
- ** determinable.
- */
- continue;
- case 'z':
- {
- long diff;
- char const * sign;
-
- if (t->tm_isdst < 0)
- continue;
-#ifdef TM_GMTOFF
- diff = t->TM_GMTOFF;
-#else /* !defined TM_GMTOFF */
- /*
- ** C99 says that the UT offset must
- ** be computed by looking only at
- ** tm_isdst. This requirement is
- ** incorrect, since it means the code
- ** must rely on magic (in this case
- ** altzone and timezone), and the
- ** magic might not have the correct
- ** offset. Doing things correctly is
- ** tricky and requires disobeying C99;
- ** see GNU C strftime for details.
- ** For now, punt and conform to the
- ** standard, even though it's incorrect.
- **
- ** C99 says that %z must be replaced by the
- ** empty string if the time zone is not
- ** determinable, so output nothing if the
- ** appropriate variables are not available.
- */
- if (t->tm_isdst == 0)
-#ifdef USG_COMPAT
- diff = -timezone;
-#else /* !defined USG_COMPAT */
- continue;
-#endif /* !defined USG_COMPAT */
- else
-#ifdef ALTZONE
- diff = -altzone;
-#else /* !defined ALTZONE */
- continue;
-#endif /* !defined ALTZONE */
-#endif /* !defined TM_GMTOFF */
- if (diff < 0) {
- sign = "-";
- diff = -diff;
- } else sign = "+";
- pt = _add(sign, pt, ptlim);
- diff /= SECSPERMIN;
- diff = (diff / MINSPERHOUR) * 100 +
- (diff % MINSPERHOUR);
- pt = _conv(diff, "%04d", pt, ptlim);
- }
- continue;
- case '+':
- pt = _fmt(Locale->date_fmt, t, pt, ptlim,
- warnp);
- continue;
- case '%':
- /*
- ** X311J/88-090 (4.12.3.5): if conversion char is
- ** undefined, behavior is undefined. Print out the
- ** character itself as printf(3) also does.
- */
- default:
- break;
- }
- }
- if (pt == ptlim)
- break;
- *pt++ = *format;
- }
- return pt;
-}
-
-static char *
-_conv(int n, const char *format, char *pt, const char *ptlim)
-{
- char buf[INT_STRLEN_MAXIMUM(int) + 1];
-
- sprintf(buf, format, n);
- return _add(buf, pt, ptlim);
-}
-
-static char *
-_add(const char *str, char *pt, const char *ptlim)
-{
- while (pt < ptlim && (*pt = *str++) != '\0')
- ++pt;
- return pt;
-}
-
-/*
-** POSIX and the C Standard are unclear or inconsistent about
-** what %C and %y do if the year is negative or exceeds 9999.
-** Use the convention that %C concatenated with %y yields the
-** same output as %Y, and that %Y contains at least 4 bytes,
-** with more only if necessary.
-*/
-
-static char *
-_yconv(int a, int b, bool convert_top, bool convert_yy,
- char *pt, const char *ptlim)
-{
- register int lead;
- register int trail;
-
-#define DIVISOR 100
- trail = a % DIVISOR + b % DIVISOR;
- lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR;
- trail %= DIVISOR;
- if (trail < 0 && lead > 0) {
- trail += DIVISOR;
- --lead;
- } else if (lead < 0 && trail > 0) {
- trail -= DIVISOR;
- ++lead;
- }
- if (convert_top) {
- if (lead == 0 && trail < 0)
- pt = _add("-0", pt, ptlim);
- else pt = _conv(lead, "%02d", pt, ptlim);
- }
- if (convert_yy)
- pt = _conv(((trail < 0) ? -trail : trail), "%02d", pt, ptlim);
- return pt;
-}
Deleted: vendor/tzcode/dist/time2posix.3
===================================================================
--- vendor/tzcode/dist/time2posix.3 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/time2posix.3 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,129 +0,0 @@
-.TH TIME2POSIX 3
-.SH NAME
-time2posix, posix2time \- convert seconds since the Epoch
-.SH SYNOPSIS
-.nf
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.B #include <time.h>
-.PP
-.B time_t time2posix(time_t t);
-.PP
-.B time_t posix2time(time_t t);
-.PP
-.B cc ... \*-ltz
-.fi
-.SH DESCRIPTION
-.ie '\(en'' .ds en \-
-.el .ds en \(en
-.ie '\(lq'' .ds lq \&"\"
-.el .ds lq \(lq\"
-.ie '\(rq'' .ds rq \&"\"
-.el .ds rq \(rq\"
-.de q
-\\$3\*(lq\\$1\*(rq\\$2
-..
-IEEE Standard 1003.1
-(POSIX)
-requires the time_t value 536457599 to stand for 1986-12-31 23:59:59 UTC.
-This effectively implies that POSIX time_t values cannot include leap
-seconds and,
-therefore,
-that the system time must be adjusted as each leap occurs.
-.PP
-If the time package is configured with leap-second support
-enabled,
-however,
-no such adjustment is needed and
-time_t values continue to increase over leap events
-(as a true
-.q "seconds since..."
-value).
-This means that these values will differ from those required by POSIX
-by the net number of leap seconds inserted since the Epoch.
-.PP
-Typically this is not a problem as the type time_t is intended
-to be
-(mostly)
-opaque \*(en time_t values should only be obtained-from and
-passed-to functions such as
-.IR time(2) ,
-.IR localtime(3) ,
-.IR mktime(3) ,
-and
-.IR difftime(3) .
-However,
-POSIX gives an arithmetic
-expression for directly computing a time_t value from a given date/time,
-and the same relationship is assumed by some
-(usually older)
-applications.
-Any programs creating/dissecting time_t's
-using such a relationship will typically not handle intervals
-over leap seconds correctly.
-.PP
-The
-.I time2posix
-and
-.I posix2time
-functions are provided to address this time_t mismatch by converting
-between local time_t values and their POSIX equivalents.
-This is done by accounting for the number of time-base changes that
-would have taken place on a POSIX system as leap seconds were inserted
-or deleted.
-These converted values can then be used in lieu of correcting the older
-applications,
-or when communicating with POSIX-compliant systems.
-.PP
-.I Time2posix
-is single-valued.
-That is,
-every local time_t
-corresponds to a single POSIX time_t.
-.I Posix2time
-is less well-behaved:
-for a positive leap second hit the result is not unique,
-and for a negative leap second hit the corresponding
-POSIX time_t doesn't exist so an adjacent value is returned.
-Both of these are good indicators of the inferiority of the
-POSIX representation.
-.PP
-The following table summarizes the relationship between a time
-T and it's conversion to,
-and back from,
-the POSIX representation over the leap second inserted at the end of June,
-1993.
-.nf
-.ta \w'93/06/30 'u +\w'23:59:59 'u +\w'A+0 'u +\w'X=time2posix(T) 'u
-DATE TIME T X=time2posix(T) posix2time(X)
-93/06/30 23:59:59 A+0 B+0 A+0
-93/06/30 23:59:60 A+1 B+1 A+1 or A+2
-93/07/01 00:00:00 A+2 B+1 A+1 or A+2
-93/07/01 00:00:01 A+3 B+2 A+3
-
-A leap second deletion would look like...
-
-DATE TIME T X=time2posix(T) posix2time(X)
-??/06/30 23:59:58 A+0 B+0 A+0
-??/07/01 00:00:00 A+1 B+2 A+1
-??/07/01 00:00:01 A+2 B+3 A+2
-.sp
-.ce
- [Note: posix2time(B+1) => A+0 or A+1]
-.fi
-.PP
-If leap-second support is not enabled,
-local time_t's and
-POSIX time_t's are equivalent,
-and both
-.I time2posix
-and
-.I posix2time
-degenerate to the identity function.
-.SH SEE ALSO
-difftime(3),
-localtime(3),
-mktime(3),
-time(2)
-.\" This file is in the public domain, so clarified as of
-.\" 1996-06-05 by Arthur David Olson.
Deleted: vendor/tzcode/dist/time2posix.3.txt
===================================================================
--- vendor/tzcode/dist/time2posix.3.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/time2posix.3.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,76 +0,0 @@
-TIME2POSIX(3) Library Functions Manual TIME2POSIX(3)
-
-NAME
- time2posix, posix2time - convert seconds since the Epoch
-
-SYNOPSIS
- #include <time.h>
-
- time_t time2posix(time_t t);
-
- time_t posix2time(time_t t);
-
- cc ... -ltz
-
-DESCRIPTION
- IEEE Standard 1003.1 (POSIX) requires the time_t value 536457599 to
- stand for 1986-12-31 23:59:59 UTC. This effectively implies that POSIX
- time_t values cannot include leap seconds and, therefore, that the
- system time must be adjusted as each leap occurs.
-
- If the time package is configured with leap-second support enabled,
- however, no such adjustment is needed and time_t values continue to
- increase over leap events (as a true "seconds since..." value). This
- means that these values will differ from those required by POSIX by the
- net number of leap seconds inserted since the Epoch.
-
- Typically this is not a problem as the type time_t is intended to be
- (mostly) opaque - time_t values should only be obtained-from and
- passed-to functions such as time(2), localtime(3), mktime(3), and
- difftime(3). However, POSIX gives an arithmetic expression for
- directly computing a time_t value from a given date/time, and the same
- relationship is assumed by some (usually older) applications. Any
- programs creating/dissecting time_t's using such a relationship will
- typically not handle intervals over leap seconds correctly.
-
- The time2posix and posix2time functions are provided to address this
- time_t mismatch by converting between local time_t values and their
- POSIX equivalents. This is done by accounting for the number of time-
- base changes that would have taken place on a POSIX system as leap
- seconds were inserted or deleted. These converted values can then be
- used in lieu of correcting the older applications, or when
- communicating with POSIX-compliant systems.
-
- Time2posix is single-valued. That is, every local time_t corresponds
- to a single POSIX time_t. Posix2time is less well-behaved: for a
- positive leap second hit the result is not unique, and for a negative
- leap second hit the corresponding POSIX time_t doesn't exist so an
- adjacent value is returned. Both of these are good indicators of the
- inferiority of the POSIX representation.
-
- The following table summarizes the relationship between a time T and
- it's conversion to, and back from, the POSIX representation over the
- leap second inserted at the end of June, 1993.
- DATE TIME T X=time2posix(T) posix2time(X)
- 93/06/30 23:59:59 A+0 B+0 A+0
- 93/06/30 23:59:60 A+1 B+1 A+1 or A+2
- 93/07/01 00:00:00 A+2 B+1 A+1 or A+2
- 93/07/01 00:00:01 A+3 B+2 A+3
-
- A leap second deletion would look like...
-
- DATE TIME T X=time2posix(T) posix2time(X)
- ??/06/30 23:59:58 A+0 B+0 A+0
- ??/07/01 00:00:00 A+1 B+2 A+1
- ??/07/01 00:00:01 A+2 B+3 A+2
-
- [Note: posix2time(B+1) => A+0 or A+1]
-
- If leap-second support is not enabled, local time_t's and POSIX
- time_t's are equivalent, and both time2posix and posix2time degenerate
- to the identity function.
-
-SEE ALSO
- difftime(3), localtime(3), mktime(3), time(2)
-
- TIME2POSIX(3)
Deleted: vendor/tzcode/dist/tz-art.htm
===================================================================
--- vendor/tzcode/dist/tz-art.htm 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tz-art.htm 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,574 +0,0 @@
-<!DOCTYPE html
-PUBLIC "-//W3C//DTD HTML 4.01//EN"
-"http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<meta http-equiv="Content-type" content='text/html; charset="UTF-8"'>
-<title>Time and the Arts</title>
-</head>
-<body>
-<h1>Time and the Arts</h1>
-<h2>Documentaries</h2>
-<ul>
-<li>
-"<a href="https://www.youtube.com/watch?v=84aWtseb2-4">Daylight
-Saving Time Explained</a>" (2011; 6:39) lightly covers daylight saving
-time's theory, history, pros and cons. Among other things, it explains
-Arizona's daylight-saving enclaves quite well.</li>
-<li>
-"<a href="https://www.youtube.com/watch?v=-5wpm-gesOY">The Problem
-with Time & Timezones – Computerphile</a>" (2013; 10:12) delves
-into problems that programmers have with timekeeping.</li>
-<li>
-"About Time" (1962; 53 minutes) is part of the the
-Bell Science extravaganza, with Frank Baxter, Richard Deacon, and Les Tremayne.
-(<a href="http://www.imdb.com/title/tt0154110/">IMDb entry</a>.)</li>
-</ul>
-<h2>Music</h2>
-<p>
-Data on recordings of "Save That Time," Russ Long, Serrob Publishing, BMI:</p>
-<table>
-<tr><td>Artist</td><td>Karrin Allyson</td></tr>
-<tr><td>CD</td><td>I Didn't Know About You</td></tr>
-<tr><td>Copyright Date</td><td>1993</td></tr>
-<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
-<tr><td>ID</td><td>CCD-4543</td></tr>
-<tr><td>Track Time</td><td>3:44</td></tr>
-<tr><td>Personnel</td><td>Karrin Allyson, vocal;
-Russ Long, piano;
-Gerald Spaits, bass;
-Todd Strait, drums</td></tr>
-<tr><td>Notes</td><td>CD notes "additional lyric by Karrin Allyson;
-arranged by Russ Long and Karrin Allyson"</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/i-didnt-know-about-you-mw0000618657">AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Kevin Mahogany</td></tr>
-<tr><td>CD</td><td>Double Rainbow</td></tr>
-<tr><td>Copyright Date</td><td>1993</td></tr>
-<tr><td>Label</td><td>Enja Records</td></tr>
-<tr><td>ID</td><td>ENJ-7097 2</td></tr>
-<tr><td>Track Time</td><td>6:27</td></tr>
-<tr><td>Personnel</td><td>Kevin Mahogany, vocal;
-Kenny Barron, piano;
-Ray Drummond, bass;
-Ralph Moore, tenor saxophone;
-Lewis Nash, drums</td></tr>
-<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/double-rainbow-mw0000620371">AMG Rating</a></td><td>3 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Joe Williams</td></tr>
-<tr><td>CD</td><td>Here's to Life</td></tr>
-<tr><td>Copyright Date</td><td>1994</td></tr>
-<tr><td>Label</td><td>Telarc International Corporation</td></tr>
-<tr><td>ID</td><td>CD-83357</td></tr>
-<tr><td>Track Time</td><td>3:58</td></tr>
-<tr><td>Personnel</td><td>Joe Williams, vocal
-The Robert Farnon [39 piece] Orchestra</td></tr>
-<tr><td>Notes</td><td>This CD is also available as part of a 3-CD package from
-Telarc, "Triple Play" (CD-83461)</td></tr>
-<tr><td>ADO Rating</td><td>black dot</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/heres-to-life-mw0000623648">AMG Rating</a></td><td>2 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Charles Fambrough</td></tr>
-<tr><td>CD</td><td>Keeper of the Spirit</td></tr>
-<tr><td>Copyright Date</td><td>1995</td></tr>
-<tr><td>Label</td><td>AudioQuest Music</td></tr>
-<tr><td>ID</td><td>AQ-CD1033</td></tr>
-<tr><td>Track Time</td><td>7:07</td></tr>
-<tr><td>Personnel</td><td>Charles Fambrough, bass;
-Joel Levine, tenor recorder;
-Edward Simon, piano;
-Lenny White, drums;
-Marion Simon, percussion</td></tr>
-<tr><td>ADO Rating</td><td>2 stars</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/keeper-of-the-spirit-mw0000176559">AMG Rating</a></td><td>unrated</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-</table>
-<hr>
-<p>Also of note:</p>
-<table>
-<tr><td>Artist</td><td>Holly Cole Trio</td></tr>
-<tr><td>CD</td><td>Blame It On My Youth</td></tr>
-<tr><td>Copyright Date</td><td>1992</td></tr>
-<tr><td>Label</td><td>Manhattan</td></tr>
-<tr><td>ID</td><td>CDP 7 97349 2</td></tr>
-<tr><td>Total Time</td><td>37:45</td></tr>
-<tr><td>Personnel</td><td>Holly Cole, voice;
-Aaron Davis, piano;
-David Piltch, string bass</td></tr>
-<tr><td>Notes</td><td>Lyrical reference to "Eastern Standard Time" in
-Tom Waits' "Purple Avenue"</td></tr>
-<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/blame-it-on-my-youth-mw0000274303">AMG Rating</a></td><td>3 stars</td></tr>
-<tr><td>Penguin Rating</td><td>unrated</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Milt Hinton</td></tr>
-<tr><td>CD</td><td>Old Man Time</td></tr>
-<tr><td>Copyright Date</td><td>1990</td></tr>
-<tr><td>Label</td><td>Chiaroscuro</td></tr>
-<tr><td>ID</td><td>CR(D) 310</td></tr>
-<tr><td>Total Time</td><td>149:38 (two CDs)</td></tr>
-<tr><td>Personnel</td><td>Milt Hinton, bass;
-Doc Cheatham, Dizzy Gillespie, Clark Terry, trumpet;
-Al Grey, trombone;
-Eddie Barefield, Joe Camel (Flip Phillips), Buddy Tate,
-clarinet and saxophone;
-John Bunch, Red Richards, Norman Simmons, Derek Smith,
-Ralph Sutton, piano;
-Danny Barker, Al Casey, guitar;
-Gus Johnson, Gerryck King, Bob Rosengarden, Jackie Williams,
-drums;
-Lionel Hampton, vibraphone;
-Cab Calloway, Joe Williams, vocal;
-Buck Clayton, arrangements</td></tr>
-<tr><td>Notes</td><td>tunes include Old Man Time, Time After Time,
-Sometimes I'm Happy,
-A Hot Time in the Old Town Tonight,
-Four or Five Times, Now's the Time,
-Time on My Hands, This Time It's Us,
-and Good Time Charlie.
-<a href="http://www.chiaroscurojazz.com/album.php?C=310">Album info</a>
-is available.</td></tr>
-<tr><td>ADO Rating</td><td>3 stars</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/old-man-time-mw0000269353">AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Alan Broadbent</td></tr>
-<tr><td>CD</td><td>Pacific Standard Time</td></tr>
-<tr><td>Copyright Date</td><td>1995</td></tr>
-<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
-<tr><td>ID</td><td>CCD-4664</td></tr>
-<tr><td>Total Time</td><td>62:42</td></tr>
-<tr><td>Personnel</td><td>Alan Broadbent, piano;
-Putter Smith, Bass;
-Frank Gibson, Jr., drums</td></tr>
-<tr><td>Notes</td><td>The CD cover features an analemma for equation-of-time fans</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/pacific-standard-time-mw0000645433">AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Anthony Braxton/Richard Teitelbaum</td></tr>
-<tr><td>CD</td><td>Silence/Time Zones</td></tr>
-<tr><td>Copyright Date</td><td>1996</td></tr>
-<tr><td>Label</td><td>Black Lion</td></tr>
-<tr><td>ID</td><td>BLCD 760221</td></tr>
-<tr><td>Total Time</td><td>72:58</td></tr>
-<tr><td>Personnel</td><td>Anthony Braxton, sopranino and alto saxophones,
-contrebasse clarinet, miscellaneous instruments;
-Leo Smith, trumpet and miscellaneous instruments;
-Leroy Jenkins, violin and miscellaneous instruments;
-Richard Teitelbaum, modular moog and micromoog synthesizer</td></tr>
-<tr><td>ADO Rating</td><td>black dot</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/silence-time-zones-mw0000595735">AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Charles Gayle</td></tr>
-<tr><td>CD</td><td>Time Zones</td></tr>
-<tr><td>Copyright Date</td><td>2006</td></tr>
-<tr><td>Label</td><td>Tompkins Square</td></tr>
-<tr><td>ID</td><td>TSQ2839</td></tr>
-<tr><td>Total Time</td><td>49:06</td></tr>
-<tr><td>Personnel</td><td>Charles Gayle, piano</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/time-zones-mw0000349642">AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>The Get Up Kids</td></tr>
-<tr><td>CD</td><td>Eudora</td></tr>
-<tr><td>Copyright Date</td><td>2001</td></tr>
-<tr><td>Label</td><td>Vagrant</td></tr>
-<tr><td>ID</td><td>357</td></tr>
-<tr><td>Total Time</td><td>65:12</td></tr>
-<tr><td>Notes</td><td>Includes the song "Central Standard Time." Thanks to Colin Bowern for this information.</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/eudora-mw0000592063">AMG Rating</a></td><td>2.5 stars</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>Artist</td><td>Coldplay</td></tr>
-<tr><td>Song</td><td>Clocks</td></tr>
-<tr><td>Copyright Date</td><td>2003</td></tr>
-<tr><td>Label</td><td>Capitol Records</td></tr>
-<tr><td>ID</td><td>52608</td></tr>
-<tr><td>Total Time</td><td>4:13</td></tr>
-<tr><td>Notes</td><td>Won the 2004 Record of the Year honor at the
-Grammy Awards. Co-written and performed by Chris Martin,
-great-great-grandson of DST inventor William Willett. The song's first
-line is "Lights go out and I can't be saved".</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>Artist</td><td>Irving Kahal and Harry Richman</td></tr>
-<tr><td>Song</td><td>There Ought to be a Moonlight Saving Time</td></tr>
-<tr><td>Copyright Date</td><td>1931</td>
-<tr><td>Notes</td><td>This musical standard was a No. 1 hit for Guy Lombardo
-in 1931, and was also performed by Maurice Chevalier, Blossom Dearie
-and many others. The phrase "Moonlight saving time" also appears in
-the 1995 country song "Not Enough Hours in the Night" written by Aaron
-Barker, Kim Williams and Rob Harbin and performed by Doug
-Supernaw.</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>Artist</td><td>The Microscopic Septet</td></tr>
-<tr><td>CD</td><td>Lobster Leaps In</td></tr>
-<tr><td>Copyright Date</td><td>2008</td></tr>
-<tr><td>Label</td><td>Cuneiform</td></tr>
-<tr><td>ID</td><td>272</td></tr>
-<tr><td>Total Time</td><td>73:05</td></tr>
-<tr><td>Notes</td><td>Includes the song "Twilight Time Zone."</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/lobster-leaps-in-mw0000794929">AMG Rating</a></td><td>3.5 stars</td></tr>
-<tr><td>ADO Rating</td><td>2 stars</td></tr>
-
-<tr><td> </td></tr>
-
-<tr><td>Artist</td><td>Bob Dylan</td></tr>
-<tr><td>CD</td><td>The Times They Are a-Changin'</td></tr>
-<tr><td>Copyright Date</td><td>1964</td></tr>
-<tr><td>Label</td><td>Columbia</td></tr>
-<tr><td>ID</td><td>CK-8905</td></tr>
-<tr><td>Total Time</td><td>45:36</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/the-times-they-a-changin-mw0000202344">AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
-<tr><td>Notes<td>The title song is also available on "Bob Dylan's Greatest Hits" and "The Essential Bob Dylan."</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>Artist</td><td>Luciana Souza</td></tr>
-<tr><td>CD</td><td>Tide</td></tr>
-<tr><td>Copyright Date</td><td>2009</td></tr>
-<tr><td>Label</td><td>Universal Jazz France</td></tr>
-<tr><td>ID</td><td>B0012688-02</td></tr>
-<tr><td>Total Time</td><td>42:31</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/tide-mw0000815692">AMG Rating</a></td><td>3.5 stars</td></tr>
-<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
-<tr><td>Notes<td>Includes the song "Fire and Wood" with the lyric
-"The clocks were turned back you remember/Think it's still November."
-</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Ken Nordine</td></tr>
-<tr><td>CD</td><td>You're Getting Better: The Word Jazz Dot Masters</td></tr>
-<tr><td>Copyright Date</td><td>2005</td></tr>
-<tr><td>Label</td><td>Geffen</td></tr>
-<tr><td>ID</td><td>B0005171-02</td></tr>
-<tr><td>Total Time</td><td>156:22</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="http://www.allmusic.com/album/youre-getting-better-the-word-jazz-dot-masters-mw0000736197">AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>Notes</td><td>Includes the piece "What Time Is It"
-("He knew what time it was everywhere...that counted").</td></tr>
-</table>
-
-<h2>TV episodes</h2>
-
-<ul>
-<li>
-An episode of <em>The Adventures of Superman</em> entitled "The Mysterious
-Cube," first aired 1958-02-24, had Superman convincing the controllers
-of the Arlington Time Signal to broadcast ahead of actual time;
-doing so got a crook trying to be declared dead to
-emerge a bit too early from the titular enclosure.
-</li>
-<li>
-The 1960s ITC television series <em>The Prisoner</em> included an episode
-entitled "The Chimes of Big Ben" in which our protagonist tumbled to
-the fraudulent nature of a Poland-to-England escape upon hearing "Big
-Ben" chiming on Polish local time.
-</li>
-<li>
-The series <em>Seinfeld</em> included an episode entitled "The Susie," first
-broadcast 1997-02-13, in which Kramer decides that daylight saving time
-isn't coming fast enough, so he sets his watch ahead an hour.
-</li>
-<li>
-The "20 Hours in America" episode of <em>The West Wing</em>,
-first aired 2002-09-25,
-saw White House staffers stranded in Indiana; they thought they had time to
-catch Air Force One but were done in by intra-Indiana local time changes.
-</li>
-<li>
-"In what time zone would you find New York City?" was a $200 question on
-the 1999-11-13 United States airing of <em>Who Wants to Be a Millionaire?</em>,
-and "In 1883, what industry led the movement to divide the U.S. into four time
-zones?" was a $32,000 question on the 2001-05-23 United States airing of
-the same show. At this rate, the million-dollar time-zone
-question should have been asked 2002-06-04.
-</li>
-<li>
-A private jet's mid-flight change of time zones distorts Alison Dubois'
-premonition in the "We Had a Dream" episode of <em>Medium</em>
-(originally aired 2007-02-28).
-</li>
-<li>
-In the <em>30 Rock</em> episode "Anna Howard Shaw Day"
-(first broadcast 2010-02-11),
-Jack Donaghy's date realizes that a Geneva-to-New-York business phone call
-received in the evening must be fake given the difference in local times.
-</li>
-<li>
-In the "Run by the Monkeys" episode of <em>Da Vinci's Inquest</em>
-(first broadcast 2002-11-17),
-a witness in a five-year-old fire case realizes they may not have set
-their clock back when daylight saving ended on the day of the fire,
-introducing the possibility of an hour when arson might have occurred.
-</li>
-<li>
-In "The Todd Couple" episode of <em>Outsourced</em> (first aired 2011-02-10),
-Manmeet sets up Valentine's Day teledates for 6:00 and 9:00pm;
-since one is with a New Yorker and the other with a San Franciscan,
-hilarity ensues.
-(Never mind that this should be 7:30am in Mumbai, yet for some reason the show
-proceeds as though it's also mid-evening there.)
-</li>
-<li>
-In the "14 Days to Go"/"T Minus..." episode of
-<em>You, Me and the Apocalypse</em>
-(first aired 2015-11-11 in the UK, 2016-03-10 in the US),
-the success of a mission to deal with a comet
-hinges on whether or not Russia observes daylight saving time.
-(In the US, the episode first aired in the week before the switch to DST.)
-</li>
-</ul>
-
-<table>
-<tr><td>TV episode title</td><td>The Lost Hour</td>
-<tr><td>TV series</td><td><em>Eerie, Indiana</em></td>
-<tr><td>TV episode number</td><td>10</td>
-<tr><td>Network</td><td>NBC</td>
-<tr><td>Air date</td><td>1991-12-01</td>
-<tr><td>Notes</td><td>Despite Indiana's then-lack of DST, Marshall changes his clock with unusual consequences.</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>TV episode title</td><td>Time Tunnel</td>
-<tr><td>TV series</td><td><em>The Adventures of Pete & Pete</em></td>
-<tr><td>TV episode number</td><td>5, season 2</td>
-<tr><td>Network</td><td>Nickelodeon</td>
-<tr><td>Air date</td><td>1994-10-23</td>
-<tr><td>Notes</td><td>The two Petes travel back in time an hour on the day that DST ends.</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>TV episode title</td><td>King-Size Homer</td>
-<tr><td>TV series</td><td><em>The Simpsons</em></td>
-<tr><td>TV episode number</td><td>135</td>
-<tr><td>Network</td><td>Fox</td>
-<tr><td>Air date</td><td>1995-11-05</td>
-<tr><td>Notes</td><td>Homer, working from home, remarks "8:58, first
-time I've ever been early for work. Except for all those daylight
-savings days. Lousy farmers."</td></tr>
-<tr><td> </td></tr>
-
-<tr><td>TV episode title</td><td>Tracks</td></tr>
-<tr><td>TV series</td><td><em>The Good Wife</em></td></tr>
-<tr><td>TV episode number</td><td>12, season 7</td></tr>
-<tr><td>Network</td><td>CBS</td></tr>
-<tr><td>Air date</td><td>2016-01-17</td></tr>
-<tr><td>Notes</td><td>The applicability of a contract hinges on the
-time zone associated with a video time stamp.</td></tr>
-</table>
-
-<h2>Books, plays, and magazines</h2>
-
-<table>
-<tr><td>Artist</td><td>Jules Verne</td></tr>
-<tr><td>Book</td><td><em>Around the World in Eighty Days</em>
-(<em>Le tour du monde en quatre-vingts jours</em>)</td></tr>
-<tr><td>Notes</td><td>Wall-clock time plays a central role in the plot.
-European readers of the 1870s clearly held the U.S. press in
-deep contempt; the protagonists cross the U.S. without once
-reading a paper.
-An on-line French-language version of the book
-"with illustrations from the original 1873 French-language edition"
-is available at
-<a href="http://fourmilab.ch/etexts/www/tdm80j">http://fourmilab.ch/etexts/www/tdm80j</a>
-An on-line English-language translation of the book is available at
-<a href="http://www.literature.org/Works/Jules-Verne/eighty">http://www.literature.org/Works/Jules-Verne/eighty</a></td></tr>
-
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Nick Enright</td></tr>
-<tr><td>Play</td><td><em>Daylight Saving</em></td></tr>
-<tr><td>Copyright Date</td><td>1989</td></tr>
-<tr><td>Notes</td><td>
-A fast-paced comedy about love and loneliness as the clocks turn back.
-</td></tr>
-
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>Umberto Eco</td></tr>
-<tr><td>Book</td><td><em>The Island of the Day Before</em>
-(<em>L'isola del giorno prima</em>)</td></tr>
-<tr><td>Copyright Date</td><td>1994</td></tr>
-<tr><td>Notes</td><td>
-"...the story of a 17th century Italian nobleman trapped near an island
-on the International Date Line. Time and time zones play an integral
-part in the novel." (Paul Eggert, 2006-04-22)
-</td></tr>
-<tr><td> </td></tr>
-<tr><td>Artist</td><td>John Dunning</td></tr>
-<tr><td>Book</td><td><a
-href="http://books.simonandschuster.com/Two-OClock-Eastern-Wartime/John-Dunning/9781439171530"><em>Two
-O'Clock, Eastern Wartime</em></a></td></tr>
-<tr><td>Copyright Date</td><td>2001</td></tr>
-<tr><td>Notes</td><td>
-Mystery, history, daylight saving time, and old-time radio.
-</td></tr>
-</table>
-<hr>
-<ul>
-<li>
-Surrealist artist Guy Billout's work "Date Line" appeared on page 103
-of the 1999-11 <em>Atlantic Monthly</em>.
-</li>
-<li>
-"Gloom, Gloom, Go Away" by Walter Kirn appeared on page 106 of <em>Time</em>
-magazine's 2002-11-11 issue; among other things, it proposed
-year-round DST as a way of lessening wintertime despair.
-</li>
-</ul>
-<h2>Movies</h2>
-<ul>
-<li>
-In the 1946 movie <em>A Matter of Life and Death</em>
-(U.S. title <em>Stairway to Heaven</em>)
-there is a reference to British Double Summer Time.
-The time does not play a large part in the plot;
-it's just a passing reference to the time when one of the
-characters was supposed to have died (but didn't).
-The IMDb page is at
-<a href="http://us.imdb.com/title/tt0038733/">
-http://us.imdb.com/title/tt0038733/
-</a>. (Dave Cantor)
-<li>
-The 1953 railway comedy movie <em>The Titfield Thunderbolt</em> includes a
-play on words on British Double Summer Time. Valentine's wife wants
-him to leave the pub and asks him, "Do you know what time it is?"
-And he, happy where he is, replies: "Yes, my love. Summer double time."
-IMDb page:
-<a href="http://us.imdb.com/title/tt0046436/">
-http://us.imdb.com/title/tt0046436/
-</a>. (Mark Brader, 2009-10-02)
-</li>
-<li>
-The premise of the 1999 caper movie <em>Entrapment</em> involves computers
-in an international banking network being shut down briefly at
-midnight in each time zone to avoid any problems at the transition
-from the year 1999 to 2000 in that zone. (Hmmmm.) If this shutdown
-is extended by 10 seconds, it will create a one-time opportunity for
-a gigantic computerized theft. To achieve this, at one location the
-crooks interfere with the microwave system supplying time signals to
-the computer, advancing the time by 0.1 second each minute over the
-last hour of 1999. (So this movie teaches us that 0.1 × 60 = 10.)
-IMDb page:
-<a href="http://us.imdb.com/title/tt0137494/">
-http://us.imdb.com/title/tt0137494/
-</a>. (Mark Brader, 2009-10-02)
-</li>
-<li>
-One mustn't forget the
-<a href="https://www.youtube.com/watch?v=k4EUTMPuvHo">trailer</a>
-(2014; 2:23) for the movie <em>Daylight Saving</em>.
-</li>
-</ul>
-<h2>Comics</h2>
-<ul>
-<li>
-The webcomic <em>xkcd</em> has the strip
-"<a href='http://xkcd.com/673/'>The Sun</a>" (2009-12-09) and the panels
-"<a href='http://xkcd.com/1017/'>Backward in Time</a>" (2012-02-14),
-"<a href='http://xkcd.com/1061/'>EST</a>" (2012-05-28), and
-"<a href='http://xkcd.com/1335/'>Now</a>" (2014-02-26), and
-"<a href='http://xkcd.com/1655/'>Doomsday Clock</a>" (2016-03-14).
-The related book <em>What If?</em> has an entry
-"<a href='http://what-if.xkcd.com/26/'>Leap Seconds</a>" (2012-12-31).
-</li>
-<li>
-The syndicated comic strip <em>Dilbert</em> featured an
-<a href='http://dilbert.com/strip/1998-03-14'>example of
-time zone humor</a> on 1998-03-14.
-</li>
-<li>
-Peppermint Patty: "What if the world comes to an end tonight, Marcie?"
-<br>
-Marcie: "I promise there'll be a tomorrow, sir ... in fact,
-it's already tomorrow in Australia!"
-<br>
-(Charles M. Schulz, <a href='http://www.gocomics.com/peanuts/1980/06/13'><em>Peanuts</em>, 1980-06-13</a>)
-</li>
-</ul>
-<h2>Jokes</h2>
-<ul>
-<li>
-"We've been using the five-cent nickel in this country since 1492.
-Now that's pretty near 100 years, daylight saving."
-(Groucho Marx as Captain Spaulding in <em>Animal Crackers</em>, 1930,
-as noted by Will Fitzgerald)
-</li>
-<li>
-BRADY. ...[Bishop Usher] determined that the Lord began the Creation
-on the 23rd of October in the Year 4,004 B.C. at – uh, 9 A.M.!
-<br>
-DRUMMOND. That Eastern Standard Time? (<em>Laughter.</em>) Or Rocky Mountain
-Time? (<em>More laughter.</em>) It wasn't daylight-saving time, was it? Because
-the Lord didn't make the sun until the fourth day!
-<br>
-(From the play <em>Inherit the Wind</em> by Jerome Lawrence and Robert E. Lee,
-filmed in 1960 with Spencer Tracy as Drummond and Fredric March as
-Brady, and several other times. Thanks to Mark Brader.)
-</li>
-<li>
-"Good news."
-"What did they do? Extend Daylight Saving Time year round?"
-(Professional tanner George Hamilton, in dialog from a
-May, 1999 episode of the syndicated television series <em>Baywatch</em>)
-</li>
-<li>
-"A fundamental belief held by Americans is that if you are on land, you
-cannot be killed by a fish...So most Americans remain on land, believing
-they're safe. Unfortunately, this belief – like so many myths, such as that
-there's a reason for 'Daylight Saving Time' – is false."
-(Dave Barry column, 2000-07-02)
-</li>
-<li>
-"I once had sex for an hour and five minutes, but that was on the day
-when you turn the clocks ahead."
-(Garry Shandling, 52nd Annual Emmys, 2000-09-10)
-</li>
-<li>
-"Would it impress you if I told you I invented Daylight Savings Time?"
-("Sahjhan" to "Lilah" in dialog from the "Loyalty" episode of <em>Angel</em>,
-originally aired 2002-02-25)
-</li>
-<li>
-"I thought you said Tulsa was a three-hour flight."
-"Well, you're forgetting about the time difference."
-("Joey" and "Chandler" in dialog from the episode of <em>Friends</em>
-entitled "The One With Rachel's Phone Number," originally aired 2002-12-05)
-</li>
-<li>
-"Is that a pertinent fact,
-or are you just trying to dazzle me with your command of time zones?"
-(Kelsey Grammer as "Frasier Crane" to "Roz" from the episode of <em>Frasier</em>
-entitled "The Kid," originally aired 1997-11-04)
-</li>
-<li>
-"I put myself and my staff through this crazy, huge ordeal, all because
-I refused to go on at midnight, okay? And so I work, you know, and
-then I get this job at eleven, supposed to be a big deal. Then
-yesterday daylight [saving] time ended. Right now it's basically
-midnight." (Conan O'Brien on the 2010-11-08 premiere of <em>Conan</em>.)
-</li>
-<li>
-"Well, in my time zone that's all the time I have,
-but maybe in your time zone I haven't finished yet. So stay tuned!"
-(Goldie Hawn, <em>Rowan & Martin's Laugh-In</em> No. 65, 1970-03-09)
-</li>
-</ul>
-<h2>See also</h2>
-<ul>
-<li><a href="tz-link.htm">Sources for Time Zone and Daylight Saving
-Time Data</a></li>
-</ul>
-<hr>
-<address>
-This web page is in the public domain, so clarified as of
-2009-05-17 by Arthur David Olson.
-<br>
-Please send corrections to this web page to the
-<a href="mailto:tz at iana.org">time zone mailing list</a>.
-</address>
-</body>
-</html>
Deleted: vendor/tzcode/dist/tz-how-to.html
===================================================================
--- vendor/tzcode/dist/tz-how-to.html 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tz-how-to.html 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,680 +0,0 @@
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head><title>How to Read the tz Database</title></head>
-<body>
-<h2>How to Read the <a href="https://en.wikipedia.org/wiki/Tz_database">tz
-Database</a> Source Files</h2>
-<h3>by Bill Seymour</h3>
-<p>This page uses the <code>America/Chicago</code> and
-<code>Pacific/Honolulu</code> zones as examples of how to infer
-times of day from the <a href="tz-link.htm">tz database</a>
-source files. It might be helpful, but not absolutely necessary,
-for the reader to have already downloaded the
-<a href="http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz">latest
-release of the database</a> and become familiar with the basic layout
-of the data files. The format is explained in the “man
-page” for the zic compiler, <code>zic.8.txt</code>, in
-the <code>code</code> subdirectory.</p>
-
-<p>We’ll begin by talking about the rules for changing between standard
-and daylight saving time since we’ll need that information when we talk
-about the zones.</p>
-
-<p>First, let’s consider the special daylight saving time rules
-for Chicago (from the <code>northamerica</code> file in
-the <code>data</code> subdirectory):</p>
-
-<table border="1">
-<tr>
- <th colspan="6">From the Source File</th>
-</tr>
-<tr>
- <td colspan="6" align="center"><table><tr><td>
-<pre>
-#Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
-Rule Chicago 1920 only - Jun 13 2:00 1:00 D
-Rule Chicago 1920 1921 - Oct lastSun 2:00 0 S
-Rule Chicago 1921 only - Mar lastSun 2:00 1:00 D
-Rule Chicago 1922 1966 - Apr lastSun 2:00 1:00 D
-Rule Chicago 1922 1954 - Sep lastSun 2:00 0 S
-Rule Chicago 1955 1966 - Oct lastSun 2:00 0 S
-</pre>
- </td></tr></table></td>
-</tr>
-<tr>
- <th colspan="6">Reformatted a Bit</th>
-</tr>
-<tr>
- <th>From</th>
- <th>To</th>
- <th colspan="2">On</th>
- <th>At</th>
- <th>Action</th>
-</tr>
-<tr align="center">
- <td colspan="2">1920 only</td>
- <td colspan="2">June 13<small><sup>th</sup></small></td>
- <td rowspan="6">02:00 local</td>
- <td>go to daylight saving time</td>
-</tr>
-<tr align="center">
- <td>1920</td>
- <td>1921</td>
- <td rowspan="5">last Sunday</td>
- <td>in October</td>
- <td>return to standard time</td>
-</tr>
-<tr align="center">
- <td colspan="2">1921 only</td>
- <td>in March</td>
- <td rowspan="2">go to daylight saving time</td>
-</tr>
-<tr align="center">
- <td rowspan="2">1922</td>
- <td>1966</td>
- <td>in April</td>
-</tr>
-<tr align="center">
- <td>1954</td>
- <td>in September</td>
- <td rowspan="2">return to standard time</td>
-</tr>
-<tr align="center">
- <td>1955</td>
- <td>1966</td>
- <td>in October</td>
-</tr>
-</table>
-
-<p>We’ll basically just ignore the <code>TYPE</code> column.
-In the 2007j release, the most recent as of this writing, the
-<code>TYPE</code> column never contains anything but a hyphen,
-a kind of null value. (From the description in <code>zic.8.txt</code>,
-this appears to be a mechanism for removing years from a set
-in some localizable way. It’s used in the file, <code>pacificnew</code>,
-to determine whether a given year will have a US presidential election;
-but everything related to that use is commented out.)
-
-<p>The <code>SAVE</code> column contains the wall clock offset from
-local standard time.
-This is usually either zero for standard time or one hour for daylight
-saving time; but there’s no reason, in principle, why it can’t
-take on other values.
-
-<p>The <code>LETTER</code> (sometimes called <code>LETTER/S</code>)
-column can contain a variable
-part of the usual abbreviation of the time zone’s name, or it can just
-be a hyphen if there’s no variable part. For example, the abbreviation
-used in the central time zone will be either “CST” or
-“CDT”. The variable part is ‘S’ or ‘D’;
-and, sure enough, that’s just what we find in
-the <code>LETTER</code> column
-in the <code>Chicago</code> rules. More about this when we talk about
-“Zone” lines.
-
-<p>One important thing to notice is that “Rule” lines
-want at once to be both <i>transitions</i> and <i>steady states</i>:
-<ul>
-<li>On the one hand, they represent transitions between standard and
-daylight saving time; and any number of Rule lines can be in effect
-during a given period (which will always be a non-empty set of
-contiguous calendar years).</li>
-<li>On the other hand, the <code>SAVE</code> and <code>LETTER</code>
-columns contain state that exists between transitions. More about this
-when we talk about the US rules.</li>
-</ul>
-
-<p>In the example above, the transition to daylight saving time
-happened on the 13<small><sup>th</sup></small> of June in 1920, and on
-the last Sunday in March in 1921; but the return to standard time
-happened on the last Sunday in October in both of those
-years. Similarly, the rule for changing to daylight saving time was
-the same from 1922 to 1966; but the rule for returning to standard
-time changed in 1955. Got it?</p>
-
-<p>OK, now for the somewhat more interesting “US” rules:</p>
-
-<table border="1">
-<tr>
- <th colspan="6">From the Source File</th>
-</tr>
-<tr>
- <td colspan="6" align="center"><table><tr><td>
-<pre>
-#Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule US 1918 1919 - Mar lastSun 2:00 1:00 D
-Rule US 1918 1919 - Oct lastSun 2:00 0 S
-Rule US 1942 only - Feb 9 2:00 1:00 W # War
-Rule US 1945 only - Aug 14 23:00u 1:00 P # Peace
-Rule US 1945 only - Sep 30 2:00 0 S
-Rule US 1967 2006 - Oct lastSun 2:00 0 S
-Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
-Rule US 1974 only - Jan 6 2:00 1:00 D
-Rule US 1975 only - Feb 23 2:00 1:00 D
-Rule US 1976 1986 - Apr lastSun 2:00 1:00 D
-Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
-Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
-Rule US 2007 max - Nov Sun>=1 2:00 0 S
-</pre>
- </td></tr></table></td>
-</tr>
-<tr>
- <th colspan="6">Reformatted a Bit</th>
-</tr>
-<tr>
- <th>From</th>
- <th>To</th>
- <th colspan="2">On</th>
- <th>At</th>
- <th>Action</th>
-</tr>
-<tr align="center">
- <td rowspan="2">1918</td>
- <td rowspan="2">1919</td>
- <td rowspan="2">last Sunday</td>
- <td>in March</td>
- <td rowspan="3">02:00 local</td>
- <td>go to daylight saving time</td>
-</tr>
-<tr align="center">
- <td>in October</td>
- <td>return to standard time</td>
-</tr>
-<tr align="center">
- <td colspan="2">1942 only</td>
- <td colspan="2">February 9<small><sup>th</sup></small></td>
- <td>go to “war time”</td>
-</tr>
-<tr align="center">
- <td colspan="2" rowspan="2">1945 only</td>
- <td colspan="2">August 14<small><sup>th</sup></small></td>
- <td>23:00 <a href="https://en.wikipedia.org/wiki/Universal_Time">UT</a></td>
- <td>
- rename “war time” to “peace<br>time;”
- clocks don’t change
- </td>
-</tr>
-<tr align="center">
- <td colspan="2">September 30<small><sup>th</sup></small></td>
- <td rowspan="9">02:00 local</td>
- <td rowspan="2">return to standard time</td>
-</tr>
-<tr align="center">
- <td rowspan="2">1967</td>
- <td>2006</td>
- <td rowspan="2">last Sunday</td>
- <td>in October</td>
-</tr>
-<tr align="center">
- <td>1973</td>
- <td>in April</td>
- <td rowspan="6">go to daylight saving time</td>
-</tr>
-<tr align="center">
- <td colspan="2">1974 only</td>
- <td colspan="2">January 6<small><sup>th</sup></small></td>
-</tr>
-<tr align="center">
- <td colspan="2">1975 only</td>
- <td colspan="2">February 23<small><sup>rd</sup></small></td>
-</tr>
-<tr align="center">
- <td>1976</td>
- <td>1986</td>
- <td>last Sunday</td>
- <td rowspan="2">in April</td>
-</tr>
-<tr align="center">
- <td>1987</td>
- <td>2006</td>
- <td>first Sunday</td>
-</tr>
-<tr align="center">
- <td rowspan="2">2007</td>
- <td rowspan="2">present</td>
- <td colspan="2">second Sunday in March</td>
-</tr>
-<tr align="center">
- <td colspan="2">first Sunday in November</td>
- <td>return to standard time</td>
-</tr>
-</table>
-
-<p>There are two interesting things to note here.</p>
-
-<p>First, the time that something happens (in the <code>AT</code>
-column) is not necessarily the local wall clock time. The time can be
-suffixed with ‘s’ (for “standard”) to mean
-local standard time (different from wall clock time when observing
-daylight saving time); or it can be suffixed with ‘g’,
-‘u’, or ‘z’, all three of which mean the
-standard time at the
-<a href="https://en.wikipedia.org/wiki/Prime_Meridian">prime meridan</a>.
-‘g’ stands for “<a
-href="https://en.wikipedia.org/wiki/Greenwich_Mean_Time">GMT</a>”;
-‘u’ stands for “<a
-href="https://en.wikipedia.org/wiki/Universal_Time">UT</a>” or “<a
-href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a>”
-(whichever was official at the time); ‘z’ stands for the
-<a href="https://en.wikipedia.org/wiki/Nautical_time">nautical time zone</a>
-Z (a.k.a. “Zulu” which, in turn, stands for ‘Z’).
-The time can also be suffixed with ‘w’ meaning “wall
-clock time;” but it usually isn’t because that’s the
-default.</p>
-
-<p>Second, the day in the <code>ON</code> column, in addition to
-“<code>lastSun</code>” or a particular day of the month,
-can have the form, “<code>Sun>=</code><i>x</i>” or
-“<code>Sun<=</code><i>x</i>,” where <i>x</i> is a day
-of the month. For example, “<code>Sun>=8</code>” means
-“the first Sunday on or after the eighth of the month,” in
-other words, the second Sunday of the month. Furthermore, although
-there are no examples above, the weekday needn’t be
-“<code>Sun</code>” in either form, but can be the usual
-three-character English abbreviation for any day of the week.</p>
-
-<p>And the US rules give us more examples of a couple of things
-already mentioned:</p>
-
-<ul>
-<li>The rules for changing to and from daylight saving time are
-actually <i>different sets</i> of rules; and the two sets can change
-independently. Consider, for example, that the rule for the return to
-standard time stayed the same from 1967 to 2006; but the rule for the
-transition to daylight saving time changed several times in the same
-period. There can also be periods, 1946 to 1966 for example, when no
-rule from this group is in effect, and so either no transition
-happened in those years, or some other rule is in effect (perhaps a
-state or other more local rule).</li>
-
-<li>The <code>SAVE</code> and <code>LETTER</code> columns
-contain <i>steady state</i>, not transitions. Consider, for example,
-the transition from “war time” to “peace time”
-that happened on August 14, 1945. The “1:00” in
-the <code>SAVE</code> column is <i>not</i> an instruction to advance
-the clock an hour. It means that clocks should <i>be</i> one hour
-ahead of standard time, which they already are because of the previous
-rule, so there should be no change.</li>
-
-</ul>
-
-<p>OK, now let’s look at a Zone record:</p>
-
-<table border="1">
-<tr>
- <th colspan="5">From the Source File</th>
-</tr>
-<tr>
- <td colspan="6" align="center"><table><tr><td>
-<pre>
-#Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Chicago -5:50:36 - LMT 1883 Nov 18 12:09:24
- -6:00 US C%sT 1920
- -6:00 Chicago C%sT 1936 Mar 1 2:00
- -5:00 - EST 1936 Nov 15 2:00
- -6:00 Chicago C%sT 1942
- -6:00 US C%sT 1946
- -6:00 Chicago C%sT 1967
- -6:00 US C%sT
-</pre>
- </td></tr></table></td>
-</tr>
-<tr>
- <th colspan="5">Columns Renamed</th>
-</tr>
-<tr>
- <th rowspan="2">Standard Offset<br>
- from <a href="https://en.wikipedia.org/wiki/Prime_Meridian">Prime
- Meridian</a></th>
- <th rowspan="2">Daylight<br>Saving Time</th>
- <th rowspan="2">Abbreviation(s)</th>
- <th colspan="2">Ending at Local Time</th>
-</tr>
-<tr>
- <th>Date</th>
- <th>Time</th>
-</tr>
-<tr align="center">
- <td>−5:50:36</td>
- <td>not observed</td>
- <td>LMT</td>
- <td>1883-11-18</td>
- <td>12:09:24</td>
-</tr>
-<tr align="center">
- <td rowspan="2">−6:00:00</td>
- <td>US rules</td>
- <td rowspan="2">CST or CDT</td>
- <td>1920-01-01</td>
- <td>00:00:00</td>
-</tr>
-<tr align="center">
- <td>Chicago rules</td>
- <td>1936-03-01</td>
- <td rowspan="2">02:00:00</td>
-</tr>
-<tr align="center">
- <td>−5:00:00</td>
- <td>not observed</td>
- <td>EST</td>
- <td>1936-11-15</td>
-</tr>
-<tr align="center">
- <td rowspan="4">−6:00:00</td>
- <td>Chicago rules</td>
- <td>CST or CDT</td>
- <td>1942-01-01</td>
- <td rowspan="3">00:00:00</td>
-</tr>
-<tr align="center">
- <td>US rules</td>
- <td>CST, CWT or CPT</td>
- <td>1946-01-01</td>
-</tr>
-<tr align="center">
- <td>Chicago rules</td>
- <td rowspan="2">CST or CDT</td>
- <td>1967-01-01</td>
-</tr>
-<tr align="center">
- <td>US rules</td>
- <td colspan="2">—</td>
-</tr>
-</table>
-
-<p>There are a couple of interesting differences between Zones and Rules.</p>
-
-<p>First, and somewhat trivially, whereas Rules are considered to
-contain one or more records, a Zone is considered to be a single
-record with zero or more <i>continuation lines</i>. Thus, the keyword,
-“<code>Zone</code>,” and the zone name are not
-repeated. The last line is the one without anything in
-the <code>[UNTIL]</code> column.</p>
-
-<p>Second, and more fundamentally, each line of a Zone represents a
-steady state, not a transition between states. The state exists from
-the date and time in the previous line’s <code>[UNTIL]</code>
-column up to the date and time in the current
-line’s <code>[UNTIL]</code> column. In other words, the date and
-time in the <code>[UNTIL]</code> column is the instant that separates
-this state from the next. Where that would be ambiguous because
-we’re setting our clocks back, the <code>[UNTIL]</code> column
-specifies the first occurrence of the instant. The state specified by
-the last line, the one without anything in the <code>[UNTIL]</code>
-column, continues to the present.</p>
-
-<p>The first line typically specifies the mean solar time observed
-before the introduction of standard time. Since there’s no line before
-that, it has no beginning. <code>8-) </code> For some places near the <a
-href="https://en.wikipedia.org/wiki/International_Date_Line">International
-Date Line</a>, the first <i>two</i> lines will show solar times
-differing by 24 hours; this corresponds to a movement of the Date
-Line. For example:</p>
-
-<pre>
-#Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Juneau 15:02:19 - LMT 1867 Oct 18
- -8:57:41 - LMT ...
-</pre>
-
-<p>When Alaska was purchased from Russia in 1867, the Date Line moved
-from the Alaska/Canada border to the Bering Strait; and the time in
-Alaska was then 24 hours earlier than it had
-been. <code><aside></code>(6 October in the Julian calendar,
-which Russia was still using then for religious reasons, was followed
-by <i>a second instance of the same day with a different name</i>, 18
-October in the Gregorian calendar. Isn’t civil time
-wonderful? <code>8-)</code>)<code></aside></code></p>
-
-<p>The abbreviation, “LMT” stands for “local mean
-time”, which is an invention of
-the <a href="https://en.wikipedia.org/wiki/Tz_database">tz
-database</a> and was probably never actually used during the
-period. Furthermore, the value is almost certainly wrong except in the
-archetypal place after which the zone is named. (The tz database
-usually doesn’t provide a separate Zone record for places where
-nothing significant happened after 1970.)</p>
-
-<p>The <code>RULES</code> column tells us whether daylight saving time is being observed:
-<ul>
-<li>A hyphen, a kind of null value, means that we have not set our
-clocks ahead of standard time.</li>
-
-<li>An amount of time (usually but not necessarily “1:00”
-meaning one hour) means that we have set our clocks ahead by that
-amount.</li>
-
-<li>Some alphabetic string means that we <i>might have</i> set our
-clocks ahead; and we need to check the rule the name of which is the
-given alphabetic string.</li>
-</ul>
-
-<p>An example of a specific amount of time is:</p>
-<pre>
-#Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Pacific/Honolulu ... 1933 Apr 30 2:00
- -10:30 1:00 HDT 1933 May 21 2:00
- ...
-</pre>
-
-<p>Hawaii tried daylight saving time for three weeks in 1933 and
-decided they didn’t like it. <code>8-) </code>Note that
-the <code>GMTOFF</code> column always contains the standard time
-offset, so the wall clock time during this period was GMT −
-10:30 + 1:00 = GMT − 9:30.</p>
-
-<p>The <code>FORMAT</code> column specifies the usual abbreviation of
-the time zone name. It can have one of three forms:</p>
-<ul>
-
-<li>a string of three or more characters that are either ASCII alphanumerics,
-“<code>+</code>”, or “<code>-</code>”,
-in which case that’s the abbreviation</li>
-
-<li>a pair of strings separated by a slash
-(‘<code>/</code>’), in which case the first string is the
-abbreviation for the standard time name and the second string is the
-abbreviation for the daylight saving time name</li>
-
-<li>a string containing “<code>%s</code>,” in which case
-the “<code>%s</code>” will be replaced by the text in the
-appropriate Rule’s <code>LETTER</code> column</li>
-</ul>
-
-<p>The last two make sense only if there’s a named rule in effect.</p>
-
-<p>An example of a slash is:</p>
-<pre>
-#Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Europe/London ... 1996
- 0:00 EU GMT/BST
-</pre>
-
-<p>The current time in the UK is called either Greenwich mean time or
-British summer time.</p>
-
-<p>One wrinkle, not fully explained in <code>zic.8.txt</code>, is what
-happens when switching to a named rule. To what values should
-the <code>SAVE</code> and <code>LETTER</code> data be initialized?</p>
-
-<ul>
-<li>If at least one transition has happened, use
-the <code>SAVE</code> and <code>LETTER</code> data from the most
-recent.</li>
-
-<li>If switching to a named rule before any transition has happened,
-assume standard time (<code>SAVE</code> zero), and use
-the <code>LETTER</code> data from the earliest transition with
-a <code>SAVE</code> of zero.
-
-</ul>
-
-<p>And three last things about the <code>FORMAT</code> column:</p>
-<ul>
-
-<li>The <a href="https://en.wikipedia.org/wiki/Tz_database">tz
-database</a> gives abbreviations for time zone names in <i>popular
-usage</i>, which is not necessarily “correct” by law. For
-example, the last line in
-<code>Zone</code> <code>Pacific/Honolulu</code> (shown below) gives
-“HST” for “Hawaii standard time” even though the
-<a href="http://www.law.cornell.edu/uscode/html/uscode15/usc_sec_15_00000263----000-.html">legal</a>
-name for that time zone is “Hawaii-Aleutian standard time.”
-This author has read that there are also some places in Australia where
-popular time zone names differ from the legal ones.
-
-<li>No attempt is made to <a
-href="https://en.wikipedia.org/wiki/Internationalization_and_localization">localize</a>
-the abbreviations. They are intended to be the values returned through the
-<code>"%Z"</code> format specifier to
-<a href="https://en.wikipedia.org/wiki/C_(programming_language)">C</a>’s
-<a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html"><code>strftime</code></a>
-function in the
-<a href="http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_19.html#SEC324">“C” locale</a>.
-
-<li>If there is no generally-accepted abbreviation for a time zone,
-a numeric offset is used instead, e.g., <code>+07</code> for 7 hours
-ahead of Greenwich. By convention, <code>-00</code> is used in a
-zone while uninhabited, where the offset is zero but in some sense
-the true offset is undefined.
-</ul>
-
-<p>As a final example, here’s the complete history for Hawaii:</p>
-
-<table border="1">
-<tr>
- <th colspan="6">Relevant Excerpts from the US Rules</th>
-</tr>
-<tr>
- <td colspan="6" align="center"><table><tr><td>
-<pre>
-#Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule US 1918 1919 - Oct lastSun 2:00 0 S
-Rule US 1942 only - Feb 9 2:00 1:00 W # War
-Rule US 1945 only - Aug 14 23:00u 1:00 P # Peace
-Rule US 1945 only - Sep 30 2:00 0 S
-</pre>
- </td></tr></table></td>
-</tr>
-<tr>
- <th colspan="6">The Zone Record</th>
-</tr>
-<tr>
- <td colspan="6" align="center"><table><tr><td>
-<pre>
-#Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Pacific/Honolulu -10:31:26 - LMT 1900 Jan 1 12:00
- -10:30 - HST 1933 Apr 30 2:00
- -10:30 1:00 HDT 1933 May 21 2:00
- -10:30 US H%sT 1947 Jun 8 2:00
- -10:00 - HST
-</pre>
- </td></tr></table></td>
-</tr>
-<tr>
- <th colspan="6">What We Infer</th>
-</tr>
-<tr>
- <th rowspan="2">Wall-Clock<br>Offset from<br>Prime Meridian</th>
- <th rowspan="2">Adjust<br>Clocks</th>
- <th colspan="2">Time Zone</th>
- <th colspan="2">Ending at Local Time</th>
-</tr>
-<tr>
- <th>Abbrv.</th>
- <th>Name</th>
- <th>Date</th>
- <th>Time</th>
-</tr>
-<tr align="center">
- <td>−10:31:26</td>
- <td>—</td>
- <td>LMT</td>
- <td>local mean time</td>
- <td>1900-01-01</td>
- <td>12:00</td>
-</tr>
-<tr align="center">
- <td>−10:30</td>
- <td>+0:01:26</td>
- <td>HST</td>
- <td>Hawaii standard time</td>
- <td>1933-04-30</td>
- <td rowspan="3">02:00</td>
-</tr>
-<tr align="center">
- <td>−9:30</td>
- <td>+1:00</td>
- <td>HDT</td>
- <td>Hawaii daylight time</td>
- <td>1933-05-21</td>
-</tr>
-<tr align="center">
- <td>−10:30¹</td>
- <td>−1:00¹</td>
- <td>HST¹</td>
- <td>Hawaii standard time</td>
- <td>1942-02-09</td>
-</tr>
-<tr align="center">
- <td rowspan="2">−9:30</td>
- <td>+1:00</td>
- <td>HWT</td>
- <td>Hawaii war time</td>
- <td>1945-08-14</td>
- <td>13:30²</td>
-</tr>
-<tr align="center">
- <td>0</td>
- <td>HPT</td>
- <td>Hawaii peace time</td>
- <td>1945-09-30</td>
- <td rowspan="2">02:00</td>
-</tr>
-<tr align="center">
- <td>−10:30</td>
- <td>−1:00</td>
- <td rowspan="2">HST</td>
- <td rowspan="2">Hawaii standard time</td>
- <td>1947-06-08</td>
-</tr>
-<tr align="center">
- <td>−10:00³</td>
- <td>+0:30³</td>
- <td colspan="2">—</td>
-</tr>
-<tr>
- <td colspan="6">
- ¹Switching to US rules…most recent transition (in 1919) was to standard time
- </td>
-</tr>
-<tr>
- <td colspan="6">
- ²23:00 <a href="https://en.wikipedia.org/wiki/Universal_Time">UT</a>
- + (−9:30) = 13:30 local
- </td>
-</tr>
-<tr>
- <td colspan="6">
- ³Since <a href="https://en.wikipedia.org/wiki/ISO_8601">1947–06–08T12:30Z</a>,
- the civil time in Hawaii has been
- <a href="https://en.wikipedia.org/wiki/Universal_Time">UT</a>/<a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a>
- − 10:00 year-round.
- </td>
-</tr>
-</table>
-
-<p>There will be a short quiz later. <code>8-)</code></p>
-
-<hr>
-<address>
-This web page is in the public domain, so clarified as of
-2015-10-20 by Bill Seymour.
-<br>
-All suggestions and corrections will be welcome; all flames will be amusing.
-Mail to was at pobox dot com.
-</address>
-</body>
-</html>
Deleted: vendor/tzcode/dist/tz-link.htm
===================================================================
--- vendor/tzcode/dist/tz-link.htm 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tz-link.htm 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,847 +0,0 @@
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head profile="http://dublincore.org/documents/2008/08/04/dc-html/">
-<title>Sources for time zone and daylight saving time data</title>
-<link rel="schema.DC" href="http://purl.org/DC/elements/1.1/">
-<meta http-equiv="Content-type" content='text/html; charset="UTF-8"'>
-<meta name="DC.Title"
- content="Sources for time zone and daylight saving time data">
-<meta name="DC.Creator" content="Eggert, Paul">
-<meta name="DC.Contributor" content="Olson, Arthur David">
-<meta name="DC.Date" content="2016-06-14">
-<meta name="DC.Description"
- content="Sources of information about time zones and daylight saving time">
-<meta name="DC.Identifier"
- content="http://www.iana.org/time-zones/repository/tz-link.htm">
-<meta name="Keywords"
- content="database,daylight saving,DST,time zone,timezone,tz,zoneinfo">
-</head>
-<body>
-<h1>Sources for time zone and daylight saving time data</h1>
-<p>
-Time zone and daylight saving rules are controlled by individual
-governments. They are sometimes changed with little notice, and their
-histories and planned futures are often recorded only fitfully. Here
-is a summary of attempts to organize and record relevant data in this
-area.
-</p>
-<h2>The <code><abbr title="time zone">tz</abbr></code> database</h2>
-<p>
-The <a href="https://en.wikipedia.org/wiki/Public_domain">public-domain</a>
-time zone database contains code and data
-that represent the history of local time
-for many representative locations around the globe.
-It is updated periodically to reflect changes made by political bodies
-to <a href="https://en.wikipedia.org/wiki/Time_zone">time zone</a>
-boundaries and
-<a href="https://en.wikipedia.org/wiki/Daylight_saving_time">daylight-saving</a>
-rules.
-This database (often called <code>zoneinfo</code> or
-<code><abbr>tz</abbr></code>)
-is used by several implementations,
-including
-<a href="http://www.gnu.org/software/libc/">the
-<abbr title="GNU's Not Unix">GNU</abbr>
-C Library</a> (used in
-<a href="https://en.wikipedia.org/wiki/Linux"><abbr>GNU</abbr>/Linux</a>),
-<a href="https://www.android.com">Android</a>,
-<a href="https://developer.mozilla.org/en-US/docs/Mozilla/B2G_OS">B2G
-<abbr title="Operating System">OS</abbr></a>,
-<a href="https://www.freebsd.org">Free<abbr
-title="Berkeley Software Distribution">BSD</abbr></a>,
-<a href="http://netbsd.org">Net<abbr>BSD</abbr></a>,
-<a href="http://www.openbsd.org">Open<abbr>BSD</abbr></a>,
-<a href="http://www.chromium.org/chromium-os">Chromium OS</a>,
-<a href="https://cygwin.com">Cygwin</a>,
-<a href="http://www.delorie.com/djgpp/"><abbr
-title="DJ's GNU Programming Platform">DJGPP</abbr></a>,
-<a href="https://en.wikipedia.org/wiki/MINIX">MINIX</a>,
-<a href="https://en.wikipedia.org/wiki/WebOS"><abbr
-title="Web Operating System">webOS</abbr></a>,
-<a href="http://ibm.com/aix"><abbr
-title="Advanced Interactive eXecutive">AIX</abbr></a>,
-<a href="https://en.wikipedia.org/wiki/BlackBerry_10">BlackBerry 10</a>,
-<a href="http://www.apple.com/ios/"><abbr
-title="iPhone OS">iOS</abbr></a>,
-<a href="http://windows.microsoft.com">Microsoft Windows</a>,
-<a href="http://www.hp.com/go/openvms/">Open<abbr
-title="Virtual Memory System">VMS</abbr></a>,
-<a href="https://www.oracle.com/database/index.html">Oracle Database</a>,
-<a href="http://oracle.com/solaris">Oracle Solaris</a>, and
-<a href="http://www.apple.com/osx/"><abbr title="Operating System Ten">OS
-X</abbr></a>.</p>
-<p>
-Each location in the database represents a region where all
-clocks keeping local time have agreed since 1970.
-Locations are identified by continent or ocean and then by the name of
-the location, which is typically the largest city within the region.
-For example, <code>America/New_York</code>
-represents most of the <abbr title="United States">US</abbr> eastern time zone;
-<code>America/Phoenix</code> represents most of Arizona, which
-uses mountain time without daylight saving time (<abbr
-title="daylight saving time">DST</abbr>);
-<code>America/Detroit</code> represents most of Michigan, which uses
-eastern time but with different <abbr>DST</abbr> rules in 1975;
-and other entries represent smaller regions like Starke County,
-Indiana, which switched from central to eastern time in 1991
-and switched back in 2006.
-To use the database on an extended <a
-href="https://en.wikipedia.org/wiki/POSIX"><abbr
-title="Portable Operating System Interface">POSIX</abbr></a>
-implementation set the <code><abbr>TZ</abbr></code>
-environment variable to the location's full name,
-e.g., <code><abbr>TZ</abbr>="America/New_York"</code>.</p>
-<p>
-Associated with each region is a history of offsets from
-<a href="https://en.wikipedia.org/wiki/Universal_Time">Universal
-Time</a> (<abbr>UT</abbr>), which is <a
-href="https://en.wikipedia.org/wiki/Greenwich_Mean_Time">Greenwich Mean
-Time</a> (<abbr>GMT</abbr>) with days beginning at midnight;
-for time stamps after 1960 this is more precisely <a
-href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">Coordinated
-Universal Time</a> (<abbr>UTC</abbr>).
-The database also records when daylight saving time was in use,
-along with alphabetic time zone abbreviations such as <abbr>EST</abbr>
-for Eastern Standard Time in the <abbr>US</abbr>.</p>
-<p>
-In the <code><abbr>tz</abbr></code> database's
-<a href="ftp://ftp.iana.org/tz/releases/"><abbr
-title="File Transfer Protocol">FTP</abbr> releases</a>
-the code is in the file <code>tzcode<var>C</var>.tar.gz</code>,
-where <code><var>C</var></code> is the code's version;
-similarly, the data entries are in <code>tzdata<var>D</var>.tar.gz</code>,
-where <code><var>D</var></code> is the data's version.
-Since 1996, each version has been a four-digit year followed by
-lower-case letter (<samp>a</samp> through <samp>z</samp>,
-then <samp>za</samp> through <samp>zz</samp>, then <samp>zza</samp>
-through <samp>zzz</samp>, and so on).
-Convenience links to
-the <a href="ftp://ftp.iana.org/tz/tzcode-latest.tar.gz">latest
-code</a> and
-<a href="ftp://ftp.iana.org/tz/tzdata-latest.tar.gz">latest data</a> revisions
-are also available.
-The following <a
-href="https://en.wikipedia.org/wiki/Unix_shell">shell</a> commands download
-these files to a <abbr>GNU</abbr>/Linux or similar host;
-see the downloaded
-<code>README</code> file for what to do next.</p>
-<pre style="margin-left: 2em"><code>mkdir tz
-cd tz
-<a href="http://www.gnu.org/software/wget/">wget</a> --retr-symlinks 'ftp://ftp.iana.org/tz/tz*-latest.tar.gz'
-<a href="http://www.gnu.org/software/gzip/">gzip</a> -dc tzcode-latest.tar.gz | <a href="http://www.gnu.org/software/tar/">tar</a> -xf -
-gzip -dc tzdata-latest.tar.gz | tar -xf -
-</code></pre>
-<p>
-The code and data files can also be obtained from the
-<a href="http://www.iana.org/time-zones">Time Zone Database website</a>
-of the <a href="http://www.iana.org">Internet Assigned Numbers
-Authority (IANA)</a>.
-An <a href="https://github.com/eggert/tz">unofficial development
-repository</a> of the code and data is available
-in <a href="http://git-scm.com">Git</a> form
-from <a href="https://github.com">GitHub</a>; be careful, as this
-repository is less well tested and probably contains more errors.
-<p>
-The code lets you compile the <code><abbr>tz</abbr></code> source files into
-machine-readable binary files, one for each location. It also lets
-you read a <code><abbr>tz</abbr></code> binary file and interpret time stamps for that
-location.</p>
-<h2>Changes to the <code><abbr>tz</abbr></code> database</h2>
-<p>
-The <code><abbr>tz</abbr></code> code and data
-are by no means authoritative. If you find errors, please
-send changes to the <a href="mailto:tz at iana.org">time zone
-mailing list</a>. You can also <a
-href="http://news.gmane.org/gmane.comp.time.tz">browse recent
-messages</a> sent to the mailing list, <a
-href="https://mm.icann.org/mailman/listinfo/tz">subscribe</a> to it,
-and browse the <a
-href="http://mm.icann.org/pipermail/tz/">archive of old
-messages</a>.</p>
-<p>
-If your government plans to change its time zone boundaries or
-daylight saving rules, let the mailing list know well in advance. With
-less than a year's notice there is a good chance that some
-computer-based clocks will operate incorrectly after the change, due
-to delays in propagating updates to software and data. The shorter
-the notice, the more likely clock problems will arise.
-</p>
-<p>Sources for the <code><abbr>tz</abbr></code> database are
-<a href="https://en.wikipedia.org/wiki/UTF-8"><abbr
-title="Unicode Transformation Format 8-bit">UTF-8</abbr></a>
-<a href="https://en.wikipedia.org/wiki/Text_file">text files</a>
-with lines terminated by <a href="https://en.wikipedia.org/wiki/Newline"><abbr
-title="linefeed">LF</abbr></a>,
-which can be modified by common text editors such
-as <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>,
-<a href="https://wiki.gnome.org/Apps/Gedit">gedit</a>, and
-<a href="http://www.vim.org">vim</a>. One
-editor has a package to simplify editing further:</p>
-<ul>
-<li><a href="https://packagecontrol.io/packages/zoneinfo">Sublime
-zoneinfo</a> is a <a href="http://www.sublimetext.com">Sublime
-Text</a> package for syntax highlighting <code><abbr>tz</abbr></code>
-source files.</li>
-</ul>
-<p>
-For further information about updates, please see
-<a href="https://tools.ietf.org/html/rfc6557">Procedures for
-Maintaining the Time Zone Database</a> (Internet <abbr
-title="Request For Comments">RFC</abbr> 6557).</p>
-<h2>Commentary on the <code><abbr>tz</abbr></code> database</h2>
-<ul>
-<li>The article
-<a href="https://en.wikipedia.org/wiki/Tz_database">tz database</a> is
-an encyclopedic summary.</li>
-<li><a href="tz-how-to.html">How to Read the
-tz Database Source Files</a> explains the <code><abbr>tz</abbr></code>
-database format.</li>
-<li><a
-href="http://codeofmatt.com/2016/04/23/on-the-timing-of-time-zone-changes/">On
-the Timing of Time Zone Changes</a> gives examples of problems caused
-by inadequate notice by governments of time zone and daylight saving
-rule changes.</li>
-<li><a
-href="http://blog.jonudell.net/2009/10/23/a-literary-appreciation-of-the-olsonzoneinfotz-database/">A
-literary appreciation of the Olson/Zoneinfo/tz database</a> comments on the
-database's style.</li>
-</ul>
-<h2>Web sites using recent versions of the <code><abbr>tz</abbr></code> database</h2>
-<p>
-These are listed roughly in ascending order of complexity and fanciness.
-</p>
-<ul>
-<li><a href="http://time.is">Time.is</a> shows locations'
-time and zones in a simple format.</li>
-<li><a href="https://www.timejones.com">TimeJones.com</a> is a simple
-time zone converter.</li>
-<li><a
-href="http://twiki.org/cgi-bin/xtra/tzdatepick.html">Date and Time Gateway</a>
-lets you see the <code><abbr>TZ</abbr></code> values directly.</li>
-<li><a
-href="http://www.convertit.com/Go/ConvertIt/World_Time/Current_Time.ASP">Current
-Time in 1000 Places</a> uses descriptions of the values.</li>
-<li><a href="http://www.timezoneconverter.com/cgi-bin/tzc.tzc">Time Zone
-Converter</a>
-uses a pulldown menu.</li>
-<li><a href="http://home.kpn.nl/vanadovv/time/TZworld.html">Complete
-timezone information for all countries</a> displays tables of DST rules.
-<li><a href="http://www.timeanddate.com/worldclock/">The World Clock –
-Worldwide</a> lets you sort zone names and convert times.</li>
-<li><a href="http://www.zeitverschiebung.net/en/">Time Difference</a>
-calculates the current time difference between locations.</li>
-<li><a href="http://www.wx-now.com">Weather Now</a> lists the weather too.</li>
-<li><a href="http://www.thetimenow.com">The Time Now</a> also lists weather.</li>
-<li><a href="https://worldtime.io">worldtime.io</a>
-also contains data about time zone boundaries; it supports queries via place
-names and shows location maps.</li>
-</ul>
-<h2>Network protocols for <code><abbr>tz</abbr></code> data</h2>
-<ul>
-<li>The <a href="http://www.ietf.org">Internet Engineering Task Force</a>'s
-<a href="https://datatracker.ietf.org/wg/tzdist/charter/">Time Zone Data
-Distribution Service (tzdist) working group</a> defined <a
-href="https://tools.ietf.org/html/rfc7808">TZDIST</a>
-(Internet <abbr>RFC</abbr> 7808), a time zone data distribution service,
-along with a <a href="https://tools.ietf.org/html/rfc7809">calendar access
-protocol for transferring time zone data by reference</a>
-(Internet <abbr>RFC</abbr> 7809). This work was based
-on the iCalendar and CalConnect efforts described below.</li>
-<li>The <a href="https://tools.ietf.org/html/rfc5545">
-Internet Calendaring and Scheduling Core Object Specification
-(iCalendar)</a> (Internet <abbr>RFC</abbr> 5445)
-covers time zone
-data; see its VTIMEZONE calendar component.
-The iCalendar format requires specialized parsers and generators; a
-variant <a href="https://tools.ietf.org/html/rfc6321">xCal</a>
-(Internet <abbr>RFC</abbr> 6321) uses
-<a href="http://www.w3.org/XML/"><abbr
-title="Extensible Markup Language">XML</abbr></a> format, and a variant
-<a href="https://tools.ietf.org/html/rfc7265">jCal</a>
-(Internet <abbr>RFC</abbr> 7265)
-uses <a href="http://www.json.org"><abbr
-title="JavaScript Object Notation">JSON</abbr></a> format.
-<a href="https://www.calconnect.org">CalConnect, The Calendaring and Scheduling
-Consortium</a> is promoting further work in this area. <a
-href="http://calconnect.org/publications/icalendartimezoneproblemsandrecommendationsv1.0.pdf">iCalendar
-TIMEZONE Problems and Recommendations</a> offers guidelines and
-recommendations for the use of VTIMEZONE and <code><abbr>tz</abbr></code>.</li>
-<li>The <a
-href="http://calconnect.org/publications/timezoneregistryandservicerecommendationsv1.0.pdf">Timezone
-Registry and Service Recommendations</a> of CalConnect's
-<a href="https://www.calconnect.org/about/technical-committees/tc-timezone">TIMEZONE
-Technical Committee</a> discusses a
-strategy for defining and deploying a time zone
-registration process that would establish unique names for each
-version of each <code><abbr>tz</abbr></code> zone, along with a polygonal
-representation of the geographical area corresponding to the
-zone.</li>
-<li>The <a
-href="http://lists.w3.org/Archives/Public/www-rdf-calendar/">www-rdf-calendar</a>
-list discusses <a
-href="http://www.w3.org/RDF/"><abbr
-title="Resource Description Framework">RDF</abbr></a>-based calendar
-and group scheduling systems, and has a <a
-href="http://www.w3.org/2002/12/cal/#tzd">workspace on time zone
-data</a> converted from <code><abbr>tz</abbr></code>.</li>
-</ul>
-<h2>Other <code><abbr>tz</abbr></code> compilers</h2>
-<ul>
-<li><a href="https://sourceforge.net/projects/vzic/">Vzic</a> is a <a
-href="https://en.wikipedia.org/wiki/C_%28programming_language%29">C</a>
-program that compiles
-<code><abbr>tz</abbr></code> source into iCalendar-compatible VTIMEZONE files.
-Vzic is freely
-available under the <a
-href="http://www.gnu.org/copyleft/gpl.html"><abbr>GNU</abbr>
-General Public License (<abbr
-title="General Public License">GPL</abbr>)</a>.</li>
-<li><a href="https://sourceforge.net/projects/tzical/">tziCal – tz
-database conversion utility</a> is like Vzic, except for the <a
-href="https://www.microsoft.com/net">.NET framework</a>
-and with a <abbr>BSD</abbr>-style license.</li>
-<li><a
-href="http://search.cpan.org/dist/DateTime-TimeZone/">DateTime::TimeZone</a>
-contains a script <code>parse_olson</code> that compiles
-<code><abbr>tz</abbr></code> source into <a href="https://www.perl.org">Perl</a>
-modules. It is part of the Perl <a
-href="http://datetime.perl.org">DateTime Project</a>, which is freely
-available under both the <abbr>GPL</abbr> and the Perl Artistic
-License. DateTime::TimeZone also contains a script
-<code>tests_from_zdump</code> that generates test cases for each clock
-transition in the <code><abbr>tz</abbr></code> database.</li>
-<li>The <a href="https://howardhinnant.github.io/date/tz.html">Time Zone
-Database Parser</a> is a
-<a href="https://en.wikipedia.org/wiki/C%2B%2B">C++</a> parser and
-runtime library. It is freely available under the
-<a href="http://creativecommons.org/licenses/by/4.0/">Creative Commons
-Attribution 4.0 International Public License</a>.</li>
-<li><a href="http://site.icu-project.org">International Components for
-Unicode (<abbr>ICU</abbr>)</a> contains C/C++ and <a
-href="https://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>
-libraries for internationalization that
-has a compiler from <code><abbr>tz</abbr></code> source
-and from <abbr title="Common Locale Data Repository">CLDR</abbr> data
-(mentioned below)
-into an <abbr>ICU</abbr>-specific format.
-<abbr>ICU</abbr> is freely available under a
-<abbr>BSD</abbr>-style license.</li>
-<li>The <a href="https://github.com/lau/tzdata">Tzdata</a> package for
-the <a href="http://elixir-lang.org">Elixir</a> language downloads
-and compiles tz source and exposes <abbr
-title="Application Program Interface">API</abbr>s for use. It is
-freely available under the <abbr
-title="Massachusetts Institute of Technology">MIT</abbr> license.</li>
-<li>The <a
-href="http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html">TZUpdater
-tool</a> compiles <code><abbr>tz</abbr></code> source into the format used by
-Oracle Java.</li>
-<li><a href="http://www.joda.org/joda-time/">Joda-Time – Java date
-and time <abbr>API</abbr></a> contains a class
-<code>org.joda.time.tz.ZoneInfoCompiler</code> that compiles
-<code><abbr>tz</abbr></code> source into a Joda-specific binary format. Joda Time
-is freely available under a <abbr>BSD</abbr>-style license.</li>
-<li><a href="http://nodatime.org">Noda Time – Date and
-time <abbr>API</abbr> for .NET</a>
-and <a href="http://www.babiej.demon.nl/Tz4Net/main.htm">TZ4Net</a>
-are similar to Joda Time, but for the .NET framework instead of
-Java. They are freely available under the
-<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License</a>
-and a <abbr>BSD</abbr>-style license, respectively.</li>
-<li><a href="https://en.wikipedia.org/wiki/JavaScript">JavaScript</a>-based
-compilers and libraries include:
-<ul>
-<li><a href="http://momentjs.com/timezone/">Moment Timezone</a> is a
-plugin for the <a href="http://momentjs.com">Moment.js</a> date
-manipulation library. It is freely available under the <abbr>MIT</abbr>
-license.</li>
-<li><a href="https://github.com/mde/timezone-js">TimezoneJS.Date</a>'s
-<abbr>API</abbr> is upward compatible with standard JavaScript
-Dates. It is freely available under the Apache License.</li>
-<li><a href="https://github.com/sproutsocial/walltime-js">Walltime-js</a>
-translates <abbr>UT</abbr> to local time. It is freely available under
-the <abbr>MIT</abbr> license.</li>
-</ul>
-<li><a href="http://pytz.sourceforge.net">pytz – World Timezone
-Definitions for Python</a> compiles <code><abbr>tz</abbr></code> source into
-<a href="https://www.python.org">Python</a>.
-It is freely available under a <abbr>BSD</abbr>-style license.</li>
-<li><a href="http://tzinfo.github.io">TZInfo –
-Ruby Timezone Library</a>
-compiles <code><abbr>tz</abbr></code> source into
-<a href="https://www.ruby-lang.org/en/">Ruby</a>.
-It is freely available under the <abbr>MIT</abbr> license.</li>
-<li>The <a href="http://www.squeaksource.com/Chronos/">Chronos Date/Time
-Library</a> is
-a <a href="https://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a> class
-library that compiles <code><abbr>tz</abbr></code> source into a time
-zone repository whose format
-is either proprietary or an <abbr>XML</abbr>-encoded
-representation.</li>
-<li><a href="http://tcl.tk">Tcl</a>
-contains a developer-oriented parser that compiles <code><abbr>tz</abbr></code>
-source into text files, along with a runtime that can read those
-files. Tcl is freely available under a <abbr>BSD</abbr>-style
-license.</li>
-</ul>
-<h2>Other <code><abbr>tz</abbr></code> binary file readers</h2>
-<ul>
-<li>The <a
-href="http://www.gnu.org/software/libc/"><abbr>GNU</abbr> C
-Library</a>
-has an independent, thread-safe implementation of
-a <code><abbr>tz</abbr></code> binary file reader.
-This library is freely available under the
-<a href="http://www.gnu.org/copyleft/lesser.html">
-<abbr>GNU</abbr> Lesser General Public License
-(<abbr title="Lesser General Public License">LGPL</abbr>)</a>,
-and is widely used in <abbr>GNU</abbr>/Linux systems.</li>
-<li><a href="https://www.gnome.org">GNOME</a>'s Glib has
-a <code><abbr>tz</abbr></code> binary file reader written in C that
-creates a <code>GTimeZone</code> object representing sets
-of <abbr>UT</abbr> offsets.
-It is freely available under the <abbr>LGPL</abbr>.</li>
-<li>The
-<a href="https://github.com/bloomberg/bde/wiki">BDE Standard Library</a>'s
-<code>baltzo::TimeZoneUtil</code> component contains a C++
-implementation of a binary file reader. It is freely available under
-the Apache License.</li>
-<li><a href="https://github.com/google/cctz">CCTZ</a> is a simple C++
-library that translates between UTC and civil time and can read binary
-files. It is freely available under the Apache License.</li>
-<li><a href="http://bmsi.com/java/#TZ">ZoneInfo.java</a>
-is a <code><abbr>tz</abbr></code> binary file reader written in Java.
-It is freely available under the <abbr>LGPL</abbr>.</li>
-<li><a href="https://github.com/bigeasy/timezone">Timezone</a> is a
-JavaScript library that supports date arithmetic that is time zone
-aware. It is freely available under the <abbr>MIT</abbr> license.</li>
-<li>Tcl, mentioned above, also contains a
-<code><abbr>tz</abbr></code> binary file reader.</li>
-<li><a href="http://search.cpan.org/perldoc?DateTime::TimeZone::Tzfile">
-DateTime::TimeZone::Tzfile</a>
-is a <code><abbr>tz</abbr></code> binary file reader written in Perl.
-It is freely available under the same terms as Perl
-(dual <abbr>GPL</abbr> and Artistic license).</li>
-<li>The
-public-domain <a href="https://github.com/dbaron/tz.js">tz.js</a>
-library contains a Python tool that
-converts <code><abbr>tz</abbr></code> binary data into
-<abbr>JSON</abbr>-format data suitable for use
-in its JavaScript library for time zone conversion. Dates before 1970
-are not supported.</li>
-<li>The <a
-href="http://hackage.haskell.org/package/timezone-olson">timezone-olson</a>
-package contains <a href="https://www.haskell.org">Haskell</a> code that
-parses and uses <code><abbr>tz</abbr></code> binary data. It is freely
-available under a <abbr>BSD</abbr>-style license.</li>
-</ul>
-<h2>Other <code><abbr>tz</abbr></code>-based time zone software</h2>
-<ul>
-<li><a href="https://foxclocks.org">FoxClocks</a>
-is an extension for <a href="https://www.google.com/chrome/">Google
-Chrome</a> and for <a
-href="https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Toolkit_API">Mozilla
-Toolkit</a> applications like <a
-href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a> and <a
-href="https://www.mozilla.org/en-US/thunderbird/">Thunderbird</a>.
-It displays multiple clocks in the application window, and has a mapping
-interface to <a href="https://www.google.com/earth/">Google Earth</a>.
-It is freely available under the <abbr>GPL</abbr>.</li>
-<li><a href="https://golang.org">Go programming language</a>
-implementations contain a copy of a 32-bit subset of a recent
-<code><abbr>tz</abbr></code> database in a
-Go-specific format.</li>
-<li><a
-href="http://users.skynet.be/Peter.Verthez/projects/intclock/">International
-clock (intclock)</a> is a clock that displays multiple time zones on
-<abbr>GNU</abbr>/Linux and similar systems. It is freely available
-under the <abbr>GPL</abbr>.</li>
-<li>Microsoft Windows 8.1
-and later has <code><abbr>tz</abbr></code> data and <abbr>CLDR</abbr>
-data (mentioned below) used by
-<a href="https://en.wikipedia.org/wiki/Windows_Runtime">Windows Runtime</a>
-classes such as <a
-href="https://msdn.microsoft.com/en-us/library/windows/apps/windows.globalization.datetimeformatting.datetimeformatter.aspx"><code>DateTimeFormatter</code></a>.
-<a
-href="https://blogs.msdn.microsoft.com/bclteam/2007/06/07/exploring-windows-time-zones-with-system-timezoneinfo-josh-free/">Exploring
-Windows Time Zones with <code>System.TimeZoneInfo</code></a> describes
-the older, proprietary method of Microsoft Windows 2000 and later,
-which stores time zone data in the
-<a href="https://en.wikipedia.org/wiki/Windows_Registry">Windows Registry</a>. The
-<a
-href="http://www.unicode.org/cldr/charts/latest/supplemental/zone_tzid.html">Zone →
-Tzid table</a> or <a
-href="http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml"><abbr>XML</abbr>
-file</a> of the <abbr>CLDR</abbr> data maps proprietary zone IDs
-to <code><abbr>tz</abbr></code> names.
-<li><a
-href="https://www.oracle.com/java/index.html">Oracle
-Java</a> contains a copy of a subset of a recent
-<code><abbr>tz</abbr></code> database in a
-Java-specific format.</li>
-<li><a href="https://kimmo.suominen.com/sw/timezone/">Time Zone</a> is
-a <a href="https://wordpress.org">WordPress</a> plugin. It is freely
-available under a <abbr>BSD</abbr>-style license.</li>
-<li><a href="http://www.relativedata.com/time-zone-master">Time Zone
-Master</a> is a Microsoft Windows clock program that can automatically
-download, compile and use the <code>tzdata<var>D</var>.tar.gz</code>
-files as they are released. The Basic version is free.</li>
-<li><a
-href="http://veladg.com/velaterra.html">VelaTerra</a> is
-an <abbr>OS X</abbr> program. Its developers
-<a href="http://veladg.com/tzoffer.html">offer free
-licenses</a> to <code><abbr>tz</abbr></code> contributors.</li>
-</ul>
-<h2>Other time zone databases</h2>
-<ul>
-<li><a href="http://www.astro.com/atlas">Time-zone Atlas</a>
-is Astrodienst's Web version of Shanks and Pottenger's
-time zone history atlases published in both <a
-href="http://astrocom.com/astrology-products/software/acs-atlas-software">computer</a>
-and book form (<a
-href="http://www.astrocom.com/astrology/books/american-atlas">one volume
-for the <abbr>US</abbr></a>, and <a
-href="http://www.astrocom.com/astrology/books/international-atlas">one for
-other locations</a>) by <a
-href="http://astrocom.com">Astro Computing Services</a>.
-These atlases are extensive but unreliable, as Shanks appears to have
-guessed many <abbr>UT</abbr> offsets and transitions. The atlases cite no
-sources and do not indicate which entries are guesswork.</li>
-<li><a href="https://en.wikipedia.org/wiki/HP-UX">HP-UX</a> has a database in
-its own <code>tztab</code>(4) format.</li>
-<li>Microsoft Windows has proprietary data mentioned above.</li>
-<li><a href="http://www.worldtimeserver.com">World Time Server</a>
-is another time zone database.</li>
-<li><a href="http://tycho.usno.navy.mil/tzones.html">World Time Zones</a>
-contains data from the Time Service Department of the
-<abbr>US</abbr> Naval Observatory.</li>
-<li>The <a href="http://www.iata.org/publications/Pages/ssim.aspx">Standard
-Schedules Information Manual</a> of the
-International Air Transport Association
-gives current time zone rules for airports served by commercial aviation.</li>
-</ul>
-<h2>Maps</h2>
-<ul>
-<li>The <a href="https://www.cia.gov/index.html">United States Central
-Intelligence Agency (<abbr
-title="Central Intelligence Agency">CIA</abbr>)</a> publishes a <a
-href="https://www.cia.gov/library/publications/the-world-factbook/graphics/ref_maps/physical/pdf/standard_time_zones_of_the_world.pdf">time
-zone map</a>; the
-<a
-href="http://www.lib.utexas.edu/maps/world.html">Perry–Castañeda
-Library Map Collection</a>
-of the University of Texas at Austin has copies of
-recent editions.
-The pictorial quality is good,
-but the maps do not indicate summer time,
-and parts of the data are a few years out of date.</li>
-<li><a href="http://www.worldtimezone.com">Current time around the world
-and standard time zones map of the world</a>
-has several fancy time zone maps; it covers Russia particularly well.
-The maps' pictorial quality is not quite as good as the
-<abbr>CIA</abbr>'s
-but the maps are more up to date.</li>
-<li><a
-href="http://blog.poormansmath.net/how-much-is-time-wrong-around-the-world/">How
-much is time wrong around the world?</a> maps the difference between
-mean solar and standard time, highlighting areas such as western China
-where the two differ greatly. It's a bit out of date, unfortunately.</li>
-</ul>
-<h2>Time zone boundaries</h2>
-<ul>
-<li><a href="http://efele.net/maps/tz/"><abbr>TZ</abbr> timezones
-maps</a> contains <a
-href="https://en.wikipedia.org/wiki/Shapefile">shapefiles</a> of
-sets of <code><abbr>tz</abbr></code> regions.</li>
-<li>The <a href="https://github.com/bradfitz/latlong">latlong package</a>
-maps geographical coordinates to a <code><abbr>tz</abbr></code> region.
-It is written in Go and is freely available under the Apache License.</li>
-<li><a href="https://derickrethans.nl/what-time-is-it.html">What Time
-is It Here?</a> applies <a href="https://www.mongodb.com">MongoDB</a>
-geospatial query operators to shapefiles' data.</li>
-<li><a href="http://statoids.com/statoids.html">Administrative
-Divisions of Countries ("Statoids")</a> contains lists of
-political subdivision data related to time zones.</li>
-<li><a href="http://home.kpn.nl/vanadovv/time/Multizones.html">Time
-zone boundaries for multizone countries</a> summarizes legal
-boundaries between time zones within countries.</li>
-<li>Manifold.net's <a
-href="http://manifold.net/info/freestuff.shtml">Free Stuff for
-Manifold System Users</a> includes a Manifold-format map of
-world time zone boundaries distributed under the
-<abbr>GPL</abbr>.</li>
-<li>The GeoCommunity lists several commercial sources for <a
-href="http://spatialnews.geocomm.com/features/timezones/">International
-Time Zones and Time Zone Data</a>.</li>
-<li>A ship within the <a
-href="https://en.wikipedia.org/wiki/Territorial_waters">territorial
-waters</a> of any nation uses that nation's time. In international
-waters, time zone boundaries are meridians 15° apart, except that
-<abbr>UTC</abbr>−12 and <abbr>UTC</abbr>+12 are each 7.5°
-wide and are separated by
-the 180° meridian (not by the International Date Line, which is
-for land and territorial waters only). A captain can change ship's
-clocks any time after entering a new time zone; midnight changes are
-common.</li>
-</ul>
-<h2>Civil time concepts and history</h2>
-<ul>
-<li><a href="http://www.nist.gov/pml/general/time/index.cfm">A
-Walk through Time</a>
-surveys the evolution of timekeeping.</li>
-<li><a href="http://www.webexhibits.org/daylightsaving/">About Daylight
-Saving Time – History, rationale, laws & dates</a>
-is an overall history of <abbr>DST</abbr>.</li>
-<li><a href="https://www.w3.org/TR/timezone/">Working with Time Zones</a>
-contains guidelines and best practices for software applications that
-deal with civil time.</li>
-<li><a href="http://energy.ca.gov/daylightsaving.html">Saving Time,
-Saving Energy</a> discusses a primary justification for <abbr>DST</abbr>.</li>
-<li><a href="http://seizethedaylight.com/dst/">A Brief
-History of Daylight Saving Time</a> summarizes some of the contentious
-history of <abbr>DST</abbr>.</li>
-<li><a href="http://www.staff.science.uu.nl/~gent0113/idl/idl.htm">A History of
-the International Date Line</a> tells the story of the most important
-time zone boundary.</li>
-<li><a href="http://statoids.com/tconcept.html">Basic Time
-Zone Concepts</a> discusses terminological issues behind time zones.</li>
-</ul>
-<h2>National histories of legal time</h2>
-<dl>
-<dt>Australia</dt>
-<dd>The Parliamentary Library has commissioned a <a
-href="http://www.aph.gov.au/binaries/library/pubs/rp/2009-10/10rp10.pdf">research
-paper on daylight saving time in Australia</a>.
-The Bureau of Meteorology publishes a list of <a
-href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml">Implementation
-Dates of Daylight Savings Time within Australia</a>.</dd>
-<dt>Belgium</dt>
-<dd>The Royal Observatory of Belgium maintains a table of <a
-href="http://www.astro.oma.be/GENERAL/INFO/nli001a.html"
-hreflang="nl">time in Belgium (in Dutch)</a>.</dd>
-<dt>Brazil</dt>
-<dd>The Time Service Department of the National Observatory
-records <a href="http://pcdsh01.on.br/DecHV.html"
-hreflang="pt-BR">Brazil's daylight saving time decrees (in
-Portuguese)</a>.</dd>
-<dt>Canada</dt>
-<dd>National Research Council Canada publishes current
-and some older information about <a
-href="http://www.nrc-cnrc.gc.ca/eng/services/time/time_zones.html">time
-zones & daylight saving time</a>.</dd>
-<dt>Chile</dt>
-<dd>The Hydrographic and Oceanographic Service of the Chilean Navy publishes a
-<a href="http://www.horaoficial.cl/historia_hora.html" hreflang="es">history of
-Chile's official time (in Spanish)</a>.</dd>
-<dt>Germany</dt>
-<dd>The National Institute for Science and Technology maintains the <a
-href="http://www.ptb.de/cms/en/fachabteilungen/abt4/fb-44/ag-441/realisation-of-legal-time-in-germany.html">Realisation
-of Legal Time in Germany</a>.</dd>
-<dt>Israel</dt>
-<dd>The Interior Ministry periodically issues <a
-href="ftp://ftp.cs.huji.ac.il/pub/tz/announcements"
-hreflang="he">announcements (in Hebrew)</a>.</dd>
-<dt>Mexico</dt>
-<dd>The Investigation and Analysis Service of the Mexican Library of
-Congress has published a <a
-href="http://www.diputados.gob.mx/bibliot/publica/inveyana/polisoc/horver/index.htm"
-hreflang="es">history of Mexican local time (in Spanish)</a>.</dd>
-<dt>Malaysia</dt>
-<dd>See Singapore below.</dd>
-<dt>Netherlands</dt>
-<dd><a href="http://www.staff.science.uu.nl/~gent0113/wettijd/wettijd.htm"
-hreflang="nl">Legal time in the Netherlands (in Dutch)</a>
-covers the history of local time in the Netherlands from ancient times.</dd>
-<dt>New Zealand</dt>
-<dd>The Department of Internal Affairs maintains a brief <a
-href="http://www.dia.govt.nz/Daylight-Saving-History">History of
-Daylight Saving</a>. The privately-maintained <a
-href="http://astrologyschool.com/nztime.html">History of New Zealand
-time</a> has more details.</dd>
-<dt>Singapore</dt>
-<dd><a
-href="http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html">Why
-is Singapore in the "Wrong" Time Zone?</a> details the
-history of legal time in Singapore and Malaysia.</dd>
-<dt>United Kingdom</dt>
-<dd><a
-href="https://www.polyomino.org.uk/british-time/">History of
-legal time in Britain</a> discusses in detail the country
-with perhaps the best-documented history of clock adjustments.
-The National Physical Laboratory also maintains an <a
-href="http://www.npl.co.uk/educate-explore/what-is-time/archive-of-summer-time-dates-1916-2006">Archive
-of Summer time dates</a>.</dd>
-<dt>United States</dt>
-<dd>The Department of Transportation's <a
-href="https://www.transportation.gov/regulations/recent-time-zone-proceedings">Recent
-Time Zone Proceedings</a> lists changes to time zone boundaries.</dd>
-</dl>
-<h2>Precision timekeeping</h2>
-<ul>
-<li><a
-href="http://literature.agilent.com/litweb/pdf/5965-7984E.pdf">The
-Science of Timekeeping</a> is a thorough introduction
-to the theory and practice of precision timekeeping.</li>
-<li><a href="http://www.ntp.org"><abbr
-title="Network Time Protocol">NTP</abbr>: The Network
-Time Protocol</a>
-discusses how to synchronize clocks of
-Internet hosts.</li>
-<li>The <a href="http://www.nist.gov/el/isd/ieee/ieee1588.cfm">Precision
-Time Protocol</a> (<abbr
-title="Institute of Electrical and Electronics Engineers">IEEE</abbr> 1588)
-can achieve submicrosecond clock accuracy on a local area network.</li>
-<li><a
-href="https://tools.ietf.org/html/rfc4833">Timezone
-Options for <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr></a>
-(Internet <abbr>RFC</abbr> 4833)
-specifies a <a
-href="https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol"><abbr>DHCP</abbr></a>
-option for a server to configure
-a client's time zone and daylight saving settings automatically.</li>
-<li><a href="http://gauss.gge.unb.ca/GMT.UT.and.the.RGO.html">A Few Facts
-Concerning <abbr>GMT</abbr>, <abbr>UT</abbr>, and
-the <abbr title="Royal Greenwich Observatory">RGO</abbr></a>
-answers questions like "What is the
-difference between <abbr>GMT</abbr> and <abbr>UTC</abbr>?"</li>
-<li><a
-href="http://www.cv.nrao.edu/~rfisher/Ephemerides/times.html">Astronomical
-Times</a> explains more abstruse astronomical time scales like
-<abbr title="Terrestrial Dynamic Time">TDT</abbr>,
-<abbr title="Geocentric Coordinate Time">TCG</abbr>, and
-<abbr title="Barycentric Dynamic Time">TDB</abbr>.
-<a href="http://www.ucolick.org/~sla/leapsecs/timescales.html">Time
-Scales</a> goes into more detail, particularly for historical variants.</li>
-<li>The <a href="http://iau.org"><abbr
-title="International Astronomical Union">IAU</abbr></a>'s <a
-href="http://www.iausofa.org"><abbr
-title="Standards Of Fundamental Astronomy">SOFA</abbr></a>
-collection contains C and <a
-href="https://en.wikipedia.org/wiki/Fortran">Fortran</a>
-code for converting among time scales like
-<abbr title="International Atomic Time">TAI</abbr>,
-<abbr>TDB</abbr>, <abbr>TDT</abbr> and
-<abbr>UTC</abbr>.</li>
-<li><a href="http://solarsystem.nasa.gov/basics/bsf2-3.php">Basics of
-Space Flight – Reference Systems – Time Conventions</a>
-briefly explains interplanetary space flight timekeeping.</li>
-<li><a
-href="http://www.giss.nasa.gov/tools/mars24/help/notes.html">Technical
-Notes on Mars Solar Time as Adopted by the Mars24 Sunclock</a> briefly
-describes Mars Coordinated Time (<abbr
-title="Mars Coordinated Time">MTC</abbr>) and the
-diverse local time
-scales used by each landed mission on Mars.</li>
-<li><a href="http://leapsecond.com">LeapSecond.com</a> is
-dedicated not only to leap seconds but to precise time and frequency
-in general. It covers the state of the art in amateur timekeeping, and
-how the art has progressed over the past few decades.</li>
-<li><a
-href="https://www.iers.org/IERS/EN/Publications/Bulletins/bulletins.html"><abbr
-title="International Earth Rotation and Reference Systems Service">IERS</abbr>
-Bulletins</a> contains official publications of the International
-Earth Rotation and Reference Systems Service, which decides
-when leap seconds occur.</li>
-<li>The <a
-href="https://pairlist6.pair.net/mailman/listinfo/leapsecs">Leap
-Second Discussion List</a> covers <a
-href="http://gauss.gge.unb.ca/papers.pdf/gpsworld.november99.pdf">McCarthy
-and Klepczynski's proposal to discontinue leap seconds</a>,
-discussed further in
-<a href="http://www.cl.cam.ac.uk/~mgk25/time/metrologia-leapsecond.pdf">The
-leap second: its history and possible future</a>.
-<a href="http://www.ucolick.org/~sla/leapsecs/"><abbr>UTC</abbr>
-might be redefined
-without Leap Seconds</a> gives pointers on this
-contentious issue.</li>
-</ul>
-<h2>Time notation</h2>
-<ul>
-<li>The <a href="http://cldr.unicode.org">Unicode Common Locale Data
-Repository (<abbr>CLDR</abbr>) Project</a> has localizations for time
-zone names, abbreviations, identifiers, and formats. For example, it
-contains French translations for "Eastern European Summer Time",
-"<abbr title="Eastern European Summer Time">EEST</abbr>", and
-"Bucharest". Its
-<a href="http://unicode.org/cldr/charts/by_type/index.html">by-type
-charts</a> show these values for many locales. Data values are available in
-both <abbr title="Locale Data Markup Language">LDML</abbr>
-(an <abbr>XML</abbr> format) and <abbr>JSON</abbr>.
-<li>
-<a href="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">A summary of
-the international standard date and time notation</a> is a good
-summary of
-<a
-href="http://www.iso.org/iso/catalogue_detail?csnumber=40874"><abbr
-title="International Organization for Standardization">ISO</abbr>
-8601:2004 – Data elements and interchange formats – Information
-interchange – Representation of dates and times</a>.</li>
-<li>
-<a href="https://www.w3.org/TR/xmlschema-2/#dateTime"><abbr>XML</abbr>
-Schema: Datatypes – dateTime</a> specifies a format inspired by
-<abbr>ISO</abbr> 8601 that is in common use in <abbr>XML</abbr> data.</li>
-<li>
-<a href="https://tools.ietf.org/html/rfc5322">Internet
-Message Format</a> (Internet <abbr>RFC</abbr> 5322) §3.3
-specifies the time notation used in email and <a
-href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol"><abbr>HTTP</abbr></a>
-headers.</li>
-<li>
-<a href="https://tools.ietf.org/html/rfc3339">Date and Time
-on the Internet: Timestamps</a> (Internet <abbr>RFC</abbr> 3339)
-specifies an <abbr>ISO</abbr> 8601
-profile for use in new Internet
-protocols.</li>
-<li>
-<a href="https://www.hackcraft.net/web/datetime/">Date & Time
-Formats on the Web</a> surveys web- and Internet-oriented date and time
-formats.</li>
-<li>
-<a href="http://exit109.com/~ghealton/y2k/yrexamples.html">The
-Best of Dates, the Worst of Dates</a> covers many problems encountered
-by software developers when handling dates and time stamps.</li>
-<li>Alphabetic time zone abbreviations should not be used as unique
-identifiers for <abbr>UTC</abbr> offsets as they are ambiguous in
-practice. For example, in English-speaking North America
-"<abbr>CST</abbr>" denotes 6 hours behind <abbr>UTC</abbr>,
-but in China it denotes 8 hours ahead of <abbr>UTC</abbr>,
-and French-speaking North Americans prefer
-"<abbr title="Heure Normale du Centre">HNC</abbr>" to
-"<abbr>CST</abbr>". For <abbr>POSIX</abbr> the <code><abbr>tz</abbr></code>
-database contains English abbreviations for all time stamps but in
-many cases these are merely inventions of the database
-maintainers.</li>
-<li>Numeric time zone abbreviations typically count hours east of
-<abbr>UTC</abbr>, e.g., +09 for Japan and
-−10 for Hawaii. However, the <abbr>POSIX</abbr>
-<code><abbr>TZ</abbr></code> environment variable uses the opposite convention.
-For example, one might use <code><abbr>TZ</abbr>="<abbr
-title="Japan Standard Time">JST</abbr>-9"</code> and
-<code><abbr>TZ</abbr>="<abbr title="Hawaii Standard Time">HST</abbr>10"</code>
-for Japan and Hawaii, respectively. If the
-<code><abbr>tz</abbr></code> database is available, it is usually better to use
-settings like <code><abbr>TZ</abbr>="Asia/Tokyo"</code> and
-<code><abbr>TZ</abbr>="Pacific/Honolulu"</code> instead, as this should avoid
-confusion, handle old time stamps better, and insulate you better from
-any future changes to the rules. One should never set
-<abbr>POSIX</abbr> <code><abbr>TZ</abbr></code> to a value like
-<code>"GMT-9"</code>, though, since this would falsely claim that
-local time is nine hours ahead of <abbr>UTC</abbr> and the time zone
-is called "<abbr>GMT</abbr>".</li>
-</ul>
-<h2>See also</h2>
-<ul>
-<li><a href="tz-art.htm">Time and the Arts</a></li>
-</ul>
-<hr>
-<address>
-This web page is in the public domain, so clarified as of
-2009-05-17 by Arthur David Olson.
-<br>
-Please send corrections to this web page to the
-<a href="mailto:tz at iana.org">time zone mailing list</a>.
-</address>
-</body>
-</html>
Deleted: vendor/tzcode/dist/tzfile.5
===================================================================
--- vendor/tzcode/dist/tzfile.5 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tzfile.5 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,155 +0,0 @@
-.TH TZFILE 5
-.SH NAME
-tzfile \- time zone information
-.SH DESCRIPTION
-The time zone information files used by
-.IR tzset (3)
-begin with the magic characters "TZif" to identify them as
-time zone information files,
-followed by a character identifying the version of the file's format
-(as of 2013, either an ASCII NUL, or '2', or '3')
-followed by fifteen bytes containing zeroes reserved for future use,
-followed by six four-byte integer values
-written in a standard byte order
-(the high-order byte of the value is written first).
-These values are,
-in order:
-.TP
-.I tzh_ttisgmtcnt
-The number of UT/local indicators stored in the file.
-.TP
-.I tzh_ttisstdcnt
-The number of standard/wall indicators stored in the file.
-.TP
-.I tzh_leapcnt
-The number of leap seconds for which data entries are stored in the file.
-.TP
-.I tzh_timecnt
-The number of transition times for which data entries are stored
-in the file.
-.TP
-.I tzh_typecnt
-The number of local time types for which data entries are stored
-in the file (must not be zero).
-.TP
-.I tzh_charcnt
-The number of characters of time zone abbreviation strings
-stored in the file.
-.PP
-The above header is followed by
-.I tzh_timecnt
-four-byte signed integer values sorted in ascending order.
-These values are written in standard byte order.
-Each is used as a transition time (as returned by
-.IR time (2))
-at which the rules for computing local time change.
-Next come
-.I tzh_timecnt
-one-byte unsigned integer values;
-each one tells which of the different types of local time types
-described in the file is associated with the time period
-starting with the same-indexed transition time.
-These values serve as indices into an array of
-.I ttinfo
-structures (with
-.I tzh_typecnt
-entries) that appears next in the file;
-these structures are defined as follows:
-.in +.5i
-.sp
-.nf
-.ta .5i +\w'unsigned char\0\0'u
-struct ttinfo {
- int32_t tt_gmtoff;
- unsigned char tt_isdst;
- unsigned char tt_abbrind;
-};
-.in -.5i
-.fi
-.sp
-Each structure is written as a four-byte signed integer value for
-.IR tt_gmtoff ,
-in a standard byte order, followed by a one-byte value for
-.I tt_isdst
-and a one-byte value for
-.IR tt_abbrind .
-In each structure,
-.I tt_gmtoff
-gives the number of seconds to be added to UT,
-.I tt_isdst
-tells whether
-.I tm_isdst
-should be set by
-.I localtime (3)
-and
-.I tt_abbrind
-serves as an index into the array of time zone abbreviation characters
-that follow the
-.I ttinfo
-structure(s) in the file.
-.PP
-Then there are
-.I tzh_leapcnt
-pairs of four-byte values, written in standard byte order;
-the first value of each pair gives the time
-(as returned by
-.IR time(2))
-at which a leap second occurs;
-the second gives the
-.I total
-number of leap seconds to be applied during the time period
-starting at the given time.
-The pairs of values are sorted in ascending order by time.
-.PP
-Then there are
-.I tzh_ttisstdcnt
-standard/wall indicators, each stored as a one-byte value;
-they tell whether the transition times associated with local time types
-were specified as standard time or wall clock time,
-and are used when a time zone file is used in handling POSIX-style
-time zone environment variables.
-.PP
-Finally there are
-.I tzh_ttisgmtcnt
-UT/local indicators, each stored as a one-byte value;
-they tell whether the transition times associated with local time types
-were specified as UT or local time,
-and are used when a time zone file is used in handling POSIX-style
-time zone environment variables.
-.PP
-.I Localtime
-uses the first standard-time
-.I ttinfo
-structure in the file
-(or simply the first
-.I ttinfo
-structure in the absence of a standard-time structure)
-if either
-.I tzh_timecnt
-is zero or the time argument is less than the first transition time recorded
-in the file.
-.PP
-For version-2-format time zone files,
-the above header and data are followed by a second header and data,
-identical in format except that
-eight bytes are used for each transition time or leap second time.
-After the second header and data comes a newline-enclosed,
-POSIX-TZ-environment-variable-style string for use in handling instants
-after the last transition time stored in the file
-(with nothing between the newlines if there is no POSIX representation for
-such instants).
-.PP
-For version-3-format time zone files, the POSIX-TZ-style string may
-use two minor extensions to the POSIX TZ format, as described in
-.IR newtzset (3).
-First, the hours part of its transition times may be signed and range from
-\-167 through 167 instead of the POSIX-required unsigned values
-from 0 through 24. Second, DST is in effect all year if it starts
-January 1 at 00:00 and ends December 31 at 24:00 plus the difference
-between daylight saving and standard time.
-.PP
-Future changes to the format may append more data.
-.SH SEE ALSO
-newctime(3), newtzset(3), zdump(8), zic(8)
-.\" This file is in the public domain, so clarified as of
-.\" 1996-06-05 by Arthur David Olson.
Deleted: vendor/tzcode/dist/tzfile.5.txt
===================================================================
--- vendor/tzcode/dist/tzfile.5.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tzfile.5.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,107 +0,0 @@
-TZFILE(5) File Formats Manual TZFILE(5)
-
-NAME
- tzfile - time zone information
-
-DESCRIPTION
- The time zone information files used by tzset(3) begin with the magic
- characters "TZif" to identify them as time zone information files,
- followed by a character identifying the version of the file's format
- (as of 2013, either an ASCII NUL, or '2', or '3') followed by fifteen
- bytes containing zeroes reserved for future use, followed by six four-
- byte integer values written in a standard byte order (the high-order
- byte of the value is written first). These values are, in order:
-
- tzh_ttisgmtcnt
- The number of UT/local indicators stored in the file.
-
- tzh_ttisstdcnt
- The number of standard/wall indicators stored in the file.
-
- tzh_leapcnt
- The number of leap seconds for which data entries are stored in
- the file.
-
- tzh_timecnt
- The number of transition times for which data entries are stored
- in the file.
-
- tzh_typecnt
- The number of local time types for which data entries are stored
- in the file (must not be zero).
-
- tzh_charcnt
- The number of characters of time zone abbreviation strings
- stored in the file.
-
- The above header is followed by tzh_timecnt four-byte signed integer
- values sorted in ascending order. These values are written in standard
- byte order. Each is used as a transition time (as returned by time(2))
- at which the rules for computing local time change. Next come
- tzh_timecnt one-byte unsigned integer values; each one tells which of
- the different types of local time types described in the file is
- associated with the time period starting with the same-indexed
- transition time. These values serve as indices into an array of ttinfo
- structures (with tzh_typecnt entries) that appears next in the file;
- these structures are defined as follows:
-
- struct ttinfo {
- int32_t tt_gmtoff;
- unsigned char tt_isdst;
- unsigned char tt_abbrind;
- };
-
- Each structure is written as a four-byte signed integer value for
- tt_gmtoff, in a standard byte order, followed by a one-byte value for
- tt_isdst and a one-byte value for tt_abbrind. In each structure,
- tt_gmtoff gives the number of seconds to be added to UT, tt_isdst tells
- whether tm_isdst should be set by localtime (3) and tt_abbrind serves
- as an index into the array of time zone abbreviation characters that
- follow the ttinfo structure(s) in the file.
-
- Then there are tzh_leapcnt pairs of four-byte values, written in
- standard byte order; the first value of each pair gives the time (as
- returned by time(2)) at which a leap second occurs; the second gives
- the total number of leap seconds to be applied during the time period
- starting at the given time. The pairs of values are sorted in
- ascending order by time.
-
- Then there are tzh_ttisstdcnt standard/wall indicators, each stored as
- a one-byte value; they tell whether the transition times associated
- with local time types were specified as standard time or wall clock
- time, and are used when a time zone file is used in handling POSIX-
- style time zone environment variables.
-
- Finally there are tzh_ttisgmtcnt UT/local indicators, each stored as a
- one-byte value; they tell whether the transition times associated with
- local time types were specified as UT or local time, and are used when
- a time zone file is used in handling POSIX-style time zone environment
- variables.
-
- Localtime uses the first standard-time ttinfo structure in the file (or
- simply the first ttinfo structure in the absence of a standard-time
- structure) if either tzh_timecnt is zero or the time argument is less
- than the first transition time recorded in the file.
-
- For version-2-format time zone files, the above header and data are
- followed by a second header and data, identical in format except that
- eight bytes are used for each transition time or leap second time.
- After the second header and data comes a newline-enclosed, POSIX-TZ-
- environment-variable-style string for use in handling instants after
- the last transition time stored in the file (with nothing between the
- newlines if there is no POSIX representation for such instants).
-
- For version-3-format time zone files, the POSIX-TZ-style string may use
- two minor extensions to the POSIX TZ format, as described in
- newtzset(3). First, the hours part of its transition times may be
- signed and range from -167 through 167 instead of the POSIX-required
- unsigned values from 0 through 24. Second, DST is in effect all year
- if it starts January 1 at 00:00 and ends December 31 at 24:00 plus the
- difference between daylight saving and standard time.
-
- Future changes to the format may append more data.
-
-SEE ALSO
- newctime(3), newtzset(3), zdump(8), zic(8)
-
- TZFILE(5)
Deleted: vendor/tzcode/dist/tzfile.h
===================================================================
--- vendor/tzcode/dist/tzfile.h 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tzfile.h 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,169 +0,0 @@
-#ifndef TZFILE_H
-
-#define TZFILE_H
-
-/*
-** This file is in the public domain, so clarified as of
-** 1996-06-05 by Arthur David Olson.
-*/
-
-/*
-** This header is for use ONLY with the time conversion code.
-** There is no guarantee that it will remain unchanged,
-** or that it will remain at all.
-** Do NOT copy it to any system include directory.
-** Thank you!
-*/
-
-/*
-** Information about time zone files.
-*/
-
-#ifndef TZDIR
-#define TZDIR "/usr/local/etc/zoneinfo" /* Time zone object file directory */
-#endif /* !defined TZDIR */
-
-#ifndef TZDEFAULT
-#define TZDEFAULT "localtime"
-#endif /* !defined TZDEFAULT */
-
-#ifndef TZDEFRULES
-#define TZDEFRULES "posixrules"
-#endif /* !defined TZDEFRULES */
-
-/*
-** Each file begins with. . .
-*/
-
-#define TZ_MAGIC "TZif"
-
-struct tzhead {
- char tzh_magic[4]; /* TZ_MAGIC */
- char tzh_version[1]; /* '\0' or '2' or '3' as of 2013 */
- char tzh_reserved[15]; /* reserved; must be zero */
- char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */
- char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
- char tzh_leapcnt[4]; /* coded number of leap seconds */
- char tzh_timecnt[4]; /* coded number of transition times */
- char tzh_typecnt[4]; /* coded number of local time types */
- char tzh_charcnt[4]; /* coded number of abbr. chars */
-};
-
-/*
-** . . .followed by. . .
-**
-** tzh_timecnt (char [4])s coded transition times a la time(2)
-** tzh_timecnt (unsigned char)s types of local time starting at above
-** tzh_typecnt repetitions of
-** one (char [4]) coded UT offset in seconds
-** one (unsigned char) used to set tm_isdst
-** one (unsigned char) that's an abbreviation list index
-** tzh_charcnt (char)s '\0'-terminated zone abbreviations
-** tzh_leapcnt repetitions of
-** one (char [4]) coded leap second transition times
-** one (char [4]) total correction after above
-** tzh_ttisstdcnt (char)s indexed by type; if 1, transition
-** time is standard time, if 0,
-** transition time is wall clock time
-** if absent, transition times are
-** assumed to be wall clock time
-** tzh_ttisgmtcnt (char)s indexed by type; if 1, transition
-** time is UT, if 0,
-** transition time is local time
-** if absent, transition times are
-** assumed to be local time
-*/
-
-/*
-** If tzh_version is '2' or greater, the above is followed by a second instance
-** of tzhead and a second instance of the data in which each coded transition
-** time uses 8 rather than 4 chars,
-** then a POSIX-TZ-environment-variable-style string for use in handling
-** instants after the last transition time stored in the file
-** (with nothing between the newlines if there is no POSIX representation for
-** such instants).
-**
-** If tz_version is '3' or greater, the above is extended as follows.
-** First, the POSIX TZ string's hour offset may range from -167
-** through 167 as compared to the POSIX-required 0 through 24.
-** Second, its DST start time may be January 1 at 00:00 and its stop
-** time December 31 at 24:00 plus the difference between DST and
-** standard time, indicating DST all year.
-*/
-
-/*
-** In the current implementation, "tzset()" refuses to deal with files that
-** exceed any of the limits below.
-*/
-
-#ifndef TZ_MAX_TIMES
-#define TZ_MAX_TIMES 2000
-#endif /* !defined TZ_MAX_TIMES */
-
-#ifndef TZ_MAX_TYPES
-/* This must be at least 17 for Europe/Samara and Europe/Vilnius. */
-#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
-#endif /* !defined TZ_MAX_TYPES */
-
-#ifndef TZ_MAX_CHARS
-#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
- /* (limited by what unsigned chars can hold) */
-#endif /* !defined TZ_MAX_CHARS */
-
-#ifndef TZ_MAX_LEAPS
-#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
-#endif /* !defined TZ_MAX_LEAPS */
-
-#define SECSPERMIN 60
-#define MINSPERHOUR 60
-#define HOURSPERDAY 24
-#define DAYSPERWEEK 7
-#define DAYSPERNYEAR 365
-#define DAYSPERLYEAR 366
-#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
-#define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
-#define MONSPERYEAR 12
-
-#define TM_SUNDAY 0
-#define TM_MONDAY 1
-#define TM_TUESDAY 2
-#define TM_WEDNESDAY 3
-#define TM_THURSDAY 4
-#define TM_FRIDAY 5
-#define TM_SATURDAY 6
-
-#define TM_JANUARY 0
-#define TM_FEBRUARY 1
-#define TM_MARCH 2
-#define TM_APRIL 3
-#define TM_MAY 4
-#define TM_JUNE 5
-#define TM_JULY 6
-#define TM_AUGUST 7
-#define TM_SEPTEMBER 8
-#define TM_OCTOBER 9
-#define TM_NOVEMBER 10
-#define TM_DECEMBER 11
-
-#define TM_YEAR_BASE 1900
-
-#define EPOCH_YEAR 1970
-#define EPOCH_WDAY TM_THURSDAY
-
-#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
-
-/*
-** Since everything in isleap is modulo 400 (or a factor of 400), we know that
-** isleap(y) == isleap(y % 400)
-** and so
-** isleap(a + b) == isleap((a + b) % 400)
-** or
-** isleap(a + b) == isleap(a % 400 + b % 400)
-** This is true even if % means modulo rather than Fortran remainder
-** (which is allowed by C89 but not C99).
-** We use this to avoid addition overflow problems.
-*/
-
-#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
-
-#endif /* !defined TZFILE_H */
Deleted: vendor/tzcode/dist/tzselect.8
===================================================================
--- vendor/tzcode/dist/tzselect.8 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tzselect.8 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,113 +0,0 @@
-.TH TZSELECT 8
-.SH NAME
-tzselect \- select a time zone
-.SH SYNOPSIS
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.B tzselect
-[
-.B \*-c
-.I coord
-] [
-.B \*-n
-.I limit
-] [
-.B \*-\*-help
-] [
-.B \*-\*-version
-]
-.SH DESCRIPTION
-The
-.B tzselect
-program asks the user for information about the current location,
-and outputs the resulting time zone description to standard output.
-The output is suitable as a value for the TZ environment variable.
-.PP
-All interaction with the user is done via standard input and standard error.
-.SH OPTIONS
-.TP
-.BI "\*-c " coord
-Instead of asking for continent and then country and then city,
-ask for selection from time zones whose largest cities
-are closest to the location with geographical coordinates
-.I coord.
-Use ISO 6709 notation for
-.I coord,
-that is, a latitude immediately followed by a longitude. The latitude
-and longitude should be signed integers followed by an optional
-decimal point and fraction: positive numbers represent north and east,
-negative south and west. Latitudes with two and longitudes with three
-integer digits are treated as degrees; latitudes with four or six and
-longitudes with five or seven integer digits are treated as
-.I "DDMM, DDDMM, DDMMSS,"
-or
-.I DDDMMSS
-representing
-.I DD
-or
-.I DDD
-degrees,
-.I MM
-minutes,
-and zero or
-.I SS
-seconds, with any trailing fractions represent fractional minutes or
-(if
-.I SS
-is present) seconds. The decimal point is that of the current locale.
-For example, in the (default) C locale,
-.B "\*-c\ +40.689\*-074.045"
-specifies 40.689\(de\|N, 74.045\(de\|W,
-.B "\*-c\ +4041.4\*-07402.7"
-specifies 40\(de\|41.4\(fm\|N, 74\(de\|2.7\(fm\|W, and
-.B "\*-c\ +404121\*-0740240"
-specifies 40\(de\|41\(fm\|21\(sd\|N, 74\(de\|2\(fm\|40\(sd\|W.
-If
-.I coord
-is not one of the documented forms, the resulting behavior is unspecified.
-.TP
-.BI "\*-n " limit
-When
-.B \*-c
-is used, display the closest
-.I limit
-locations (default 10).
-.TP
-.B "\*-\*-help"
-Output help information and exit.
-.TP
-.B "\*-\*-version"
-Output version information and exit.
-.SH "ENVIRONMENT VARIABLES"
-.TP
-\f3AWK\fP
-Name of a Posix-compliant
-.I awk
-program (default:
-.BR awk ).
-.TP
-\f3TZDIR\fP
-Name of the directory containing time zone data files (default:
-.BR /usr/local/etc/zoneinfo ).
-.SH FILES
-.TP
-\f2TZDIR\fP\f3/iso3166.tab\fP
-Table of ISO 3166 2-letter country codes and country names.
-.TP
-\f2TZDIR\fP\f3/zone1970.tab\fP
-Table of country codes, latitude and longitude, zone names, and
-descriptive comments.
-.TP
-\f2TZDIR\fP\f3/\fP\f2TZ\fP
-Time zone data file for time zone \f2TZ\fP.
-.SH "EXIT STATUS"
-The exit status is zero if a time zone was successfully obtained from the user,
-nonzero otherwise.
-.SH "SEE ALSO"
-newctime(3), tzfile(5), zdump(8), zic(8)
-.SH NOTES
-Applications should not assume that
-.BR tzselect 's
-output matches the user's political preferences.
-.\" This file is in the public domain, so clarified as of
-.\" 2009-05-17 by Arthur David Olson.
Deleted: vendor/tzcode/dist/tzselect.8.txt
===================================================================
--- vendor/tzcode/dist/tzselect.8.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tzselect.8.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,77 +0,0 @@
-TZSELECT(8) System Manager's Manual TZSELECT(8)
-
-NAME
- tzselect - select a time zone
-
-SYNOPSIS
- tzselect [ -c coord ] [ -n limit ] [ --help ] [ --version ]
-
-DESCRIPTION
- The tzselect program asks the user for information about the current
- location, and outputs the resulting time zone description to standard
- output. The output is suitable as a value for the TZ environment
- variable.
-
- All interaction with the user is done via standard input and standard
- error.
-
-OPTIONS
- -c coord
- Instead of asking for continent and then country and then city,
- ask for selection from time zones whose largest cities are
- closest to the location with geographical coordinates coord.
- Use ISO 6709 notation for coord, that is, a latitude immediately
- followed by a longitude. The latitude and longitude should be
- signed integers followed by an optional decimal point and
- fraction: positive numbers represent north and east, negative
- south and west. Latitudes with two and longitudes with three
- integer digits are treated as degrees; latitudes with four or
- six and longitudes with five or seven integer digits are treated
- as DDMM, DDDMM, DDMMSS, or DDDMMSS representing DD or DDD
- degrees, MM minutes, and zero or SS seconds, with any trailing
- fractions represent fractional minutes or (if SS is present)
- seconds. The decimal point is that of the current locale. For
- example, in the (default) C locale, -c +40.689-074.045 specifies
- 40.689oN, 74.045oW, -c +4041.4-07402.7 specifies 40o41.4'N,
- 74o2.7'W, and -c +404121-0740240 specifies 40o41'21''N,
- 74o2'40''W. If coord is not one of the documented forms, the
- resulting behavior is unspecified.
-
- -n limit
- When -c is used, display the closest limit locations (default
- 10).
-
- --help Output help information and exit.
-
- --version
- Output version information and exit.
-
-ENVIRONMENT VARIABLES
- AWK Name of a Posix-compliant awk program (default: awk).
-
- TZDIR Name of the directory containing time zone data files (default:
- /usr/local/etc/zoneinfo).
-
-FILES
- TZDIR/iso3166.tab
- Table of ISO 3166 2-letter country codes and country names.
-
- TZDIR/zone1970.tab
- Table of country codes, latitude and longitude, zone names, and
- descriptive comments.
-
- TZDIR/TZ
- Time zone data file for time zone TZ.
-
-EXIT STATUS
- The exit status is zero if a time zone was successfully obtained from
- the user, nonzero otherwise.
-
-SEE ALSO
- newctime(3), tzfile(5), zdump(8), zic(8)
-
-NOTES
- Applications should not assume that tzselect's output matches the
- user's political preferences.
-
- TZSELECT(8)
Deleted: vendor/tzcode/dist/tzselect.ksh
===================================================================
--- vendor/tzcode/dist/tzselect.ksh 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/tzselect.ksh 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,559 +0,0 @@
-#!/bin/bash
-
-PKGVERSION='(tzcode) '
-TZVERSION=see_Makefile
-REPORT_BUGS_TO=tz at iana.org
-
-# Ask the user about the time zone, and output the resulting TZ value to stdout.
-# Interact with the user via stderr and stdin.
-
-# Contributed by Paul Eggert. This file is in the public domain.
-
-# Porting notes:
-#
-# This script requires a Posix-like shell and prefers the extension of a
-# 'select' statement. The 'select' statement was introduced in the
-# Korn shell and is available in Bash and other shell implementations.
-# If your host lacks both Bash and the Korn shell, you can get their
-# source from one of these locations:
-#
-# Bash <http://www.gnu.org/software/bash/bash.html>
-# Korn Shell <http://www.kornshell.com/>
-# Public Domain Korn Shell <http://www.cs.mun.ca/~michael/pdksh/>
-#
-# For portability to Solaris 9 /bin/sh this script avoids some POSIX
-# features and common extensions, such as $(...) (which works sometimes
-# but not others), $((...)), and $10.
-#
-# This script also uses several features of modern awk programs.
-# If your host lacks awk, or has an old awk that does not conform to Posix,
-# you can use either of the following free programs instead:
-#
-# Gawk (GNU awk) <http://www.gnu.org/software/gawk/>
-# mawk <http://invisible-island.net/mawk/>
-
-
-# Specify default values for environment variables if they are unset.
-: ${AWK=awk}
-: ${TZDIR=`pwd`}
-
-# Output one argument as-is to standard output.
-# Safer than 'echo', which can mishandle '\' or leading '-'.
-say() {
- printf '%s\n' "$1"
-}
-
-# Check for awk Posix compliance.
-($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
-[ $? = 123 ] || {
- say >&2 "$0: Sorry, your '$AWK' program is not Posix compatible."
- exit 1
-}
-
-coord=
-location_limit=10
-zonetabtype=zone1970
-
-usage="Usage: tzselect [--version] [--help] [-c COORD] [-n LIMIT]
-Select a time zone interactively.
-
-Options:
-
- -c COORD
- Instead of asking for continent and then country and then city,
- ask for selection from time zones whose largest cities
- are closest to the location with geographical coordinates COORD.
- COORD should use ISO 6709 notation, for example, '-c +4852+00220'
- for Paris (in degrees and minutes, North and East), or
- '-c -35-058' for Buenos Aires (in degrees, South and West).
-
- -n LIMIT
- Display at most LIMIT locations when -c is used (default $location_limit).
-
- --version
- Output version information.
-
- --help
- Output this help.
-
-Report bugs to $REPORT_BUGS_TO."
-
-# Ask the user to select from the function's arguments,
-# and assign the selected argument to the variable 'select_result'.
-# Exit on EOF or I/O error. Use the shell's 'select' builtin if available,
-# falling back on a less-nice but portable substitute otherwise.
-if
- case $BASH_VERSION in
- ?*) : ;;
- '')
- # '; exit' should be redundant, but Dash doesn't properly fail without it.
- (eval 'set --; select x; do break; done; exit') </dev/null 2>/dev/null
- esac
-then
- # Do this inside 'eval', as otherwise the shell might exit when parsing it
- # even though it is never executed.
- eval '
- doselect() {
- select select_result
- do
- case $select_result in
- "") echo >&2 "Please enter a number in range." ;;
- ?*) break
- esac
- done || exit
- }
-
- # Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout.
- case $BASH_VERSION in
- [01].*)
- case `echo 1 | (select x in x; do break; done) 2>/dev/null` in
- ?*) PS3=
- esac
- esac
- '
-else
- doselect() {
- # Field width of the prompt numbers.
- select_width=`expr $# : '.*'`
-
- select_i=
-
- while :
- do
- case $select_i in
- '')
- select_i=0
- for select_word
- do
- select_i=`expr $select_i + 1`
- printf >&2 "%${select_width}d) %s\\n" $select_i "$select_word"
- done ;;
- *[!0-9]*)
- echo >&2 'Please enter a number in range.' ;;
- *)
- if test 1 -le $select_i && test $select_i -le $#; then
- shift `expr $select_i - 1`
- select_result=$1
- break
- fi
- echo >&2 'Please enter a number in range.'
- esac
-
- # Prompt and read input.
- printf >&2 %s "${PS3-#? }"
- read select_i || exit
- done
- }
-fi
-
-while getopts c:n:t:-: opt
-do
- case $opt$OPTARG in
- c*)
- coord=$OPTARG ;;
- n*)
- location_limit=$OPTARG ;;
- t*) # Undocumented option, used for developer testing.
- zonetabtype=$OPTARG ;;
- -help)
- exec echo "$usage" ;;
- -version)
- exec echo "tzselect $PKGVERSION$TZVERSION" ;;
- -*)
- say >&2 "$0: -$opt$OPTARG: unknown option; try '$0 --help'"; exit 1 ;;
- *)
- say >&2 "$0: try '$0 --help'"; exit 1 ;;
- esac
-done
-
-shift `expr $OPTIND - 1`
-case $# in
-0) ;;
-*) say >&2 "$0: $1: unknown argument"; exit 1 ;;
-esac
-
-# Make sure the tables are readable.
-TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
-TZ_ZONE_TABLE=$TZDIR/$zonetabtype.tab
-for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
-do
- <"$f" || {
- say >&2 "$0: time zone files are not set up correctly"
- exit 1
- }
-done
-
-# If the current locale does not support UTF-8, convert data to current
-# locale's format if possible, as the shell aligns columns better that way.
-# Check the UTF-8 of U+12345 CUNEIFORM SIGN URU TIMES KI.
-! $AWK 'BEGIN { u12345 = "\360\222\215\205"; exit length(u12345) != 1 }' &&
- { tmp=`(mktemp -d) 2>/dev/null` || {
- tmp=${TMPDIR-/tmp}/tzselect.$$ &&
- (umask 77 && mkdir -- "$tmp")
- };} &&
- trap 'status=$?; rm -fr -- "$tmp"; exit $status' 0 HUP INT PIPE TERM &&
- (iconv -f UTF-8 -t //TRANSLIT <"$TZ_COUNTRY_TABLE" >$tmp/iso3166.tab) \
- 2>/dev/null &&
- TZ_COUNTRY_TABLE=$tmp/iso3166.tab &&
- iconv -f UTF-8 -t //TRANSLIT <"$TZ_ZONE_TABLE" >$tmp/$zonetabtype.tab &&
- TZ_ZONE_TABLE=$tmp/$zonetabtype.tab
-
-newline='
-'
-IFS=$newline
-
-
-# Awk script to read a time zone table and output the same table,
-# with each column preceded by its distance from 'here'.
-output_distances='
- BEGIN {
- FS = "\t"
- while (getline <TZ_COUNTRY_TABLE)
- if ($0 ~ /^[^#]/)
- country[$1] = $2
- country["US"] = "US" # Otherwise the strings get too long.
- }
- function abs(x) {
- return x < 0 ? -x : x;
- }
- function min(x, y) {
- return x < y ? x : y;
- }
- function convert_coord(coord, deg, minute, ilen, sign, sec) {
- if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9][0-9][0-9]([^0-9]|$)/) {
- degminsec = coord
- intdeg = degminsec < 0 ? -int(-degminsec / 10000) : int(degminsec / 10000)
- minsec = degminsec - intdeg * 10000
- intmin = minsec < 0 ? -int(-minsec / 100) : int(minsec / 100)
- sec = minsec - intmin * 100
- deg = (intdeg * 3600 + intmin * 60 + sec) / 3600
- } else if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9]([^0-9]|$)/) {
- degmin = coord
- intdeg = degmin < 0 ? -int(-degmin / 100) : int(degmin / 100)
- minute = degmin - intdeg * 100
- deg = (intdeg * 60 + minute) / 60
- } else
- deg = coord
- return deg * 0.017453292519943296
- }
- function convert_latitude(coord) {
- match(coord, /..*[-+]/)
- return convert_coord(substr(coord, 1, RLENGTH - 1))
- }
- function convert_longitude(coord) {
- match(coord, /..*[-+]/)
- return convert_coord(substr(coord, RLENGTH))
- }
- # Great-circle distance between points with given latitude and longitude.
- # Inputs and output are in radians. This uses the great-circle special
- # case of the Vicenty formula for distances on ellipsoids.
- function gcdist(lat1, long1, lat2, long2, dlong, x, y, num, denom) {
- dlong = long2 - long1
- x = cos(lat2) * sin(dlong)
- y = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dlong)
- num = sqrt(x * x + y * y)
- denom = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(dlong)
- return atan2(num, denom)
- }
- # Parallel distance between points with given latitude and longitude.
- # This is the product of the longitude difference and the cosine
- # of the latitude of the point that is further from the equator.
- # I.e., it considers longitudes to be further apart if they are
- # nearer the equator.
- function pardist(lat1, long1, lat2, long2) {
- return abs(long1 - long2) * min(cos(lat1), cos(lat2))
- }
- # The distance function is the sum of the great-circle distance and
- # the parallel distance. It could be weighted.
- function dist(lat1, long1, lat2, long2) {
- return gcdist(lat1, long1, lat2, long2) + pardist(lat1, long1, lat2, long2)
- }
- BEGIN {
- coord_lat = convert_latitude(coord)
- coord_long = convert_longitude(coord)
- }
- /^[^#]/ {
- here_lat = convert_latitude($2)
- here_long = convert_longitude($2)
- line = $1 "\t" $2 "\t" $3
- sep = "\t"
- ncc = split($1, cc, /,/)
- for (i = 1; i <= ncc; i++) {
- line = line sep country[cc[i]]
- sep = ", "
- }
- if (NF == 4)
- line = line " - " $4
- printf "%g\t%s\n", dist(coord_lat, coord_long, here_lat, here_long), line
- }
-'
-
-# Begin the main loop. We come back here if the user wants to retry.
-while
-
- echo >&2 'Please identify a location' \
- 'so that time zone rules can be set correctly.'
-
- continent=
- country=
- region=
-
- case $coord in
- ?*)
- continent=coord;;
- '')
-
- # Ask the user for continent or ocean.
-
- echo >&2 'Please select a continent, ocean, "coord", or "TZ".'
-
- quoted_continents=`
- $AWK '
- BEGIN { FS = "\t" }
- /^[^#]/ {
- entry = substr($3, 1, index($3, "/") - 1)
- if (entry == "America")
- entry = entry "s"
- if (entry ~ /^(Arctic|Atlantic|Indian|Pacific)$/)
- entry = entry " Ocean"
- printf "'\''%s'\''\n", entry
- }
- ' <"$TZ_ZONE_TABLE" |
- sort -u |
- tr '\n' ' '
- echo ''
- `
-
- eval '
- doselect '"$quoted_continents"' \
- "coord - I want to use geographical coordinates." \
- "TZ - I want to specify the time zone using the Posix TZ format."
- continent=$select_result
- case $continent in
- Americas) continent=America;;
- *" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`
- esac
- '
- esac
-
- case $continent in
- TZ)
- # Ask the user for a Posix TZ string. Check that it conforms.
- while
- echo >&2 'Please enter the desired value' \
- 'of the TZ environment variable.'
- echo >&2 'For example, GST-10 is a zone named GST' \
- 'that is 10 hours ahead (east) of UTC.'
- read TZ
- $AWK -v TZ="$TZ" 'BEGIN {
- tzname = "(<[[:alnum:]+-]{3,}>|[[:alpha:]]{3,})"
- time = "(2[0-4]|[0-1]?[0-9])" \
- "(:[0-5][0-9](:[0-5][0-9])?)?"
- offset = "[-+]?" time
- mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
- jdate = "((J[1-9]|[0-9]|J?[1-9][0-9]" \
- "|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])"
- datetime = ",(" mdate "|" jdate ")(/" time ")?"
- tzpattern = "^(:.*|" tzname offset "(" tzname \
- "(" offset ")?(" datetime datetime ")?)?)$"
- if (TZ ~ tzpattern) exit 1
- exit 0
- }'
- do
- say >&2 "'$TZ' is not a conforming Posix time zone string."
- done
- TZ_for_date=$TZ;;
- *)
- case $continent in
- coord)
- case $coord in
- '')
- echo >&2 'Please enter coordinates' \
- 'in ISO 6709 notation.'
- echo >&2 'For example, +4042-07403 stands for'
- echo >&2 '40 degrees 42 minutes north,' \
- '74 degrees 3 minutes west.'
- read coord;;
- esac
- distance_table=`$AWK \
- -v coord="$coord" \
- -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
- "$output_distances" <"$TZ_ZONE_TABLE" |
- sort -n |
- sed "${location_limit}q"
- `
- regions=`say "$distance_table" | $AWK '
- BEGIN { FS = "\t" }
- { print $NF }
- '`
- echo >&2 'Please select one of the following' \
- 'time zone regions,'
- echo >&2 'listed roughly in increasing order' \
- "of distance from $coord".
- doselect $regions
- region=$select_result
- TZ=`say "$distance_table" | $AWK -v region="$region" '
- BEGIN { FS="\t" }
- $NF == region { print $4 }
- '`
- ;;
- *)
- # Get list of names of countries in the continent or ocean.
- countries=`$AWK \
- -v continent="$continent" \
- -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
- '
- BEGIN { FS = "\t" }
- /^#/ { next }
- $3 ~ ("^" continent "/") {
- ncc = split($1, cc, /,/)
- for (i = 1; i <= ncc; i++)
- if (!cc_seen[cc[i]]++) cc_list[++ccs] = cc[i]
- }
- END {
- while (getline <TZ_COUNTRY_TABLE) {
- if ($0 !~ /^#/) cc_name[$1] = $2
- }
- for (i = 1; i <= ccs; i++) {
- country = cc_list[i]
- if (cc_name[country]) {
- country = cc_name[country]
- }
- print country
- }
- }
- ' <"$TZ_ZONE_TABLE" | sort -f`
-
-
- # If there's more than one country, ask the user which one.
- case $countries in
- *"$newline"*)
- echo >&2 'Please select a country' \
- 'whose clocks agree with yours.'
- doselect $countries
- country=$select_result;;
- *)
- country=$countries
- esac
-
-
- # Get list of names of time zone rule regions in the country.
- regions=`$AWK \
- -v country="$country" \
- -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
- '
- BEGIN {
- FS = "\t"
- cc = country
- while (getline <TZ_COUNTRY_TABLE) {
- if ($0 !~ /^#/ && country == $2) {
- cc = $1
- break
- }
- }
- }
- /^#/ { next }
- $1 ~ cc { print $4 }
- ' <"$TZ_ZONE_TABLE"`
-
-
- # If there's more than one region, ask the user which one.
- case $regions in
- *"$newline"*)
- echo >&2 'Please select one of the following' \
- 'time zone regions.'
- doselect $regions
- region=$select_result;;
- *)
- region=$regions
- esac
-
- # Determine TZ from country and region.
- TZ=`$AWK \
- -v country="$country" \
- -v region="$region" \
- -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
- '
- BEGIN {
- FS = "\t"
- cc = country
- while (getline <TZ_COUNTRY_TABLE) {
- if ($0 !~ /^#/ && country == $2) {
- cc = $1
- break
- }
- }
- }
- /^#/ { next }
- $1 ~ cc && $4 == region { print $3 }
- ' <"$TZ_ZONE_TABLE"`
- esac
-
- # Make sure the corresponding zoneinfo file exists.
- TZ_for_date=$TZDIR/$TZ
- <"$TZ_for_date" || {
- say >&2 "$0: time zone files are not set up correctly"
- exit 1
- }
- esac
-
-
- # Use the proposed TZ to output the current date relative to UTC.
- # Loop until they agree in seconds.
- # Give up after 8 unsuccessful tries.
-
- extra_info=
- for i in 1 2 3 4 5 6 7 8
- do
- TZdate=`LANG=C TZ="$TZ_for_date" date`
- UTdate=`LANG=C TZ=UTC0 date`
- TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'`
- UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'`
- case $TZsec in
- $UTsec)
- extra_info="
-Selected time is now: $TZdate.
-Universal Time is now: $UTdate."
- break
- esac
- done
-
-
- # Output TZ info and ask the user to confirm.
-
- echo >&2 ""
- echo >&2 "The following information has been given:"
- echo >&2 ""
- case $country%$region%$coord in
- ?*%?*%) say >&2 " $country$newline $region";;
- ?*%%) say >&2 " $country";;
- %?*%?*) say >&2 " coord $coord$newline $region";;
- %%?*) say >&2 " coord $coord";;
- *) say >&2 " TZ='$TZ'"
- esac
- say >&2 ""
- say >&2 "Therefore TZ='$TZ' will be used.$extra_info"
- say >&2 "Is the above information OK?"
-
- doselect Yes No
- ok=$select_result
- case $ok in
- Yes) break
- esac
-do coord=
-done
-
-case $SHELL in
-*csh) file=.login line="setenv TZ '$TZ'";;
-*) file=.profile line="TZ='$TZ'; export TZ"
-esac
-
-test -t 1 && say >&2 "
-You can make this change permanent for yourself by appending the line
- $line
-to the file '$file' in your home directory; then log out and log in again.
-
-Here is that TZ value again, this time on standard output so that you
-can use the $0 command in shell scripts:"
-
-say "$TZ"
Deleted: vendor/tzcode/dist/usno1988
===================================================================
--- vendor/tzcode/dist/usno1988 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/usno1988 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,109 +0,0 @@
-# From Arthur David Olson (1989-01-19):
-#
-# Here's some United States Naval Observatory time zone data from
-# February 1988. It's here mostly to convince you that the USNO has indeed
-# been updating its files (see its 1989 data elsewhere).
-#
-ANDORRA 1 H AHEAD OF UTC
-ARGENTINA 3 H BEHIND UTC
-BRASIL WEST 5 H BEHIND UTC (CRUZEIRO DO SUL)
-BRASIL CENTRAL 4 H BEHIND UTC (MANAUS)
-BRASIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SP, BRASILIA
-BRASIL 2 H BEHIND UTC ATLANTIC ISLANDS
-BRAZIL 5 H BEHIND UTC WEST (CRUZEIRO DO SUL)
-BRAZIL 4 H BEHIND UTC CENTRAL (MANAUS)
-BRAZIL 3 H BEHIND UTC COASTAL STATES, RIO, SP, BRASILIA
-BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS.
-BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS
-BULGARIA 2 H AHEAD OF UTC WINTER
-BULGARIA 3 H AHEAD OF UTC SUMMER MAR31 - SEP 85, 0100 LOCAL
-CHINA 8 H AHEAD OF UTC; ALL OF CHINA, INCL TAIWAN
-CUBA 5 H BEHIND UTC IN WINTER
-CUBA 4 H BEHIND UTC MAY 8 - OCT 8
-CYPRUS 2 H AHEAD UTC IN WINTER
-CYPRUS 3 H AHEAD UTC MAR 25 - SEP 30
-DENMARK 1 H AHEAD UTC IN WINTER
-DENMARK 2 H AHEAD UTC MAR 31 - SEP 30 , 0200 LOCAL
-DENMK. FAEROE IS 1 H AHEAD UTC MAR 31 - SEP 30 , 0200 LOCAL
-EGYPT 2 H AHEAD UTC
-EGYPT 3 H AHEAD UTC SUMMER (AFTER RAMADAN)
-ENGLAND ON UTC IN WINTER; WALES, SCOTLAND, N.I., CH.IS.
-ENGLAND 1 H AHEAD OF UTC; SUMMER TIL 28 OCT 0200 LOCAL
-FINLAND 2 H AHEAD OF UTC IN WINTER
-FINLAND 3 H AHEAD OF UTC MAR 25 - SEP 30
-FRANCE 1 H AHEAD OF UTC IN WINTER
-FRANCE 2 H AHEAD OF UTC MAR 31 - SEP 30 , 0100 LOCAL
-GREECE 2 H AHEAD OF UTC IN WINTER
-GREECE 3 H AHEAD OF UTC IN SUMMER EFF. 31MAR85 02/03 LOCAL
-GREECE 3 H AHEAD OF UTC MAR 25 - SEP 30
-GREENLAND 4 H BEHIND UTC IN THULE AIRBASE YEAR ROUND
-GREENLAND 3 H BEHIND UTC IN WINTER AT SONDRESTROM
-GREENLAND 2 H BEHIND UTC 30 MAR - 30 SEP 2200 LOCAL AT -"-
-GREENLAND 2 H BEHIND UTC AROUND SCORESBY SUND
-ICELAND ON UTC
-IRAN 3.5H AHEAD OF UTC
-IRELAND ON UTC IN WINTER
-IRELAND 1 H AHEAD OF UTC MAR 31 - OCT 23 0200 LOCAL
-ITALY 1 H AHEAD OF UTC IN WINTER
-ITALY 2 H AHEAD OF UTC MAR 31 - SEP 30, 0030 LOCAL
-JAMAICA 5 H BEHIND UTC IN WINTER
-JAMAICA 4 H BEHIND UTC APR 29 - OCT 29
-LIBYA 2 H AHEAD OF UTC
-MEXICO BAJA CAL N 8 H BEHIND UTC IN WINTER; NORTH BAJA CAL, TIJUANA
-MEXICO BAJA CAL N 7 H BEHIND UTC APR 29 - OCT 29
-MEXICO BAJA CAL S 7 H BEHIND UTC ALL YEAR; MAZATLAN
-MEXICO CENTRAL 6 H BEHIND UTC ALL YEAR; MEXICO CITY
-MONACO 1 H AHEAD UTC IN WINTER
-MONACO 2 H AHEAD UTC MAR 25 - SEP30
-PARAGUAY 4 H BEHIND UTC IN WINTER
-PARAGUAY 3 H BEHIND UTC SEP 30 - MAR 30
-POLAND 1 H AHEAD OF UTC IN WINTER
-POLAND 2 H AHEAD OF UTC MAR 24 - SEP 0200 LOCAL
-PORTUGAL ON UTC IN WINTER
-PORTUGAL 1 H AHEAD OF UTC IN SUMMER MAR 31 - SEP 29 0100 LOCAL
-PORTUGAL AZORES 1 H BEHIND UTC IN WINTER
-PORTUGAL AZORES ON UTC IN SUMMER MAR 31 - SEP 29
-PORTUGAL MADEIRA ON UTC ALL YEAR;
-ROMANIA 2 H AHEAD OF UTC IN WINTER
-ROMANIA 3 H AHEAD OF UTC APR 3 - SEP 24
-SCOTLAND SEE ENGLAND
-SWITZERLAND 1 H AHEAD OF UTC IN WINTER
-SWITZERLAND 2 H AHEAD OF UTC MAR 31 - SEP 30 0200 LOCAL
-TURKEY 3 H AHEAD OF UTC
-USA EASTERN 5 H BEHIND UTC IN WINTER; NEW YORK, WASHINGTON
-USA EASTERN 4 H BEHIND UTC APR 29 - OCT 29
-USA CENTRAL 6 H BEHIND UTC IN WINTER; CHICAGO, HOUSTON
-USA CENTRAL 5 H BEHIND UTC APR 29 - OCT 29
-USA MOUNTAIN 7 H BEHIND UTC IN WINTER; DENVER
-USA MOUNTAIN 6 H BEHIND UTC APR 29 - OCT 29
-USA PACIFIC 8 H BEHIND UTC IN WINTER; L.A., SAN FRANCISCO
-USA PACIFIC 7 H BEHIND UTC APR 29 - OCT 29
-USA ALASKA STD 9 H BEHIND UTC IN WINTER; MOST OF ALASKA (AKST)
-USA ALASKA STD 8 H BEHIND UTC APR 29 - OCT 29 (AKDT)
-USA ALEUTIAN 10 H BEHIND UTC IN WINTER; ISLANDS WEST OF 170W
-USA - " - 9 H BEHIND UTC APR 29 - OCT 29
-USA HAWAII 10 H BEHIND UTC ALL YEAR;
-USA BERING 11 H BEHIND UTC ALL YEAR; SAMOA, MIDWAY
-USSR WEST EUROP 3 H AHEAD OF UTC IN WINTER; LENINGRAD, MOSCOW
-USSR WEST EUROP 4 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL EUR 4 H AHEAD OF UTC IN WINTER; ROSTOV, BAKU
-USSR CENTRAL EUR 5 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST EUROP 5 H AHEAD OF UTC IN WINTER; SVERDLOVSK
-USSR EAST EUROP 6 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST SIBERIAN 6 H AHEAD OF UTC IN WINTER; TASHKENT, ALMA ATA
-USSR WEST SIBERIAN 7 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST-CENTRAL 7 H AHEAD OF UTC IN WINTER; NOVOSIBIRSK
-USSR WEST-CENTRAL 8 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST-CENTRAL 8 H AHEAD OF UTC IN WINTER; IRKUTSK
-USSR WEST-CENTRAL 9 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL SIB 9 H AHEAD OF UTC IN WINTER; YAKUTSK
-USSR CENTRAL SIB 10 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL SIB 10 H AHEAD OF UTC IN WINTER; VLADIVOSTOK
-USSR CENTRAL SIB 11 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 11 H AHEAD OF UTC IN WINTER; MAGADAN
-USSR EAST SIBERIA 12 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 12 H AHEAD OF UTC IN WINTER; PETROPAVLOVSK
-USSR EAST SIBERIA 13 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 13 H AHEAD OF UTC IN WINTER; UELEN
-USSR EAST SIBERIA 14 H AHEAD OF UTC APR 1 - SEP 30
-WALES SEE ENGLAND
Deleted: vendor/tzcode/dist/usno1989
===================================================================
--- vendor/tzcode/dist/usno1989 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/usno1989 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,450 +0,0 @@
-# From Arthur David Olson (1989-01-19):
-#
-# Here's time zone information from the United States Naval Observatory;
-# no corrections have been made, and there are some obvious challenges.
-# The USNO warns:
-# DUE TO FREQUENT CHANGES IN THE LOCAL LAWS GOVERNING DAYLIGHT
-# SAVING TIME, WE CANNOT GUARANTEE THE ACCURACY OF THIS
-# INFORMATION. PLEASE ALERT US TO ANY DISCREPANCY YOU MAY
-# DISCOVER.
-#
-AFGHANISTAN 4.5H AHEAD OF UTC
-ALBANIA 1 H AHEAD OF UTC
-ALBANIA 2 H AHEAD OF UTC MAR 27 - SEP 24
-ALBANIA (ESTIMATED)
-ALGERIA 1 H AHEAD OF UTC
-AMERICAN SAMOA 11 H BEHIND UTC
-ANDORRA 1 H AHEAD OF UTC
-ANDORRA 2 H AHEAD OF UTC MAR 27 - SEP 24
-ANDORRA (ESTIMATED)
-ANGOLA 1 H AHEAD OF UTC
-ARGENTINA 3 H BEHIND UTC
-ARUBA 4 H BEHIND UTC ALSO BONAIRE, CURACAO,
-ARUBA ST.MAARTEN
-AUSTRALIA WEST 8 H AHEAD OF UTC PERTH, EXMOUTH
-AUSTRALIA N.T. 9.5H AHEAD OF UTC DARWIN NO ADVANCED TIME
-AUSTRALIA N.T. IN SUMMER
-AUSTRALIA SOUTH 9.5H AHEAD OF UTC ADELAIDE
-AUSTRALIA INCLUDING BROKEN HILL, NSW
-AUSTRALIA SOUTH 10.5H AHEAD OF UTC ADELAIDE OCT 30, '88-MAR
-AUSTRALIA SOUTH 18, '89 INCLUDING BROKEN
-AUSTRIALIA SOUTH HILL, NSW
-AUSTRALIA QUEENL 10 H AHEAD OF UTC
-AUSTRALIA NSW 10 H AHEAD OF UTC SYDNEY
-AUSTRALIA NSW 11 H AHEAD OF UTC SYDNEY OCT 30, '88-MAR 18,
-AUSTRALIA NSW '89
-AUSTRALIA TASM. 10 H AHEAD OF UTC HOBART
-AUSTRALIA TASM. 11 H AHEAD OF UTC HOBART OCT 30, '88-MAR 18,
-AUSTRALIA TASM. '89
-AUSTRIA 1 H AHEAD OF UTC
-AUSTRIA 2 H AHEAD OF UTC MAR 27 - SEPT 24
-AZORES SEE PORTUGAL
-BAHAMAS 5 H BEHIND UTC EXCLUDING TURKS AND CAICOS
-BAHAMAS ISLANDS)
-BAHAMAS 4 H BEHIND UTC APR 3 - OCT 29 (SAME
-BAHAMAS EXCLUSION)
-BAHRAIN 3 H AHEAD OF UTC
-BANGLADESH 6 H AHEAD OF UTC
-BARBADOS 4 H BEHIND UTC
-BELGIUM 1 H AHEAD OF UTC
-BELGIUM 2 H AHEAD OF UTC MAR 27 - SEP 24
-BELIZE 6 H BEHIND UTC
-BENIN PEOPLES REP 1 H AHEAD OF UTC DAHOMEY
-BERMUDA 4 H BEHIND UTC
-BERMUDA 3 H BEHIND UTC APR 3 - OCT 29
-BHUTAN 6 H AHEAD OF UTC
-BOLIVIA 4 H BEHIND UTC
-BONAIRE 4 H BEHIND UTC ALSO ARUBA,CURACAO,
-BONAIRE ST.MAARTEN, SABA
-BOTSWANA 2 H AHEAD OF UTC
-BRAZIL WEST 5 H BEHIND UTC TERRITORY OF ACRE
-BRAZIL WEST 4 H BEHIND UTC ACRE OCT 23, '88-FEB 11,
-BRAZIL '89 (ESTIMATED)
-BRAZIL CENTRAL 4 H BEHIND UTC MANAUS
-BRAZIL CENTRAL 3 H BEHIND UTC MANAUS OCT 23, '88-FEB 11,
-BRAZIL CENTRAL '89 (ESTIMATED)
-BRAZIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SAO
-BRAZIL EAST PAULO, BRASILIA
-BRAZIL EAST 2 H BEHIND UTC COASTAL STATES, RIO, SAO
-BRAZIL PAULO, BRASILIA OCT 23,
-BRAZIL '88-FEB 11, '89
-BRAZIL (ESTIMATED)
-BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS, FERNANDO
-BRAZIL DE NORONHA
-BRAZIL 1 H BEHIND UTC OCT 23, '88-FEB 11, '89
-BRAZIL (ESTIMATED)
-BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS.
-BRITISH VIRGIN I. 4 H BEHIND UTC
-BRUNEI 8 H AHEAD OF UTC
-BULGARIA 2 H AHEAD OF UTC
-BULGARIA 3 H AHEAD OF UTC MAR 27 - SEP 24
-BURKINA FASO ON UTC
-BURMA 6.5H AHEAD OF UTC
-BURUNDI 2 H AHEAD OF UTC
-CAMBODIA SEE KAMPUCHEA
-CAMEROON 1 H AHEAD OF UTC
-CANADA NEW FDL 3.5H BEHIND UTC ST.JOHN'S
-CANADA NEW FDL 1.5H BEHIND UTC APR 3 - OCT 29
-CANADA ATLANTIC 4 H BEHIND UTC HALIFAX
-CANADA ATLANTIC 3 H BEHIND UTC APR 3 - OCT 29
-CANADA EASTERN 5 H BEHIND UTC TORONTO, MONTREAL, OTTAWA
-CANADA EASTERN 4 H BEHIND UTC APR 3 - OCT 29
-CANADA CENTRAL 6 H BEHIND UTC REGINA, WINNIPEG
-CANADA CENTRAL 5 H BEHIND UTC APR 3 - OCT 29
-CANADA MOUNTAIN 7 H BEHIND UTC CALGARY, EDMONTON
-CANADA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 29
-CANADA PACIFIC 8 H BEHIND UTC VANCOUVER
-CANADA PACIFIC 7 H BEHIND UTC APR 3 - OCT 29
-CANADA YUKON SAME AS PACIFIC DAWSON
-CAPE VERDE 1 H BEHIND UTC
-CAYMAN ISLANDS 5 H BEHIND UTC
-CAROLINE ISLAND 10 H AHEAD OF UTC EXCLUDING PONAPE IS.,
-CAROLINE ISLAND KUSAIE, AND PINGELAP
-CENTRAL AFRICA 1 H AHEAD OF UTC
-CEYLON 5.5H AHEAD OF UTC, SEE SRI LANKA
-CHAD 1 H AHEAD OF UTC
-CHANNEL ISLANDS SEE ENGLAND
-CHILE 4 H BEHIND UTC CONTINENTAL
-CHILE 3 H BEHIND UTC OCT 9, '88-MAR 11, '89
-CHILE 6 H BEHIND UTC EASTER ISLAND
-CHILE 5 H BEHIND UTC OCT 9, '88-MAR 11, '89
-CHINA 8 H AHEAD OF UTC ALL OF CHINA, INCL TAIWAN
-CHINA 9 H AHEAD OF UTC APR 17 - SEP 10
-COCOS (Keeling) I. 6.5H AHEAD OF UTC
-COLOMBIA 5 H BEHIND UTC
-COMOROS 3 H AHEAD OF UTC
-CONGO 1 H AHEAD OF UTC
-COOK ISLANDS 10 H BEHIND UTC
-COOK ISLANDS 9.5H BEHIND UTC OCT 30, '88-MAR 24, '89
-COOK ISLANDS (ESTIMATED)
-COSTA RICA 6 H BEHIND UTC
-COTE D'IVOIRE ON UTC
-CUBA 5 H BEHIND UTC
-CUBA 4 H BEHIND UTC MAR 20 - OCT 8
-CURACAO 4 H BEHIND UTC ALSO BONAIRE, ARUBA,
-CURACAO ST.MAARTEN
-CYPRUS 2 H AHEAD OF UTC
-CYPRUS 3 H AHEAD OF UTC MAR 27 - SEP 24
-CZECHOSLOVAKIA 1 H AHEAD OF UTC
-CZECHOSLOVAKIA 2 H AHEAD OF UTC MAR 27 - SEP 24
-DENMARK 1 H AHEAD OF UTC
-DENMARK 2 H AHEAD OF UTC MAR 27 - SEP 24
-DENMK. FAEROE IS 1 H AHEAD OF UTC MAR 27 - SEP 24
-DJIBOUTI 3 H AHEAD OF UTC
-DOMINICA 4 H BEHIND UTC
-DOMINICAN REP 4 H BEHIND UTC
-ECUADOR 5 H BEHIND UTC CONTINENTAL
-ECUADOR 6 H BEHIND UTC GALAPAGOS ISLANDS
-EGYPT 2 H AHEAD OF UTC
-EGYPT 3 H AHEAD OF UTC MAY 17 - SEP 30 (AFTER
-EGYPT RAMADAN)
-EL SALVADOR 6 H BEHIND UTC
-ENGLAND ON UTC (WALES, SCOTLAND, N.I.,
-ENGLAND CH. IS.)
-ENGLAND 1 H AHEAD OF UTC MAR 27 - OCT 22
-ENEZUELA 4 H BEHIND UTC
-EQUITORIAL GUINEA 1 H AHEAD OF UTC
-ETHIOPIA 3 H AHEAD OF UTC
-FALKLAND ISLANDS 4 H BEHIND UTC
-FALKLAND ISLANDS 3 H BEHIND UTC SEP 11, '88-APR 15, '89
-FALKLAND ISLANDS (ESTIMATED)
-FAROE ISLAND ON UTC
-FAROE ISLAND 1 H AHEAD OF UTC MAR 27 - SEP 24
-FIJI 12 H AHEAD OF UTC
-FINLAND 2 H AHEAD OF UTC
-FINLAND 3 H AHEAD OF UTC MAR 27 - SEP 24
-FRANCE 1 H AHEAD OF UTC
-FRANCE 2 H AHEAD OF UTC MAR 27 - SEP 24
-FRENCH GUIANA 3 H BEHIND UTC
-FRENCH POLYNESIA 9 H BEHIND UTC GAMBIER ISLAND
-FRENCH POLYNESIA 9.5H BEHIND UTC MARQUESAS ISLANDS
-FRENCH POLYNESIA 10 H BEHIND UTC SOCIETY ISLANDS, TUBUAI
-FRENCH POLYNESIA ISLANDS, TUAMOTU ISLAND,
-FRENCH POLYNESIA TAHITI
-GABON 1 H AHEAD OF UTC
-GAMBIA ON UTC
-GERMANY ALL 1 H AHEAD OF UTC
-GERMANY ALL 2 H AHEAD OF UTC MAR 27 - SEP 24
-GHANA ON UTC
-GIBRALTAR 1 H AHEAD OF UTC
-GIBRALTAR 2 H AHEAD OF UTC MAR 27 - SEP 24
-GREECE 2 H AHEAD OF UTC
-GREECE 3 H AHEAD OF UTC MAR 27 - SEP 24
-GREENLAND 4 H BEHIND UTC THULE AIRBASE YEAR ROUND
-GREENLAND 3 H BEHIND UTC ANGMAGSSALIK AND W. COAST
-GREENLAND 2 H BEHIND UTC MAR 27 - SEP 24
-GREENLAND 1 H BEHIND UTC SCORESBYSUND
-GREENLAND ON UTC MAR 27 - SEP 24
-GRENADA 4 H BEHIND UTC
-GUADELOUPE 4 H BEHIND UTC ST. BARTHELEMY, NORTHERN
-GUADELOUPE ST. MARTIN MARTINIQUE
-GUAM 10 H AHEAD OF UTC
-GUATEMALA 6 H BEHIND UTC
-GUINEA ON UTC
-GUINEA BISSAU ON UTC
-GUINEA REPUBLIC ON UTC
-GUINEA EQUATORIAL 1 H AHEAD OF UTC
-GUYANA 3 H BEHIND UTC
-HAITI 5 H BEHIND UTC
-HAITI 4 H BEHIND UTC APR 3 - OCT 29
-HOLLAND SEE NETHERLANDS
-HONDURAS 6 H BEHIND UTC
-HONG KONG 8 H AHEAD OF UTC
-HUNGARY 1 H AHEAD OF UTC
-HUNGARY 2 H AHEAD OF UTC MAR 27 - SEP 24
-ICELAND ON UTC
-INDIA 5.5H AHEAD OF UTC INCLUDING ANDAMAN ISLANDS
-INDONESIA WEST 7 H AHEAD OF UTC SUMATRA, JAVA, BALI,
-INDONESIA WEST JAKARTA
-INDONESIA CENTRAL 8 H AHEAD OF UTC KALIMANTAN, SULAWESI
-INDONESIA EAST 9 H AHEAD OF UTC IRIAN, BARAT
-IRAN 3.5H AHEAD OF UTC
-IRAQ 3 H AHEAD OF UTC
-IRAQ 4 H AHEAD OF UTC APR 1 - SEP 30
-IRELAND ON UTC
-IRELAND 1 H AHEAD OF UTC MAR 27 - OCT 22
-ISRAEL 2 H AHEAD OF UTC
-ISRAEL 3 H AHEAD OF UTC APR 10 - SEP 3
-ITALY 1 H AHEAD OF UTC
-ITALY 2 H AHEAD OF UTC MAR 27 - SEP 24
-IVORY COAST ON UTC
-IWAN 8 H AHEAD OF UTC
-JAMAICA 5 H BEHIND UTC
-JAPAN 9 H AHEAD OF UTC
-JOHNSTON ISLAND 10 H BEHIND UTC
-JORDAN 2 H AHEAD OF UTC
-JORDAN 3 H AHEAD OF UTC APR 1 - OCT 6
-KAMPUCHEA 7 H AHEAD OF UTC
-KENYA 3 H AHEAD OF UTC
-KIRIBATI, REP OF 12 H AHEAD OF UTC CANTON, ENDERBURY ISLANDS
-KIRIBATI, REP OF 11 H AHEAD OF UTC CHRISTMAS ISLAND
-KOREA 9 H AHEAD OF UTC
-KOREA, REP OF 9 H AHEAD OF UTC
-KOREA, REP OF 10 H AHEAD OF UTC MAY 8 - OCT 8
-KUWAIT 3 H AHEAD OF UTC
-KUSAIE, PINGELAP 12 H AHEAD OF UTC INCLUDING MARSHALL IS.,
-KUSAIE, PINGELAP EXCLUDING KWAJALEIN)
-KWAJALEIN 12 H BEHIND UTC
-LAOS 7 H AHEAD OF UTC
-LEBANON 2 H AHEAD OF UTC
-LEBANON 3 H AHEAD OF UTC JUN 1 - OCT 31
-LEEWARD ISLANDS 4 H BEHIND UTC ANTIGUA, DOMINICA,
-LEEWARD ISLANDS MONTSERRAT, ST.
-LEEWARD ISLAANDS CHRISTOPHER, ST. KITTS,
-LEEWARD ISLANDS NEVIS, ANGUILLA
-LESOTHO 2 H AHEAD OF UTC
-LIBERIA ON UTC
-LIBYAN ARAB 1 H AHEAD OF UTC JAMAHIRIYA/LIBYA
-LIBYAN ARAB 2 H AHEAD OF UTC APR 1 - SEP 30 JAMAHIRIYA/LIBYA
-LIECHTENSTEIN 1 H AHEAD OF UTC
-LIECHTENSTEIN 2 H AHEAD OF UTC MAR 27 - SEP 24
-LUXEMBOURG 1 H AHEAD OF UTC
-LUXEMBOURG 2 H AHEAD OF UTC MAR 27 - SEP 24
-MACAO 8 H AHEAD OF UTC
-MADAGASCAR 3 H AHEAD OF UTC
-MADEIRA SEE PORTUGAL
-MALAWI 2 H AHEAD OF UTC
-MALAYSIA 8 H AHEAD OF UTC
-MALDIVES 5 H AHEAD OF UTC
-MALI ON UTC
-MALTA 1 H AHEAD OF UTC
-MALTA 2 H AHEAD OF UTC MAR 27 - SEP 24
-MARTINIQUE 4 H BEHIND UTC
-MAURITANIA ON UTC
-MAURITIUS 4 H AHEAD OF UTC
-MARIANA ISLAND 10 H AHEAD OF UTC EXCLUDING GUAM
-MEXICO BAJA CAL N 7 H BEHIND UTC BAJA CALIFORNIA SUR AND
-MEXICO BAJA CAL N N. PACIFIC COAST (STATES
-MEXICO BAJA CAL N OF SINALOA AND SONORA)
-MEXICO BAJA CAL N 8 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
-MEXICO BAJA CAL N - OCT 29
-MEXICO BAJA CAL N 7 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
-MEXICO BAJA CAL N - 0CT 29
-MEXICO 6 H BEHIND UTC STATES OF DURANGO,
-MEXICO COAHUILA, NUEVO LEON,
-MEXICO TAMAULIPAS
-MEXICO 5 H BEHIND UTC STATES OF DURANGO,
-MEXICO COAHUILA, NUEVO LEON,
-MEXICO TAMAULIPAS APR 3 - OCT 29
-MEXICO 6 H BEHIND UTC GENERAL MEXICO, STATES OF
-MEXICO CAMPECHE, QUINTANA ROO AND
-MEXICO YUCATAN
-MIDWAY ISLAND 11 H BEHIND UTC
-MONACO 1 H AHEAD OF UTC
-MONACO 2 H AHEAD OF UTC MAR 27 - SEP 24
-MONGOLIA 8 H AHEAD OF UTC
-MONGOLIA 9 H AHEAD OF UTC MAR 27 - SEP 24
-MONTSERRAT 4 H BEHIND UTC
-MOROCCO ON UTC
-MOZAMBIQUE 2 H AHEAD OF UTC
-NAMIBIA 2 H AHEAD OF UTC
-NAURU, REP OF 12 H AHEAD OF UTC
-NEPAL 5H45M AHEAD OF UTC
-NETHERLANDS 1 H AHEAD OF UTC
-NETHERLANDS 2 H AHEAD OF UTC MAR 27 - SEP 24
-NETHERLANDS 4 H BEHIND UTC ANTILLES AND SOUTHERN ST.
-NETHERLANDS MAARTEN
-NEW CALEDONIA 11 H AHEAD OF UTC
-NEW HEBRIDES SEE VANUATU
-NEW ZEALAND 12 H AHEAD OF UTC (EXCLUDING CHATHAM ISLAND)
-NEW ZEALAND 13 H AHEAD OF UTC OCT 30, '88-MAR 4, '89
-NEW ZEALAND 12H45M AHEAD OF UTC CHATHAM ISLAND
-NICARAGUA 6 H BEHIND UTC
-NIGER 1 H AHEAD OF UTC
-NIGERIA 1 H AHEAD OF UTC
-NIUE ISLAND 11 H BEHIND UTC
-NORFOLK ISLAND 11H30M AHEAD OF UTC
-NORTHERN IRELAND ON UTC WALES, SCOTLAND, N.I.,
-NORTHERN IRELAND CH.IS.
-NORTHERN IRELAND 1 H AHEAD OF UTC MAR 27 - OCT 22
-NORWAY 1 H AHEAD OF UTC
-NORWAY 2 H AHEAD OF UTC MAR 27 - SEP 24
-OGO ON UTC
-OMAN 4 H AHEAD OF UTC
-PACIFIC ISLAND T.T.
-PALAU ISLAND 9 H AHEAD OF UTC
-PAKISTAN 5 H AHEAD OF UTC
-PANAMA 5 H BEHIND UTC
-PAPUA NEW GUINEA 10 H AHEAD OF UTC INCLUDING BOUGAINVILLE
-PAPUA NEW GUINEA ISLAND
-PARAGUAY 4 H BEHIND UTC
-PARAGUAY 3 H BEHIND UTC OCT 1, '88-MAR 31, '89
-PERU 5 H BEHIND UTC
-PHILIPPINES 8 H AHEAD OF UTC
-PONAPE ISLAND 11 H AHEAD OF UTC
-POLAND 1 H AHEAD OF UTC
-POLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
-PORTUGAL MAINLAND ON UTC
-PORTUGAL MAINLAND 1 H AHEAD OF UTC MAR 27 - SEP 24
-PORTUGAL AZORES 1 H BEHIND UTC
-PORTUGAL AZORES ON UTC MAR 27 - SEP 24
-PORTUGAL MADEIRA ON UTC
-PORTUGAL MADEIRA 1 H AHEAD OF UTC MAR 27 - SEP 24
-PUERTO RICO 4 H BEHIND UTC
-QATAR 3 H AHEAD OF UTC
-ROMANIA 2 H AHEAD OF UTC
-ROMANIA 3 H AHEAD OF UTC MAR 27 - SEP 24
-RUSSIA SEE USSR
-RWANDA 2 H AHEAD OF UTC
-SABA 4 H BEHIND UTC ALSO BONAIRE, CURACAO,
-SAMOA 11 H BEHIND UTC
-SAN MARINO 1 H AHEAD OF UTC
-SAN MARINO 2 H AHEAD OF UTC MAR 27 - SEP 24
-SAN SALVADOR 6 H BEHIND UTC
-SAO TOME ISLAND ON UTC AND PRINCIPE ISLAND
-SAUDI ARABIA 3 H AHEAD OF UTC
-SCOTLAND SEE ENGLAND
-SENEGAL ON UTC
-SEYCHELLES 4 H AHEAD OF UTC
-SIERRA LEONE ON UTC
-SINGAPORE 8 H AHEAD OF UTC
-SOLOMON ISLANDS 11 H AHEAD OF UTC EXCLUDING BOUGAINVILLE
-SOLOMON ISLANDS ISLAND
-SOMALI 3 H AHEAD OF UTC
-SOUTH AFRICA 2 H AHEAD OF UTC
-SPAIN CANARY IS ON UTC
-SPAIN CANARY IS 1 H AHEAD OF UTC MAR 27 - SEP 24
-SPAIN 1 H AHEAD OF UTC CONTINENTAL, BALEARIC AND
-SPAIN MALLORCA ISLANDS
-SPAIN 2 H AHEAD OF UTC CONTINENTAL, BALEARIC AND
-SPAIN MALLORCA ISLANDS MAR 27 -
-SPAIN SEP 24
-SPAIN MAINLAND 1 H AHEAD OF UTC MELILLA
-SPAIN MAINLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
-SRI LANKA 5H30M AHEAD OF UTC
-ST.MAARTEN
-ST.KITTS-NEVIS 4 H BEHIND UTC
-ST.LUCIA 4 H BEHIND UTC
-ST.PIERRE 3 H BEHIND UTC INCLUDING MIQUELON
-ST.PIERRE 2 H BEHIND UTC INLCUDING MIQUELON APR 3
-ST.PIERRE - OCT 29
-ST.VINCENT 4 H BEHIND UTC INCLUDING THE GRENADINES
-ST. HELENA ON UTC
-SURINAME 3 H BEHIND UTC
-SWAZILAND 2 H AHEAD OF UTC
-SWEDEN 1 H AHEAD OF UTC
-SWEDEN 2 H AHEAD OF UTC MAR 27 - SEP 24
-SWITZERLAND 1 H AHEAD OF UTC
-SWITZERLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
-SYRIA 2 H AHEAD OF UTC
-SYRIA 3 H AHEAD OF UTC MAR 15 - OCT 30
-TAHITI 10 H BEHIND UTC
-TANZANIA 3 H AHEAD OF UTC
-THAILAND 7 H AHEAD OF UTC
-TRINIDAD / TOBAGO 4 H BEHIND UTC
-TUNISIA 1 H AHEAD OF UTC
-TUNISIA 2 H AHEAD OF UTC APR 10 - SEP 24
-TURKEY 2 H AHEAD OF UTC
-TURKEY 3 H AHEAD OF UTC MAR 27 - SEP 24
-TURKS AND CAICOS 5 H BEHIND UTC
-TURKS AND CAICOS 4 H BEHIND UTC APR 3 - OCT 29
-TUVALU 12 H AHEAD OF UTC
-UDAN 2 H AHEAD OF UTC
-UGANDA 3 H AHEAD OF UTC
-UNITED ARAB EMIR. 4 H AHEAD OF UTC ABU DHABI, DUBAI, SHARJAH,
-UNITED ARAB EMIR RAS AL KHAIMAH
-UNITED KINGDOM ON UTC WALES, SCOTLAND, N.I., CH.
-UNITED KINGDOM IS.
-UNITED KINGDOM 1 H AHEAD OF UTC MAR 27 - OCT 22
-UNITED STATES SEE USA
-UPPER VOLTA ON UTC
-URUGUAY 3 H BEHIND UTC
-URUGUAY 2 H BEHIND UTC DEC 11, '88-FEB 25, '89
-URAGUAY (ESTIMATED)
-USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
-USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
-USA CENTRAL 6 H BEHIND UTC CHICAGO, HOUSTON
-USA CENTRAL 5 H BEHIND UTC APR 3 - OCT 30
-USA MOUNTAIN 7 H BEHIND UTC DENVER
-USA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 30
-USA PACIFIC 8 H BEHIND UTC L.A., SAN FRANCISCO
-USA PACIFIC 7 H BEHIND UTC APR 3 - OCT 30
-USA ALASKA STD 9 H BEHIND UTC MOST OF ALASKA (AKST)
-USA ALASKA STD 8 H BEHIND UTC APR 3 - OCT 30 (AKDT)
-USA ALEUTIAN 10 H BEHIND UTC ISLANDS WEST OF 170W
-USA - " - 9 H BEHIND UTC APR 3 - OCT 30
-USA HAWAII 10 H BEHIND UTC
-USA BERING 11 H BEHIND UTC SAMOA, MIDWAY
-USA FOR SPECIFIC INFO ON USA ZONES/TIMES CALL DOT 202-426-4520
-USSR WEST EUROP 3 H AHEAD OF UTC LENINGRAD, MOSCOW
-USSR WEST EUROP 4 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL EUR 4 H AHEAD OF UTC ROSTOV, BAKU
-USSR CENTRAL EUR 5 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST EUROP 5 H AHEAD OF UTC SVERDLOVSK
-USSR EAST EUROP 6 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST SIBERIAN 6 H AHEAD OF UTC TASHKENT, ALMA ATA
-USSR WEST SIBERIAN 7 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST-CENTRAL 7 H AHEAD OF UTC NOVOSIBIRSK
-USSR WEST-CENTRAL 8 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST-CENTRAL 8 H AHEAD OF UTC IRKUTSK
-USSR WEST-CENTRAL 9 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL SIB 9 H AHEAD OF UTC YAKUTSK
-USSR CENTRAL SIB 10 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL SIB 10 H AHEAD OF UTC VLADIVOSTOK
-USSR CENTRAL SIB 11 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 11 H AHEAD OF UTC MAGADAN
-USSR EAST SIBERIA 12 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 12 H AHEAD OF UTC PETROPAVLOVSK
-USSR EAST SIBERIA 13 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 13 H AHEAD OF UTC UELEN
-USSR EAST SIBERIA 14 H AHEAD OF UTC APR 1 - SEP 30
-VANUATU 11 H AHEAD OF UTC (NEW HEBRIDES)
-VANUATU 12 H AHEAD OF UTC SEP 25, '88-MAR 25, '89
-VANUATU (ESTIMATED)
-VATICAN 1 H AHEAD OF UTC
-VATICAN 2 H AHEAD OF UTC MAR 27 - SEP 24
-VIETNAM 7 H AHEAD OF UTC
-VIRGIN ISLANDS 4 H BEHIND UTC ST.CROIX, ST.THOMAS,
-VIRGIN ISLANDS ST.JOHN
-WAKE ISLAND 12 H AHEAD OF UTC
-WALES SEE ENGLAND
-WALLIS/FUTUNA IS. 12 H AHEAD OF UTC
-WINDWARD ISLANDS 4 H BEHIND UTC GRENADA, ST. LUCIA
-YEMEN 3 H AHEAD OF UTC BOTH REPUBLICS
-YUGOSLAVIA 1 H AHEAD OF UTC
-YUGOSLAVIA 2 H AHEAD OF UTC MAR 27 - SEP 24
-ZAIRE EAST 1 H AHEAD OF UTC KINSHASA MBANDAKA
-ZAIRE WEST 2 H AHEAD OF UTC LUBUMBASHI, KASAI, KIVU,
-ZAIRE WEST HAUT-ZAIRE, SHABA
-ZAMBIA 2 H AHEAD OF UTC
-ZIMBABWE 2 H AHEAD OF UTC
Deleted: vendor/tzcode/dist/usno1989a
===================================================================
--- vendor/tzcode/dist/usno1989a 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/usno1989a 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,450 +0,0 @@
-# From Arthur David Olson (1994-02-07):
-#
-# Here's time zone information from the United States Naval Observatory,
-# with corrections from Paul Eggert.
-# The USNO warns:
-# DUE TO FREQUENT CHANGES IN THE LOCAL LAWS GOVERNING DAYLIGHT
-# SAVING TIME, WE CANNOT GUARANTEE THE ACCURACY OF THIS
-# INFORMATION. PLEASE ALERT US TO ANY DISCREPANCY YOU MAY
-# DISCOVER.
-#
-AFGHANISTAN 4.5H AHEAD OF UTC
-ALBANIA 1 H AHEAD OF UTC
-ALBANIA 2 H AHEAD OF UTC MAR 27 - SEP 24
-ALBANIA (ESTIMATED)
-ALGERIA 1 H AHEAD OF UTC
-AMERICAN SAMOA 11 H BEHIND UTC
-ANDORRA 1 H AHEAD OF UTC
-ANDORRA 2 H AHEAD OF UTC MAR 27 - SEP 24
-ANDORRA (ESTIMATED)
-ANGOLA 1 H AHEAD OF UTC
-ARGENTINA 3 H BEHIND UTC
-ARUBA 4 H BEHIND UTC ALSO BONAIRE, CURACAO,
-ARUBA ST.MAARTEN
-AUSTRALIA WEST 8 H AHEAD OF UTC PERTH, EXMOUTH
-AUSTRALIA N.T. 9.5H AHEAD OF UTC DARWIN NO ADVANCED TIME
-AUSTRALIA N.T. IN SUMMER
-AUSTRALIA SOUTH 9.5H AHEAD OF UTC ADELAIDE
-AUSTRALIA INCLUDING BROKEN HILL, NSW
-AUSTRALIA SOUTH 10.5H AHEAD OF UTC ADELAIDE OCT 30, '88-MAR
-AUSTRALIA SOUTH 18, '89 INCLUDING BROKEN
-AUSTRIALIA SOUTH HILL, NSW
-AUSTRALIA QUEENL 10 H AHEAD OF UTC
-AUSTRALIA NSW 10 H AHEAD OF UTC SYDNEY
-AUSTRALIA NSW 11 H AHEAD OF UTC SYDNEY OCT 30, '88-MAR 18,
-AUSTRALIA NSW '89
-AUSTRALIA TASM. 10 H AHEAD OF UTC HOBART
-AUSTRALIA TASM. 11 H AHEAD OF UTC HOBART OCT 30, '88-MAR 18,
-AUSTRALIA TASM. '89
-AUSTRIA 1 H AHEAD OF UTC
-AUSTRIA 2 H AHEAD OF UTC MAR 27 - SEPT 24
-AZORES SEE PORTUGAL
-BAHAMAS 5 H BEHIND UTC EXCLUDING TURKS AND CAICOS
-BAHAMAS ISLANDS)
-BAHAMAS 4 H BEHIND UTC APR 3 - OCT 29 (SAME
-BAHAMAS EXCLUSION)
-BAHRAIN 3 H AHEAD OF UTC
-BANGLADESH 6 H AHEAD OF UTC
-BARBADOS 4 H BEHIND UTC
-BELGIUM 1 H AHEAD OF UTC
-BELGIUM 2 H AHEAD OF UTC MAR 27 - SEP 24
-BELIZE 6 H BEHIND UTC
-BENIN PEOPLES REP 1 H AHEAD OF UTC DAHOMEY
-BERMUDA 4 H BEHIND UTC
-BERMUDA 3 H BEHIND UTC APR 3 - OCT 29
-BHUTAN 6 H AHEAD OF UTC
-BOLIVIA 4 H BEHIND UTC
-BONAIRE 4 H BEHIND UTC ALSO ARUBA,CURACAO,
-BONAIRE ST.MAARTEN, SABA
-BOTSWANA 2 H AHEAD OF UTC
-BRAZIL WEST 5 H BEHIND UTC TERRITORY OF ACRE
-BRAZIL WEST 4 H BEHIND UTC ACRE OCT 23, '88-FEB 11,
-BRAZIL '89 (ESTIMATED)
-BRAZIL CENTRAL 4 H BEHIND UTC MANAUS
-BRAZIL CENTRAL 3 H BEHIND UTC MANAUS OCT 23, '88-FEB 11,
-BRAZIL CENTRAL '89 (ESTIMATED)
-BRAZIL EAST 3 H BEHIND UTC COASTAL STATES, RIO, SAO
-BRAZIL EAST PAULO, BRASILIA
-BRAZIL EAST 2 H BEHIND UTC COASTAL STATES, RIO, SAO
-BRAZIL PAULO, BRASILIA OCT 23,
-BRAZIL '88-FEB 11, '89
-BRAZIL (ESTIMATED)
-BRAZIL 2 H BEHIND UTC ATLANTIC ISLANDS, FERNANDO
-BRAZIL DE NORONHA
-BRAZIL 1 H BEHIND UTC OCT 23, '88-FEB 11, '89
-BRAZIL (ESTIMATED)
-BRAZIL 3 H BEHIND UTC FOR MOST MAJOR AIRPORTS.
-BRITISH VIRGIN I. 4 H BEHIND UTC
-BRUNEI 8 H AHEAD OF UTC
-BULGARIA 2 H AHEAD OF UTC
-BULGARIA 3 H AHEAD OF UTC MAR 27 - SEP 24
-BURKINA FASO ON UTC
-BURMA 6.5H AHEAD OF UTC
-BURUNDI 2 H AHEAD OF UTC
-CAMBODIA SEE KAMPUCHEA
-CAMEROON 1 H AHEAD OF UTC
-CANADA NEW FDL 3.5H BEHIND UTC ST.JOHN'S
-CANADA NEW FDL 1.5H BEHIND UTC APR 3 - OCT 29
-CANADA ATLANTIC 4 H BEHIND UTC HALIFAX
-CANADA ATLANTIC 3 H BEHIND UTC APR 3 - OCT 29
-CANADA EASTERN 5 H BEHIND UTC TORONTO, MONTREAL, OTTAWA
-CANADA EASTERN 4 H BEHIND UTC APR 3 - OCT 29
-CANADA CENTRAL 6 H BEHIND UTC REGINA, WINNIPEG
-CANADA CENTRAL 5 H BEHIND UTC APR 3 - OCT 29
-CANADA MOUNTAIN 7 H BEHIND UTC CALGARY, EDMONTON
-CANADA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 29
-CANADA PACIFIC 8 H BEHIND UTC VANCOUVER
-CANADA PACIFIC 7 H BEHIND UTC APR 3 - OCT 29
-CANADA YUKON SAME AS PACIFIC DAWSON
-CAPE VERDE 1 H BEHIND UTC
-CAYMAN ISLANDS 5 H BEHIND UTC
-CAROLINE ISLAND 10 H AHEAD OF UTC EXCLUDING PONAPE IS.,
-CAROLINE ISLAND KUSAIE, AND PINGELAP
-CENTRAL AFRICA 1 H AHEAD OF UTC
-CEYLON 5.5H AHEAD OF UTC, SEE SRI LANKA
-CHAD 1 H AHEAD OF UTC
-CHANNEL ISLANDS SEE ENGLAND
-CHILE 4 H BEHIND UTC CONTINENTAL
-CHILE 3 H BEHIND UTC OCT 9, '88-MAR 11, '89
-CHILE 6 H BEHIND UTC EASTER ISLAND
-CHILE 5 H BEHIND UTC OCT 9, '88-MAR 11, '89
-CHINA 8 H AHEAD OF UTC ALL OF CHINA, INCL TAIWAN
-CHINA 9 H AHEAD OF UTC APR 17 - SEP 10
-COCOS (Keeling) I. 6.5H AHEAD OF UTC
-COLOMBIA 5 H BEHIND UTC
-COMOROS 3 H AHEAD OF UTC
-CONGO 1 H AHEAD OF UTC
-COOK ISLANDS 10 H BEHIND UTC
-COOK ISLANDS 9.5H BEHIND UTC OCT 30, '88-MAR 24, '89
-COOK ISLANDS (ESTIMATED)
-COSTA RICA 6 H BEHIND UTC
-COTE D'IVOIRE ON UTC
-CUBA 5 H BEHIND UTC
-CUBA 4 H BEHIND UTC MAR 20 - OCT 8
-CURACAO 4 H BEHIND UTC ALSO BONAIRE, ARUBA,
-CURACAO ST.MAARTEN
-CYPRUS 2 H AHEAD OF UTC
-CYPRUS 3 H AHEAD OF UTC MAR 27 - SEP 24
-CZECHOSLOVAKIA 1 H AHEAD OF UTC
-CZECHOSLOVAKIA 2 H AHEAD OF UTC MAR 27 - SEP 24
-DENMARK 1 H AHEAD OF UTC
-DENMARK 2 H AHEAD OF UTC MAR 27 - SEP 24
-DENMK. FAEROE IS 1 H AHEAD OF UTC MAR 27 - SEP 24
-DJIBOUTI 3 H AHEAD OF UTC
-DOMINICA 4 H BEHIND UTC
-DOMINICAN REP 4 H BEHIND UTC
-ECUADOR 5 H BEHIND UTC CONTINENTAL
-ECUADOR 6 H BEHIND UTC GALAPAGOS ISLANDS
-EGYPT 2 H AHEAD OF UTC
-EGYPT 3 H AHEAD OF UTC MAY 17 - SEP 30 (AFTER
-EGYPT RAMADAN)
-EL SALVADOR 6 H BEHIND UTC
-ENGLAND ON UTC (WALES, SCOTLAND, N.I.,
-ENGLAND CH. IS.)
-ENGLAND 1 H AHEAD OF UTC MAR 27 - OCT 22
-EQUATORIAL GUINEA 1 H AHEAD OF UTC
-ETHIOPIA 3 H AHEAD OF UTC
-FALKLAND ISLANDS 4 H BEHIND UTC
-FALKLAND ISLANDS 3 H BEHIND UTC SEP 11, '88-APR 15, '89
-FALKLAND ISLANDS (ESTIMATED)
-FAROE ISLAND ON UTC
-FAROE ISLAND 1 H AHEAD OF UTC MAR 27 - SEP 24
-FIJI 12 H AHEAD OF UTC
-FINLAND 2 H AHEAD OF UTC
-FINLAND 3 H AHEAD OF UTC MAR 27 - SEP 24
-FRANCE 1 H AHEAD OF UTC
-FRANCE 2 H AHEAD OF UTC MAR 27 - SEP 24
-FRENCH GUIANA 3 H BEHIND UTC
-FRENCH POLYNESIA 9 H BEHIND UTC GAMBIER ISLAND
-FRENCH POLYNESIA 9.5H BEHIND UTC MARQUESAS ISLANDS
-FRENCH POLYNESIA 10 H BEHIND UTC SOCIETY ISLANDS, TUBUAI
-FRENCH POLYNESIA ISLANDS, TUAMOTU ISLAND,
-FRENCH POLYNESIA TAHITI
-GABON 1 H AHEAD OF UTC
-GAMBIA ON UTC
-GERMANY ALL 1 H AHEAD OF UTC
-GERMANY ALL 2 H AHEAD OF UTC MAR 27 - SEP 24
-GHANA ON UTC
-GIBRALTAR 1 H AHEAD OF UTC
-GIBRALTAR 2 H AHEAD OF UTC MAR 27 - SEP 24
-GREECE 2 H AHEAD OF UTC
-GREECE 3 H AHEAD OF UTC MAR 27 - SEP 24
-GREENLAND 4 H BEHIND UTC THULE AIRBASE YEAR ROUND
-GREENLAND 3 H BEHIND UTC ANGMAGSSALIK AND W. COAST
-GREENLAND 2 H BEHIND UTC MAR 27 - SEP 24
-GREENLAND 1 H BEHIND UTC SCORESBYSUND
-GREENLAND ON UTC MAR 27 - SEP 24
-GRENADA 4 H BEHIND UTC
-GUADELOUPE 4 H BEHIND UTC ST. BARTHELEMY, NORTHERN
-GUADELOUPE ST. MARTIN MARTINIQUE
-GUAM 10 H AHEAD OF UTC
-GUATEMALA 6 H BEHIND UTC
-GUINEA ON UTC
-GUINEA BISSAU ON UTC
-GUINEA REPUBLIC ON UTC
-GUINEA EQUATORIAL 1 H AHEAD OF UTC
-GUYANA 3 H BEHIND UTC
-HAITI 5 H BEHIND UTC
-HAITI 4 H BEHIND UTC APR 3 - OCT 29
-HOLLAND SEE NETHERLANDS
-HONDURAS 6 H BEHIND UTC
-HONG KONG 8 H AHEAD OF UTC
-HUNGARY 1 H AHEAD OF UTC
-HUNGARY 2 H AHEAD OF UTC MAR 27 - SEP 24
-ICELAND ON UTC
-INDIA 5.5H AHEAD OF UTC INCLUDING ANDAMAN ISLANDS
-INDONESIA WEST 7 H AHEAD OF UTC SUMATRA, JAVA, BALI,
-INDONESIA WEST JAKARTA
-INDONESIA CENTRAL 8 H AHEAD OF UTC KALIMANTAN, SULAWESI
-INDONESIA EAST 9 H AHEAD OF UTC IRIAN, BARAT
-IRAN 3.5H AHEAD OF UTC
-IRAQ 3 H AHEAD OF UTC
-IRAQ 4 H AHEAD OF UTC APR 1 - SEP 30
-IRELAND ON UTC
-IRELAND 1 H AHEAD OF UTC MAR 27 - OCT 22
-ISRAEL 2 H AHEAD OF UTC
-ISRAEL 3 H AHEAD OF UTC APR 10 - SEP 3
-ITALY 1 H AHEAD OF UTC
-ITALY 2 H AHEAD OF UTC MAR 27 - SEP 24
-IVORY COAST ON UTC
-JAMAICA 5 H BEHIND UTC
-JAPAN 9 H AHEAD OF UTC
-JOHNSTON ISLAND 10 H BEHIND UTC
-JORDAN 2 H AHEAD OF UTC
-JORDAN 3 H AHEAD OF UTC APR 1 - OCT 6
-KAMPUCHEA 7 H AHEAD OF UTC
-KENYA 3 H AHEAD OF UTC
-KIRIBATI, REP OF 12 H AHEAD OF UTC CANTON, ENDERBURY ISLANDS
-KIRIBATI, REP OF 11 H AHEAD OF UTC CHRISTMAS ISLAND
-KOREA 9 H AHEAD OF UTC
-KOREA, REP OF 9 H AHEAD OF UTC
-KOREA, REP OF 10 H AHEAD OF UTC MAY 8 - OCT 8
-KUWAIT 3 H AHEAD OF UTC
-KUSAIE, PINGELAP 12 H AHEAD OF UTC INCLUDING MARSHALL IS.,
-KUSAIE, PINGELAP EXCLUDING KWAJALEIN)
-KWAJALEIN 12 H BEHIND UTC
-LAOS 7 H AHEAD OF UTC
-LEBANON 2 H AHEAD OF UTC
-LEBANON 3 H AHEAD OF UTC JUN 1 - OCT 31
-LEEWARD ISLANDS 4 H BEHIND UTC ANTIGUA, DOMINICA,
-LEEWARD ISLANDS MONTSERRAT, ST.
-LEEWARD ISLAANDS CHRISTOPHER, ST. KITTS,
-LEEWARD ISLANDS NEVIS, ANGUILLA
-LESOTHO 2 H AHEAD OF UTC
-LIBERIA ON UTC
-LIBYAN ARAB 1 H AHEAD OF UTC JAMAHIRIYA/LIBYA
-LIBYAN ARAB 2 H AHEAD OF UTC APR 1 - SEP 30 JAMAHIRIYA/LIBYA
-LIECHTENSTEIN 1 H AHEAD OF UTC
-LIECHTENSTEIN 2 H AHEAD OF UTC MAR 27 - SEP 24
-LUXEMBOURG 1 H AHEAD OF UTC
-LUXEMBOURG 2 H AHEAD OF UTC MAR 27 - SEP 24
-MACAO 8 H AHEAD OF UTC
-MADAGASCAR 3 H AHEAD OF UTC
-MADEIRA SEE PORTUGAL
-MALAWI 2 H AHEAD OF UTC
-MALAYSIA 8 H AHEAD OF UTC
-MALDIVES 5 H AHEAD OF UTC
-MALI ON UTC
-MALTA 1 H AHEAD OF UTC
-MALTA 2 H AHEAD OF UTC MAR 27 - SEP 24
-MARTINIQUE 4 H BEHIND UTC
-MAURITANIA ON UTC
-MAURITIUS 4 H AHEAD OF UTC
-MARIANA ISLANDS 10 H AHEAD OF UTC EXCLUDING GUAM
-MEXICO BAJA CAL N 7 H BEHIND UTC BAJA CALIFORNIA SUR AND
-MEXICO BAJA CAL N N. PACIFIC COAST (STATES
-MEXICO BAJA CAL N OF SINALOA AND SONORA)
-MEXICO BAJA CAL N 8 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
-MEXICO BAJA CAL N - OCT 29
-MEXICO BAJA CAL N 7 H BEHIND UTC ABOVE 28TH PARALLAL APR 3
-MEXICO BAJA CAL N - 0CT 29
-MEXICO 6 H BEHIND UTC STATES OF DURANGO,
-MEXICO COAHUILA, NUEVO LEON,
-MEXICO TAMAULIPAS
-MEXICO 5 H BEHIND UTC STATES OF DURANGO,
-MEXICO COAHUILA, NUEVO LEON,
-MEXICO TAMAULIPAS APR 3 - OCT 29
-MEXICO 6 H BEHIND UTC GENERAL MEXICO, STATES OF
-MEXICO CAMPECHE, QUINTANA ROO AND
-MEXICO YUCATAN
-MIDWAY ISLAND 11 H BEHIND UTC
-MONACO 1 H AHEAD OF UTC
-MONACO 2 H AHEAD OF UTC MAR 27 - SEP 24
-MONGOLIA 8 H AHEAD OF UTC
-MONGOLIA 9 H AHEAD OF UTC MAR 27 - SEP 24
-MONTSERRAT 4 H BEHIND UTC
-MOROCCO ON UTC
-MOZAMBIQUE 2 H AHEAD OF UTC
-NAMIBIA 2 H AHEAD OF UTC
-NAURU, REP OF 12 H AHEAD OF UTC
-NEPAL 5H45M AHEAD OF UTC
-NETHERLANDS 1 H AHEAD OF UTC
-NETHERLANDS 2 H AHEAD OF UTC MAR 27 - SEP 24
-NETHERLANDS 4 H BEHIND UTC ANTILLES AND SOUTHERN ST.
-NETHERLANDS MAARTEN
-NEW CALEDONIA 11 H AHEAD OF UTC
-NEW HEBRIDES SEE VANUATU
-NEW ZEALAND 12 H AHEAD OF UTC (EXCLUDING CHATHAM ISLAND)
-NEW ZEALAND 13 H AHEAD OF UTC OCT 30, '88-MAR 4, '89
-NEW ZEALAND 12H45M AHEAD OF UTC CHATHAM ISLAND
-NICARAGUA 6 H BEHIND UTC
-NIGER 1 H AHEAD OF UTC
-NIGERIA 1 H AHEAD OF UTC
-NIUE ISLAND 11 H BEHIND UTC
-NORFOLK ISLAND 11H30M AHEAD OF UTC
-NORTHERN IRELAND ON UTC WALES, SCOTLAND, N.I.,
-NORTHERN IRELAND CH.IS.
-NORTHERN IRELAND 1 H AHEAD OF UTC MAR 27 - OCT 22
-NORWAY 1 H AHEAD OF UTC
-NORWAY 2 H AHEAD OF UTC MAR 27 - SEP 24
-OMAN 4 H AHEAD OF UTC
-PACIFIC ISLAND T.T.
-PALAU ISLANDS 9 H AHEAD OF UTC
-PAKISTAN 5 H AHEAD OF UTC
-PANAMA 5 H BEHIND UTC
-PAPUA NEW GUINEA 10 H AHEAD OF UTC INCLUDING BOUGAINVILLE
-PAPUA NEW GUINEA ISLAND
-PARAGUAY 4 H BEHIND UTC
-PARAGUAY 3 H BEHIND UTC OCT 1, '88-MAR 31, '89
-PERU 5 H BEHIND UTC
-PHILIPPINES 8 H AHEAD OF UTC
-PONAPE ISLAND 11 H AHEAD OF UTC
-POLAND 1 H AHEAD OF UTC
-POLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
-PORTUGAL MAINLAND ON UTC
-PORTUGAL MAINLAND 1 H AHEAD OF UTC MAR 27 - SEP 24
-PORTUGAL AZORES 1 H BEHIND UTC
-PORTUGAL AZORES ON UTC MAR 27 - SEP 24
-PORTUGAL MADEIRA ON UTC
-PORTUGAL MADEIRA 1 H AHEAD OF UTC MAR 27 - SEP 24
-PUERTO RICO 4 H BEHIND UTC
-QATAR 3 H AHEAD OF UTC
-ROMANIA 2 H AHEAD OF UTC
-ROMANIA 3 H AHEAD OF UTC MAR 27 - SEP 24
-RUSSIA SEE USSR
-RWANDA 2 H AHEAD OF UTC
-SABA 4 H BEHIND UTC ALSO BONAIRE, CURACAO,
-SAMOA 11 H BEHIND UTC
-SAN MARINO 1 H AHEAD OF UTC
-SAN MARINO 2 H AHEAD OF UTC MAR 27 - SEP 24
-SAN SALVADOR 6 H BEHIND UTC
-SAO TOME ISLAND ON UTC AND PRINCIPE ISLAND
-SAUDI ARABIA 3 H AHEAD OF UTC
-SCOTLAND SEE ENGLAND
-SENEGAL ON UTC
-SEYCHELLES 4 H AHEAD OF UTC
-SIERRA LEONE ON UTC
-SINGAPORE 8 H AHEAD OF UTC
-SOLOMON ISLANDS 11 H AHEAD OF UTC EXCLUDING BOUGAINVILLE
-SOLOMON ISLANDS ISLAND
-SOMALI 3 H AHEAD OF UTC
-SOUTH AFRICA 2 H AHEAD OF UTC
-SPAIN CANARY IS ON UTC
-SPAIN CANARY IS 1 H AHEAD OF UTC MAR 27 - SEP 24
-SPAIN 1 H AHEAD OF UTC CONTINENTAL, BALEARIC AND
-SPAIN MALLORCA ISLANDS
-SPAIN 2 H AHEAD OF UTC CONTINENTAL, BALEARIC AND
-SPAIN MALLORCA ISLANDS MAR 27 -
-SPAIN SEP 24
-SPAIN MAINLAND 1 H AHEAD OF UTC MELILLA
-SPAIN MAINLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
-SRI LANKA 5H30M AHEAD OF UTC
-ST. MAARTEN
-ST. KITTS-NEVIS 4 H BEHIND UTC
-ST. LUCIA 4 H BEHIND UTC
-ST. PIERRE 3 H BEHIND UTC INCLUDING MIQUELON
-ST. PIERRE 2 H BEHIND UTC INLCUDING MIQUELON APR 3
-ST. PIERRE - OCT 29
-ST. VINCENT 4 H BEHIND UTC INCLUDING THE GRENADINES
-ST. HELENA ON UTC
-SUDAN 2 H AHEAD OF UTC
-SURINAME 3 H BEHIND UTC
-SWAZILAND 2 H AHEAD OF UTC
-SWEDEN 1 H AHEAD OF UTC
-SWEDEN 2 H AHEAD OF UTC MAR 27 - SEP 24
-SWITZERLAND 1 H AHEAD OF UTC
-SWITZERLAND 2 H AHEAD OF UTC MAR 27 - SEP 24
-SYRIA 2 H AHEAD OF UTC
-SYRIA 3 H AHEAD OF UTC MAR 15 - OCT 30
-TAHITI 10 H BEHIND UTC
-TAIWAN 8 H AHEAD OF UTC
-TANZANIA 3 H AHEAD OF UTC
-THAILAND 7 H AHEAD OF UTC
-TOGO ON UTC
-TRINIDAD / TOBAGO 4 H BEHIND UTC
-TUNISIA 1 H AHEAD OF UTC
-TUNISIA 2 H AHEAD OF UTC APR 10 - SEP 24
-TURKEY 2 H AHEAD OF UTC
-TURKEY 3 H AHEAD OF UTC MAR 27 - SEP 24
-TURKS AND CAICOS 5 H BEHIND UTC
-TURKS AND CAICOS 4 H BEHIND UTC APR 3 - OCT 29
-TUVALU 12 H AHEAD OF UTC
-UGANDA 3 H AHEAD OF UTC
-UNITED ARAB EMIR. 4 H AHEAD OF UTC ABU DHABI, DUBAI, SHARJAH,
-UNITED ARAB EMIR RAS AL KHAIMAH
-UNITED KINGDOM ON UTC WALES, SCOTLAND, N.I., CH.
-UNITED KINGDOM IS.
-UNITED KINGDOM 1 H AHEAD OF UTC MAR 27 - OCT 22
-UNITED STATES SEE USA
-UPPER VOLTA ON UTC
-URUGUAY 3 H BEHIND UTC
-URUGUAY 2 H BEHIND UTC DEC 11, '88-FEB 25, '89
-URAGUAY (ESTIMATED)
-USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
-USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
-USA CENTRAL 6 H BEHIND UTC CHICAGO, HOUSTON
-USA CENTRAL 5 H BEHIND UTC APR 3 - OCT 30
-USA MOUNTAIN 7 H BEHIND UTC DENVER
-USA MOUNTAIN 6 H BEHIND UTC APR 3 - OCT 30
-USA PACIFIC 8 H BEHIND UTC L.A., SAN FRANCISCO
-USA PACIFIC 7 H BEHIND UTC APR 3 - OCT 30
-USA ALASKA STD 9 H BEHIND UTC MOST OF ALASKA (AKST)
-USA ALASKA STD 8 H BEHIND UTC APR 3 - OCT 30 (AKDT)
-USA ALEUTIAN 10 H BEHIND UTC ISLANDS WEST OF 170W
-USA - " - 9 H BEHIND UTC APR 3 - OCT 30
-USA HAWAII 10 H BEHIND UTC
-USA BERING 11 H BEHIND UTC SAMOA, MIDWAY
-USA FOR SPECIFIC INFO ON USA ZONES/TIMES CALL DOT 202-426-4520
-USSR WEST EUROP 3 H AHEAD OF UTC LENINGRAD, MOSCOW
-USSR WEST EUROP 4 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL EUR 4 H AHEAD OF UTC ROSTOV, BAKU
-USSR CENTRAL EUR 5 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST EUROP 5 H AHEAD OF UTC SVERDLOVSK
-USSR EAST EUROP 6 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST SIBERIAN 6 H AHEAD OF UTC TASHKENT, ALMA ATA
-USSR WEST SIBERIAN 7 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST-CENTRAL 7 H AHEAD OF UTC NOVOSIBIRSK
-USSR WEST-CENTRAL 8 H AHEAD OF UTC APR 1 - SEP 30
-USSR WEST-CENTRAL 8 H AHEAD OF UTC IRKUTSK
-USSR WEST-CENTRAL 9 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL SIB 9 H AHEAD OF UTC YAKUTSK
-USSR CENTRAL SIB 10 H AHEAD OF UTC APR 1 - SEP 30
-USSR CENTRAL SIB 10 H AHEAD OF UTC VLADIVOSTOK
-USSR CENTRAL SIB 11 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 11 H AHEAD OF UTC MAGADAN
-USSR EAST SIBERIA 12 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 12 H AHEAD OF UTC PETROPAVLOVSK
-USSR EAST SIBERIA 13 H AHEAD OF UTC APR 1 - SEP 30
-USSR EAST SIBERIA 13 H AHEAD OF UTC UELEN
-USSR EAST SIBERIA 14 H AHEAD OF UTC APR 1 - SEP 30
-VANUATU 11 H AHEAD OF UTC (NEW HEBRIDES)
-VANUATU 12 H AHEAD OF UTC SEP 25, '88-MAR 25, '89
-VANUATU (ESTIMATED)
-VATICAN 1 H AHEAD OF UTC
-VATICAN 2 H AHEAD OF UTC MAR 27 - SEP 24
-VENEZUELA 4 H BEHIND UTC
-VIETNAM 7 H AHEAD OF UTC
-VIRGIN ISLANDS 4 H BEHIND UTC ST.CROIX, ST.THOMAS,
-VIRGIN ISLANDS ST.JOHN
-WAKE ISLAND 12 H AHEAD OF UTC
-WALES SEE ENGLAND
-WALLIS/FUTUNA IS. 12 H AHEAD OF UTC
-WINDWARD ISLANDS 4 H BEHIND UTC GRENADA, ST. LUCIA
-YEMEN 3 H AHEAD OF UTC BOTH REPUBLICS
-YUGOSLAVIA 1 H AHEAD OF UTC
-YUGOSLAVIA 2 H AHEAD OF UTC MAR 27 - SEP 24
-ZAIRE EAST 1 H AHEAD OF UTC KINSHASA MBANDAKA
-ZAIRE WEST 2 H AHEAD OF UTC LUBUMBASHI, KASAI, KIVU,
-ZAIRE WEST HAUT-ZAIRE, SHABA
-ZAMBIA 2 H AHEAD OF UTC
-ZIMBABWE 2 H AHEAD OF UTC
Deleted: vendor/tzcode/dist/usno1995
===================================================================
--- vendor/tzcode/dist/usno1995 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/usno1995 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,324 +0,0 @@
-# From Arthur David Olson (1995-12-21):
-#
-# Here's time zone information from the United States Naval Observatory
-# via http://tycho.usno.navy.mil/tzones.html. See USNO's note at the end.
-World Time Zones
-For selected countries, the local standard time offset from UTC is given,
-with daylight savings time where observed.
-Time: Thu Dec 21 17:43:00 utc 1995
-Afghanistan: +4.5 hours
-Albania: +1 hours (Local summer +2 hours)
-Algeria: +1 hours (Local summer +2 hours)
-American Samoa: -11 hours
-Andorra: +1 hours (Local summer +2 hours)
-Angola: +1 hours
-Anguilla: -4 hours
-Antarctica: -2 hours (Local summer -3 hours)
-Antigua: -4 hours
-Argentina: -3 hours
-Argentina western prov: -4 hours
-Armenia: +4 hours (Local summer +5 hours)
-Aruba: -4 hours
-Ascension: 0 hours
-Australia Northern Territory: +9.5 hours
-Australia Lord Howe Island: +10.5 hours (Local summer +11 hours)
-Australia New South Wales: +10 hours (Local summer +11 hours)
-Australia Queensland: +10 hours
-Australia Victoria: +10 hours (Local summer +11 hours)
-Australia Australian Captial Territory: +10 hours (Local summer +11 hours)
-Australia South: +9.5 hours (Local summer +10.5 hours)
-Australia Tasmania: +10 hours (Local summer +11 hours)
-Australia Western: +8 hours
-Austria: +1 hours (Local summer +2 hours)
-Azerbajian: +3 hours
-Azores: -1 hours (Local summer 0 hours)
-Bahamas: -5 hours (Local summer -4 hours)
-Bahrain: +3 hours
-Balearic Islands: +1 hours (Local summer +2 hours)
-Bangladesh: +6 hours
-Barbados: -4 hours
-Belarus: +2 hours (Local summer +3 hours)
-Belgium: +1 hours (Local summer +2 hours)
-Belize: -6 hours
-Benin: +1 hours
-Bermuda: -4 hours (Local summer -3 hours)
-Bhutan: +6 hours
-Bolivia: -4 hours
-Bonaire: -4 hours
-Bosnia Hercegovina: +1 hours (Local summer +2 hours)
-Botswana: +2 hours
-Brazil Acre: -4 hours (Local summer -5 hours)
-Brazil Atlantic Islands: -1 hours (Local summer -2 hours)
-Brazil East: -3 hours (Local summer -1 hours)
-Brazil West: -4 hours (Local summer -3 hours)
-British Virgin Islands: -4 hours
-Brunei: +8 hours
-Bulgaria: +2 hours (Local summer +3 hours)
-Burkina Faso: 0 hours
-Burundi: +2 hours
-Cambodia: +7 hours
-Cameroon: +1 hours
-Canada Central: -6 hours (Local summer -5 hours)
-Canada Eastern: -5 hours (Local summer -4 hours)
-Canada Mountain: -7 hours (Local summer -6 hours)
-Canada Yukon & Pacific: -8 hours (Local summer -7 hours)
-Canada Atlantic: -4 hours (Local summer -3 hours)
-Canada Newfoundland: -3.5 hours (Local summer -2.5 hours)
-Canary Islands: 0 hours (Local summer +1 hours)
-Canton Enderbury Islands: -11 hours
-Cape Verde: -1 hours
-Caroline Island: +11 hours
-Cayman Islands: -5 hours
-Central African Rep: +1 hours
-Chad: +1 hours
-Channel Islands: 0 hours (Local summer +1 hours)
-Chatham Island: +12.75 hours (Local summer +13.75 hours)
-Chile: -4 hours (Local summer -3 hours)
-China People's Rep: +8 hours
-Christmas Islands: -10 hours
-Cocos (Keeling) Islands: ( hours (Local summer ) hours)
-Colombia: -5 hours
-Congo: +1 hours
-Cook Islands: -10 hours
-Costa Rica: -6 hours
-Cote d'Ivoire: 0 hours
-Croatia: +1 hours (Local summer +2 hours)
-Cuba: -5 hours (Local summer -4 hours)
-Curacao: -4 hours
-Cyprus: +2 hours (Local summer +3 hours)
-Czech Republic: +1 hours (Local summer +2 hours)
-Dahomey: +1 hours
-Denmark: +1 hours (Local summer +2 hours)
-Djibouti: +3 hours
-Dominica: -4 hours
-Dominican Republic: -4 hours
-Easter Island: -6 hours (Local summer -5 hours)
-Ecuador: -5 hours
-Egypt: +2 hours (Local summer +3 hours)
-El Salvador: -6 hours
-England: 0 hours (Local summer +1 hours)
-Equitorial Guinea: +1 hours
-Eritrea: +3 hours
-Estonia: +2 hours (Local summer +3 hours)
-Ethiopia: +3 hours
-Falkland Islands: -4 hours (Local summer -3 hours)
-Faroe Island: 0 hours (Local summer +1 hours)
-Fiji: +12 hours
-Finland: +2 hours (Local summer +3 hours)
-France: +1 hours (Local summer +2 hours)
-French Guiana: -3 hours
-French Polynesia: -10 hours
-Gabon: +1 hours
-Galapagos Islands: -6 hours
-Gambia: 0 hours
-Gambier Island: -9 hours
-Georgia: +4 hours
-Germany: +1 hours (Local summer +2 hours)
-Ghana: 0 hours
-Gibraltar: +1 hours (Local summer +2 hours)
-Greece: +2 hours (Local summer +3 hours)
-Greenland: -3 hours (Local summer -2 hours)
-Greenland Thule: -4 hours (Local summer -3 hours)
-Greenland Scoresbysun: -1 hours (Local summer 0 hours)
-Grenada: -4 hours
-Grenadines: -4 hours
-Guadeloupe: -4 hours
-Guam: +10 hours
-Guatemala: -6 hours
-Guinea: 0 hours
-Guinea Bissau: - hours (Local summer 0 hours)
-Guyana: -3 hours
-Haiti: -5 hours (Local summer -4 hours)
-Honduras: -6 hours
-Hong kong: +8 hours
-Hungary: +1 hours (Local summer +2 hours)
-Iceland: 0 hours
-India: +5.5 hours
-Indonesia Central: +8 hours
-Indonesia East: +9 hours
-Indonesia West: +7 hours
-Iran: +3.5 hours
-Iraq: +3 hours (Local summer +4 hours)
-Ireland Republic of: 0 hours (Local summer +1 hours)
-Israel: +2 hours (Local summer +3 hours)
-Italy: +1 hours (Local summer +2 hours)
-Jamaica: -5 hours
-Japan: +9 hours
-Johnston Island: -10 hours
-Jordan: +2 hours (Local summer +3 hours)
-Kazakhstan: +6 hours (Local summer +7 hours)
-Kenya: +3 hours
-Kiribati: +12 hours
-Korea Dem Republic of: +9 hours
-Korea Republic of: +9 hours
-Kusaie: +12 hours
-Kuwait: +3 hours
-Kwajalein: -12 hours
-Kyrgyzstan: +5 hours (Local summer +6 hours)
-Laos: +7 hours
-Latvia: +2 hours (Local summer +3 hours)
-Lebanon: +2 hours (Local summer +3 hours)
-Leeward Islands: -4 hours
-Lesotho: +2 hours
-Liberia: 0 hours
-Libya: +2 hours
-Lithuania: +2 hours (Local summer +3 hours)
-Luxembourg: +1 hours (Local summer +2 hours)
-Macedonia: +1 hours (Local summer +2 hours)
-Madagascar: +3 hours
-Madeira: 0 hours (Local summer +1 hours)
-Malawi: +2 hours
-Malaysia: +8 hours
-Maldives: +5 hours
-Mali: 0 hours
-Mallorca Islands: +1 hours (Local summer +2 hours)
-Malta: +1 hours (Local summer +2 hours)
-Mariana Island: +10 hours
-Marquesas Islands: -9.5 hours
-Marshall Islands: +12 hours
-Martinique: -4 hours
-Mauritania: 0 hours
-Mauritius: +4 hours
-Mayotte: +3 hours
-Melilla: +1 hours (Local summer +2 hours)
-Mexico: -6 hours
-Mexico Baja Calif Norte: -8 hours (Local summer -7 hours)
-Mexico Nayarit: -7 hours
-Mexico Sinaloa: -7 hours
-Mexico Sonora: -7 hours
-Midway Island: -11 hours
-Moldova: +2 hours (Local summer +3 hours)
-Moldovian Rep Pridnestrovye: +2 hours (Local summer +3 hours)
-Monaco: +1 hours (Local summer +2 hours)
-Mongolia: +8 hours
-Morocco: 0 hours
-Mozambique: +2 hours
-Myanmar: +6.5 hours
-Namibia: +1 hours (Local summer +2 hours)
-Nauru Republic of: +12 hours
-Nepal: +5.75 hours
-Netherlands: +1 hours (Local summer +2 hours)
-Netherlands Antilles: -4 hours
-Nevis Montserrat: -4 hours
-New Caledonia: +11 hours
-New Hebrides: +11 hours
-New Zealand: +12 hours (Local summer +13 hours)
-Nicaragua: -6 hours (Local summer -5 hours)
-Niger: +1 hours
-Nigeria: +1 hours
-Niue Island: -11 hours
-Norfolk Island: +11.5 hours
-Northern Ireland: 0 hours (Local summer +1 hours)
-Northern Mariana Islands: +10 hours
-Norway: +1 hours (Local summer +2 hours)
-Oman: +4 hours
-Pakistan: +5 hours
-Palau: +9 hours
-Panama: -5 hours
-Papua New Guinea: +10 hours
-Paraguay: -4 hours (Local summer -3 hours)
-Peru: -5 hours
-Philippines: +8 hours
-Pingelap: +12 hours
-Poland: +1 hours (Local summer +2 hours)
-Ponape Island: +11 hours
-Portugal: +1 hours (Local summer +2 hours)
-Principe Island: 0 hours
-Puerto Rico: -4 hours
-Qatar: +3 hours
-Reunion: +4 hours
-Romania: +2 hours (Local summer +3 hours)
-Russian Federation zone eight: +9 hours (Local summer +10 hours)
-Russian Federation zone eleven: +12 hours (Local summer +13 hours)
-Russian Federation zone five: +6 hours (Local summer +7 hours)
-Russian Federation zone four: +5 hours (Local summer +6 hours)
-Russian Federation zone nine: +10 hours (Local summer +11 hours)
-Russian Federation zone one: +2 hours (Local summer +3 hours)
-Russian Federation zone seven: +8 hours (Local summer +9 hours)
-Russian Federation zone six: +7 hours (Local summer +8 hours)
-Russian Federation zone ten: +11 hours (Local summer +12 hours)
-Russian Federation zone three: +4 hours (Local summer +5 hours)
-Russian Federation zone two: +4 hours (Local summer +5 hours)
-Rwanda: +2 hours
-Saba: -4 hours
-Samoa: -11 hours
-San Marino: +1 hours (Local summer +2 hours)
-Sao Tome e Principe: 0 hours
-Saudi Arabia: +3 hours
-Scotland: 0 hours
-Senegal: 0 hours
-Seychelles: +4 hours
-Sierra Leone: 0 hours
-Singapore: +8 hours
-Slovakia: +1 hours (Local summer +2 hours)
-Slovenia: +1 hours (Local summer +2 hours)
-Society Island: -10 hours
-Solomon Islands: +11 hours
-Somalia: +3 hours
-South Africa: +2 hours
-Spain: +1 hours (Local summer +2 hours)
-Sri Lanka: +5.5 hours
-St Christopher: -4 hours
-St Croix: -4 hours
-St Helena: 0 hours
-St John: -4 hours
-St Kitts Nevis: -4 hours
-St Lucia: -4 hours
-St Maarten: -4 hours
-St Pierre & Miquelon: -3 hours (Local summer -2 hours)
-St Thomas: -4 hours
-St Vincent: -4 hours
-Sudan: +2 hours
-Suriname: -3 hours
-Swaziland: +2 hours
-Sweden: +1 hours (Local summer +2 hours)
-Switzerland: +1 hours (Local summer +2 hours)
-Syria: +2 hours (Local summer +3 hours)
-Tahiti: -10 hours
-Taiwan: +8 hours
-Tajikistan: +6 hours
-Tanzania: +3 hours
-Thailand: +7 hours
-Togo: 0 hours
-Tonga: +13 hours
-Trinidad and Tobago: -4 hours
-Tuamotu Island: -10 hours
-Tubuai Island: -10 hours
-Tunisia: +1 hours
-Turkey: +2 hours (Local summer +3 hours)
-Turkmenistan: +5 hours
-Turks and Caicos Islands: -5 hours (Local summer -4 hours)
-Tuvalu: +12 hours
-Uganda: +3 hours
-Ukraine: +2 hours (Local summer +3 hours)
-United Arab Emirates: +4 hours
-United Kingdom: 0 hours (Local summer +1 hours)
-USA Central: -6 hours (Local summer -5 hours)
-USA Eastern: -5 hours (Local summer -4 hours)
-USA Mountain: -7 hours (Local summer -6 hours)
-USA Arizona: -7 hours
-USA Indiana East: -5 hours
-USA Pacific: -8 hours (Local summer -7 hours)
-USA Alaska: -9 hours (Local summer -8 hours)
-USA Hawaii Aleutian: - hours (Local summer -10 hours)
-Uruguay: -3 hours
-Uzbekistan: +5 hours
-Vanuatu: +11 hours (Local summer +12 hours)
-Vatican City: +1 hours (Local summer +2 hours)
-Venezuela: -4 hours
-Vietnam: +7 hours
-Virgin Islands: -4 hours
-Wake Island: +12 hours
-Wales: 0 hours (Local summer +1 hours)
-Wallis and Futuna Islands: +12 hours
-Windward Islands: -4 hours
-Yemen: +3 hours
-Yugoslavia: +1 hours (Local summer +2 hours)
-Zaire Kasai: +2 hours
-Zaire Kinshasa Mbandaka: +1 hours
-Zaire Haut Zaire: +2 hours
-Zaire Kivu: +2 hours
-Zaire Shaba: +2 hours
-Zambia: +2 hours
-Zimbabwe: +2 hours
-All timezone information is non-authoritative...
Deleted: vendor/tzcode/dist/usno1997
===================================================================
--- vendor/tzcode/dist/usno1997 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/usno1997 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,325 +0,0 @@
-# From Arthur David Olson (1997-03-07):
-#
-# Here's time zone information from the United States Naval Observatory
-# via http://tycho.usno.navy.mil/tzones.html. See USNO's note at the end.
-Unofficial Time Zone Information
-World Time Zones
-For selected countries, the local standard time offset from UTC is given, with daylight savings time where observed.
-Time: Fri Mar 7 22:38:58 UTC 1997
-Afghanistan: +4.5 hours
-Albania: +1 hours (Local summer +2 hours)
-Algeria: +1 hours (Local summer +2 hours)
-American Samoa: -11 hours
-Andorra: +1 hours (Local summer +2 hours)
-Angola: +1 hours
-Anguilla: -4 hours
-Antarctica: -2 hours (Local summer -3 hours)
-Antigua: -4 hours
-Argentina: -3 hours
-Argentina western prov: -4 hours
-Armenia: +4 hours (Local summer +5 hours)
-Aruba: -4 hours
-Ascension: 0 hours
-Australia Northern Territory: +9.5 hours
-Australia Lord Howe Island: +10.5 hours (Local summer +11 hours)
-Australia New South Wales: +10 hours (Local summer +11 hours)
-Australia Queensland: +10 hours
-Australia Victoria: +10 hours (Local summer +11 hours)
-Australia Australian Captial Territory: +10 hours (Local summer +11 hours)
-Australia South: +9.5 hours (Local summer +10.5 hours)
-Australia Tasmania: +10 hours (Local summer +11 hours)
-Australia Western: +8 hours
-Austria: +1 hours (Local summer +2 hours)
-Azerbajian: +3 hours
-Azores: -1 hours (Local summer 0 hours)
-Bahamas: -5 hours (Local summer -4 hours)
-Bahrain: +3 hours
-Balearic Islands: +1 hours (Local summer +2 hours)
-Bangladesh: +6 hours
-Barbados: -4 hours
-Belarus: +2 hours (Local summer +3 hours)
-Belgium: +1 hours (Local summer +2 hours)
-Belize: -6 hours
-Benin: +1 hours
-Bermuda: -4 hours (Local summer -3 hours)
-Bhutan: +6 hours
-Bolivia: -4 hours
-Bonaire: -4 hours
-Bosnia Hercegovina: +1 hours (Local summer +2 hours)
-Botswana: +2 hours
-Brazil Acre: -4 hours (Local summer -5 hours)
-Brazil Atlantic Islands: -1 hours (Local summer -2 hours)
-Brazil East: -3 hours (Local summer -1 hours)
-Brazil West: -4 hours (Local summer -3 hours)
-British Virgin Islands: -4 hours
-Brunei: +8 hours
-Bulgaria: +2 hours (Local summer +3 hours)
-Burkina Faso: 0 hours
-Burundi: +2 hours
-Cambodia: +7 hours
-Cameroon: +1 hours
-Canada Central: -6 hours (Local summer -5 hours)
-Canada Eastern: -5 hours (Local summer -4 hours)
-Canada Mountain: -7 hours (Local summer -6 hours)
-Canada Yukon & Pacific: -8 hours (Local summer -7 hours)
-Canada Atlantic: -4 hours (Local summer -3 hours)
-Canada Newfoundland: -3.5 hours (Local summer -2.5 hours)
-Canary Islands: 0 hours (Local summer +1 hours)
-Canton Enderbury Islands: -11 hours
-Cape Verde: -1 hours
-Caroline Island: +11 hours
-Cayman Islands: -5 hours
-Central African Rep: +1 hours
-Chad: +1 hours
-Channel Islands: 0 hours (Local summer +1 hours)
-Chatham Island: +12.75 hours (Local summer +13.75 hours)
-Chile: -4 hours (Local summer -3 hours)
-China People's Rep: +8 hours
-Christmas Islands: -10 hours
-Cocos (Keeling) Islands: ( hours (Local summer ) hours)
-Colombia: -5 hours
-Congo: +1 hours
-Cook Islands: -10 hours
-Costa Rica: -6 hours
-Cote d'Ivoire: 0 hours
-Croatia: +1 hours (Local summer +2 hours)
-Cuba: -5 hours (Local summer -4 hours)
-Curacao: -4 hours
-Cyprus: +2 hours (Local summer +3 hours)
-Czech Republic: +1 hours (Local summer +2 hours)
-Dahomey: +1 hours
-Denmark: +1 hours (Local summer +2 hours)
-Djibouti: +3 hours
-Dominica: -4 hours
-Dominican Republic: -4 hours
-Easter Island: -6 hours (Local summer -5 hours)
-Ecuador: -5 hours
-Egypt: +2 hours (Local summer +3 hours)
-El Salvador: -6 hours
-England: 0 hours (Local summer +1 hours)
-Equitorial Guinea: +1 hours
-Eritrea: +3 hours
-Estonia: +2 hours (Local summer +3 hours)
-Ethiopia: +3 hours
-Falkland Islands: -4 hours (Local summer -3 hours)
-Faroe Island: 0 hours (Local summer +1 hours)
-Fiji: +12 hours
-Finland: +2 hours (Local summer +3 hours)
-France: +1 hours (Local summer +2 hours)
-French Guiana: -3 hours
-French Polynesia: -10 hours
-Gabon: +1 hours
-Galapagos Islands: -5 hours
-Gambia: 0 hours
-Gambier Island: -9 hours
-Georgia: +4 hours
-Germany: +1 hours (Local summer +2 hours)
-Ghana: 0 hours
-Gibraltar: +1 hours (Local summer +2 hours)
-Greece: +2 hours (Local summer +3 hours)
-Greenland: -3 hours (Local summer -2 hours)
-Greenland Thule: -4 hours (Local summer -3 hours)
-Greenland Scoresbysun: -1 hours (Local summer 0 hours)
-Grenada: -4 hours
-Grenadines: -4 hours
-Guadeloupe: -4 hours
-Guam: +10 hours
-Guatemala: -6 hours
-Guinea: 0 hours
-Guinea Bissau: - hours (Local summer 0 hours)
-Guyana: -3 hours
-Haiti: -5 hours (Local summer -4 hours)
-Honduras: -6 hours
-Hong kong: +8 hours
-Hungary: +1 hours (Local summer +2 hours)
-Iceland: 0 hours
-India: +5.5 hours
-Indonesia Central: +8 hours
-Indonesia East: +9 hours
-Indonesia West: +7 hours
-Iran: +3.5 hours
-Iraq: +3 hours (Local summer +4 hours)
-Ireland Republic of: 0 hours (Local summer +1 hours)
-Israel: +2 hours (Local summer +3 hours)
-Italy: +1 hours (Local summer +2 hours)
-Jamaica: -5 hours
-Japan: +9 hours
-Johnston Island: -10 hours
-Jordan: +2 hours (Local summer +3 hours)
-Kazakhstan: +6 hours (Local summer +7 hours)
-Kenya: +3 hours
-Kiribati: +12 hours
-Korea Dem Republic of: +9 hours
-Korea Republic of: +9 hours
-Kusaie: +12 hours
-Kuwait: +3 hours
-Kwajalein: -12 hours
-Kyrgyzstan: +5 hours (Local summer +6 hours)
-Laos: +7 hours
-Latvia: +2 hours (Local summer +3 hours)
-Lebanon: +2 hours (Local summer +3 hours)
-Leeward Islands: -4 hours
-Lesotho: +2 hours
-Liberia: 0 hours
-Libya: +2 hours
-Lithuania: +2 hours (Local summer +3 hours)
-Luxembourg: +1 hours (Local summer +2 hours)
-Macedonia: +1 hours (Local summer +2 hours)
-Madagascar: +3 hours
-Madeira: 0 hours (Local summer +1 hours)
-Malawi: +2 hours
-Malaysia: +8 hours
-Maldives: +5 hours
-Mali: 0 hours
-Mallorca Islands: +1 hours (Local summer +2 hours)
-Malta: +1 hours (Local summer +2 hours)
-Mariana Island: +10 hours
-Marquesas Islands: -9.5 hours
-Marshall Islands: +12 hours
-Martinique: -4 hours
-Mauritania: 0 hours
-Mauritius: +4 hours
-Mayotte: +3 hours
-Melilla: +1 hours (Local summer +2 hours)
-Mexico: -6 hours
-Mexico Baja Calif Norte: -8 hours (Local summer -7 hours)
-Mexico Nayarit: -7 hours
-Mexico Sinaloa: -7 hours
-Mexico Sonora: -7 hours
-Midway Island: -11 hours
-Moldova: +2 hours (Local summer +3 hours)
-Moldovian Rep Pridnestrovye: +2 hours (Local summer +3 hours)
-Monaco: +1 hours (Local summer +2 hours)
-Mongolia: +8 hours
-Morocco: 0 hours
-Mozambique: +2 hours
-Myanmar: +6.5 hours
-Namibia: +1 hours (Local summer +2 hours)
-Nauru Republic of: +12 hours
-Nepal: +5.75 hours
-Netherlands: +1 hours (Local summer +2 hours)
-Netherlands Antilles: -4 hours
-Nevis Montserrat: -4 hours
-New Caledonia: +11 hours
-New Hebrides: +11 hours
-New Zealand: +12 hours (Local summer +13 hours)
-Nicaragua: -6 hours (Local summer -5 hours)
-Niger: +1 hours
-Nigeria: +1 hours
-Niue Island: -11 hours
-Norfolk Island: +11.5 hours
-Northern Ireland: 0 hours (Local summer +1 hours)
-Northern Mariana Islands: +10 hours
-Norway: +1 hours (Local summer +2 hours)
-Oman: +4 hours
-Pakistan: +5 hours
-Palau: +9 hours
-Panama: -5 hours
-Papua New Guinea: +10 hours
-Paraguay: -4 hours (Local summer -3 hours)
-Peru: -5 hours
-Philippines: +8 hours
-Pingelap: +12 hours
-Poland: +1 hours (Local summer +2 hours)
-Ponape Island: +11 hours
-Portugal: +1 hours (Local summer +2 hours)
-Principe Island: 0 hours
-Puerto Rico: -4 hours
-Qatar: +3 hours
-Reunion: +4 hours
-Romania: +2 hours (Local summer +3 hours)
-Russian Federation zone eight: +9 hours (Local summer +10 hours)
-Russian Federation zone eleven: +12 hours (Local summer +13 hours)
-Russian Federation zone five: +6 hours (Local summer +7 hours)
-Russian Federation zone four: +5 hours (Local summer +6 hours)
-Russian Federation zone nine: +10 hours (Local summer +11 hours)
-Russian Federation zone one: +2 hours (Local summer +3 hours)
-Russian Federation zone seven: +8 hours (Local summer +9 hours)
-Russian Federation zone six: +7 hours (Local summer +8 hours)
-Russian Federation zone ten: +11 hours (Local summer +12 hours)
-Russian Federation zone three: +4 hours (Local summer +5 hours)
-Russian Federation zone two: +4 hours (Local summer +5 hours)
-Rwanda: +2 hours
-Saba: -4 hours
-Samoa: -11 hours
-San Marino: +1 hours (Local summer +2 hours)
-Sao Tome e Principe: 0 hours
-Saudi Arabia: +3 hours
-Scotland: 0 hours (Local summer +1 hours)
-Senegal: 0 hours
-Seychelles: +4 hours
-Sierra Leone: 0 hours
-Singapore: +8 hours
-Slovakia: +1 hours (Local summer +2 hours)
-Slovenia: +1 hours (Local summer +2 hours)
-Society Island: -10 hours
-Solomon Islands: +11 hours
-Somalia: +3 hours
-South Africa: +2 hours
-Spain: +1 hours (Local summer +2 hours)
-Sri Lanka: +5.5 hours
-St Christopher: -4 hours
-St Croix: -4 hours
-St Helena: 0 hours
-St John: -4 hours
-St Kitts Nevis: -4 hours
-St Lucia: -4 hours
-St Maarten: -4 hours
-St Pierre & Miquelon: -3 hours (Local summer -2 hours)
-St Thomas: -4 hours
-St Vincent: -4 hours
-Sudan: +2 hours
-Suriname: -3 hours
-Swaziland: +2 hours
-Sweden: +1 hours (Local summer +2 hours)
-Switzerland: +1 hours (Local summer +2 hours)
-Syria: +2 hours (Local summer +3 hours)
-Tahiti: -10 hours
-Taiwan: +8 hours
-Tajikistan: +6 hours
-Tanzania: +3 hours
-Thailand: +7 hours
-Togo: 0 hours
-Tonga: +13 hours
-Trinidad and Tobago: -4 hours
-Tuamotu Island: -10 hours
-Tubuai Island: -10 hours
-Tunisia: +1 hours
-Turkey: +2 hours (Local summer +3 hours)
-Turkmenistan: +5 hours
-Turks and Caicos Islands: -5 hours (Local summer -4 hours)
-Tuvalu: +12 hours
-Uganda: +3 hours
-Ukraine: +2 hours (Local summer +3 hours)
-United Arab Emirates: +4 hours
-United Kingdom: 0 hours (Local summer +1 hours)
-USA Central: -6 hours (Local summer -5 hours)
-USA Eastern: -5 hours (Local summer -4 hours)
-USA Mountain: -7 hours (Local summer -6 hours)
-USA Arizona: -7 hours
-USA Indiana East: -5 hours
-USA Pacific: -8 hours (Local summer -7 hours)
-USA Alaska: -9 hours (Local summer -8 hours)
-USA Aleutian: -10 hours
-USA Hawaii: -10 hours
-Uruguay: -3 hours
-Uzbekistan: +5 hours
-Vanuatu: +11 hours (Local summer +12 hours)
-Vatican City: +1 hours (Local summer +2 hours)
-Venezuela: -4 hours
-Vietnam: +7 hours
-Virgin Islands: -4 hours
-Wake Island: +12 hours
-Wales: 0 hours (Local summer +1 hours)
-Wallis and Futuna Islands: +12 hours
-Windward Islands: -4 hours
-Yemen: +3 hours
-Yugoslavia: +1 hours (Local summer +2 hours)
-Zaire Kasai: +2 hours
-Zaire Kinshasa Mbandaka: +1 hours
-Zaire Haut Zaire: +2 hours
-Zaire Kivu: +2 hours
-Zaire Shaba: +2 hours
-Zambia: +2 hours
-Zimbabwe: +2 hours
-All timezone information is non-authoritative...
Deleted: vendor/tzcode/dist/usno1998
===================================================================
--- vendor/tzcode/dist/usno1998 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/usno1998 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,325 +0,0 @@
-# From Arthur David Olson (1998-05-26):
-#
-# Here's time zone information from the United States Naval Observatory
-# via http://tycho.usno.navy.mil/tzones.html. See USNO's note at the end.
-Unofficial Time Zone Information
-World Time Zones
-For selected countries, the local standard time offset from UTC is given, with daylight savings time where observed.
-Time: Mon May 25 21:14:24 UTC 1998
-Afghanistan: +4.5 hours
-Albania: +1 hours (Local summer +2 hours)
-Algeria: +1 hours (Local summer +2 hours)
-American Samoa: -11 hours
-Andorra: +1 hours (Local summer +2 hours)
-Angola: +1 hours
-Anguilla: -4 hours
-Antarctica: -2 hours (Local summer -3 hours)
-Antigua: -4 hours
-Argentina: -3 hours
-Argentina western prov: -4 hours
-Armenia: +4 hours (Local summer +5 hours)
-Aruba: -4 hours
-Ascension: 0 hours
-Australia Northern Territory: +9.5 hours
-Australia Lord Howe Island: +10.5 hours (Local summer +11 hours)
-Australia New South Wales: +10 hours (Local summer +11 hours)
-Australia Queensland: +10 hours
-Australia Victoria: +10 hours (Local summer +11 hours)
-Australia Australian Captial Territory: +10 hours (Local summer +11 hours)
-Australia South: +9.5 hours (Local summer +10.5 hours)
-Australia Tasmania: +10 hours (Local summer +11 hours)
-Australia Western: +8 hours
-Austria: +1 hours (Local summer +2 hours)
-Azerbajian: +3 hours
-Azores: -1 hours (Local summer 0 hours)
-Bahamas: -5 hours (Local summer -4 hours)
-Bahrain: +3 hours
-Balearic Islands: +1 hours (Local summer +2 hours)
-Bangladesh: +6 hours
-Barbados: -4 hours
-Belarus: +2 hours (Local summer +3 hours)
-Belgium: +1 hours (Local summer +2 hours)
-Belize: -6 hours
-Benin: +1 hours
-Bermuda: -4 hours (Local summer -3 hours)
-Bhutan: +6 hours
-Bolivia: -4 hours
-Bonaire: -4 hours
-Bosnia Hercegovina: +1 hours (Local summer +2 hours)
-Botswana: +2 hours
-Brazil Acre: -4 hours (Local summer -5 hours)
-Brazil Atlantic Islands: -1 hours (Local summer -2 hours)
-Brazil East: -3 hours (Local summer -1 hours)
-Brazil West: -4 hours (Local summer -3 hours)
-British Virgin Islands: -4 hours
-Brunei: +8 hours
-Bulgaria: +2 hours (Local summer +3 hours)
-Burkina Faso: 0 hours
-Burundi: +2 hours
-Cambodia: +7 hours
-Cameroon: +1 hours
-Canada Central: -6 hours (Local summer -5 hours)
-Canada Eastern: -5 hours (Local summer -4 hours)
-Canada Mountain: -7 hours (Local summer -6 hours)
-Canada Yukon & Pacific: -8 hours (Local summer -7 hours)
-Canada Atlantic: -4 hours (Local summer -3 hours)
-Canada Newfoundland: -3.5 hours (Local summer -2.5 hours)
-Canary Islands: 0 hours (Local summer +1 hours)
-Canton Enderbury Islands: -11 hours
-Cape Verde: -1 hours
-Caroline Island: +11 hours
-Cayman Islands: -5 hours
-Central African Rep: +1 hours
-Chad: +1 hours
-Channel Islands: 0 hours (Local summer +1 hours)
-Chatham Island: +12.75 hours (Local summer +13.75 hours)
-Chile: -4 hours (Local summer -3 hours)
-China People's Rep: +8 hours
-Christmas Islands: -10 hours
-Cocos (Keeling) Islands: ( hours (Local summer ) hours)
-Colombia: -5 hours
-Congo: +1 hours
-Cook Islands: -10 hours
-Costa Rica: -6 hours
-Cote d'Ivoire: 0 hours
-Croatia: +1 hours (Local summer +2 hours)
-Cuba: -5 hours (Local summer -4 hours)
-Curacao: -4 hours
-Cyprus: +2 hours (Local summer +3 hours)
-Czech Republic: +1 hours (Local summer +2 hours)
-Dahomey: +1 hours
-Denmark: +1 hours (Local summer +2 hours)
-Djibouti: +3 hours
-Dominica: -4 hours
-Dominican Republic: -4 hours
-Easter Island: -6 hours (Local summer -5 hours)
-Ecuador: -5 hours
-Egypt: +2 hours (Local summer +3 hours)
-El Salvador: -6 hours
-England: 0 hours (Local summer +1 hours)
-Equitorial Guinea: +1 hours
-Eritrea: +3 hours
-Estonia: +2 hours (Local summer +3 hours)
-Ethiopia: +3 hours
-Falkland Islands: -4 hours (Local summer -3 hours)
-Faroe Island: 0 hours (Local summer +1 hours)
-Fiji: +12 hours
-Finland: +2 hours (Local summer +3 hours)
-France: +1 hours (Local summer +2 hours)
-French Guiana: -3 hours
-French Polynesia: -10 hours
-Gabon: +1 hours
-Galapagos Islands: -5 hours
-Gambia: 0 hours
-Gambier Island: -9 hours
-Georgia: +4 hours
-Germany: +1 hours (Local summer +2 hours)
-Ghana: 0 hours
-Gibraltar: +1 hours (Local summer +2 hours)
-Greece: +2 hours (Local summer +3 hours)
-Greenland: -3 hours (Local summer -2 hours)
-Greenland Thule: -4 hours (Local summer -3 hours)
-Greenland Scoresbysun: -1 hours (Local summer 0 hours)
-Grenada: -4 hours
-Grenadines: -4 hours
-Guadeloupe: -4 hours
-Guam: +10 hours
-Guatemala: -6 hours
-Guinea: 0 hours
-Guinea Bissau: - hours (Local summer 0 hours)
-Guyana: -3 hours
-Haiti: -5 hours (Local summer -4 hours)
-Honduras: -6 hours
-Hong kong: +8 hours
-Hungary: +1 hours (Local summer +2 hours)
-Iceland: 0 hours
-India: +5.5 hours
-Indonesia Central: +8 hours
-Indonesia East: +9 hours
-Indonesia West: +7 hours
-Iran: +3.5 hours
-Iraq: +3 hours (Local summer +4 hours)
-Ireland Republic of: 0 hours (Local summer +1 hours)
-Israel: +2 hours (Local summer +3 hours)
-Italy: +1 hours (Local summer +2 hours)
-Jamaica: -5 hours
-Japan: +9 hours
-Johnston Island: -10 hours
-Jordan: +2 hours (Local summer +3 hours)
-Kazakhstan: +6 hours (Local summer +7 hours)
-Kenya: +3 hours
-Kiribati: +12 hours
-Korea Dem Republic of: +9 hours
-Korea Republic of: +9 hours
-Kusaie: +12 hours
-Kuwait: +3 hours
-Kwajalein: -12 hours
-Kyrgyzstan: +5 hours (Local summer +6 hours)
-Laos: +7 hours
-Latvia: +2 hours (Local summer +3 hours)
-Lebanon: +2 hours (Local summer +3 hours)
-Leeward Islands: -4 hours
-Lesotho: +2 hours
-Liberia: 0 hours
-Libya: +2 hours
-Lithuania: +2 hours (Local summer +3 hours)
-Luxembourg: +1 hours (Local summer +2 hours)
-Macedonia: +1 hours (Local summer +2 hours)
-Madagascar: +3 hours
-Madeira: 0 hours (Local summer +1 hours)
-Malawi: +2 hours
-Malaysia: +8 hours
-Maldives: +5 hours
-Mali: 0 hours
-Mallorca Islands: +1 hours (Local summer +2 hours)
-Malta: +1 hours (Local summer +2 hours)
-Mariana Island: +10 hours
-Marquesas Islands: -9.5 hours
-Marshall Islands: +12 hours
-Martinique: -4 hours
-Mauritania: 0 hours
-Mauritius: +4 hours
-Mayotte: +3 hours
-Melilla: +1 hours (Local summer +2 hours)
-Mexico: -6 hours
-Mexico Baja Calif Norte: -8 hours (Local summer -7 hours)
-Mexico Nayarit: -7 hours
-Mexico Sinaloa: -7 hours
-Mexico Sonora: -7 hours
-Midway Island: -11 hours
-Moldova: +2 hours (Local summer +3 hours)
-Moldovian Rep Pridnestrovye: +2 hours (Local summer +3 hours)
-Monaco: +1 hours (Local summer +2 hours)
-Mongolia: +8 hours
-Morocco: 0 hours
-Mozambique: +2 hours
-Myanmar: +6.5 hours
-Namibia: +1 hours (Local summer +2 hours)
-Nauru Republic of: +12 hours
-Nepal: +5.75 hours
-Netherlands: +1 hours (Local summer +2 hours)
-Netherlands Antilles: -4 hours
-Nevis Montserrat: -4 hours
-New Caledonia: +11 hours
-New Hebrides: +11 hours
-New Zealand: +12 hours (Local summer +13 hours)
-Nicaragua: -6 hours (Local summer -5 hours)
-Niger: +1 hours
-Nigeria: +1 hours
-Niue Island: -11 hours
-Norfolk Island: +11.5 hours
-Northern Ireland: 0 hours (Local summer +1 hours)
-Northern Mariana Islands: +10 hours
-Norway: +1 hours (Local summer +2 hours)
-Oman: +4 hours
-Pakistan: +5 hours
-Palau: +9 hours
-Panama: -5 hours
-Papua New Guinea: +10 hours
-Paraguay: -4 hours (Local summer -3 hours)
-Peru: -5 hours
-Philippines: +8 hours
-Pingelap: +12 hours
-Poland: +1 hours (Local summer +2 hours)
-Ponape Island: +11 hours
-Portugal: +1 hours (Local summer +2 hours)
-Principe Island: 0 hours
-Puerto Rico: -4 hours
-Qatar: +3 hours
-Reunion: +4 hours
-Romania: +2 hours (Local summer +3 hours)
-Russian Federation zone eight: +9 hours (Local summer +10 hours)
-Russian Federation zone eleven: +12 hours (Local summer +13 hours)
-Russian Federation zone five: +6 hours (Local summer +7 hours)
-Russian Federation zone four: +5 hours (Local summer +6 hours)
-Russian Federation zone nine: +10 hours (Local summer +11 hours)
-Russian Federation zone one: +2 hours (Local summer +3 hours)
-Russian Federation zone seven: +8 hours (Local summer +9 hours)
-Russian Federation zone six: +7 hours (Local summer +8 hours)
-Russian Federation zone ten: +11 hours (Local summer +12 hours)
-Russian Federation zone three: +4 hours (Local summer +5 hours)
-Russian Federation zone two: +4 hours (Local summer +5 hours)
-Rwanda: +2 hours
-Saba: -4 hours
-Samoa: -11 hours
-San Marino: +1 hours (Local summer +2 hours)
-Sao Tome e Principe: 0 hours
-Saudi Arabia: +3 hours
-Scotland: 0 hours (Local summer +1 hours)
-Senegal: 0 hours
-Seychelles: +4 hours
-Sierra Leone: 0 hours
-Singapore: +8 hours
-Slovakia: +1 hours (Local summer +2 hours)
-Slovenia: +1 hours (Local summer +2 hours)
-Society Island: -10 hours
-Solomon Islands: +11 hours
-Somalia: +3 hours
-South Africa: +2 hours
-Spain: +1 hours (Local summer +2 hours)
-Sri Lanka: +5.5 hours
-St Christopher: -4 hours
-St Croix: -4 hours
-St Helena: 0 hours
-St John: -4 hours
-St Kitts Nevis: -4 hours
-St Lucia: -4 hours
-St Maarten: -4 hours
-St Pierre & Miquelon: -3 hours (Local summer -2 hours)
-St Thomas: -4 hours
-St Vincent: -4 hours
-Sudan: +2 hours
-Suriname: -3 hours
-Swaziland: +2 hours
-Sweden: +1 hours (Local summer +2 hours)
-Switzerland: +1 hours (Local summer +2 hours)
-Syria: +2 hours (Local summer +3 hours)
-Tahiti: -10 hours
-Taiwan: +8 hours
-Tajikistan: +6 hours
-Tanzania: +3 hours
-Thailand: +7 hours
-Togo: 0 hours
-Tonga: +13 hours
-Trinidad and Tobago: -4 hours
-Tuamotu Island: -10 hours
-Tubuai Island: -10 hours
-Tunisia: +1 hours
-Turkey: +2 hours (Local summer +3 hours)
-Turkmenistan: +5 hours
-Turks and Caicos Islands: -5 hours (Local summer -4 hours)
-Tuvalu: +12 hours
-Uganda: +3 hours
-Ukraine: +2 hours (Local summer +3 hours)
-United Arab Emirates: +4 hours
-United Kingdom: 0 hours (Local summer +1 hours)
-USA Central: -6 hours (Local summer -5 hours)
-USA Eastern: -5 hours (Local summer -4 hours)
-USA Mountain: -7 hours (Local summer -6 hours)
-USA Arizona: -7 hours
-USA Indiana East: -5 hours
-USA Pacific: -8 hours (Local summer -7 hours)
-USA Alaska: -9 hours (Local summer -8 hours)
-USA Aleutian: -10 hours
-USA Hawaii: -10 hours
-Uruguay: -3 hours
-Uzbekistan: +5 hours
-Vanuatu: +11 hours (Local summer +12 hours)
-Vatican City: +1 hours (Local summer +2 hours)
-Venezuela: -4 hours
-Vietnam: +7 hours
-Virgin Islands: -4 hours
-Wake Island: +12 hours
-Wales: 0 hours (Local summer +1 hours)
-Wallis and Futuna Islands: +12 hours
-Windward Islands: -4 hours
-Yemen: +3 hours
-Yugoslavia: +1 hours (Local summer +2 hours)
-Zaire Kasai: +2 hours
-Zaire Kinshasa Mbandaka: +1 hours
-Zaire Haut Zaire: +2 hours
-Zaire Kivu: +2 hours
-Zaire Shaba: +2 hours
-Zambia: +2 hours
-Zimbabwe: +2 hours
-All timezone information is non-authoritative...
Deleted: vendor/tzcode/dist/workman.sh
===================================================================
--- vendor/tzcode/dist/workman.sh 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/workman.sh 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,32 +0,0 @@
-#! /bin/sh
-
-# This file is in the public domain, so clarified as of
-# 2009-05-17 by Arthur David Olson.
-
-# Tell groff not to emit SGR escape sequences (ANSI color escapes).
-GROFF_NO_SGR=1
-export GROFF_NO_SGR
-
-echo ".am TH
-.hy 0
-.na
-..
-.rm }H
-.rm }F" | nroff -man - ${1+"$@"} | perl -ne '
- binmode STDIN, '\'':encoding(utf8)'\'';
- binmode STDOUT, '\'':encoding(utf8)'\'';
- chomp;
- s/.\010//g;
- s/\s*$//;
- if (/^$/) {
- $sawblank = 1;
- next;
- } else {
- if ($sawblank && $didprint) {
- print "\n";
- $sawblank = 0;
- }
- print "$_\n";
- $didprint = 1;
- }
-'
Deleted: vendor/tzcode/dist/zdump.8
===================================================================
--- vendor/tzcode/dist/zdump.8 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zdump.8 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,92 +0,0 @@
-.TH ZDUMP 8
-.SH NAME
-zdump \- time zone dumper
-.SH SYNOPSIS
-.B zdump
-[
-.I option
-\&... ] [
-.I zonename
-\&... ]
-.SH DESCRIPTION
-.ie \n(.g .ds - \f(CW-\fP
-.el ds - \-
-.I Zdump
-prints the current time in each
-.I zonename
-named on the command line.
-.PP
-These options are available:
-.TP
-.BI "\*-\*-version"
-Output version information and exit.
-.TP
-.B \*-v
-For each
-.I zonename
-on the command line,
-print the time at the lowest possible time value,
-the time one day after the lowest possible time value,
-the times both one second before and exactly at
-each detected time discontinuity,
-the time at one day less than the highest possible time value,
-and the time at the highest possible time value.
-Each line is followed by
-.BI isdst= D
-where
-.I D
-is positive, zero, or negative depending on whether
-the given time is daylight saving time, standard time,
-or an unknown time type, respectively.
-Each line is also followed by
-.BI gmtoff= N
-if the given local time is known to be
-.I N
-seconds east of Greenwich.
-.TP
-.B \*-V
-Like
-.BR \*-v ,
-except omit the times relative to the extreme time values.
-This generates output that is easier to compare to that of
-implementations with different time representations.
-.TP
-.BI "\*-c " [loyear,]hiyear
-Cut off verbose output at the given year(s).
-Cutoff times are computed using the proleptic Gregorian calendar with year 0
-and with Universal Time (UT) ignoring leap seconds.
-The lower bound is exclusive and the upper is inclusive; for example, a
-.I loyear
-of 1970 excludes a transition occurring at 1970-01-01 00:00:00 UTC but a
-.I hiyear
-of 1970 includes the transition.
-The default cutoff is
-.BR \*-500,2500 .
-.TP
-.BI "\*-t " [lotime,]hitime
-Cut off verbose output at the given time(s),
-given in decimal seconds since 1970-01-01 00:00:00
-Coordinated Universal Time (UTC).
-The
-.I zonename
-determines whether the count includes leap seconds.
-As with
-.BR \*-c ,
-the cutoff's lower bound is exclusive and its upper bound is inclusive.
-.SH LIMITATIONS
-Time discontinuities are found by sampling the results returned by localtime
-at twelve-hour intervals.
-This works in all real-world cases;
-one can construct artificial time zones for which this fails.
-.PP
-In the output, "UT" denotes the value returned by
-.IR gmtime (3),
-which uses UTC for modern time stamps and some other UT flavor for
-time stamps that predate the introduction of UTC.
-No attempt is currently made to have the output use "UTC" for newer
-and "UT" for older time stamps,
-partly because the exact date of the introduction of UTC is problematic.
-.SH "SEE ALSO"
-newctime(3), tzfile(5), zic(8)
-.\" This file is in the public domain, so clarified as of
-.\" 2009-05-17 by Arthur David Olson.
Deleted: vendor/tzcode/dist/zdump.8.txt
===================================================================
--- vendor/tzcode/dist/zdump.8.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zdump.8.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,65 +0,0 @@
-ZDUMP(8) System Manager's Manual ZDUMP(8)
-
-NAME
- zdump - time zone dumper
-
-SYNOPSIS
- zdump [ option ... ] [ zonename ... ]
-
-DESCRIPTION
- Zdump prints the current time in each zonename named on the command
- line.
-
- These options are available:
-
- --version
- Output version information and exit.
-
- -v For each zonename on the command line, print the time at the
- lowest possible time value, the time one day after the lowest
- possible time value, the times both one second before and
- exactly at each detected time discontinuity, the time at one day
- less than the highest possible time value, and the time at the
- highest possible time value. Each line is followed by isdst=D
- where D is positive, zero, or negative depending on whether the
- given time is daylight saving time, standard time, or an unknown
- time type, respectively. Each line is also followed by gmtoff=N
- if the given local time is known to be N seconds east of
- Greenwich.
-
- -V Like -v, except omit the times relative to the extreme time
- values. This generates output that is easier to compare to that
- of implementations with different time representations.
-
- -c [loyear,]hiyear
- Cut off verbose output at the given year(s). Cutoff times are
- computed using the proleptic Gregorian calendar with year 0 and
- with Universal Time (UT) ignoring leap seconds. The lower bound
- is exclusive and the upper is inclusive; for example, a loyear
- of 1970 excludes a transition occurring at 1970-01-01 00:00:00
- UTC but a hiyear of 1970 includes the transition. The default
- cutoff is -500,2500.
-
- -t [lotime,]hitime
- Cut off verbose output at the given time(s), given in decimal
- seconds since 1970-01-01 00:00:00 Coordinated Universal Time
- (UTC). The zonename determines whether the count includes leap
- seconds. As with -c, the cutoff's lower bound is exclusive and
- its upper bound is inclusive.
-
-LIMITATIONS
- Time discontinuities are found by sampling the results returned by
- localtime at twelve-hour intervals. This works in all real-world
- cases; one can construct artificial time zones for which this fails.
-
- In the output, "UT" denotes the value returned by gmtime(3), which uses
- UTC for modern time stamps and some other UT flavor for time stamps
- that predate the introduction of UTC. No attempt is currently made to
- have the output use "UTC" for newer and "UT" for older time stamps,
- partly because the exact date of the introduction of UTC is
- problematic.
-
-SEE ALSO
- newctime(3), tzfile(5), zic(8)
-
- ZDUMP(8)
Deleted: vendor/tzcode/dist/zdump.c
===================================================================
--- vendor/tzcode/dist/zdump.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zdump.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,1014 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 2009-05-17 by Arthur David Olson.
-*/
-
-#include "version.h"
-
-/*
-** This code has been made independent of the rest of the time
-** conversion package to increase confidence in the verification it provides.
-** You can use this code to help in verifying other implementations.
-** To do this, compile with -DUSE_LTZ=0 and link without the tz library.
-*/
-
-#ifndef NETBSD_INSPIRED
-# define NETBSD_INSPIRED 1
-#endif
-#ifndef USE_LTZ
-# define USE_LTZ 1
-#endif
-
-#if USE_LTZ
-# include "private.h"
-#endif
-
-/* Enable tm_gmtoff and tm_zone on GNUish systems. */
-#define _GNU_SOURCE 1
-/* Enable strtoimax on Solaris 10. */
-#define __EXTENSIONS__ 1
-
-#include "stdio.h" /* for stdout, stderr, perror */
-#include "string.h" /* for strcpy */
-#include "sys/types.h" /* for time_t */
-#include "time.h" /* for struct tm */
-#include "stdlib.h" /* for exit, malloc, atoi */
-#include "limits.h" /* for CHAR_BIT, LLONG_MAX */
-#include <errno.h>
-
-/*
-** Substitutes for pre-C99 compilers.
-** Much of this section of code is stolen from private.h.
-*/
-
-#ifndef HAVE_STDINT_H
-# define HAVE_STDINT_H \
- (199901 <= __STDC_VERSION__ \
- || 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
- || __CYGWIN__)
-#endif
-#if HAVE_STDINT_H
-# include "stdint.h"
-#endif
-#ifndef HAVE_INTTYPES_H
-# define HAVE_INTTYPES_H HAVE_STDINT_H
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-
-#ifndef INT_FAST32_MAX
-# if INT_MAX >> 31 == 0
-typedef long int_fast32_t;
-# else
-typedef int int_fast32_t;
-# endif
-#endif
-
-/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */
-#if !defined LLONG_MAX && defined __LONG_LONG_MAX__
-# define LLONG_MAX __LONG_LONG_MAX__
-#endif
-
-#ifndef INTMAX_MAX
-# ifdef LLONG_MAX
-typedef long long intmax_t;
-# define strtoimax strtoll
-# define INTMAX_MAX LLONG_MAX
-# else
-typedef long intmax_t;
-# define strtoimax strtol
-# define INTMAX_MAX LONG_MAX
-# endif
-#endif
-
-#ifndef PRIdMAX
-# if INTMAX_MAX == LLONG_MAX
-# define PRIdMAX "lld"
-# else
-# define PRIdMAX "ld"
-# endif
-#endif
-
-/* Infer TM_ZONE on systems where this information is known, but suppress
- guessing if NO_TM_ZONE is defined. Similarly for TM_GMTOFF. */
-#if (defined __GLIBC__ \
- || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
- || (defined __APPLE__ && defined __MACH__))
-# if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
-# define TM_GMTOFF tm_gmtoff
-# endif
-# if !defined TM_ZONE && !defined NO_TM_ZONE
-# define TM_ZONE tm_zone
-# endif
-#endif
-
-#ifndef HAVE_LOCALTIME_R
-# define HAVE_LOCALTIME_R 1
-#endif
-
-#ifndef HAVE_LOCALTIME_RZ
-# ifdef TM_ZONE
-# define HAVE_LOCALTIME_RZ (NETBSD_INSPIRED && USE_LTZ)
-# else
-# define HAVE_LOCALTIME_RZ 0
-# endif
-#endif
-
-#ifndef HAVE_TZSET
-# define HAVE_TZSET 1
-#endif
-
-#ifndef ZDUMP_LO_YEAR
-#define ZDUMP_LO_YEAR (-500)
-#endif /* !defined ZDUMP_LO_YEAR */
-
-#ifndef ZDUMP_HI_YEAR
-#define ZDUMP_HI_YEAR 2500
-#endif /* !defined ZDUMP_HI_YEAR */
-
-#ifndef MAX_STRING_LENGTH
-#define MAX_STRING_LENGTH 1024
-#endif /* !defined MAX_STRING_LENGTH */
-
-#if __STDC_VERSION__ < 199901
-# define true 1
-# define false 0
-# define bool int
-#else
-# include <stdbool.h>
-#endif
-
-#ifndef EXIT_SUCCESS
-#define EXIT_SUCCESS 0
-#endif /* !defined EXIT_SUCCESS */
-
-#ifndef EXIT_FAILURE
-#define EXIT_FAILURE 1
-#endif /* !defined EXIT_FAILURE */
-
-#ifndef SECSPERMIN
-#define SECSPERMIN 60
-#endif /* !defined SECSPERMIN */
-
-#ifndef MINSPERHOUR
-#define MINSPERHOUR 60
-#endif /* !defined MINSPERHOUR */
-
-#ifndef SECSPERHOUR
-#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
-#endif /* !defined SECSPERHOUR */
-
-#ifndef HOURSPERDAY
-#define HOURSPERDAY 24
-#endif /* !defined HOURSPERDAY */
-
-#ifndef EPOCH_YEAR
-#define EPOCH_YEAR 1970
-#endif /* !defined EPOCH_YEAR */
-
-#ifndef TM_YEAR_BASE
-#define TM_YEAR_BASE 1900
-#endif /* !defined TM_YEAR_BASE */
-
-#ifndef DAYSPERNYEAR
-#define DAYSPERNYEAR 365
-#endif /* !defined DAYSPERNYEAR */
-
-#ifndef isleap
-#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
-#endif /* !defined isleap */
-
-#ifndef isleap_sum
-/*
-** See tzfile.h for details on isleap_sum.
-*/
-#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
-#endif /* !defined isleap_sum */
-
-#define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
-#define SECSPERNYEAR (SECSPERDAY * DAYSPERNYEAR)
-#define SECSPERLYEAR (SECSPERNYEAR + SECSPERDAY)
-#define SECSPER400YEARS (SECSPERNYEAR * (intmax_t) (300 + 3) \
- + SECSPERLYEAR * (intmax_t) (100 - 3))
-
-/*
-** True if SECSPER400YEARS is known to be representable as an
-** intmax_t. It's OK that SECSPER400YEARS_FITS can in theory be false
-** even if SECSPER400YEARS is representable, because when that happens
-** the code merely runs a bit more slowly, and this slowness doesn't
-** occur on any practical platform.
-*/
-enum { SECSPER400YEARS_FITS = SECSPERLYEAR <= INTMAX_MAX / 400 };
-
-#ifndef HAVE_GETTEXT
-#define HAVE_GETTEXT 0
-#endif
-#if HAVE_GETTEXT
-#include "locale.h" /* for setlocale */
-#include "libintl.h"
-#endif /* HAVE_GETTEXT */
-
-#if 2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)
-# define ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define ATTRIBUTE_PURE /* empty */
-#endif
-
-/*
-** For the benefit of GNU folk...
-** '_(MSGID)' uses the current locale's message library string for MSGID.
-** The default is to use gettext if available, and use MSGID otherwise.
-*/
-
-#ifndef _
-#if HAVE_GETTEXT
-#define _(msgid) gettext(msgid)
-#else /* !HAVE_GETTEXT */
-#define _(msgid) msgid
-#endif /* !HAVE_GETTEXT */
-#endif /* !defined _ */
-
-#if !defined TZ_DOMAIN && defined HAVE_GETTEXT
-# define TZ_DOMAIN "tz"
-#endif
-
-#if ! HAVE_LOCALTIME_RZ
-# undef timezone_t
-# define timezone_t char **
-#endif
-
-#if !HAVE_POSIX_DECLS
-extern char ** environ;
-extern int getopt(int argc, char * const argv[],
- const char * options);
-extern char * optarg;
-extern int optind;
-extern char * tzname[];
-#endif
-
-/* The minimum and maximum finite time values. */
-enum { atime_shift = CHAR_BIT * sizeof (time_t) - 2 };
-static time_t const absolute_min_time =
- ((time_t) -1 < 0
- ? (- ((time_t) ~ (time_t) 0 < 0)
- - (((time_t) 1 << atime_shift) - 1 + ((time_t) 1 << atime_shift)))
- : 0);
-static time_t const absolute_max_time =
- ((time_t) -1 < 0
- ? (((time_t) 1 << atime_shift) - 1 + ((time_t) 1 << atime_shift))
- : -1);
-static int longest;
-static char * progname;
-static bool warned;
-static bool errout;
-
-static char const *abbr(struct tm const *);
-static intmax_t delta(struct tm *, struct tm *) ATTRIBUTE_PURE;
-static void dumptime(struct tm const *);
-static time_t hunt(timezone_t, char *, time_t, time_t);
-static void show(timezone_t, char *, time_t, bool);
-static const char *tformat(void);
-static time_t yeartot(intmax_t) ATTRIBUTE_PURE;
-
-/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
-#define is_digit(c) ((unsigned)(c) - '0' <= 9)
-
-/* Is A an alphabetic character in the C locale? */
-static bool
-is_alpha(char a)
-{
- switch (a) {
- default:
- return false;
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
- case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
- case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
- case 'V': case 'W': case 'X': case 'Y': case 'Z':
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
- case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
- case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
- case 'v': case 'w': case 'x': case 'y': case 'z':
- return true;
- }
-}
-
-/* Return A + B, exiting if the result would overflow. */
-static size_t
-sumsize(size_t a, size_t b)
-{
- size_t sum = a + b;
- if (sum < a) {
- fprintf(stderr, "%s: size overflow\n", progname);
- exit(EXIT_FAILURE);
- }
- return sum;
-}
-
-#if ! HAVE_TZSET
-# undef tzset
-# define tzset zdump_tzset
-static void tzset(void) { }
-#endif
-
-/* Assume gmtime_r works if localtime_r does.
- A replacement localtime_r is defined below if needed. */
-#if ! HAVE_LOCALTIME_R
-
-# undef gmtime_r
-# define gmtime_r zdump_gmtime_r
-
-static struct tm *
-gmtime_r(time_t *tp, struct tm *tmp)
-{
- struct tm *r = gmtime(tp);
- if (r) {
- *tmp = *r;
- r = tmp;
- }
- return r;
-}
-
-#endif
-
-/* Platforms with TM_ZONE don't need tzname, so they can use the
- faster localtime_rz or localtime_r if available. */
-
-#if defined TM_ZONE && HAVE_LOCALTIME_RZ
-# define USE_LOCALTIME_RZ true
-#else
-# define USE_LOCALTIME_RZ false
-#endif
-
-#if ! USE_LOCALTIME_RZ
-
-# if !defined TM_ZONE || ! HAVE_LOCALTIME_R || ! HAVE_TZSET
-# undef localtime_r
-# define localtime_r zdump_localtime_r
-static struct tm *
-localtime_r(time_t *tp, struct tm *tmp)
-{
- struct tm *r = localtime(tp);
- if (r) {
- *tmp = *r;
- r = tmp;
- }
- return r;
-}
-# endif
-
-# undef localtime_rz
-# define localtime_rz zdump_localtime_rz
-static struct tm *
-localtime_rz(timezone_t rz, time_t *tp, struct tm *tmp)
-{
- return localtime_r(tp, tmp);
-}
-
-# ifdef TYPECHECK
-# undef mktime_z
-# define mktime_z zdump_mktime_z
-static time_t
-mktime_z(timezone_t tz, struct tm *tmp)
-{
- return mktime(tmp);
-}
-# endif
-
-# undef tzalloc
-# undef tzfree
-# define tzalloc zdump_tzalloc
-# define tzfree zdump_tzfree
-
-static timezone_t
-tzalloc(char const *val)
-{
- static char **fakeenv;
- char **env = fakeenv;
- char *env0;
- if (! env) {
- char **e = environ;
- int to;
-
- while (*e++)
- continue;
- env = malloc(sumsize(sizeof *environ,
- (e - environ) * sizeof *environ));
- if (! env) {
- perror(progname);
- exit(EXIT_FAILURE);
- }
- to = 1;
- for (e = environ; (env[to] = *e); e++)
- to += strncmp(*e, "TZ=", 3) != 0;
- }
- env0 = malloc(sumsize(sizeof "TZ=", strlen(val)));
- if (! env0) {
- perror(progname);
- exit(EXIT_FAILURE);
- }
- env[0] = strcat(strcpy(env0, "TZ="), val);
- environ = fakeenv = env;
- tzset();
- return env;
-}
-
-static void
-tzfree(timezone_t env)
-{
- environ = env + 1;
- free(env[0]);
-}
-#endif /* ! USE_LOCALTIME_RZ */
-
-/* A UTC time zone, and its initializer. */
-static timezone_t gmtz;
-static void
-gmtzinit(void)
-{
- if (USE_LOCALTIME_RZ) {
- static char const utc[] = "UTC0";
- gmtz = tzalloc(utc);
- if (!gmtz) {
- perror(utc);
- exit(EXIT_FAILURE);
- }
- }
-}
-
-/* Convert *TP to UTC, storing the broken-down time into *TMP.
- Return TMP if successful, NULL otherwise. This is like gmtime_r(TP, TMP),
- except typically faster if USE_LOCALTIME_RZ. */
-static struct tm *
-my_gmtime_r(time_t *tp, struct tm *tmp)
-{
- return USE_LOCALTIME_RZ ? localtime_rz(gmtz, tp, tmp) : gmtime_r(tp, tmp);
-}
-
-#ifndef TYPECHECK
-# define my_localtime_rz localtime_rz
-#else /* !defined TYPECHECK */
-
-static struct tm *
-my_localtime_rz(timezone_t tz, time_t *tp, struct tm *tmp)
-{
- tmp = localtime_rz(tz, tp, tmp);
- if (tmp) {
- struct tm tm;
- register time_t t;
-
- tm = *tmp;
- t = mktime_z(tz, &tm);
- if (t != *tp) {
- fflush(stdout);
- fprintf(stderr, "\n%s: ", progname);
- fprintf(stderr, tformat(), *tp);
- fprintf(stderr, " ->");
- fprintf(stderr, " year=%d", tmp->tm_year);
- fprintf(stderr, " mon=%d", tmp->tm_mon);
- fprintf(stderr, " mday=%d", tmp->tm_mday);
- fprintf(stderr, " hour=%d", tmp->tm_hour);
- fprintf(stderr, " min=%d", tmp->tm_min);
- fprintf(stderr, " sec=%d", tmp->tm_sec);
- fprintf(stderr, " isdst=%d", tmp->tm_isdst);
- fprintf(stderr, " -> ");
- fprintf(stderr, tformat(), t);
- fprintf(stderr, "\n");
- errout = true;
- }
- }
- return tmp;
-}
-#endif /* !defined TYPECHECK */
-
-static void
-abbrok(const char *const abbrp, const char *const zone)
-{
- register const char * cp;
- register const char * wp;
-
- if (warned)
- return;
- cp = abbrp;
- while (is_alpha(*cp) || is_digit(*cp) || *cp == '-' || *cp == '+')
- ++cp;
- if (cp - abbrp < 3)
- wp = _("has fewer than 3 characters");
- else if (cp - abbrp > 6)
- wp = _("has more than 6 characters");
- else if (*cp)
- wp = _("has characters other than ASCII alphanumerics, '-' or '+'");
- else
- return;
- fflush(stdout);
- fprintf(stderr,
- _("%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"),
- progname, zone, abbrp, wp);
- warned = errout = true;
-}
-
-/* Return a time zone abbreviation. If the abbreviation needs to be
- saved, use *BUF (of size *BUFALLOC) to save it, and return the
- abbreviation in the possibly-reallocated *BUF. Otherwise, just
- return the abbreviation. Get the abbreviation from TMP.
- Exit on memory allocation failure. */
-static char const *
-saveabbr(char **buf, size_t *bufalloc, struct tm const *tmp)
-{
- char const *ab = abbr(tmp);
- if (HAVE_LOCALTIME_RZ)
- return ab;
- else {
- size_t ablen = strlen(ab);
- if (*bufalloc <= ablen) {
- free(*buf);
-
- /* Make the new buffer at least twice as long as the old,
- to avoid O(N**2) behavior on repeated calls. */
- *bufalloc = sumsize(*bufalloc, ablen + 1);
-
- *buf = malloc(*bufalloc);
- if (! *buf) {
- perror(progname);
- exit(EXIT_FAILURE);
- }
- }
- return strcpy(*buf, ab);
- }
-}
-
-static void
-close_file(FILE *stream)
-{
- char const *e = (ferror(stream) ? _("I/O error")
- : fclose(stream) != 0 ? strerror(errno) : NULL);
- if (e) {
- fprintf(stderr, "%s: %s\n", progname, e);
- exit(EXIT_FAILURE);
- }
-}
-
-static void
-usage(FILE * const stream, const int status)
-{
- fprintf(stream,
-_("%s: usage: %s [--version] [--help] [-{vV}] [-{ct} [lo,]hi] zonename ...\n"
- "\n"
- "Report bugs to %s.\n"),
- progname, progname, REPORT_BUGS_TO);
- if (status == EXIT_SUCCESS)
- close_file(stream);
- exit(status);
-}
-
-int
-main(int argc, char *argv[])
-{
- /* These are static so that they're initially zero. */
- static char * abbrev;
- static size_t abbrevsize;
- static struct tm newtm;
-
- register int i;
- register bool vflag;
- register bool Vflag;
- register char * cutarg;
- register char * cuttimes;
- register time_t cutlotime;
- register time_t cuthitime;
- time_t now;
- time_t t;
- time_t newt;
- struct tm tm;
- register struct tm * tmp;
- register struct tm * newtmp;
-
- cutlotime = absolute_min_time;
- cuthitime = absolute_max_time;
-#if HAVE_GETTEXT
- setlocale(LC_ALL, "");
-#ifdef TZ_DOMAINDIR
- bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
-#endif /* defined TEXTDOMAINDIR */
- textdomain(TZ_DOMAIN);
-#endif /* HAVE_GETTEXT */
- progname = argv[0];
- for (i = 1; i < argc; ++i)
- if (strcmp(argv[i], "--version") == 0) {
- printf("zdump %s%s\n", PKGVERSION, TZVERSION);
- return EXIT_SUCCESS;
- } else if (strcmp(argv[i], "--help") == 0) {
- usage(stdout, EXIT_SUCCESS);
- }
- vflag = Vflag = false;
- cutarg = cuttimes = NULL;
- for (;;)
- switch (getopt(argc, argv, "c:t:vV")) {
- case 'c': cutarg = optarg; break;
- case 't': cuttimes = optarg; break;
- case 'v': vflag = true; break;
- case 'V': Vflag = true; break;
- case -1:
- if (! (optind == argc - 1 && strcmp(argv[optind], "=") == 0))
- goto arg_processing_done;
- /* Fall through. */
- default:
- usage(stderr, EXIT_FAILURE);
- }
- arg_processing_done:;
-
- if (vflag | Vflag) {
- intmax_t lo;
- intmax_t hi;
- char *loend, *hiend;
- register intmax_t cutloyear = ZDUMP_LO_YEAR;
- register intmax_t cuthiyear = ZDUMP_HI_YEAR;
- if (cutarg != NULL) {
- lo = strtoimax(cutarg, &loend, 10);
- if (cutarg != loend && !*loend) {
- hi = lo;
- cuthiyear = hi;
- } else if (cutarg != loend && *loend == ','
- && (hi = strtoimax(loend + 1, &hiend, 10),
- loend + 1 != hiend && !*hiend)) {
- cutloyear = lo;
- cuthiyear = hi;
- } else {
- fprintf(stderr, _("%s: wild -c argument %s\n"),
- progname, cutarg);
- return EXIT_FAILURE;
- }
- }
- if (cutarg != NULL || cuttimes == NULL) {
- cutlotime = yeartot(cutloyear);
- cuthitime = yeartot(cuthiyear);
- }
- if (cuttimes != NULL) {
- lo = strtoimax(cuttimes, &loend, 10);
- if (cuttimes != loend && !*loend) {
- hi = lo;
- if (hi < cuthitime) {
- if (hi < absolute_min_time)
- hi = absolute_min_time;
- cuthitime = hi;
- }
- } else if (cuttimes != loend && *loend == ','
- && (hi = strtoimax(loend + 1, &hiend, 10),
- loend + 1 != hiend && !*hiend)) {
- if (cutlotime < lo) {
- if (absolute_max_time < lo)
- lo = absolute_max_time;
- cutlotime = lo;
- }
- if (hi < cuthitime) {
- if (hi < absolute_min_time)
- hi = absolute_min_time;
- cuthitime = hi;
- }
- } else {
- fprintf(stderr,
- _("%s: wild -t argument %s\n"),
- progname, cuttimes);
- return EXIT_FAILURE;
- }
- }
- }
- gmtzinit();
- now = time(NULL);
- longest = 0;
- for (i = optind; i < argc; i++) {
- size_t arglen = strlen(argv[i]);
- if (longest < arglen)
- longest = arglen < INT_MAX ? arglen : INT_MAX;
- }
-
- for (i = optind; i < argc; ++i) {
- timezone_t tz = tzalloc(argv[i]);
- char const *ab;
- if (!tz) {
- perror(argv[i]);
- return EXIT_FAILURE;
- }
- if (! (vflag | Vflag)) {
- show(tz, argv[i], now, false);
- tzfree(tz);
- continue;
- }
- warned = false;
- t = absolute_min_time;
- if (!Vflag) {
- show(tz, argv[i], t, true);
- t += SECSPERDAY;
- show(tz, argv[i], t, true);
- }
- if (t < cutlotime)
- t = cutlotime;
- tmp = my_localtime_rz(tz, &t, &tm);
- if (tmp)
- ab = saveabbr(&abbrev, &abbrevsize, &tm);
- while (t < cuthitime) {
- newt = ((t < absolute_max_time - SECSPERDAY / 2
- && t + SECSPERDAY / 2 < cuthitime)
- ? t + SECSPERDAY / 2
- : cuthitime);
- newtmp = localtime_rz(tz, &newt, &newtm);
- if ((tmp == NULL || newtmp == NULL) ? (tmp != newtmp) :
- (delta(&newtm, &tm) != (newt - t) ||
- newtm.tm_isdst != tm.tm_isdst ||
- strcmp(abbr(&newtm), ab) != 0)) {
- newt = hunt(tz, argv[i], t, newt);
- newtmp = localtime_rz(tz, &newt, &newtm);
- if (newtmp)
- ab = saveabbr(&abbrev, &abbrevsize,
- &newtm);
- }
- t = newt;
- tm = newtm;
- tmp = newtmp;
- }
- if (!Vflag) {
- t = absolute_max_time;
- t -= SECSPERDAY;
- show(tz, argv[i], t, true);
- t += SECSPERDAY;
- show(tz, argv[i], t, true);
- }
- tzfree(tz);
- }
- close_file(stdout);
- if (errout && (ferror(stderr) || fclose(stderr) != 0))
- return EXIT_FAILURE;
- return EXIT_SUCCESS;
-}
-
-static time_t
-yeartot(intmax_t y)
-{
- register intmax_t myy, seconds, years;
- register time_t t;
-
- myy = EPOCH_YEAR;
- t = 0;
- while (myy < y) {
- if (SECSPER400YEARS_FITS && 400 <= y - myy) {
- intmax_t diff400 = (y - myy) / 400;
- if (INTMAX_MAX / SECSPER400YEARS < diff400)
- return absolute_max_time;
- seconds = diff400 * SECSPER400YEARS;
- years = diff400 * 400;
- } else {
- seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
- years = 1;
- }
- myy += years;
- if (t > absolute_max_time - seconds)
- return absolute_max_time;
- t += seconds;
- }
- while (y < myy) {
- if (SECSPER400YEARS_FITS && y + 400 <= myy && myy < 0) {
- intmax_t diff400 = (myy - y) / 400;
- if (INTMAX_MAX / SECSPER400YEARS < diff400)
- return absolute_min_time;
- seconds = diff400 * SECSPER400YEARS;
- years = diff400 * 400;
- } else {
- seconds = isleap(myy - 1) ? SECSPERLYEAR : SECSPERNYEAR;
- years = 1;
- }
- myy -= years;
- if (t < absolute_min_time + seconds)
- return absolute_min_time;
- t -= seconds;
- }
- return t;
-}
-
-static time_t
-hunt(timezone_t tz, char *name, time_t lot, time_t hit)
-{
- static char * loab;
- static size_t loabsize;
- char const * ab;
- time_t t;
- struct tm lotm;
- register struct tm * lotmp;
- struct tm tm;
- register struct tm * tmp;
-
- lotmp = my_localtime_rz(tz, &lot, &lotm);
- if (lotmp)
- ab = saveabbr(&loab, &loabsize, &lotm);
- for ( ; ; ) {
- time_t diff = hit - lot;
- if (diff < 2)
- break;
- t = lot;
- t += diff / 2;
- if (t <= lot)
- ++t;
- else if (t >= hit)
- --t;
- tmp = my_localtime_rz(tz, &t, &tm);
- if ((lotmp == NULL || tmp == NULL) ? (lotmp == tmp) :
- (delta(&tm, &lotm) == (t - lot) &&
- tm.tm_isdst == lotm.tm_isdst &&
- strcmp(abbr(&tm), ab) == 0)) {
- lot = t;
- lotm = tm;
- lotmp = tmp;
- } else hit = t;
- }
- show(tz, name, lot, true);
- show(tz, name, hit, true);
- return hit;
-}
-
-/*
-** Thanks to Paul Eggert for logic used in delta.
-*/
-
-static intmax_t
-delta(struct tm * newp, struct tm *oldp)
-{
- register intmax_t result;
- register int tmy;
-
- if (newp->tm_year < oldp->tm_year)
- return -delta(oldp, newp);
- result = 0;
- for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
- result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE);
- result += newp->tm_yday - oldp->tm_yday;
- result *= HOURSPERDAY;
- result += newp->tm_hour - oldp->tm_hour;
- result *= MINSPERHOUR;
- result += newp->tm_min - oldp->tm_min;
- result *= SECSPERMIN;
- result += newp->tm_sec - oldp->tm_sec;
- return result;
-}
-
-#ifndef TM_GMTOFF
-/* Return A->tm_yday, adjusted to compare it fairly to B->tm_yday.
- Assume A and B differ by at most one year. */
-static int
-adjusted_yday(struct tm const *a, struct tm const *b)
-{
- int yday = a->tm_yday;
- if (b->tm_year < a->tm_year)
- yday += 365 + isleap_sum(b->tm_year, TM_YEAR_BASE);
- return yday;
-}
-#endif
-
-/* If A is the broken-down local time and B the broken-down UTC for
- the same instant, return A's UTC offset in seconds, where positive
- offsets are east of Greenwich. On failure, return LONG_MIN. */
-static long
-gmtoff(struct tm const *a, struct tm const *b)
-{
-#ifdef TM_GMTOFF
- return a->TM_GMTOFF;
-#else
- if (! b)
- return LONG_MIN;
- else {
- int ayday = adjusted_yday(a, b);
- int byday = adjusted_yday(b, a);
- int days = ayday - byday;
- long hours = a->tm_hour - b->tm_hour + 24 * days;
- long minutes = a->tm_min - b->tm_min + 60 * hours;
- long seconds = a->tm_sec - b->tm_sec + 60 * minutes;
- return seconds;
- }
-#endif
-}
-
-static void
-show(timezone_t tz, char *zone, time_t t, bool v)
-{
- register struct tm * tmp;
- register struct tm * gmtmp;
- struct tm tm, gmtm;
-
- printf("%-*s ", longest, zone);
- if (v) {
- gmtmp = my_gmtime_r(&t, &gmtm);
- if (gmtmp == NULL) {
- printf(tformat(), t);
- } else {
- dumptime(gmtmp);
- printf(" UT");
- }
- printf(" = ");
- }
- tmp = my_localtime_rz(tz, &t, &tm);
- dumptime(tmp);
- if (tmp != NULL) {
- if (*abbr(tmp) != '\0')
- printf(" %s", abbr(tmp));
- if (v) {
- long off = gmtoff(tmp, gmtmp);
- printf(" isdst=%d", tmp->tm_isdst);
- if (off != LONG_MIN)
- printf(" gmtoff=%ld", off);
- }
- }
- printf("\n");
- if (tmp != NULL && *abbr(tmp) != '\0')
- abbrok(abbr(tmp), zone);
-}
-
-static char const *
-abbr(struct tm const *tmp)
-{
-#ifdef TM_ZONE
- return tmp->TM_ZONE;
-#else
- return (0 <= tmp->tm_isdst && tzname[0 < tmp->tm_isdst]
- ? tzname[0 < tmp->tm_isdst]
- : "");
-#endif
-}
-
-/*
-** The code below can fail on certain theoretical systems;
-** it works on all known real-world systems as of 2004-12-30.
-*/
-
-static const char *
-tformat(void)
-{
- if (0 > (time_t) -1) { /* signed */
- if (sizeof (time_t) == sizeof (intmax_t))
- return "%"PRIdMAX;
- if (sizeof (time_t) > sizeof (long))
- return "%lld";
- if (sizeof (time_t) > sizeof (int))
- return "%ld";
- return "%d";
- }
-#ifdef PRIuMAX
- if (sizeof (time_t) == sizeof (uintmax_t))
- return "%"PRIuMAX;
-#endif
- if (sizeof (time_t) > sizeof (unsigned long))
- return "%llu";
- if (sizeof (time_t) > sizeof (unsigned int))
- return "%lu";
- return "%u";
-}
-
-static void
-dumptime(register const struct tm *timeptr)
-{
- static const char wday_name[][3] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
- };
- static const char mon_name[][3] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
- };
- register const char * wn;
- register const char * mn;
- register int lead;
- register int trail;
-
- if (timeptr == NULL) {
- printf("NULL");
- return;
- }
- /*
- ** The packaged localtime_rz and gmtime_r never put out-of-range
- ** values in tm_wday or tm_mon, but since this code might be compiled
- ** with other (perhaps experimental) versions, paranoia is in order.
- */
- if (timeptr->tm_wday < 0 || timeptr->tm_wday >=
- (int) (sizeof wday_name / sizeof wday_name[0]))
- wn = "???";
- else wn = wday_name[timeptr->tm_wday];
- if (timeptr->tm_mon < 0 || timeptr->tm_mon >=
- (int) (sizeof mon_name / sizeof mon_name[0]))
- mn = "???";
- else mn = mon_name[timeptr->tm_mon];
- printf("%.3s %.3s%3d %.2d:%.2d:%.2d ",
- wn, mn,
- timeptr->tm_mday, timeptr->tm_hour,
- timeptr->tm_min, timeptr->tm_sec);
-#define DIVISOR 10
- trail = timeptr->tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
- lead = timeptr->tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR +
- trail / DIVISOR;
- trail %= DIVISOR;
- if (trail < 0 && lead > 0) {
- trail += DIVISOR;
- --lead;
- } else if (lead < 0 && trail > 0) {
- trail -= DIVISOR;
- ++lead;
- }
- if (lead == 0)
- printf("%d", trail);
- else printf("%d%d", lead, ((trail < 0) ? -trail : trail));
-}
Added: vendor/tzcode/dist/zic/README
===================================================================
--- vendor/tzcode/dist/zic/README (rev 0)
+++ vendor/tzcode/dist/zic/README 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,88 @@
+@(#)README 8.3
+This file is in the public domain, so clarified as of
+2009-05-17 by Arthur David Olson.
+
+$FreeBSD: stable/10/contrib/tzcode/zic/README 192890 2009-05-27 12:18:39Z edwin $
+
+"What time is it?" -- Richard Deacon as The King
+"Any time you want it to be." -- Frank Baxter as The Scientist
+ (from the Bell System film "About Time")
+
+The 1989 update of the time zone package featured
+
+* POSIXization (including interpretation of POSIX-style TZ environment
+ variables, provided by Guy Harris),
+* ANSIfication (including versions of "mktime" and "difftime"),
+* SVIDulation (an "altzone" variable)
+* MACHination (the "gtime" function)
+* corrections to some time zone data (including corrections to the rules
+ for Great Britain and New Zealand)
+* reference data from the United States Naval Observatory for folks who
+ want to do additional time zones
+* and the 1989 data for Saudi Arabia.
+
+(Since this code will be treated as "part of the implementation" in some places
+and as "part of the application" in others, there's no good way to name
+functions, such as timegm, that are not part of the proposed ANSI C standard;
+such functions have kept their old, underscore-free names in this update.)
+
+And the "dysize" function has disappeared; it was present to allow compilation
+of the "date" command on old BSD systems, and a version of "date" is now
+provided in the package. The "date" command is not created when you "make all"
+since it may lack options provided by the version distributed with your
+operating system, or may not interact with the system in the same way the
+native version does.
+
+Since POSIX frowns on correct leap second handling, the default behavior of
+the "zic" command (in the absence of a "-L" option) has been changed to omit
+leap second information from its output files.
+
+Here is a recipe for acquiring, building, installing, and testing the
+tz distribution on a GNU/Linux or similar host.
+
+ mkdir tz
+ cd tz
+ wget 'ftp://elsie.nci.nih.gov/pub/tz*.tar.gz'
+ gzip -dc tzcode*.tar.gz | tar -xf -
+ gzip -dc tzdata*.tar.gz | tar -xf -
+
+Be sure to read the comments in "Makefile" and make any changes needed
+to make things right for your system, especially if you are using some
+platform other than GNU/Linux. Then run the following commands,
+substituting your desired installation directory for "$HOME/tzdir":
+
+ make TOPDIR=$HOME/tzdir install
+ $HOME/tzdir/etc/zdump -v America/Los_Angeles
+
+To use the new functions, use a "-ltz" option when compiling or linking.
+
+Historical local time information has been included here to:
+
+* provide a compendium of data about the history of civil time
+ that is useful even if the data are not 100% accurate;
+
+* give an idea of the variety of local time rules that have
+ existed in the past and thus an idea of the variety that may be
+ expected in the future;
+
+* provide a test of the generality of the local time rule description
+ system.
+
+The information in the time zone data files is by no means authoritative;
+the files currently do not even attempt to cover all time stamps before
+1970, and there are undoubtedly errors even for time stamps since 1970.
+If you know that the rules are different from those in a file, by all means
+feel free to change file (and please send the changed version to
+tz at elsie.nci.nih.gov for use in the future). Europeans take note!
+
+Thanks to these Timezone Caballeros who've made major contributions to the
+time conversion package: Keith Bostic; Bob Devine; Paul Eggert; Robert Elz;
+Guy Harris; Mark Horton; John Mackin; and Bradley White. Thanks also to
+Michael Bloom, Art Neilson, Stephen Prince, John Sovereign, and Frank Wales
+for testing work, and to Gwillim Law for checking local mean time data.
+None of them are responsible for remaining errors.
+
+Look in the ~ftp/pub directory of elsie.nci.nih.gov
+for updated versions of these files.
+
+Please send comments or information to tz at elsie.nci.nih.gov.
Added: vendor/tzcode/dist/zic/Theory
===================================================================
--- vendor/tzcode/dist/zic/Theory (rev 0)
+++ vendor/tzcode/dist/zic/Theory 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,570 @@
+@(#)Theory 8.4
+This file is in the public domain, so clarified as of
+2009-05-17 by Arthur David Olson.
+$FreeBSD: stable/10/contrib/tzcode/zic/Theory 200832 2009-12-22 11:17:10Z edwin $
+
+----- Outline -----
+
+ Time and date functions
+ Names of time zone regions
+ Time zone abbreviations
+ Calendrical issues
+ Time and time zones on Mars
+
+----- Time and date functions -----
+
+These time and date functions are upwards compatible with POSIX,
+an international standard for UNIX-like systems.
+As of this writing, the current edition of POSIX is:
+
+ Standard for Information technology
+ -- Portable Operating System Interface (POSIX (R))
+ -- System Interfaces
+ IEEE Std 1003.1, 2004 Edition
+ <http://www.opengroup.org/online-pubs?DOC=7999959899>
+ <http://www.opengroup.org/pubs/catalog/t041.htm>
+
+POSIX has the following properties and limitations.
+
+* In POSIX, time display in a process is controlled by the
+ environment variable TZ. Unfortunately, the POSIX TZ string takes
+ a form that is hard to describe and is error-prone in practice.
+ Also, POSIX TZ strings can't deal with other (for example, Israeli)
+ daylight saving time rules, or situations where more than two
+ time zone abbreviations are used in an area.
+
+ The POSIX TZ string takes the following form:
+
+ stdoffset[dst[offset],date[/time],date[/time]]
+
+ where:
+
+ std and dst
+ are 3 or more characters specifying the standard
+ and daylight saving time (DST) zone names.
+ Starting with POSIX.1-2001, std and dst may also be
+ in a quoted form like "<UTC+10>"; this allows
+ "+" and "-" in the names.
+ offset
+ is of the form `[-]hh:[mm[:ss]]' and specifies the
+ offset west of UTC. The default DST offset is one hour
+ ahead of standard time.
+ date[/time],date[/time]
+ specifies the beginning and end of DST. If this is absent,
+ the system supplies its own rules for DST, and these can
+ differ from year to year; typically US DST rules are used.
+ time
+ takes the form `hh:[mm[:ss]]' and defaults to 02:00.
+ date
+ takes one of the following forms:
+ Jn (1<=n<=365)
+ origin-1 day number not counting February 29
+ n (0<=n<=365)
+ origin-0 day number counting February 29 if present
+ Mm.n.d (0[Sunday]<=d<=6[Saturday], 1<=n<=5, 1<=m<=12)
+ for the dth day of week n of month m of the year,
+ where week 1 is the first week in which day d appears,
+ and `5' stands for the last week in which day d appears
+ (which may be either the 4th or 5th week).
+
+ Here is an example POSIX TZ string, for US Pacific time using rules
+ appropriate from 1987 through 2006:
+
+ TZ='PST8PDT,M4.1.0/02:00,M10.5.0/02:00'
+
+ This POSIX TZ string is hard to remember, and mishandles time stamps
+ before 1987 and after 2006. With this package you can use this
+ instead:
+
+ TZ='America/Los_Angeles'
+
+* POSIX does not define the exact meaning of TZ values like "EST5EDT".
+ Typically the current US DST rules are used to interpret such values,
+ but this means that the US DST rules are compiled into each program
+ that does time conversion. This means that when US time conversion
+ rules change (as in the United States in 1987), all programs that
+ do time conversion must be recompiled to ensure proper results.
+
+* In POSIX, there's no tamper-proof way for a process to learn the
+ system's best idea of local wall clock. (This is important for
+ applications that an administrator wants used only at certain times--
+ without regard to whether the user has fiddled the "TZ" environment
+ variable. While an administrator can "do everything in UTC" to get
+ around the problem, doing so is inconvenient and precludes handling
+ daylight saving time shifts--as might be required to limit phone
+ calls to off-peak hours.)
+
+* POSIX requires that systems ignore leap seconds.
+
+These are the extensions that have been made to the POSIX functions:
+
+* The "TZ" environment variable is used in generating the name of a file
+ from which time zone information is read (or is interpreted a la
+ POSIX); "TZ" is no longer constrained to be a three-letter time zone
+ name followed by a number of hours and an optional three-letter
+ daylight time zone name. The daylight saving time rules to be used
+ for a particular time zone are encoded in the time zone file;
+ the format of the file allows U.S., Australian, and other rules to be
+ encoded, and allows for situations where more than two time zone
+ abbreviations are used.
+
+ It was recognized that allowing the "TZ" environment variable to
+ take on values such as "America/New_York" might cause "old" programs
+ (that expect "TZ" to have a certain form) to operate incorrectly;
+ consideration was given to using some other environment variable
+ (for example, "TIMEZONE") to hold the string used to generate the
+ time zone information file name. In the end, however, it was decided
+ to continue using "TZ": it is widely used for time zone purposes;
+ separately maintaining both "TZ" and "TIMEZONE" seemed a nuisance;
+ and systems where "new" forms of "TZ" might cause problems can simply
+ use TZ values such as "EST5EDT" which can be used both by
+ "new" programs (a la POSIX) and "old" programs (as zone names and
+ offsets).
+
+* To handle places where more than two time zone abbreviations are used,
+ the functions "localtime" and "gmtime" set tzname[tmp->tm_isdst]
+ (where "tmp" is the value the function returns) to the time zone
+ abbreviation to be used. This differs from POSIX, where the elements
+ of tzname are only changed as a result of calls to tzset.
+
+* Since the "TZ" environment variable can now be used to control time
+ conversion, the "daylight" and "timezone" variables are no longer
+ needed. (These variables are defined and set by "tzset"; however, their
+ values will not be used by "localtime.")
+
+* The "localtime" function has been set up to deliver correct results
+ for near-minimum or near-maximum time_t values. (A comment in the
+ source code tells how to get compatibly wrong results).
+
+* A function "tzsetwall" has been added to arrange for the system's
+ best approximation to local wall clock time to be delivered by
+ subsequent calls to "localtime." Source code for portable
+ applications that "must" run on local wall clock time should call
+ "tzsetwall();" if such code is moved to "old" systems that don't
+ provide tzsetwall, you won't be able to generate an executable program.
+ (These time zone functions also arrange for local wall clock time to be
+ used if tzset is called--directly or indirectly--and there's no "TZ"
+ environment variable; portable applications should not, however, rely
+ on this behavior since it's not the way SVR2 systems behave.)
+
+* These functions can account for leap seconds, thanks to Bradley White.
+
+Points of interest to folks with other systems:
+
+* This package is already part of many POSIX-compliant hosts,
+ including BSD, HP, Linux, Network Appliance, SCO, SGI, and Sun.
+ On such hosts, the primary use of this package
+ is to update obsolete time zone rule tables.
+ To do this, you may need to compile the time zone compiler
+ `zic' supplied with this package instead of using the system `zic',
+ since the format of zic's input changed slightly in late 1994,
+ and many vendors still do not support the new input format.
+
+* The UNIX Version 7 "timezone" function is not present in this package;
+ it's impossible to reliably map timezone's arguments (a "minutes west
+ of GMT" value and a "daylight saving time in effect" flag) to a
+ time zone abbreviation, and we refuse to guess.
+ Programs that in the past used the timezone function may now examine
+ tzname[localtime(&clock)->tm_isdst] to learn the correct time
+ zone abbreviation to use. Alternatively, use
+ localtime(&clock)->tm_zone if this has been enabled.
+
+* The 4.2BSD gettimeofday function is not used in this package.
+ This formerly let users obtain the current UTC offset and DST flag,
+ but this functionality was removed in later versions of BSD.
+
+* In SVR2, time conversion fails for near-minimum or near-maximum
+ time_t values when doing conversions for places that don't use UTC.
+ This package takes care to do these conversions correctly.
+
+The functions that are conditionally compiled if STD_INSPIRED is defined
+should, at this point, be looked on primarily as food for thought. They are
+not in any sense "standard compatible"--some are not, in fact, specified in
+*any* standard. They do, however, represent responses of various authors to
+standardization proposals.
+
+Other time conversion proposals, in particular the one developed by folks at
+Hewlett Packard, offer a wider selection of functions that provide capabilities
+beyond those provided here. The absence of such functions from this package
+is not meant to discourage the development, standardization, or use of such
+functions. Rather, their absence reflects the decision to make this package
+contain valid extensions to POSIX, to ensure its broad acceptability. If
+more powerful time conversion functions can be standardized, so much the
+better.
+
+
+----- Names of time zone rule files -----
+
+The time zone rule file naming conventions attempt to strike a balance
+among the following goals:
+
+ * Uniquely identify every national region where clocks have all
+ agreed since 1970. This is essential for the intended use: static
+ clocks keeping local civil time.
+
+ * Indicate to humans as to where that region is. This simplifes use.
+
+ * Be robust in the presence of political changes. This reduces the
+ number of updates and backward-compatibility hacks. For example,
+ names of countries are ordinarily not used, to avoid
+ incompatibilities when countries change their name
+ (e.g. Zaire->Congo) or when locations change countries
+ (e.g. Hong Kong from UK colony to China).
+
+ * Be portable to a wide variety of implementations.
+ This promotes use of the technology.
+
+ * Use a consistent naming convention over the entire world.
+ This simplifies both use and maintenance.
+
+This naming convention is not intended for use by inexperienced users
+to select TZ values by themselves (though they can of course examine
+and reuse existing settings). Distributors should provide
+documentation and/or a simple selection interface that explains the
+names; see the 'tzselect' program supplied with this distribution for
+one example.
+
+Names normally have the form AREA/LOCATION, where AREA is the name
+of a continent or ocean, and LOCATION is the name of a specific
+location within that region. North and South America share the same
+area, `America'. Typical names are `Africa/Cairo', `America/New_York',
+and `Pacific/Honolulu'.
+
+Here are the general rules used for choosing location names,
+in decreasing order of importance:
+
+ Use only valid POSIX file name components (i.e., the parts of
+ names other than `/'). Within a file name component,
+ use only ASCII letters, `.', `-' and `_'. Do not use
+ digits, as that might create an ambiguity with POSIX
+ TZ strings. A file name component must not exceed 14
+ characters or start with `-'. E.g., prefer `Brunei'
+ to `Bandar_Seri_Begawan'.
+ Include at least one location per time zone rule set per country.
+ One such location is enough. Use ISO 3166 (see the file
+ iso3166.tab) to help decide whether something is a country.
+ However, uninhabited ISO 3166 regions like Bouvet Island
+ do not need locations, since local time is not defined there.
+ If all the clocks in a country's region have agreed since 1970,
+ don't bother to include more than one location
+ even if subregions' clocks disagreed before 1970.
+ Otherwise these tables would become annoyingly large.
+ If a name is ambiguous, use a less ambiguous alternative;
+ e.g. many cities are named San Jose and Georgetown, so
+ prefer `Costa_Rica' to `San_Jose' and `Guyana' to `Georgetown'.
+ Keep locations compact. Use cities or small islands, not countries
+ or regions, so that any future time zone changes do not split
+ locations into different time zones. E.g. prefer `Paris'
+ to `France', since France has had multiple time zones.
+ Use mainstream English spelling, e.g. prefer `Rome' to `Roma', and
+ prefer `Athens' to the true name (which uses Greek letters).
+ The POSIX file name restrictions encourage this rule.
+ Use the most populous among locations in a country's time zone,
+ e.g. prefer `Shanghai' to `Beijing'. Among locations with
+ similar populations, pick the best-known location,
+ e.g. prefer `Rome' to `Milan'.
+ Use the singular form, e.g. prefer `Canary' to `Canaries'.
+ Omit common suffixes like `_Islands' and `_City', unless that
+ would lead to ambiguity. E.g. prefer `Cayman' to
+ `Cayman_Islands' and `Guatemala' to `Guatemala_City',
+ but prefer `Mexico_City' to `Mexico' because the country
+ of Mexico has several time zones.
+ Use `_' to represent a space.
+ Omit `.' from abbreviations in names, e.g. prefer `St_Helena'
+ to `St._Helena'.
+ Do not change established names if they only marginally
+ violate the above rules. For example, don't change
+ the existing name `Rome' to `Milan' merely because
+ Milan's population has grown to be somewhat greater
+ than Rome's.
+ If a name is changed, put its old spelling in the `backward' file.
+
+The file `zone.tab' lists the geographical locations used to name
+time zone rule files. It is intended to be an exhaustive list
+of canonical names for geographic regions.
+
+Older versions of this package used a different naming scheme,
+and these older names are still supported.
+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 -----
+
+When this package is installed, it generates time zone abbreviations
+like `EST' to be compatible with human tradition and POSIX.
+Here are the general rules used for choosing time zone abbreviations,
+in decreasing order of importance:
+
+ Use abbreviations that consist of three or more ASCII letters.
+ Previous editions of this database also used characters like
+ ' ' and '?', but these characters have a special meaning to
+ the shell and cause commands like
+ set `date`
+ to have unexpected effects.
+ Previous editions of this rule required upper-case letters,
+ but the Congressman who introduced Chamorro Standard Time
+ preferred "ChST", so the rule has been relaxed.
+
+ This rule guarantees that all abbreviations could have
+ been specified by a POSIX TZ string. POSIX
+ requires at least three characters for an
+ abbreviation. POSIX through 2000 says that an abbreviation
+ cannot start with ':', and cannot contain ',', '-',
+ '+', NUL, or a digit. POSIX from 2001 on changes this
+ rule to say that an abbreviation can contain only '-', '+',
+ and alphanumeric characters from the portable character set
+ in the current locale. To be portable to both sets of
+ rules, an abbreviation must therefore use only ASCII
+ letters.
+
+ Use abbreviations that are in common use among English-speakers,
+ e.g. `EST' for Eastern Standard Time in North America.
+ We assume that applications translate them to other languages
+ as part of the normal localization process; for example,
+ a French application might translate `EST' to `HNE'.
+
+ For zones whose times are taken from a city's longitude, use the
+ traditional xMT notation, e.g. `PMT' for Paris Mean Time.
+ The only name like this in current use is `GMT'.
+
+ If there is no common English abbreviation, abbreviate the English
+ translation of the usual phrase used by native speakers.
+ If this is not available or is a phrase mentioning the country
+ (e.g. ``Cape Verde Time''), then:
+
+ When a country has a single or principal time zone region,
+ append `T' to the country's ISO code, e.g. `CVT' for
+ Cape Verde Time. For summer time append `ST';
+ for double summer time append `DST'; etc.
+ When a country has multiple time zones, take the first three
+ letters of an English place name identifying each zone
+ and then append `T', `ST', etc. as before;
+ e.g. `VLAST' for VLAdivostok Summer Time.
+
+ Use UTC (with time zone abbreviation "zzz") for locations while
+ uninhabited. The "zzz" mnemonic is that these locations are,
+ in some sense, asleep.
+
+Application writers should note that these abbreviations are ambiguous
+in practice: e.g. `EST' has a different meaning in Australia than
+it does in the United States. In new applications, it's often better
+to use numeric UTC offsets like `-0500' instead of time zone
+abbreviations like `EST'; this avoids the ambiguity.
+
+
+----- Calendrical issues -----
+
+Calendrical issues are a bit out of scope for a time zone database,
+but they indicate the sort of problems that we would run into if we
+extended the time zone database further into the past. An excellent
+resource in this area is Nachum Dershowitz and Edward M. Reingold,
+<a href="http://emr.cs.iit.edu/home/reingold/calendar-book/third-edition/">
+Calendrical Calculations: Third Edition
+</a>, Cambridge University Press (2008). Other information and
+sources are given below. They sometimes disagree.
+
+
+France
+
+Gregorian calendar adopted 1582-12-20.
+French Revolutionary calendar used 1793-11-24 through 1805-12-31,
+and (in Paris only) 1871-05-06 through 1871-05-23.
+
+
+Russia
+
+From Chris Carrier (1996-12-02):
+On 1929-10-01 the Soviet Union instituted an ``Eternal Calendar''
+with 30-day months plus 5 holidays, with a 5-day week.
+On 1931-12-01 it changed to a 6-day week; in 1934 it reverted to the
+Gregorian calendar while retaining the 6-day week; on 1940-06-27 it
+reverted to the 7-day week. With the 6-day week the usual days
+off were the 6th, 12th, 18th, 24th and 30th of the month.
+(Source: Evitiar Zerubavel, _The Seven Day Circle_)
+
+
+Mark Brader reported a similar story in "The Book of Calendars", edited
+by Frank Parise (1982, Facts on File, ISBN 0-8719-6467-8), page 377. But:
+
+From: Petteri Sulonen (via Usenet)
+Date: 14 Jan 1999 00:00:00 GMT
+...
+
+If your source is correct, how come documents between 1929 -- 1940 were
+still dated using the conventional, Gregorian calendar?
+
+I can post a scan of a document dated December 1, 1934, signed by
+Yenukidze, the secretary, on behalf of Kalinin, the President of the
+Executive Committee of the Supreme Soviet, if you like.
+
+
+
+Sweden (and Finland)
+
+From: Mark Brader
+<a href="news:1996Jul6.012937.29190 at sq.com">
+Subject: Re: Gregorian reform -- a part of locale?
+</a>
+Date: 1996-07-06
+
+In 1700, Denmark made the transition from Julian to Gregorian. Sweden
+decided to *start* a transition in 1700 as well, but rather than have one of
+those unsightly calendar gaps :-), they simply decreed that the next leap
+year after 1696 would be in 1744 -- putting the whole country on a calendar
+different from both Julian and Gregorian for a period of 40 years.
+
+However, in 1704 something went wrong and the plan was not carried through;
+they did, after all, have a leap year that year. And one in 1708. In 1712
+they gave it up and went back to Julian, putting 30 days in February that
+year!...
+
+Then in 1753, Sweden made the transition to Gregorian in the usual manner,
+getting there only 13 years behind the original schedule.
+
+(A previous posting of this story was challenged, and Swedish readers
+produced the following references to support it: "Tiderakning och historia"
+by Natanael Beckman (1924) and "Tid, en bok om tiderakning och
+kalendervasen" by Lars-Olof Lode'n (no date was given).)
+
+
+Grotefend's data
+
+From: "Michael Palmer" [with one obvious typo fixed]
+Subject: Re: Gregorian Calendar (was Re: Another FHC related question
+Newsgroups: soc.genealogy.german
+Date: Tue, 9 Feb 1999 02:32:48 -800
+...
+
+The following is a(n incomplete) listing, arranged chronologically, of
+European states, with the date they converted from the Julian to the
+Gregorian calendar:
+
+04/15 Oct 1582 - Italy (with exceptions), Spain, Portugal, Poland (Roman
+ Catholics and Danzig only)
+09/20 Dec 1582 - France, Lorraine
+
+21 Dec 1582/
+ 01 Jan 1583 - Holland, Brabant, Flanders, Hennegau
+10/21 Feb 1583 - bishopric of Liege (L"uttich)
+13/24 Feb 1583 - bishopric of Augsburg
+04/15 Oct 1583 - electorate of Trier
+05/16 Oct 1583 - Bavaria, bishoprics of Freising, Eichstedt, Regensburg,
+ Salzburg, Brixen
+13/24 Oct 1583 - Austrian Oberelsass and Breisgau
+20/31 Oct 1583 - bishopric of Basel
+02/13 Nov 1583 - duchy of J"ulich-Berg
+02/13 Nov 1583 - electorate and city of K"oln
+04/15 Nov 1583 - bishopric of W"urzburg
+11/22 Nov 1583 - electorate of Mainz
+16/27 Nov 1583 - bishopric of Strassburg and the margraviate of Baden
+17/28 Nov 1583 - bishopric of M"unster and duchy of Cleve
+14/25 Dec 1583 - Steiermark
+
+06/17 Jan 1584 - Austria and Bohemia
+11/22 Jan 1584 - Luzern, Uri, Schwyz, Zug, Freiburg, Solothurn
+12/23 Jan 1584 - Silesia and the Lausitz
+22 Jan/
+ 02 Feb 1584 - Hungary (legally on 21 Oct 1587)
+ Jun 1584 - Unterwalden
+01/12 Jul 1584 - duchy of Westfalen
+
+16/27 Jun 1585 - bishopric of Paderborn
+
+14/25 Dec 1590 - Transylvania
+
+22 Aug/
+ 02 Sep 1612 - duchy of Prussia
+
+13/24 Dec 1614 - Pfalz-Neuburg
+
+ 1617 - duchy of Kurland (reverted to the Julian calendar in
+ 1796)
+
+ 1624 - bishopric of Osnabr"uck
+
+ 1630 - bishopric of Minden
+
+15/26 Mar 1631 - bishopric of Hildesheim
+
+ 1655 - Kanton Wallis
+
+05/16 Feb 1682 - city of Strassburg
+
+18 Feb/
+ 01 Mar 1700 - Protestant Germany (including Swedish possessions in
+ Germany), Denmark, Norway
+30 Jun/
+ 12 Jul 1700 - Gelderland, Zutphen
+10 Nov/
+ 12 Dec 1700 - Utrecht, Overijssel
+
+31 Dec 1700/
+ 12 Jan 1701 - Friesland, Groningen, Z"urich, Bern, Basel, Geneva,
+ Turgau, and Schaffhausen
+
+ 1724 - Glarus, Appenzell, and the city of St. Gallen
+
+01 Jan 1750 - Pisa and Florence
+
+02/14 Sep 1752 - Great Britain
+
+17 Feb/
+ 01 Mar 1753 - Sweden
+
+1760-1812 - Graub"unden
+
+The Russian empire (including Finland and the Baltic states) did not
+convert to the Gregorian calendar until the Soviet revolution of 1917.
+
+Source: H. Grotefend, _Taschenbuch der Zeitrechnung des deutschen
+Mittelalters und der Neuzeit_, herausgegeben von Dr. O. Grotefend
+(Hannover: Hahnsche Buchhandlung, 1941), pp. 26-28.
+
+
+----- Time and time zones on Mars -----
+
+Some people have adjusted their work schedules to fit Mars time.
+Dozens of special Mars watches were built for Jet Propulsion
+Laboratory workers who kept Mars time during the Mars Exploration
+Rovers mission (2004). These timepieces look like normal Seikos and
+Citizens but use Mars seconds rather than terrestrial seconds.
+
+A Mars solar day is called a "sol" and has a mean period equal to
+about 24 hours 39 minutes 35.244 seconds in terrestrial time. It is
+divided into a conventional 24-hour clock, so each Mars second equals
+about 1.02749125 terrestrial seconds.
+
+The prime meridian of Mars goes through the center of the crater
+Airy-0, named in honor of the British astronomer who built the
+Greenwich telescope that defines Earth's prime meridian. Mean solar
+time on the Mars prime meridian is called Mars Coordinated Time (MTC).
+
+Each landed mission on Mars has adopted a different reference for
+solar time keeping, so there is no real standard for Mars time zones.
+For example, the Mars Exploration Rover project (2004) defined two
+time zones "Local Solar Time A" and "Local Solar Time B" for its two
+missions, each zone designed so that its time equals local true solar
+time at approximately the middle of the nominal mission. Such a "time
+zone" is not particularly suited for any application other than the
+mission itself.
+
+Many calendars have been proposed for Mars, but none have achieved
+wide acceptance. Astronomers often use Mars Sol Date (MSD) which is a
+sequential count of Mars solar days elapsed since about 1873-12-29
+12:00 GMT.
+
+The tz database does not currently support Mars time, but it is
+documented here in the hopes that support will be added eventually.
+
+Sources:
+
+Michael Allison and Robert Schmunk,
+"Technical Notes on Mars Solar Time as Adopted by the Mars24 Sunclock"
+<http://www.giss.nasa.gov/tools/mars24/help/notes.html> (2004-07-30).
+
+Jia-Rui Chong, "Workdays Fit for a Martian", Los Angeles Times
+(2004-01-14), pp A1, A20-A21.
Added: vendor/tzcode/dist/zic/ialloc.c
===================================================================
--- vendor/tzcode/dist/zic/ialloc.c (rev 0)
+++ vendor/tzcode/dist/zic/ialloc.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,91 @@
+/*
+** This file is in the public domain, so clarified as of
+** 2006-07-17 by Arthur David Olson.
+*/
+
+#ifndef lint
+#ifndef NOID
+static const char elsieid[] = "@(#)ialloc.c 8.30";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD: stable/10/contrib/tzcode/zic/ialloc.c 192625 2009-05-23 06:31:50Z edwin $";
+#endif /* not lint */
+
+/*LINTLIBRARY*/
+
+#include "private.h"
+
+#define nonzero(n) (((n) == 0) ? 1 : (n))
+
+char *
+imalloc(n)
+const int n;
+{
+ return malloc((size_t) nonzero(n));
+}
+
+char *
+icalloc(nelem, elsize)
+int nelem;
+int elsize;
+{
+ if (nelem == 0 || elsize == 0)
+ nelem = elsize = 1;
+ return calloc((size_t) nelem, (size_t) elsize);
+}
+
+void *
+irealloc(pointer, size)
+void * const pointer;
+const int size;
+{
+ if (pointer == NULL)
+ return imalloc(size);
+ return realloc((void *) pointer, (size_t) nonzero(size));
+}
+
+char *
+icatalloc(old, new)
+char * const old;
+const char * const new;
+{
+ register char * result;
+ register int oldsize, newsize;
+
+ newsize = (new == NULL) ? 0 : strlen(new);
+ if (old == NULL)
+ oldsize = 0;
+ else if (newsize == 0)
+ return old;
+ else oldsize = strlen(old);
+ if ((result = irealloc(old, oldsize + newsize + 1)) != NULL)
+ if (new != NULL)
+ (void) strcpy(result + oldsize, new);
+ return result;
+}
+
+char *
+icpyalloc(string)
+const char * const string;
+{
+ return icatalloc((char *) NULL, string);
+}
+
+void
+ifree(p)
+char * const p;
+{
+ if (p != NULL)
+ (void) free(p);
+}
+
+void
+icfree(p)
+char * const p;
+{
+ if (p != NULL)
+ (void) free(p);
+}
Added: vendor/tzcode/dist/zic/private.h
===================================================================
--- vendor/tzcode/dist/zic/private.h (rev 0)
+++ vendor/tzcode/dist/zic/private.h 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,272 @@
+#ifndef PRIVATE_H
+
+#define PRIVATE_H
+
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+/*
+ * FreeBSD modifications: separate libc's privates from zic's.
+ * This makes it easier when we need to update one but not the other.
+ * I have removed all of the ifdef spaghetti which is not relevant to
+ * zic from this file.
+ *
+ * $FreeBSD: stable/10/contrib/tzcode/zic/private.h 207590 2010-05-03 22:32:26Z emaste $
+ */
+
+/*
+** This header is for use ONLY with the time conversion code.
+** There is no guarantee that it will remain unchanged,
+** or that it will remain at all.
+** Do NOT copy it to any system include directory.
+** Thank you!
+*/
+
+/*
+** ID
+*/
+
+#ifndef lint
+#ifndef NOID
+static const char privatehid[] = "@(#)private.h 8.6";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+#define GRANDPARENTED "Local time zone must be set--use tzsetup"
+
+/*
+** Defaults for preprocessor symbols.
+** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.
+*/
+
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif /* !defined HAVE_GETTEXT */
+
+#ifndef HAVE_SYMLINK
+#define HAVE_SYMLINK 1
+#endif /* !defined HAVE_SYMLINK */
+
+#ifndef HAVE_SYS_STAT_H
+#define HAVE_SYS_STAT_H 1
+#endif /* !defined HAVE_SYS_STAT_H */
+
+#ifndef HAVE_SYS_WAIT_H
+#define HAVE_SYS_WAIT_H 1
+#endif /* !defined HAVE_SYS_WAIT_H */
+
+#ifndef HAVE_UNISTD_H
+#define HAVE_UNISTD_H 1
+#endif /* !defined HAVE_UNISTD_H */
+
+/*
+** Nested includes
+*/
+
+#include "sys/types.h" /* for time_t */
+#include "stdio.h"
+#include "errno.h"
+#include "string.h"
+#include "limits.h" /* for CHAR_BIT et al. */
+#include "time.h"
+#include "stdlib.h"
+
+#if HAVE_GETTEXT
+#include "libintl.h"
+#endif /* HAVE_GETTEXT */
+
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h> /* for WIFEXITED and WEXITSTATUS */
+#endif /* HAVE_SYS_WAIT_H */
+
+#if HAVE_UNISTD_H
+#include "unistd.h" /* for F_OK and R_OK, and other POSIX goodness */
+#endif /* HAVE_UNISTD_H */
+
+#ifndef F_OK
+#define F_OK 0
+#endif /* !defined F_OK */
+#ifndef R_OK
+#define R_OK 4
+#endif /* !defined R_OK */
+
+/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
+#define is_digit(c) ((unsigned)(c) - '0' <= 9)
+
+/*
+** Define HAVE_STDINT_H's default value here, rather than at the
+** start, since __GLIBC__'s value depends on previously-included
+** files.
+** (glibc 2.1 and later have stdint.h, even with pre-C99 compilers.)
+*/
+#ifndef HAVE_STDINT_H
+#define HAVE_STDINT_H \
+ (199901 <= __STDC_VERSION__ || \
+ 2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
+#endif /* !defined HAVE_STDINT_H */
+
+#if HAVE_STDINT_H
+#include "stdint.h"
+#endif /* !HAVE_STDINT_H */
+
+#ifndef INT_FAST64_MAX
+/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */
+#if defined LLONG_MAX || defined __LONG_LONG_MAX__
+typedef long long int_fast64_t;
+#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
+#if (LONG_MAX >> 31) < 0xffffffff
+Please use a compiler that supports a 64-bit integer type (or wider);
+you may need to compile with "-DHAVE_STDINT_H".
+#endif /* (LONG_MAX >> 31) < 0xffffffff */
+typedef long int_fast64_t;
+#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
+#endif /* !defined INT_FAST64_MAX */
+
+#ifndef INT32_MAX
+#define INT32_MAX 0x7fffffff
+#endif /* !defined INT32_MAX */
+#ifndef INT32_MIN
+#define INT32_MIN (-1 - INT32_MAX)
+#endif /* !defined INT32_MIN */
+
+/*
+** Workarounds for compilers/systems.
+ */
+
+/*
+** Some time.h implementations don't declare asctime_r.
+** Others might define it as a macro.
+** Fix the former without affecting the latter.
+ */
+#ifndef asctime_r
+extern char * asctime_r(struct tm const *, char *);
+#endif
+
+
+
+/*
+** Private function declarations.
+*/
+char * icalloc (int nelem, int elsize);
+char * icatalloc (char * old, const char * new);
+char * icpyalloc (const char * string);
+char * imalloc (int n);
+void * irealloc (void * pointer, int size);
+void icfree (char * pointer);
+void ifree (char * pointer);
+const char * scheck (const char *string, const char *format);
+
+/*
+** Finally, some convenience items.
+*/
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* !defined TRUE */
+
+#ifndef FALSE
+#define FALSE 0
+#endif /* !defined FALSE */
+
+#ifndef TYPE_BIT
+#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT)
+#endif /* !defined TYPE_BIT */
+
+#ifndef TYPE_SIGNED
+#define TYPE_SIGNED(type) (((type) -1) < 0)
+#endif /* !defined TYPE_SIGNED */
+
+/*
+** Since the definition of TYPE_INTEGRAL contains floating point numbers,
+** it cannot be used in preprocessor directives.
+*/
+
+#ifndef TYPE_INTEGRAL
+#define TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
+#endif /* !defined TYPE_INTEGRAL */
+
+#ifndef INT_STRLEN_MAXIMUM
+/*
+** 302 / 1000 is log10(2.0) rounded up.
+** Subtract one for the sign bit if the type is signed;
+** add one for integer division truncation;
+** add one more for a minus sign if the type is signed.
+*/
+#define INT_STRLEN_MAXIMUM(type) \
+ ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
+ 1 + TYPE_SIGNED(type))
+#endif /* !defined INT_STRLEN_MAXIMUM */
+
+/*
+** INITIALIZE(x)
+*/
+
+#ifndef GNUC_or_lint
+#ifdef lint
+#define GNUC_or_lint
+#endif /* defined lint */
+#ifndef lint
+#ifdef __GNUC__
+#define GNUC_or_lint
+#endif /* defined __GNUC__ */
+#endif /* !defined lint */
+#endif /* !defined GNUC_or_lint */
+
+#ifndef INITIALIZE
+#ifdef GNUC_or_lint
+#define INITIALIZE(x) ((x) = 0)
+#endif /* defined GNUC_or_lint */
+#ifndef GNUC_or_lint
+#define INITIALIZE(x)
+#endif /* !defined GNUC_or_lint */
+#endif /* !defined INITIALIZE */
+
+/*
+** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
+*/
+
+#ifndef _
+#if HAVE_GETTEXT
+#define _(msgid) gettext(msgid)
+#else /* !HAVE_GETTEXT */
+#define _(msgid) msgid
+#endif /* !HAVE_GETTEXT */
+#endif /* !defined _ */
+
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
+/*
+** UNIX was a registered trademark of The Open Group in 2003.
+*/
+
+#ifndef YEARSPERREPEAT
+#define YEARSPERREPEAT 400 /* years before a Gregorian repeat */
+#endif /* !defined YEARSPERREPEAT */
+
+/*
+** The Gregorian year averages 365.2425 days, which is 31556952 seconds.
+*/
+
+#ifndef AVGSECSPERYEAR
+#define AVGSECSPERYEAR 31556952L
+#endif /* !defined AVGSECSPERYEAR */
+
+#ifndef SECSPERREPEAT
+#define SECSPERREPEAT ((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR)
+#endif /* !defined SECSPERREPEAT */
+
+#ifndef SECSPERREPEAT_BITS
+#define SECSPERREPEAT_BITS 34 /* ceil(log2(SECSPERREPEAT)) */
+#endif /* !defined SECSPERREPEAT_BITS */
+
+ /*
+ ** UNIX was a registered trademark of The Open Group in 2003.
+ */
+
+#endif /* !defined PRIVATE_H */
Added: vendor/tzcode/dist/zic/scheck.c
===================================================================
--- vendor/tzcode/dist/zic/scheck.c (rev 0)
+++ vendor/tzcode/dist/zic/scheck.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,68 @@
+/*
+** This file is in the public domain, so clarified as of
+** 2006-07-17 by Arthur David Olson.
+*/
+
+#ifndef lint
+#ifndef NOID
+static const char elsieid[] = "@(#)scheck.c 8.19";
+#endif /* !defined lint */
+#endif /* !defined NOID */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD: stable/10/contrib/tzcode/zic/scheck.c 192625 2009-05-23 06:31:50Z edwin $";
+#endif /* not lint */
+
+/*LINTLIBRARY*/
+
+#include "private.h"
+
+const char *
+scheck(string, format)
+const char * const string;
+const char * const format;
+{
+ register char * fbuf;
+ register const char * fp;
+ register char * tp;
+ register int c;
+ register const char * result;
+ char dummy;
+
+ result = "";
+ if (string == NULL || format == NULL)
+ return result;
+ fbuf = imalloc((int) (2 * strlen(format) + 4));
+ if (fbuf == NULL)
+ return result;
+ fp = format;
+ tp = fbuf;
+ while ((*tp++ = c = *fp++) != '\0') {
+ if (c != '%')
+ continue;
+ if (*fp == '%') {
+ *tp++ = *fp++;
+ continue;
+ }
+ *tp++ = '*';
+ if (*fp == '*')
+ ++fp;
+ while (is_digit(*fp))
+ *tp++ = *fp++;
+ if (*fp == 'l' || *fp == 'h')
+ *tp++ = *fp++;
+ else if (*fp == '[')
+ do *tp++ = *fp++;
+ while (*fp != '\0' && *fp != ']');
+ if ((*tp++ = *fp++) == '\0')
+ break;
+ }
+ *(tp - 1) = '%';
+ *tp++ = 'c';
+ *tp = '\0';
+ if (sscanf(string, fbuf, &dummy) != 1)
+ result = (char *) format;
+ ifree(fbuf);
+ return result;
+}
Added: vendor/tzcode/dist/zic/zdump/Makefile
===================================================================
--- vendor/tzcode/dist/zic/zdump/Makefile (rev 0)
+++ vendor/tzcode/dist/zic/zdump/Makefile 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,15 @@
+# $FreeBSD: stable/10/contrib/tzcode/zic/zdump/Makefile 201390 2010-01-02 11:07:44Z ed $
+
+.PATH: ${.CURDIR}/..
+
+PROG= zdump
+MAN= zdump.8
+SRCS= zdump.c ialloc.c scheck.c
+
+CFLAGS+= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone -DSTD_INSPIRED -DPCTS
+CFLAGS+= -DHAVE_LONG_DOUBLE -DTZDIR=\"/usr/share/zoneinfo\" -Demkdir=mkdir
+CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../lib/libc/stdtime
+
+WARNS?= 2
+
+.include <bsd.prog.mk>
Added: vendor/tzcode/dist/zic/zdump.8
===================================================================
--- vendor/tzcode/dist/zic/zdump.8 (rev 0)
+++ vendor/tzcode/dist/zic/zdump.8 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,63 @@
+.\"
+.\" @(#)zdump.8 8.2
+.\" This file is in the public domain, so clarified as of
+.\" 2009-05-17 by Arthur David Olson.
+.\" $FreeBSD: stable/10/contrib/tzcode/zic/zdump.8 192890 2009-05-27 12:18:39Z edwin $
+.\"
+.Dd June 20, 2004
+.Dt ZDUMP 8
+.Os
+.Sh NAME
+.Nm zdump
+.Nd timezone dumper
+.Sh SYNOPSIS
+.Nm
+.Op Fl -version
+.Op Fl v
+.Op Fl c Ar [loyear,]hiyear
+.Op Ar zonename ...
+.Sh DESCRIPTION
+The
+.Nm
+utility prints the current time in each
+.Ar zonename
+named on the command line.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl -version
+Output version information and exit.
+.It Fl v
+For each
+.Ar zonename
+on the command line,
+print the time at the lowest possible time value,
+the time one day after the lowest possible time value,
+the times both one second before and exactly at
+each detected time discontinuity,
+the time at one day less than the highest possible time value,
+and the time at the highest possible time value,
+Each line ends with
+.Em isdst=1
+if the given time is Daylight Saving Time or
+.Em isdst=0
+otherwise.
+.It Fl c Ar loyear,hiyear
+Cut off verbose output near the start of the given year(s).
+By default,
+the program cuts off verbose output near the starts of the years -500 and 2500.
+.El
+.Sh LIMITATIONS
+The
+.Fl v
+option may not be used on systems with floating-point time_t values
+that are neither float nor double.
+.Pp
+Time discontinuities are found by sampling the results returned by localtime
+at twelve-hour intervals.
+This works in all real-world cases;
+one can construct artificial time zones for which this fails.
+.Sh "SEE ALSO"
+.Xr ctime 3 ,
+.Xr tzfile 5 ,
+.Xr zic 8
Added: vendor/tzcode/dist/zic/zdump.c
===================================================================
--- vendor/tzcode/dist/zic/zdump.c (rev 0)
+++ vendor/tzcode/dist/zic/zdump.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,668 @@
+/*
+** This file is in the public domain, so clarified as of
+** 2009-05-17 by Arthur David Olson.
+*/
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD: stable/10/contrib/tzcode/zic/zdump.c 307359 2016-10-15 12:38:21Z bapt $";
+static char elsieid[] = "@(#)zdump.c 8.10";
+#endif /* not lint */
+
+/*
+** This code has been made independent of the rest of the time
+** conversion package to increase confidence in the verification it provides.
+** You can use this code to help in verifying other implementations.
+*/
+
+#include <err.h>
+#include <stdio.h> /* for stdout, stderr */
+#include <stdlib.h> /* for exit, malloc, atoi */
+#include <string.h> /* for strcpy */
+#include <sys/types.h> /* for time_t */
+#include <time.h> /* for struct tm */
+#include <unistd.h>
+#include <float.h> /* for FLT_MAX and DBL_MAX */
+#include <ctype.h> /* for isalpha et al. */
+#ifndef isascii
+#define isascii(x) 1
+#endif /* !defined isascii */
+
+#ifndef ZDUMP_LO_YEAR
+#define ZDUMP_LO_YEAR (-500)
+#endif /* !defined ZDUMP_LO_YEAR */
+
+#ifndef ZDUMP_HI_YEAR
+#define ZDUMP_HI_YEAR 2500
+#endif /* !defined ZDUMP_HI_YEAR */
+
+#ifndef MAX_STRING_LENGTH
+#define MAX_STRING_LENGTH 1024
+#endif /* !defined MAX_STRING_LENGTH */
+
+#ifndef TRUE
+#define TRUE 1
+#endif /* !defined TRUE */
+
+#ifndef FALSE
+#define FALSE 0
+#endif /* !defined FALSE */
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif /* !defined EXIT_SUCCESS */
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif /* !defined EXIT_FAILURE */
+
+#ifndef SECSPERMIN
+#define SECSPERMIN 60
+#endif /* !defined SECSPERMIN */
+
+#ifndef MINSPERHOUR
+#define MINSPERHOUR 60
+#endif /* !defined MINSPERHOUR */
+
+#ifndef SECSPERHOUR
+#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
+#endif /* !defined SECSPERHOUR */
+
+#ifndef HOURSPERDAY
+#define HOURSPERDAY 24
+#endif /* !defined HOURSPERDAY */
+
+#ifndef EPOCH_YEAR
+#define EPOCH_YEAR 1970
+#endif /* !defined EPOCH_YEAR */
+
+#ifndef TM_YEAR_BASE
+#define TM_YEAR_BASE 1900
+#endif /* !defined TM_YEAR_BASE */
+
+#ifndef DAYSPERNYEAR
+#define DAYSPERNYEAR 365
+#endif /* !defined DAYSPERNYEAR */
+
+#ifndef isleap
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+#endif /* !defined isleap */
+
+#ifndef isleap_sum
+/*
+** See tzfile.h for details on isleap_sum.
+*/
+#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
+#endif /* !defined isleap_sum */
+
+#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
+#define SECSPERNYEAR (SECSPERDAY * DAYSPERNYEAR)
+#define SECSPERLYEAR (SECSPERNYEAR + SECSPERDAY)
+
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT 0
+#endif
+#if HAVE_GETTEXT
+#include "locale.h" /* for setlocale */
+#include "libintl.h"
+#endif /* HAVE_GETTEXT */
+
+#ifndef GNUC_or_lint
+#ifdef lint
+#define GNUC_or_lint
+#else /* !defined lint */
+#ifdef __GNUC__
+#define GNUC_or_lint
+#endif /* defined __GNUC__ */
+#endif /* !defined lint */
+#endif /* !defined GNUC_or_lint */
+
+#ifndef INITIALIZE
+#ifdef GNUC_or_lint
+#define INITIALIZE(x) ((x) = 0)
+#else /* !defined GNUC_or_lint */
+#define INITIALIZE(x)
+#endif /* !defined GNUC_or_lint */
+#endif /* !defined INITIALIZE */
+
+/*
+** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
+*/
+
+#ifndef _
+#if HAVE_GETTEXT
+#define _(msgid) gettext(msgid)
+#else /* !(HAVE_GETTEXT) */
+#define _(msgid) msgid
+#endif /* !(HAVE_GETTEXT) */
+#endif /* !defined _ */
+
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
+extern char ** environ;
+extern char * tzname[2];
+
+static time_t absolute_min_time;
+static time_t absolute_max_time;
+static size_t longest;
+static char * progname;
+static int warned;
+
+static void usage(FILE *stream, int status);
+static char * abbr(struct tm * tmp);
+static void abbrok(const char * abbrp, const char * zone);
+static long delta(struct tm * newp, struct tm * oldp);
+static void dumptime(const struct tm * tmp);
+static time_t hunt(char * name, time_t lot, time_t hit);
+static void setabsolutes(void);
+static void show(char * zone, time_t t, int v);
+static const char * tformat(void);
+static time_t yeartot(long y);
+
+#ifndef TYPECHECK
+#define my_localtime localtime
+#else /* !defined TYPECHECK */
+static struct tm *
+my_localtime(tp)
+time_t * tp;
+{
+ register struct tm * tmp;
+
+ tmp = localtime(tp);
+ if (tp != NULL && tmp != NULL) {
+ struct tm tm;
+ register time_t t;
+
+ tm = *tmp;
+ t = mktime(&tm);
+ if (t - *tp >= 1 || *tp - t >= 1) {
+ (void) fflush(stdout);
+ (void) fprintf(stderr, "\n%s: ", progname);
+ (void) fprintf(stderr, tformat(), *tp);
+ (void) fprintf(stderr, " ->");
+ (void) fprintf(stderr, " year=%d", tmp->tm_year);
+ (void) fprintf(stderr, " mon=%d", tmp->tm_mon);
+ (void) fprintf(stderr, " mday=%d", tmp->tm_mday);
+ (void) fprintf(stderr, " hour=%d", tmp->tm_hour);
+ (void) fprintf(stderr, " min=%d", tmp->tm_min);
+ (void) fprintf(stderr, " sec=%d", tmp->tm_sec);
+ (void) fprintf(stderr, " isdst=%d", tmp->tm_isdst);
+ (void) fprintf(stderr, " -> ");
+ (void) fprintf(stderr, tformat(), t);
+ (void) fprintf(stderr, "\n");
+ }
+ }
+ return tmp;
+}
+#endif /* !defined TYPECHECK */
+
+static void
+abbrok(abbrp, zone)
+const char * const abbrp;
+const char * const zone;
+{
+ register const char * cp;
+ register char * wp;
+
+ if (warned)
+ return;
+ cp = abbrp;
+ wp = NULL;
+ while (isascii((unsigned char) *cp) &&
+ (isalnum((unsigned char)*cp) || *cp == '-' || *cp == '+'))
+ ++cp;
+ if (cp - abbrp < 3)
+ wp = _("has fewer than 3 characters");
+ else if (cp - abbrp > 6)
+ wp = _("has more than 6 characters");
+ else if (*cp)
+ wp = "has characters other than ASCII alphanumerics, '-' or '+'";
+ else
+ return;
+ (void) fflush(stdout);
+ (void) fprintf(stderr,
+ _("%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"),
+ progname, zone, abbrp, wp);
+ warned = TRUE;
+}
+
+int
+main(argc, argv)
+int argc;
+char * argv[];
+{
+ register int i;
+ register int c;
+ register int vflag;
+ register char * cutarg;
+ register long cutloyear = ZDUMP_LO_YEAR;
+ register long cuthiyear = ZDUMP_HI_YEAR;
+ register time_t cutlotime;
+ register time_t cuthitime;
+ register char ** fakeenv;
+ time_t now;
+ time_t t;
+ time_t newt;
+ struct tm tm;
+ struct tm newtm;
+ register struct tm * tmp;
+ register struct tm * newtmp;
+
+ progname=argv[0];
+ INITIALIZE(cutlotime);
+ INITIALIZE(cuthitime);
+#if HAVE_GETTEXT
+ (void) setlocale(LC_MESSAGES, "");
+#ifdef TZ_DOMAINDIR
+ (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* TEXTDOMAINDIR */
+ (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT */
+ for (i = 1; i < argc; ++i)
+ if (strcmp(argv[i], "--version") == 0) {
+ errx(EXIT_SUCCESS, "%s", elsieid);
+ } else if (strcmp(argv[i], "--help") == 0) {
+ usage(stdout, EXIT_SUCCESS);
+ }
+ vflag = 0;
+ cutarg = NULL;
+ while ((c = getopt(argc, argv, "c:v")) == 'c' || c == 'v')
+ if (c == 'v')
+ vflag = 1;
+ else cutarg = optarg;
+ if ((c != -1) ||
+ (optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
+ usage(stderr, EXIT_FAILURE);
+ }
+ if (vflag) {
+ if (cutarg != NULL) {
+ long lo;
+ long hi;
+ char dummy;
+
+ if (sscanf(cutarg, "%ld%c", &hi, &dummy) == 1) {
+ cuthiyear = hi;
+ } else if (sscanf(cutarg, "%ld,%ld%c",
+ &lo, &hi, &dummy) == 2) {
+ cutloyear = lo;
+ cuthiyear = hi;
+ } else {
+(void) fprintf(stderr, _("%s: wild -c argument %s\n"),
+ progname, cutarg);
+ exit(EXIT_FAILURE);
+ }
+ }
+ setabsolutes();
+ cutlotime = yeartot(cutloyear);
+ cuthitime = yeartot(cuthiyear);
+ }
+ (void) time(&now);
+ longest = 0;
+ for (i = optind; i < argc; ++i)
+ if (strlen(argv[i]) > longest)
+ longest = strlen(argv[i]);
+ {
+ register int from;
+ register int to;
+
+ for (i = 0; environ[i] != NULL; ++i)
+ continue;
+ fakeenv = (char **) malloc((size_t) ((i + 2) *
+ sizeof *fakeenv));
+ if (fakeenv == NULL ||
+ (fakeenv[0] = (char *) malloc((size_t) (longest +
+ 4))) == NULL)
+ errx(EXIT_FAILURE,
+ _("malloc() failed"));
+ to = 0;
+ (void) strcpy(fakeenv[to++], "TZ=");
+ for (from = 0; environ[from] != NULL; ++from)
+ if (strncmp(environ[from], "TZ=", 3) != 0)
+ fakeenv[to++] = environ[from];
+ fakeenv[to] = NULL;
+ environ = fakeenv;
+ }
+ for (i = optind; i < argc; ++i) {
+ static char buf[MAX_STRING_LENGTH];
+
+ (void) strcpy(&fakeenv[0][3], argv[i]);
+ if (!vflag) {
+ show(argv[i], now, FALSE);
+ continue;
+ }
+ warned = FALSE;
+ t = absolute_min_time;
+ show(argv[i], t, TRUE);
+ t += SECSPERHOUR * HOURSPERDAY;
+ show(argv[i], t, TRUE);
+ if (t < cutlotime)
+ t = cutlotime;
+ tmp = my_localtime(&t);
+ if (tmp != NULL) {
+ tm = *tmp;
+ (void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
+ }
+ for ( ; ; ) {
+ if (t >= cuthitime || t >= cuthitime - SECSPERHOUR * 12)
+ break;
+ newt = t + SECSPERHOUR * 12;
+ newtmp = localtime(&newt);
+ if (newtmp != NULL)
+ newtm = *newtmp;
+ if ((tmp == NULL || newtmp == NULL) ? (tmp != newtmp) :
+ (delta(&newtm, &tm) != (newt - t) ||
+ newtm.tm_isdst != tm.tm_isdst ||
+ strcmp(abbr(&newtm), buf) != 0)) {
+ newt = hunt(argv[i], t, newt);
+ newtmp = localtime(&newt);
+ if (newtmp != NULL) {
+ newtm = *newtmp;
+ (void) strncpy(buf,
+ abbr(&newtm),
+ (sizeof buf) - 1);
+ }
+ }
+ t = newt;
+ tm = newtm;
+ tmp = newtmp;
+ }
+ t = absolute_max_time;
+ t -= SECSPERHOUR * HOURSPERDAY;
+ show(argv[i], t, TRUE);
+ t += SECSPERHOUR * HOURSPERDAY;
+ show(argv[i], t, TRUE);
+ }
+ if (fflush(stdout) || ferror(stdout))
+ errx(EXIT_FAILURE, _("error writing standard output"));
+ exit(EXIT_SUCCESS);
+ /* If exit fails to exit... */
+ return(EXIT_FAILURE);
+}
+
+static void
+setabsolutes(void)
+{
+ if (0.5 == (time_t) 0.5) {
+ /*
+ ** time_t is floating.
+ */
+ if (sizeof (time_t) == sizeof (float)) {
+ absolute_min_time = (time_t) -FLT_MAX;
+ absolute_max_time = (time_t) FLT_MAX;
+ } else if (sizeof (time_t) == sizeof (double)) {
+ absolute_min_time = (time_t) -DBL_MAX;
+ absolute_max_time = (time_t) DBL_MAX;
+ } else {
+ (void) fprintf(stderr,
+_("%s: use of -v on system with floating time_t other than float or double\n"),
+ progname);
+ exit(EXIT_FAILURE);
+ }
+ } else if (0 > (time_t) -1) {
+ /*
+ ** time_t is signed. Assume overflow wraps around.
+ */
+ time_t t = 0;
+ time_t t1 = 1;
+
+ while (t < t1) {
+ t = t1;
+ t1 = 2 * t1 + 1;
+ }
+
+ absolute_max_time = t;
+ t = -t;
+ absolute_min_time = t - 1;
+ if (t < absolute_min_time)
+ absolute_min_time = t;
+ } else {
+ /*
+ ** time_t is unsigned.
+ */
+ absolute_min_time = 0;
+ absolute_max_time = absolute_min_time - 1;
+ }
+}
+
+static time_t
+yeartot(y)
+const long y;
+{
+ register long myy;
+ register long seconds;
+ register time_t t;
+
+ myy = EPOCH_YEAR;
+ t = 0;
+ while (myy != y) {
+ if (myy < y) {
+ seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
+ ++myy;
+ if (t > absolute_max_time - seconds) {
+ t = absolute_max_time;
+ break;
+ }
+ t += seconds;
+ } else {
+ --myy;
+ seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
+ if (t < absolute_min_time + seconds) {
+ t = absolute_min_time;
+ break;
+ }
+ t -= seconds;
+ }
+ }
+ return t;
+}
+
+static void
+usage(FILE *stream, int status)
+{
+ fprintf(stream,
+_("usage: %s [--version] [-v] [--help] [-c [loyear,]hiyear] zonename ...\n\
+\n\
+Report bugs to tz at elsie.nci.nih.gov.\n"), progname);
+ exit(status);
+}
+
+static time_t
+hunt(char *name, time_t lot, time_t hit)
+{
+ time_t t;
+ long diff;
+ struct tm lotm;
+ register struct tm * lotmp;
+ struct tm tm;
+ register struct tm * tmp;
+ char loab[MAX_STRING_LENGTH];
+
+ lotmp = my_localtime(&lot);
+ if (lotmp != NULL) {
+ lotm = *lotmp;
+ (void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
+ }
+ for ( ; ; ) {
+ diff = (long) (hit - lot);
+ if (diff < 2)
+ break;
+ t = lot;
+ t += diff / 2;
+ if (t <= lot)
+ ++t;
+ else if (t >= hit)
+ --t;
+ tmp = my_localtime(&t);
+ if (tmp != NULL)
+ tm = *tmp;
+ if ((lotmp == NULL || tmp == NULL) ? (lotmp == tmp) :
+ (delta(&tm, &lotm) == (t - lot) &&
+ tm.tm_isdst == lotm.tm_isdst &&
+ strcmp(abbr(&tm), loab) == 0)) {
+ lot = t;
+ lotm = tm;
+ lotmp = tmp;
+ } else hit = t;
+ }
+ show(name, lot, TRUE);
+ show(name, hit, TRUE);
+ return hit;
+}
+
+/*
+** Thanks to Paul Eggert for logic used in delta.
+*/
+
+static long
+delta(newp, oldp)
+struct tm * newp;
+struct tm * oldp;
+{
+ register long result;
+ register int tmy;
+
+ if (newp->tm_year < oldp->tm_year)
+ return -delta(oldp, newp);
+ result = 0;
+ for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
+ result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE);
+ result += newp->tm_yday - oldp->tm_yday;
+ result *= HOURSPERDAY;
+ result += newp->tm_hour - oldp->tm_hour;
+ result *= MINSPERHOUR;
+ result += newp->tm_min - oldp->tm_min;
+ result *= SECSPERMIN;
+ result += newp->tm_sec - oldp->tm_sec;
+ return result;
+}
+
+static void
+show(char *zone, time_t t, int v)
+{
+ register struct tm * tmp;
+
+ (void) printf("%-*s ", (int) longest, zone);
+ if (v) {
+ tmp = gmtime(&t);
+ if (tmp == NULL) {
+ (void) printf(tformat(), t);
+ } else {
+ dumptime(tmp);
+ (void) printf(" UTC");
+ }
+ (void) printf(" = ");
+ }
+ tmp = my_localtime(&t);
+ dumptime(tmp);
+ if (tmp != NULL) {
+ if (*abbr(tmp) != '\0')
+ (void) printf(" %s", abbr(tmp));
+ if (v) {
+ (void) printf(" isdst=%d", tmp->tm_isdst);
+#ifdef TM_GMTOFF
+ (void) printf(" gmtoff=%ld", tmp->TM_GMTOFF);
+#endif /* defined TM_GMTOFF */
+ }
+ }
+ (void) printf("\n");
+ if (tmp != NULL && *abbr(tmp) != '\0')
+ abbrok(abbr(tmp), zone);
+}
+
+static char *
+abbr(tmp)
+struct tm * tmp;
+{
+ register char * result;
+ static char nada;
+
+ if (tmp->tm_isdst != 0 && tmp->tm_isdst != 1)
+ return &nada;
+ result = tzname[tmp->tm_isdst];
+ return (result == NULL) ? &nada : result;
+}
+
+/*
+** The code below can fail on certain theoretical systems;
+** it works on all known real-world systems as of 2004-12-30.
+*/
+
+static const char *
+tformat(void)
+{
+ if (0.5 == (time_t) 0.5) { /* floating */
+ if (sizeof (time_t) > sizeof (double))
+ return "%Lg";
+ return "%g";
+ }
+ if (0 > (time_t) -1) { /* signed */
+ if (sizeof (time_t) > sizeof (long))
+ return "%lld";
+ if (sizeof (time_t) > sizeof (int))
+ return "%ld";
+ return "%d";
+ }
+ if (sizeof (time_t) > sizeof (unsigned long))
+ return "%llu";
+ if (sizeof (time_t) > sizeof (unsigned int))
+ return "%lu";
+ return "%u";
+}
+
+static void
+dumptime(timeptr)
+register const struct tm * timeptr;
+{
+ static const char wday_name[][3] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+ static const char mon_name[][3] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+ register const char * wn;
+ register const char * mn;
+ register int lead;
+ register int trail;
+
+ if (timeptr == NULL) {
+ (void) printf("NULL");
+ return;
+ }
+ /*
+ ** The packaged versions of localtime and gmtime never put out-of-range
+ ** values in tm_wday or tm_mon, but since this code might be compiled
+ ** with other (perhaps experimental) versions, paranoia is in order.
+ */
+ if (timeptr->tm_wday < 0 || timeptr->tm_wday >=
+ (int) (sizeof wday_name / sizeof wday_name[0]))
+ wn = "???";
+ else wn = wday_name[timeptr->tm_wday];
+ if (timeptr->tm_mon < 0 || timeptr->tm_mon >=
+ (int) (sizeof mon_name / sizeof mon_name[0]))
+ mn = "???";
+ else mn = mon_name[timeptr->tm_mon];
+ (void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d ",
+ wn, mn,
+ timeptr->tm_mday, timeptr->tm_hour,
+ timeptr->tm_min, timeptr->tm_sec);
+#define DIVISOR 10
+ trail = timeptr->tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
+ lead = timeptr->tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR +
+ trail / DIVISOR;
+ trail %= DIVISOR;
+ if (trail < 0 && lead > 0) {
+ trail += DIVISOR;
+ --lead;
+ } else if (lead < 0 && trail > 0) {
+ trail -= DIVISOR;
+ ++lead;
+ }
+ if (lead == 0)
+ (void) printf("%d", trail);
+ else (void) printf("%d%d", lead, ((trail < 0) ? -trail : trail));
+}
Added: vendor/tzcode/dist/zic/zic/Makefile
===================================================================
--- vendor/tzcode/dist/zic/zic/Makefile (rev 0)
+++ vendor/tzcode/dist/zic/zic/Makefile 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,16 @@
+# $FreeBSD: stable/10/contrib/tzcode/zic/zic/Makefile 201390 2010-01-02 11:07:44Z ed $
+
+.PATH: ${.CURDIR}/..
+
+PROG= zic
+MAN= zic.8
+SRCS= zic.c ialloc.c scheck.c
+
+CFLAGS+= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone -DSTD_INSPIRED -DPCTS
+CFLAGS+= -DHAVE_LONG_DOUBLE -DTZDIR=\"/usr/share/zoneinfo\" -Demkdir=mkdir
+CFLAGS+= -DHAVE_STRERROR -DHAVE_UNISTD_H
+CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../lib/libc/stdtime
+
+WARNS?= 2
+
+.include <bsd.prog.mk>
Added: vendor/tzcode/dist/zic/zic.8
===================================================================
--- vendor/tzcode/dist/zic/zic.8 (rev 0)
+++ vendor/tzcode/dist/zic/zic.8 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,468 @@
+.\" $FreeBSD: stable/10/contrib/tzcode/zic/zic.8 214411 2010-10-27 07:14:46Z edwin $
+.Dd June 20, 2004
+.Dt ZIC 8
+.Os
+.Sh NAME
+.Nm zic
+.Nd timezone compiler
+.Sh SYNOPSIS
+.Nm
+.Op Fl -version
+.Op Fl Dsv
+.Op Fl d Ar directory
+.Op Fl g Ar group
+.Op Fl L Ar leapsecondfilename
+.Op Fl l Ar localtime
+.Op Fl m Ar mode
+.Op Fl p Ar posixrules
+.Op Fl u Ar user
+.Op Fl y Ar command
+.Op Ar filename ...
+.Sh DESCRIPTION
+The
+.Nm
+utility reads text from the file(s) named on the command line
+and creates the time conversion information files specified in this input.
+If a
+.Ar filename
+is
+.Em - ,
+the standard input is read.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl -version
+Output version information and exit.
+.It Fl D
+Do not automatically create directories.
+If the input file(s) specify
+an output file in a directory which does not already exist, the
+default behavior is to attempt to create the directory.
+If
+.Fl D
+is specified,
+.Nm
+will instead error out immediately.
+.It Fl d Ar directory
+Create time conversion information files in the named directory rather than
+in the standard directory named below.
+.It Fl g Ar group
+After creating each output file, change its group ownership to the
+specified
+.Ar group
+(which can be either a name or a numeric group ID).
+.It Fl L Ar leapsecondfilename
+Read leap second information from the file with the given name.
+If this option is not used,
+no leap second information appears in output files.
+.It Fl l Ar timezone
+Use the given
+.Ar time zone
+as local time.
+The
+.Nm
+utility will act as if the input contained a link line of the form
+.Pp
+.D1 No "Link timezone localtime"
+.Pp
+(Note that this action has no effect on
+.Fx ,
+since the local time zone is specified in
+.Pa /etc/localtime
+and not
+.Pa /usr/share/zoneinfo/localtime . )
+.It Fl m Ar mode
+After creating each output file, change its access mode to
+.Ar mode .
+Both numeric and alphabetic modes are accepted
+(see
+.Xr chmod 1 ) .
+.It Fl p Ar timezone
+Use the given
+.Ar "time zone" Ns 's
+rules when handling POSIX-format
+time zone environment variables.
+The
+.Nm
+utility will act as if the input contained a link line of the form
+.Pp
+.D1 No "Link timezone posixrules"
+.It Fl u Ar user
+After creating each output file, change its owner to
+.Ar user
+(which can be either a name or a numeric user ID).
+.It Fl v
+Complain if a year that appears in a data file is outside the range
+of years representable by
+.Xr time 3
+values.
+.It Fl s
+Limit time values stored in output files to values that are the same
+whether they are taken to be signed or unsigned.
+You can use this option to generate SVVS-compatible files.
+.It Fl y Ar command
+Use the given
+.Ar command
+rather than
+.Em yearistype
+when checking year types (see below).
+.El
+.Pp
+Input lines are made up of fields.
+Fields are separated from one another by any number of white space characters.
+Leading and trailing white space on input lines is ignored.
+An unquoted sharp character (#) in the input introduces a comment which extends
+to the end of the line the sharp character appears on.
+White space characters and sharp characters may be enclosed in double quotes
+(") if they are to be used as part of a field.
+Any line that is blank (after comment stripping) is ignored.
+Non-blank lines are expected to be of one of three types:
+rule lines, zone lines, and link lines.
+.Pp
+Names (such as month names) must be in English and are case insensitive.
+Abbreviations, if used, must be unambiguous in context.
+.Pp
+A rule line has the form:
+.Dl "Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S"
+For example:
+.Dl "Rule US 1967 1973 \- Apr lastSun 2:00 1:00 D"
+.Pp
+The fields that make up a rule line are:
+.Bl -tag -width "LETTER/S" -offset indent
+.It NAME
+Give the (arbitrary) name of the set of rules this rule is part of.
+.It FROM
+Give the first year in which the rule applies.
+Any integer year can be supplied; the Gregorian calendar is assumed.
+The word
+.Em minimum
+(or an abbreviation) means the minimum year representable as an integer.
+The word
+.Em maximum
+(or an abbreviation) means the maximum year representable as an integer.
+Rules can describe times that are not representable as time values,
+with the unrepresentable times ignored; this allows rules to be portable
+among hosts with differing time value types.
+.It TO
+Give the final year in which the rule applies.
+In addition to
+.Em minimum
+and
+.Em maximum
+(as above),
+the word
+.Em only
+(or an abbreviation)
+may be used to repeat the value of the
+.Em FROM
+field.
+.It TYPE
+Give the type of year in which the rule applies.
+If
+.Em TYPE
+is
+.Em \-
+then the rule applies in all years between
+.Em FROM
+and
+.Em TO
+inclusive.
+If
+.Em TYPE
+is something else, then
+.Nm
+executes the command
+.Li yearistype Ar year Ar type
+to check the type of a year:
+an exit status of zero is taken to mean that the year is of the given type;
+an exit status of one is taken to mean that the year is not of the given type.
+.It IN
+Name the month in which the rule takes effect.
+Month names may be abbreviated.
+.It ON
+Give the day on which the rule takes effect.
+Recognized forms include:
+.Pp
+.Bl -tag -width lastSun -compact -offset indent
+.It \&5
+the fifth of the month
+.It lastSun
+the last Sunday in the month
+.It lastMon
+the last Monday in the month
+.It Sun>=8
+first Sunday on or after the eighth
+.It Sun<=25
+last Sunday on or before the 25th
+.El
+.Pp
+Names of days of the week may be abbreviated or spelled out in full.
+Note that there must be no spaces within the
+.Em ON
+field.
+.It AT
+Give the time of day at which the rule takes effect.
+Recognized forms include:
+.Pp
+.Bl -tag -width "\&1:28:14" -offset indent -compact
+.It 2
+time in hours
+.It 2:00
+time in hours and minutes
+.It 15:00
+24-hour format time (for times after noon)
+.It 1:28:14
+time in hours, minutes, and seconds
+.El
+.Pp
+where hour 0 is midnight at the start of the day,
+and hour 24 is midnight at the end of the day.
+Any of these forms may be followed by the letter
+.Sq Li w
+if the given time is local
+.Dq "wall clock"
+time,
+.Sq Li s
+if the given time is local
+.Dq standard
+time, or
+.Sq Li u
+(or
+.Sq Li g
+or
+.Sq Li z )
+if the given time is universal time;
+in the absence of an indicator,
+wall clock time is assumed.
+.It SAVE
+Give the amount of time to be added to local standard time when the rule is in
+effect.
+This field has the same format as the
+.Em AT
+field
+(although, of course, the
+.Sq Li w
+and
+.Sq Li s
+suffixes are not used).
+.It LETTER/S
+Give the
+.Dq "variable part"
+(for example, the
+.Dq S
+or
+.Dq D
+in
+.Dq EST
+or
+.Dq EDT )
+of time zone abbreviations to be used when this rule is in effect.
+If this field is
+.Em \- ,
+the variable part is null.
+.El
+.Pp
+A zone line has the form:
+.Dl "Zone NAME GMTOFF RULES/SAVE FORMAT [UNTILYEAR [MONTH [DAY [TIME]]]]"
+For example:
+.Dl "Zone Australia/Adelaide 9:30 Aus CST 1971 Oct 31 2:00"
+The fields that make up a zone line are:
+.Bl -tag -width indent
+.It NAME
+The name of the time zone.
+This is the name used in creating the time conversion information file for the
+zone.
+.It GMTOFF
+The amount of time to add to UTC to get standard time in this zone.
+This field has the same format as the
+.Em AT
+and
+.Em SAVE
+fields of rule lines;
+begin the field with a minus sign if time must be subtracted from UTC.
+.It RULES/SAVE
+The name of the rule(s) that apply in the time zone or,
+alternately, an amount of time to add to local standard time.
+If this field is
+.Em \-
+then standard time always applies in the time zone.
+.It FORMAT
+The format for time zone abbreviations in this time zone.
+The pair of characters
+.Em %s
+is used to show where the
+.Dq "variable part"
+of the time zone abbreviation goes.
+Alternately,
+a slash (/)
+separates standard and daylight abbreviations.
+.It UNTILYEAR [MONTH [DAY [TIME]]]
+The time at which the UTC offset or the rule(s) change for a location.
+It is specified as a year, a month, a day, and a time of day.
+If this is specified,
+the time zone information is generated from the given UTC offset
+and rule change until the time specified.
+The month, day, and time of day have the same format as the IN, ON, and AT
+fields of a rule; trailing fields can be omitted, and default to the
+earliest possible value for the missing fields.
+.Pp
+The next line must be a
+.Dq continuation
+line; this has the same form as a zone line except that the
+string
+.Dq Zone
+and the name are omitted, as the continuation line will
+place information starting at the time specified as the
+.Em until
+information in the previous line in the file used by the previous line.
+Continuation lines may contain
+.Em until
+information, just as zone lines do, indicating that the next line is a further
+continuation.
+.El
+.Pp
+A link line has the form
+.Dl "Link LINK-FROM LINK-TO"
+For example:
+.Dl "Link Europe/Istanbul Asia/Istanbul"
+The
+.Em LINK-FROM
+field should appear as the
+.Em NAME
+field in some zone line;
+the
+.Em LINK-TO
+field is used as an alternate name for that zone.
+.Pp
+Except for continuation lines,
+lines may appear in any order in the input.
+.Pp
+Lines in the file that describes leap seconds have the following form:
+.Dl "Leap YEAR MONTH DAY HH:MM:SS CORR R/S"
+For example:
+.Dl "Leap 1974 Dec 31 23:59:60 + S"
+The
+.Em YEAR ,
+.Em MONTH ,
+.Em DAY ,
+and
+.Em HH:MM:SS
+fields tell when the leap second happened.
+The
+.Em CORR
+field
+should be
+.Dq +
+if a second was added
+or
+.Dq -
+if a second was skipped.
+.\" There's no need to document the following, since it's impossible for more
+.\" than one leap second to be inserted or deleted at a time.
+.\" The C Standard is in error in suggesting the possibility.
+.\" See Terry J Quinn, The BIPM and the accurate measure of time,
+.\" Proc IEEE 79, 7 (July 1991), 894-905.
+.\" or
+.\" .q ++
+.\" if two seconds were added
+.\" or
+.\" .q --
+.\" if two seconds were skipped.
+The
+.Em R/S
+field
+should be (an abbreviation of)
+.Dq Stationary
+if the leap second time given by the other fields should be interpreted as UTC
+or
+(an abbreviation of)
+.Dq Rolling
+if the leap second time given by the other fields should be interpreted as
+local wall clock time.
+.Sh "EXTENDED EXAMPLE"
+Here is an extended example of
+.Nm
+input, intended to illustrate many of its features.
+.br
+.ne 22
+.nf
+.in +2m
+.ta \w'# Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'TYPE\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
+.sp
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Swiss 1940 only - Nov 2 0:00 1:00 S
+Rule Swiss 1940 only - Dec 31 0:00 0 -
+Rule Swiss 1941 1942 - May Sun>=1 2:00 1:00 S
+Rule Swiss 1941 1942 - Oct Sun>=1 0:00 0
+.sp .5
+Rule EU 1977 1980 - Apr Sun>=1 1:00u 1:00 S
+Rule EU 1977 only - Sep lastSun 1:00u 0 -
+Rule EU 1978 only - Oct 1 1:00u 0 -
+Rule EU 1979 1995 - Sep lastSun 1:00u 0 -
+Rule EU 1981 max - Mar lastSun 1:00u 1:00 S
+Rule EU 1996 max - Oct lastSun 1:00u 0 -
+.sp
+.ta \w'# Zone\0\0'u +\w'Europe/Zurich\0\0'u +\w'0:34:08\0\0'u +\w'RULES/SAVE\0\0'u +\w'FORMAT\0\0'u
+# Zone NAME GMTOFF RULES FORMAT UNTIL
+Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12
+ 0:29:44 - BMT 1894 Jun
+ 1:00 Swiss CE%sT 1981
+ 1:00 EU CE%sT
+.sp
+Link Europe/Zurich Switzerland
+.sp
+.in
+.fi
+In this example, the zone is named Europe/Zurich but it has an alias
+as Switzerland.
+Zurich was 34 minutes and 8 seconds west of GMT until 1848-09-12
+at 00:00, when the offset changed to 29 minutes and 44 seconds.
+After 1894-06-01 at 00:00 Swiss daylight saving rules (defined with
+lines beginning with "Rule Swiss") apply, and the GMT offset became
+one hour.
+From 1981 to the present, EU daylight saving rules have applied,
+and the UTC offset has remained at one hour.
+.Pp
+In 1940, daylight saving time applied from November 2 at 00:00 to
+December 31 at 00:00.
+In 1941 and 1942, daylight saving time applied from the first Sunday
+in May at 02:00 to the first Sunday in October at 00:00.
+The pre-1981 EU daylight-saving rules have no effect here, but are
+included for completeness.
+Since 1981, daylight saving has begun on the last Sunday in March
+at 01:00 UTC.
+Until 1995 it ended the last Sunday in September at 01:00 UTC, but
+this changed to the last Sunday in October starting in 1996.
+.Pp
+For purposes of display, "LMT" and "BMT" were initially used,
+respectively.
+Since Swiss rules and later EU rules were applied, the display name
+for the timezone has been CET for standard time and CEST for daylight
+saving time.
+.Sh NOTES
+For areas with more than two types of local time,
+you may need to use local standard time in the
+.Em AT
+field of the earliest transition time's rule to ensure that
+the earliest transition time recorded in the compiled file is correct.
+.Pp
+If, for a particular zone, a clock advance caused by the start of
+daylight saving coincides with and is equal to a clock retreat
+caused by a change in UTC offset,
+.Nm
+produces a single transition to daylight saving at the new UTC offset
+(without any change in wall clock time).
+To get separate transitions use multiple zone continuation lines
+specifying transition instants using universal time.
+.Sh FILES
+.Bl -tag -width /usr/share/zoneinfo -compact
+.It /usr/share/zoneinfo
+standard directory used for created files
+.El
+.Sh "SEE ALSO"
+.Xr ctime 3 ,
+.Xr tzfile 5 ,
+.Xr zdump 8
+.\" @(#)zic.8 8.6
+.\" This file is in the public domain, so clarified as of
+.\" 2009-05-17 by Arthur David Olson.
Added: vendor/tzcode/dist/zic/zic.c
===================================================================
--- vendor/tzcode/dist/zic/zic.c (rev 0)
+++ vendor/tzcode/dist/zic/zic.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -0,0 +1,2756 @@
+/*
+** This file is in the public domain, so clarified as of
+** 2006-07-17 by Arthur David Olson.
+*/
+
+static const char elsieid[] = "@(#)zic.c 8.22";
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD: stable/10/contrib/tzcode/zic/zic.c 307359 2016-10-15 12:38:21Z bapt $";
+#endif /* not lint */
+
+#include "private.h"
+#include "tzfile.h"
+#include <err.h>
+#include <locale.h>
+#include <sys/stat.h> /* for umask manifest constants */
+#include <sys/types.h>
+#include <unistd.h>
+
+#define ZIC_VERSION '2'
+
+typedef int_fast64_t zic_t;
+
+#ifndef ZIC_MAX_ABBR_LEN_WO_WARN
+#define ZIC_MAX_ABBR_LEN_WO_WARN 6
+#endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
+
+#define MKDIR_UMASK (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
+
+/*
+** On some ancient hosts, predicates like `isspace(C)' are defined
+** only if isascii(C) || C == EOF. Modern hosts obey the C Standard,
+** which says they are defined only if C == ((unsigned char) C) || C == EOF.
+** Neither the C Standard nor POSIX require that `isascii' exist.
+** For portability, we check both ancient and modern requirements.
+** If isascii is not defined, the isascii check succeeds trivially.
+*/
+#include "ctype.h"
+#ifndef isascii
+#define isascii(x) 1
+#endif
+
+#define OFFSET_STRLEN_MAXIMUM (7 + INT_STRLEN_MAXIMUM(long))
+#define RULE_STRLEN_MAXIMUM 8 /* "Mdd.dd.d" */
+
+#define end(cp) (strchr((cp), '\0'))
+
+struct rule {
+ const char * r_filename;
+ int r_linenum;
+ const char * r_name;
+
+ int r_loyear; /* for example, 1986 */
+ int r_hiyear; /* for example, 1986 */
+ const char * r_yrtype;
+ int r_lowasnum;
+ int r_hiwasnum;
+
+ int r_month; /* 0..11 */
+
+ int r_dycode; /* see below */
+ int r_dayofmonth;
+ int r_wday;
+
+ long r_tod; /* time from midnight */
+ int r_todisstd; /* above is standard time if TRUE */
+ /* or wall clock time if FALSE */
+ int r_todisgmt; /* above is GMT if TRUE */
+ /* or local time if FALSE */
+ long r_stdoff; /* offset from standard time */
+ const char * r_abbrvar; /* variable part of abbreviation */
+
+ int r_todo; /* a rule to do (used in outzone) */
+ zic_t r_temp; /* used in outzone */
+};
+
+/*
+** r_dycode r_dayofmonth r_wday
+*/
+
+#define DC_DOM 0 /* 1..31 */ /* unused */
+#define DC_DOWGEQ 1 /* 1..31 */ /* 0..6 (Sun..Sat) */
+#define DC_DOWLEQ 2 /* 1..31 */ /* 0..6 (Sun..Sat) */
+
+struct zone {
+ const char * z_filename;
+ int z_linenum;
+
+ const char * z_name;
+ long z_gmtoff;
+ const char * z_rule;
+ const char * z_format;
+
+ long z_stdoff;
+
+ struct rule * z_rules;
+ int z_nrules;
+
+ struct rule z_untilrule;
+ zic_t z_untiltime;
+};
+
+static void addtt(zic_t starttime, int type);
+static int addtype(long gmtoff, const char * abbr, int isdst,
+ int ttisstd, int ttisgmt);
+static void leapadd(zic_t t, int positive, int rolling, int count);
+static void adjleap(void);
+static void associate(void);
+static int ciequal(const char * ap, const char * bp);
+static void convert(long val, char * buf);
+static void convert64(zic_t val, char * buf);
+static void dolink(const char * fromfield, const char * tofield);
+static void doabbr(char * abbr, const char * format,
+ const char * letters, int isdst, int doquotes);
+static void eat(const char * name, int num);
+static void eats(const char * name, int num,
+ const char * rname, int rnum);
+static long eitol(int i);
+static void error(const char * message);
+static char ** getfields(char * buf);
+static long gethms(const char * string, const char * errstrng,
+ int signable);
+static void infile(const char * filename);
+static void inleap(char ** fields, int nfields);
+static void inlink(char ** fields, int nfields);
+static void inrule(char ** fields, int nfields);
+static int inzcont(char ** fields, int nfields);
+static int inzone(char ** fields, int nfields);
+static int inzsub(char ** fields, int nfields, int iscont);
+static int is32(zic_t x);
+static int itsabbr(const char * abbr, const char * word);
+static int itsdir(const char * name);
+static int lowerit(int c);
+static char * memcheck(char * tocheck);
+static int mkdirs(char * filename);
+static void newabbr(const char * abbr);
+static long oadd(long t1, long t2);
+static void outzone(const struct zone * zp, int ntzones);
+static void puttzcode(long code, FILE * fp);
+static void puttzcode64(zic_t code, FILE * fp);
+static int rcomp(const void * leftp, const void * rightp);
+static zic_t rpytime(const struct rule * rp, int wantedy);
+static void rulesub(struct rule * rp,
+ const char * loyearp, const char * hiyearp,
+ const char * typep, const char * monthp,
+ const char * dayp, const char * timep);
+static int stringoffset(char * result, long offset);
+static int stringrule(char * result, const struct rule * rp,
+ long dstoff, long gmtoff);
+static void stringzone(char * result,
+ const struct zone * zp, int ntzones);
+static void setboundaries(void);
+static void setgroup(gid_t *flag, const char *name);
+static void setuser(uid_t *flag, const char *name);
+static zic_t tadd(zic_t t1, long t2);
+static void usage(FILE *stream, int status);
+static void writezone(const char * name, const char * string);
+static int yearistype(int year, const char * type);
+
+static int charcnt;
+static int errors;
+static const char * filename;
+static int leapcnt;
+static int leapseen;
+static int leapminyear;
+static int leapmaxyear;
+static int linenum;
+static int max_abbrvar_len;
+static int max_format_len;
+static zic_t max_time;
+static int max_year;
+static zic_t min_time;
+static int min_year;
+static zic_t min_time;
+static int noise;
+static const char * rfilename;
+static int rlinenum;
+static int timecnt;
+static int typecnt;
+
+/*
+** Line codes.
+*/
+
+#define LC_RULE 0
+#define LC_ZONE 1
+#define LC_LINK 2
+#define LC_LEAP 3
+
+/*
+** Which fields are which on a Zone line.
+*/
+
+#define ZF_NAME 1
+#define ZF_GMTOFF 2
+#define ZF_RULE 3
+#define ZF_FORMAT 4
+#define ZF_TILYEAR 5
+#define ZF_TILMONTH 6
+#define ZF_TILDAY 7
+#define ZF_TILTIME 8
+#define ZONE_MINFIELDS 5
+#define ZONE_MAXFIELDS 9
+
+/*
+** Which fields are which on a Zone continuation line.
+*/
+
+#define ZFC_GMTOFF 0
+#define ZFC_RULE 1
+#define ZFC_FORMAT 2
+#define ZFC_TILYEAR 3
+#define ZFC_TILMONTH 4
+#define ZFC_TILDAY 5
+#define ZFC_TILTIME 6
+#define ZONEC_MINFIELDS 3
+#define ZONEC_MAXFIELDS 7
+
+/*
+** Which files are which on a Rule line.
+*/
+
+#define RF_NAME 1
+#define RF_LOYEAR 2
+#define RF_HIYEAR 3
+#define RF_COMMAND 4
+#define RF_MONTH 5
+#define RF_DAY 6
+#define RF_TOD 7
+#define RF_STDOFF 8
+#define RF_ABBRVAR 9
+#define RULE_FIELDS 10
+
+/*
+** Which fields are which on a Link line.
+*/
+
+#define LF_FROM 1
+#define LF_TO 2
+#define LINK_FIELDS 3
+
+/*
+** Which fields are which on a Leap line.
+*/
+
+#define LP_YEAR 1
+#define LP_MONTH 2
+#define LP_DAY 3
+#define LP_TIME 4
+#define LP_CORR 5
+#define LP_ROLL 6
+#define LEAP_FIELDS 7
+
+/*
+** Year synonyms.
+*/
+
+#define YR_MINIMUM 0
+#define YR_MAXIMUM 1
+#define YR_ONLY 2
+
+static struct rule * rules;
+static int nrules; /* number of rules */
+
+static struct zone * zones;
+static int nzones; /* number of zones */
+
+struct link {
+ const char * l_filename;
+ int l_linenum;
+ const char * l_from;
+ const char * l_to;
+};
+
+static struct link * links;
+static int nlinks;
+
+struct lookup {
+ const char * l_word;
+ const int l_value;
+};
+
+static struct lookup const * byword(const char * string,
+ const struct lookup * lp);
+
+static struct lookup const line_codes[] = {
+ { "Rule", LC_RULE },
+ { "Zone", LC_ZONE },
+ { "Link", LC_LINK },
+ { "Leap", LC_LEAP },
+ { NULL, 0}
+};
+
+static struct lookup const mon_names[] = {
+ { "January", TM_JANUARY },
+ { "February", TM_FEBRUARY },
+ { "March", TM_MARCH },
+ { "April", TM_APRIL },
+ { "May", TM_MAY },
+ { "June", TM_JUNE },
+ { "July", TM_JULY },
+ { "August", TM_AUGUST },
+ { "September", TM_SEPTEMBER },
+ { "October", TM_OCTOBER },
+ { "November", TM_NOVEMBER },
+ { "December", TM_DECEMBER },
+ { NULL, 0 }
+};
+
+static struct lookup const wday_names[] = {
+ { "Sunday", TM_SUNDAY },
+ { "Monday", TM_MONDAY },
+ { "Tuesday", TM_TUESDAY },
+ { "Wednesday", TM_WEDNESDAY },
+ { "Thursday", TM_THURSDAY },
+ { "Friday", TM_FRIDAY },
+ { "Saturday", TM_SATURDAY },
+ { NULL, 0 }
+};
+
+static struct lookup const lasts[] = {
+ { "last-Sunday", TM_SUNDAY },
+ { "last-Monday", TM_MONDAY },
+ { "last-Tuesday", TM_TUESDAY },
+ { "last-Wednesday", TM_WEDNESDAY },
+ { "last-Thursday", TM_THURSDAY },
+ { "last-Friday", TM_FRIDAY },
+ { "last-Saturday", TM_SATURDAY },
+ { NULL, 0 }
+};
+
+static struct lookup const begin_years[] = {
+ { "minimum", YR_MINIMUM },
+ { "maximum", YR_MAXIMUM },
+ { NULL, 0 }
+};
+
+static struct lookup const end_years[] = {
+ { "minimum", YR_MINIMUM },
+ { "maximum", YR_MAXIMUM },
+ { "only", YR_ONLY },
+ { NULL, 0 }
+};
+
+static struct lookup const leap_types[] = {
+ { "Rolling", TRUE },
+ { "Stationary", FALSE },
+ { NULL, 0 }
+};
+
+static const int len_months[2][MONSPERYEAR] = {
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+static const int len_years[2] = {
+ DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+static struct attype {
+ zic_t at;
+ unsigned char type;
+} attypes[TZ_MAX_TIMES];
+static long gmtoffs[TZ_MAX_TYPES];
+static char isdsts[TZ_MAX_TYPES];
+static unsigned char abbrinds[TZ_MAX_TYPES];
+static char ttisstds[TZ_MAX_TYPES];
+static char ttisgmts[TZ_MAX_TYPES];
+static char chars[TZ_MAX_CHARS];
+static zic_t trans[TZ_MAX_LEAPS];
+static long corr[TZ_MAX_LEAPS];
+static char roll[TZ_MAX_LEAPS];
+
+/*
+** Memory allocation.
+*/
+
+static char *
+memcheck(ptr)
+char * const ptr;
+{
+ if (ptr == NULL)
+ errx(EXIT_FAILURE, _("memory exhausted"));
+ return ptr;
+}
+
+#define emalloc(size) memcheck(imalloc(size))
+#define erealloc(ptr, size) memcheck(irealloc((ptr), (size)))
+#define ecpyalloc(ptr) memcheck(icpyalloc(ptr))
+#define ecatalloc(oldp, newp) memcheck(icatalloc((oldp), (newp)))
+
+/*
+** Error handling.
+*/
+
+static void
+eats(name, num, rname, rnum)
+const char * const name;
+const int num;
+const char * const rname;
+const int rnum;
+{
+ filename = name;
+ linenum = num;
+ rfilename = rname;
+ rlinenum = rnum;
+}
+
+static void
+eat(name, num)
+const char * const name;
+const int num;
+{
+ eats(name, num, (char *) NULL, -1);
+}
+
+static void
+error(string)
+const char * const string;
+{
+ /*
+ ** Match the format of "cc" to allow sh users to
+ ** zic ... 2>&1 | error -t "*" -v
+ ** on BSD systems.
+ */
+ (void) fprintf(stderr, _("\"%s\", line %d: %s"),
+ filename, linenum, string);
+ if (rfilename != NULL)
+ (void) fprintf(stderr, _(" (rule from \"%s\", line %d)"),
+ rfilename, rlinenum);
+ (void) fprintf(stderr, "\n");
+ ++errors;
+}
+
+static void
+warning(string)
+const char * const string;
+{
+ char * cp;
+
+ cp = ecpyalloc(_("warning: "));
+ cp = ecatalloc(cp, string);
+ error(cp);
+ ifree(cp);
+ --errors;
+}
+
+static void
+usage(FILE *stream, int status)
+ {
+ (void) fprintf(stream, _("usage is zic \
+[ --version ] [--help] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\
+\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n\
+\n\
+Report bugs to tz at elsie.nci.nih.gov.\n"));
+ exit(status);
+}
+
+static const char * psxrules;
+static const char * lcltime;
+static const char * directory;
+static const char * leapsec;
+static const char * yitcommand;
+static int Dflag;
+static uid_t uflag = (uid_t)-1;
+static gid_t gflag = (gid_t)-1;
+static mode_t mflag = (S_IRUSR | S_IRGRP | S_IROTH
+ | S_IWUSR);
+
+int
+main(argc, argv)
+int argc;
+char * argv[];
+{
+ register int i;
+ register int j;
+ register int c;
+
+#ifdef unix
+ (void) umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
+#endif /* defined unix */
+#if HAVE_GETTEXT
+ (void) setlocale(LC_ALL, "");
+#ifdef TZ_DOMAINDIR
+ (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* defined TEXTDOMAINDIR */
+ (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT */
+ if (TYPE_BIT(zic_t) < 64) {
+ (void) fprintf(stderr, "zic: %s\n",
+ _("wild compilation-time specification of zic_t"));
+ exit(EXIT_FAILURE);
+ }
+ for (i = 1; i < argc; ++i)
+ if (strcmp(argv[i], "--version") == 0) {
+ errx(EXIT_SUCCESS, "%s", elsieid);
+ } else if (strcmp(argv[i], "--help") == 0) {
+ usage(stdout, EXIT_SUCCESS);
+ }
+ while ((c = getopt(argc, argv, "Dd:g:l:m:p:L:u:vsy:")) != -1)
+ switch (c) {
+ default:
+ usage(stderr, EXIT_FAILURE);
+ case 'D':
+ Dflag = 1;
+ break;
+ case 'd':
+ if (directory == NULL)
+ directory = optarg;
+ else
+ errx(EXIT_FAILURE,
+_("more than one -d option specified"));
+ break;
+ case 'g':
+ setgroup(&gflag, optarg);
+ break;
+ case 'l':
+ if (lcltime == NULL)
+ lcltime = optarg;
+ else
+ errx(EXIT_FAILURE,
+_("more than one -l option specified"));
+ break;
+ case 'm':
+ {
+ void *set = setmode(optarg);
+ if (set == NULL)
+ errx(EXIT_FAILURE,
+_("invalid file mode"));
+ mflag = getmode(set, mflag);
+ free(set);
+ break;
+ }
+ case 'p':
+ if (psxrules == NULL)
+ psxrules = optarg;
+ else
+ errx(EXIT_FAILURE,
+_("more than one -p option specified"));
+ break;
+ case 'u':
+ setuser(&uflag, optarg);
+ break;
+ case 'y':
+ if (yitcommand == NULL)
+ yitcommand = optarg;
+ else
+ errx(EXIT_FAILURE,
+_("more than one -y option specified"));
+ break;
+ case 'L':
+ if (leapsec == NULL)
+ leapsec = optarg;
+ else
+ errx(EXIT_FAILURE,
+_("more than one -L option specified"));
+ break;
+ case 'v':
+ noise = TRUE;
+ break;
+ case 's':
+ (void) printf("zic: -s ignored\n");
+ break;
+ }
+ if (optind == argc - 1 && strcmp(argv[optind], "=") == 0)
+ usage(stderr, EXIT_FAILURE); /* usage message by request */
+ if (directory == NULL)
+ directory = TZDIR;
+ if (yitcommand == NULL)
+ yitcommand = "yearistype";
+
+ setboundaries();
+
+ if (optind < argc && leapsec != NULL) {
+ infile(leapsec);
+ adjleap();
+ }
+
+ for (i = optind; i < argc; ++i)
+ infile(argv[i]);
+ if (errors)
+ exit(EXIT_FAILURE);
+ associate();
+ for (i = 0; i < nzones; i = j) {
+ /*
+ ** Find the next non-continuation zone entry.
+ */
+ for (j = i + 1; j < nzones && zones[j].z_name == NULL; ++j)
+ continue;
+ outzone(&zones[i], j - i);
+ }
+ /*
+ ** Make links.
+ */
+ for (i = 0; i < nlinks; ++i) {
+ eat(links[i].l_filename, links[i].l_linenum);
+ dolink(links[i].l_from, links[i].l_to);
+ if (noise)
+ for (j = 0; j < nlinks; ++j)
+ if (strcmp(links[i].l_to,
+ links[j].l_from) == 0)
+ warning(_("link to link"));
+ }
+ if (lcltime != NULL) {
+ eat("command line", 1);
+ dolink(lcltime, TZDEFAULT);
+ }
+ if (psxrules != NULL) {
+ eat("command line", 1);
+ dolink(psxrules, TZDEFRULES);
+ }
+ return (errors == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+static void
+dolink(fromfield, tofield)
+const char * const fromfield;
+const char * const tofield;
+{
+ register char * fromname;
+ register char * toname;
+
+ if (fromfield[0] == '/')
+ fromname = ecpyalloc(fromfield);
+ else {
+ fromname = ecpyalloc(directory);
+ fromname = ecatalloc(fromname, "/");
+ fromname = ecatalloc(fromname, fromfield);
+ }
+ if (tofield[0] == '/')
+ toname = ecpyalloc(tofield);
+ else {
+ toname = ecpyalloc(directory);
+ toname = ecatalloc(toname, "/");
+ toname = ecatalloc(toname, tofield);
+ }
+ /*
+ ** We get to be careful here since
+ ** there's a fair chance of root running us.
+ */
+ if (!itsdir(toname))
+ (void) remove(toname);
+ if (link(fromname, toname) != 0) {
+ int result;
+
+ if (mkdirs(toname) != 0)
+ exit(EXIT_FAILURE);
+
+ result = link(fromname, toname);
+#if HAVE_SYMLINK
+ if (result != 0 &&
+ access(fromname, F_OK) == 0 &&
+ !itsdir(fromname)) {
+ const char *s = tofield;
+ register char * symlinkcontents = NULL;
+ while ((s = strchr(s+1, '/')) != NULL)
+ symlinkcontents =
+ ecatalloc(symlinkcontents,
+ "../");
+ symlinkcontents =
+ ecatalloc(symlinkcontents,
+ fromname);
+ result =
+ symlink(symlinkcontents,
+ toname);
+ if (result == 0)
+warning(_("hard link failed, symbolic link used"));
+ ifree(symlinkcontents);
+ }
+#endif /* HAVE_SYMLINK */
+ if (result != 0) {
+ err(EXIT_FAILURE, _("can't link from %s to %s"),
+ fromname, toname);
+ }
+ }
+ ifree(fromname);
+ ifree(toname);
+}
+
+#define TIME_T_BITS_IN_FILE 64
+
+static void
+setboundaries (void)
+{
+ register int i;
+
+ min_time = -1;
+ for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
+ min_time *= 2;
+ max_time = -(min_time + 1);
+}
+
+static int
+itsdir(name)
+const char * const name;
+{
+ register char * myname;
+ register int accres;
+
+ myname = ecpyalloc(name);
+ myname = ecatalloc(myname, "/.");
+ accres = access(myname, F_OK);
+ ifree(myname);
+ return accres == 0;
+}
+
+/*
+** Associate sets of rules with zones.
+*/
+
+/*
+** Sort by rule name.
+*/
+
+static int
+rcomp(cp1, cp2)
+const void * cp1;
+const void * cp2;
+{
+ return strcmp(((const struct rule *) cp1)->r_name,
+ ((const struct rule *) cp2)->r_name);
+}
+
+static void
+associate(void)
+{
+ register struct zone * zp;
+ register struct rule * rp;
+ register int base, out;
+ register int i, j;
+
+ if (nrules != 0) {
+ (void) qsort((void *) rules, (size_t) nrules,
+ (size_t) sizeof *rules, rcomp);
+ for (i = 0; i < nrules - 1; ++i) {
+ if (strcmp(rules[i].r_name,
+ rules[i + 1].r_name) != 0)
+ continue;
+ if (strcmp(rules[i].r_filename,
+ rules[i + 1].r_filename) == 0)
+ continue;
+ eat(rules[i].r_filename, rules[i].r_linenum);
+ warning(_("same rule name in multiple files"));
+ eat(rules[i + 1].r_filename, rules[i + 1].r_linenum);
+ warning(_("same rule name in multiple files"));
+ for (j = i + 2; j < nrules; ++j) {
+ if (strcmp(rules[i].r_name,
+ rules[j].r_name) != 0)
+ break;
+ if (strcmp(rules[i].r_filename,
+ rules[j].r_filename) == 0)
+ continue;
+ if (strcmp(rules[i + 1].r_filename,
+ rules[j].r_filename) == 0)
+ continue;
+ break;
+ }
+ i = j - 1;
+ }
+ }
+ for (i = 0; i < nzones; ++i) {
+ zp = &zones[i];
+ zp->z_rules = NULL;
+ zp->z_nrules = 0;
+ }
+ for (base = 0; base < nrules; base = out) {
+ rp = &rules[base];
+ for (out = base + 1; out < nrules; ++out)
+ if (strcmp(rp->r_name, rules[out].r_name) != 0)
+ break;
+ for (i = 0; i < nzones; ++i) {
+ zp = &zones[i];
+ if (strcmp(zp->z_rule, rp->r_name) != 0)
+ continue;
+ zp->z_rules = rp;
+ zp->z_nrules = out - base;
+ }
+ }
+ for (i = 0; i < nzones; ++i) {
+ zp = &zones[i];
+ if (zp->z_nrules == 0) {
+ /*
+ ** Maybe we have a local standard time offset.
+ */
+ eat(zp->z_filename, zp->z_linenum);
+ zp->z_stdoff = gethms(zp->z_rule, _("unruly zone"),
+ TRUE);
+ /*
+ ** Note, though, that if there's no rule,
+ ** a '%s' in the format is a bad thing.
+ */
+ if (strchr(zp->z_format, '%') != 0)
+ error(_("%s in ruleless zone"));
+ }
+ }
+ if (errors)
+ exit(EXIT_FAILURE);
+}
+
+static void
+infile(name)
+const char * name;
+{
+ register FILE * fp;
+ register char ** fields;
+ register char * cp;
+ register const struct lookup * lp;
+ register int nfields;
+ register int wantcont;
+ register int num;
+ char buf[BUFSIZ];
+
+ if (strcmp(name, "-") == 0) {
+ name = _("standard input");
+ fp = stdin;
+ } else if ((fp = fopen(name, "r")) == NULL)
+ err(EXIT_FAILURE, _("can't open %s"), name);
+ wantcont = FALSE;
+ for (num = 1; ; ++num) {
+ eat(name, num);
+ if (fgets(buf, (int) sizeof buf, fp) != buf)
+ break;
+ cp = strchr(buf, '\n');
+ if (cp == NULL) {
+ error(_("line too long"));
+ exit(EXIT_FAILURE);
+ }
+ *cp = '\0';
+ fields = getfields(buf);
+ nfields = 0;
+ while (fields[nfields] != NULL) {
+ static char nada;
+
+ if (strcmp(fields[nfields], "-") == 0)
+ fields[nfields] = &nada;
+ ++nfields;
+ }
+ if (nfields == 0) {
+ /* nothing to do */
+ } else if (wantcont) {
+ wantcont = inzcont(fields, nfields);
+ } else {
+ lp = byword(fields[0], line_codes);
+ if (lp == NULL)
+ error(_("input line of unknown type"));
+ else switch ((int) (lp->l_value)) {
+ case LC_RULE:
+ inrule(fields, nfields);
+ wantcont = FALSE;
+ break;
+ case LC_ZONE:
+ wantcont = inzone(fields, nfields);
+ break;
+ case LC_LINK:
+ inlink(fields, nfields);
+ wantcont = FALSE;
+ break;
+ case LC_LEAP:
+ if (name != leapsec)
+ warnx(
+_("leap line in non leap seconds file %s"), name);
+ else inleap(fields, nfields);
+ wantcont = FALSE;
+ break;
+ default: /* "cannot happen" */
+ errx(EXIT_FAILURE,
+_("panic: invalid l_value %d"), lp->l_value);
+ }
+ }
+ ifree((char *) fields);
+ }
+ if (ferror(fp))
+ errx(EXIT_FAILURE, _("error reading %s"), filename);
+ if (fp != stdin && fclose(fp))
+ err(EXIT_FAILURE, _("error closing %s"), filename);
+ if (wantcont)
+ error(_("expected continuation line not found"));
+}
+
+/*
+** Convert a string of one of the forms
+** h -h hh:mm -hh:mm hh:mm:ss -hh:mm:ss
+** into a number of seconds.
+** A null string maps to zero.
+** Call error with errstring and return zero on errors.
+*/
+
+static long
+gethms(string, errstring, signable)
+const char * string;
+const char * const errstring;
+const int signable;
+{
+ long hh;
+ int mm, ss, sign;
+
+ if (string == NULL || *string == '\0')
+ return 0;
+ if (!signable)
+ sign = 1;
+ else if (*string == '-') {
+ sign = -1;
+ ++string;
+ } else sign = 1;
+ if (sscanf(string, scheck(string, "%ld"), &hh) == 1)
+ mm = ss = 0;
+ else if (sscanf(string, scheck(string, "%ld:%d"), &hh, &mm) == 2)
+ ss = 0;
+ else if (sscanf(string, scheck(string, "%ld:%d:%d"),
+ &hh, &mm, &ss) != 3) {
+ error(errstring);
+ return 0;
+ }
+ if (hh < 0 ||
+ mm < 0 || mm >= MINSPERHOUR ||
+ ss < 0 || ss > SECSPERMIN) {
+ error(errstring);
+ return 0;
+ }
+ if (LONG_MAX / SECSPERHOUR < hh) {
+ error(_("time overflow"));
+ return 0;
+ }
+ if (noise && hh == HOURSPERDAY && mm == 0 && ss == 0)
+ warning(_("24:00 not handled by pre-1998 versions of zic"));
+ if (noise && (hh > HOURSPERDAY ||
+ (hh == HOURSPERDAY && (mm != 0 || ss != 0))))
+warning(_("values over 24 hours not handled by pre-2007 versions of zic"));
+ return oadd(eitol(sign) * hh * eitol(SECSPERHOUR),
+ eitol(sign) * (eitol(mm) * eitol(SECSPERMIN) + eitol(ss)));
+}
+
+static void
+inrule(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ static struct rule r;
+
+ if (nfields != RULE_FIELDS) {
+ error(_("wrong number of fields on Rule line"));
+ return;
+ }
+ if (*fields[RF_NAME] == '\0') {
+ error(_("nameless rule"));
+ return;
+ }
+ r.r_filename = filename;
+ r.r_linenum = linenum;
+ r.r_stdoff = gethms(fields[RF_STDOFF], _("invalid saved time"), TRUE);
+ rulesub(&r, fields[RF_LOYEAR], fields[RF_HIYEAR], fields[RF_COMMAND],
+ fields[RF_MONTH], fields[RF_DAY], fields[RF_TOD]);
+ r.r_name = ecpyalloc(fields[RF_NAME]);
+ r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
+ if (max_abbrvar_len < strlen(r.r_abbrvar))
+ max_abbrvar_len = strlen(r.r_abbrvar);
+ rules = (struct rule *) (void *) erealloc((char *) rules,
+ (int) ((nrules + 1) * sizeof *rules));
+ rules[nrules++] = r;
+}
+
+static int
+inzone(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ register int i;
+ static char * buf;
+
+ if (nfields < ZONE_MINFIELDS || nfields > ZONE_MAXFIELDS) {
+ error(_("wrong number of fields on Zone line"));
+ return FALSE;
+ }
+ if (strcmp(fields[ZF_NAME], TZDEFAULT) == 0 && lcltime != NULL) {
+ buf = erealloc(buf, (int) (132 + strlen(TZDEFAULT)));
+ (void) sprintf(buf,
+_("\"Zone %s\" line and -l option are mutually exclusive"),
+ TZDEFAULT);
+ error(buf);
+ return FALSE;
+ }
+ if (strcmp(fields[ZF_NAME], TZDEFRULES) == 0 && psxrules != NULL) {
+ buf = erealloc(buf, (int) (132 + strlen(TZDEFRULES)));
+ (void) sprintf(buf,
+_("\"Zone %s\" line and -p option are mutually exclusive"),
+ TZDEFRULES);
+ error(buf);
+ return FALSE;
+ }
+ for (i = 0; i < nzones; ++i)
+ if (zones[i].z_name != NULL &&
+ strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
+ buf = erealloc(buf, (int) (132 +
+ strlen(fields[ZF_NAME]) +
+ strlen(zones[i].z_filename)));
+ (void) sprintf(buf,
+_("duplicate zone name %s (file \"%s\", line %d)"),
+ fields[ZF_NAME],
+ zones[i].z_filename,
+ zones[i].z_linenum);
+ error(buf);
+ return FALSE;
+ }
+ return inzsub(fields, nfields, FALSE);
+}
+
+static int
+inzcont(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ if (nfields < ZONEC_MINFIELDS || nfields > ZONEC_MAXFIELDS) {
+ error(_("wrong number of fields on Zone continuation line"));
+ return FALSE;
+ }
+ return inzsub(fields, nfields, TRUE);
+}
+
+static int
+inzsub(fields, nfields, iscont)
+register char ** const fields;
+const int nfields;
+const int iscont;
+{
+ register char * cp;
+ static struct zone z;
+ register int i_gmtoff, i_rule, i_format;
+ register int i_untilyear, i_untilmonth;
+ register int i_untilday, i_untiltime;
+ register int hasuntil;
+
+ if (iscont) {
+ i_gmtoff = ZFC_GMTOFF;
+ i_rule = ZFC_RULE;
+ i_format = ZFC_FORMAT;
+ i_untilyear = ZFC_TILYEAR;
+ i_untilmonth = ZFC_TILMONTH;
+ i_untilday = ZFC_TILDAY;
+ i_untiltime = ZFC_TILTIME;
+ z.z_name = NULL;
+ } else {
+ i_gmtoff = ZF_GMTOFF;
+ i_rule = ZF_RULE;
+ i_format = ZF_FORMAT;
+ i_untilyear = ZF_TILYEAR;
+ i_untilmonth = ZF_TILMONTH;
+ i_untilday = ZF_TILDAY;
+ i_untiltime = ZF_TILTIME;
+ z.z_name = ecpyalloc(fields[ZF_NAME]);
+ }
+ z.z_filename = filename;
+ z.z_linenum = linenum;
+ z.z_gmtoff = gethms(fields[i_gmtoff], _("invalid UTC offset"), TRUE);
+ if ((cp = strchr(fields[i_format], '%')) != 0) {
+ if (*++cp != 's' || strchr(cp, '%') != 0) {
+ error(_("invalid abbreviation format"));
+ return FALSE;
+ }
+ }
+ z.z_rule = ecpyalloc(fields[i_rule]);
+ z.z_format = ecpyalloc(fields[i_format]);
+ if (max_format_len < strlen(z.z_format))
+ max_format_len = strlen(z.z_format);
+ hasuntil = nfields > i_untilyear;
+ if (hasuntil) {
+ z.z_untilrule.r_filename = filename;
+ z.z_untilrule.r_linenum = linenum;
+ rulesub(&z.z_untilrule,
+ fields[i_untilyear],
+ "only",
+ "",
+ (nfields > i_untilmonth) ?
+ fields[i_untilmonth] : "Jan",
+ (nfields > i_untilday) ? fields[i_untilday] : "1",
+ (nfields > i_untiltime) ? fields[i_untiltime] : "0");
+ z.z_untiltime = rpytime(&z.z_untilrule,
+ z.z_untilrule.r_loyear);
+ if (iscont && nzones > 0 &&
+ z.z_untiltime > min_time &&
+ z.z_untiltime < max_time &&
+ zones[nzones - 1].z_untiltime > min_time &&
+ zones[nzones - 1].z_untiltime < max_time &&
+ zones[nzones - 1].z_untiltime >= z.z_untiltime) {
+ error(_(
+"Zone continuation line end time is not after end time of previous line"
+ ));
+ return FALSE;
+ }
+ }
+ zones = (struct zone *) (void *) erealloc((char *) zones,
+ (int) ((nzones + 1) * sizeof *zones));
+ zones[nzones++] = z;
+ /*
+ ** If there was an UNTIL field on this line,
+ ** there's more information about the zone on the next line.
+ */
+ return hasuntil;
+}
+
+static void
+inleap(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ register const char * cp;
+ register const struct lookup * lp;
+ register int i, j;
+ int year, month, day;
+ long dayoff, tod;
+ zic_t t;
+
+ if (nfields != LEAP_FIELDS) {
+ error(_("wrong number of fields on Leap line"));
+ return;
+ }
+ dayoff = 0;
+ cp = fields[LP_YEAR];
+ if (sscanf(cp, scheck(cp, "%d"), &year) != 1) {
+ /*
+ ** Leapin' Lizards!
+ */
+ error(_("invalid leaping year"));
+ return;
+ }
+ if (!leapseen || leapmaxyear < year)
+ leapmaxyear = year;
+ if (!leapseen || leapminyear > year)
+ leapminyear = year;
+ leapseen = TRUE;
+ j = EPOCH_YEAR;
+ while (j != year) {
+ if (year > j) {
+ i = len_years[isleap(j)];
+ ++j;
+ } else {
+ --j;
+ i = -len_years[isleap(j)];
+ }
+ dayoff = oadd(dayoff, eitol(i));
+ }
+ if ((lp = byword(fields[LP_MONTH], mon_names)) == NULL) {
+ error(_("invalid month name"));
+ return;
+ }
+ month = lp->l_value;
+ j = TM_JANUARY;
+ while (j != month) {
+ i = len_months[isleap(year)][j];
+ dayoff = oadd(dayoff, eitol(i));
+ ++j;
+ }
+ cp = fields[LP_DAY];
+ if (sscanf(cp, scheck(cp, "%d"), &day) != 1 ||
+ day <= 0 || day > len_months[isleap(year)][month]) {
+ error(_("invalid day of month"));
+ return;
+ }
+ dayoff = oadd(dayoff, eitol(day - 1));
+ if (dayoff < 0 && !TYPE_SIGNED(zic_t)) {
+ error(_("time before zero"));
+ return;
+ }
+ if (dayoff < min_time / SECSPERDAY) {
+ error(_("time too small"));
+ return;
+ }
+ if (dayoff > max_time / SECSPERDAY) {
+ error(_("time too large"));
+ return;
+ }
+ t = (zic_t) dayoff * SECSPERDAY;
+ tod = gethms(fields[LP_TIME], _("invalid time of day"), FALSE);
+ cp = fields[LP_CORR];
+ {
+ register int positive;
+ int count;
+
+ if (strcmp(cp, "") == 0) { /* infile() turns "-" into "" */
+ positive = FALSE;
+ count = 1;
+ } else if (strcmp(cp, "--") == 0) {
+ positive = FALSE;
+ count = 2;
+ } else if (strcmp(cp, "+") == 0) {
+ positive = TRUE;
+ count = 1;
+ } else if (strcmp(cp, "++") == 0) {
+ positive = TRUE;
+ count = 2;
+ } else {
+ error(_("illegal CORRECTION field on Leap line"));
+ return;
+ }
+ if ((lp = byword(fields[LP_ROLL], leap_types)) == NULL) {
+ error(_(
+ "illegal Rolling/Stationary field on Leap line"
+ ));
+ return;
+ }
+ leapadd(tadd(t, tod), positive, lp->l_value, count);
+ }
+}
+
+static void
+inlink(fields, nfields)
+register char ** const fields;
+const int nfields;
+{
+ struct link l;
+
+ if (nfields != LINK_FIELDS) {
+ error(_("wrong number of fields on Link line"));
+ return;
+ }
+ if (*fields[LF_FROM] == '\0') {
+ error(_("blank FROM field on Link line"));
+ return;
+ }
+ if (*fields[LF_TO] == '\0') {
+ error(_("blank TO field on Link line"));
+ return;
+ }
+ l.l_filename = filename;
+ l.l_linenum = linenum;
+ l.l_from = ecpyalloc(fields[LF_FROM]);
+ l.l_to = ecpyalloc(fields[LF_TO]);
+ links = (struct link *) (void *) erealloc((char *) links,
+ (int) ((nlinks + 1) * sizeof *links));
+ links[nlinks++] = l;
+}
+
+static void
+rulesub(rp, loyearp, hiyearp, typep, monthp, dayp, timep)
+register struct rule * const rp;
+const char * const loyearp;
+const char * const hiyearp;
+const char * const typep;
+const char * const monthp;
+const char * const dayp;
+const char * const timep;
+{
+ register const struct lookup * lp;
+ register const char * cp;
+ register char * dp;
+ register char * ep;
+
+ if ((lp = byword(monthp, mon_names)) == NULL) {
+ error(_("invalid month name"));
+ return;
+ }
+ rp->r_month = lp->l_value;
+ rp->r_todisstd = FALSE;
+ rp->r_todisgmt = FALSE;
+ dp = ecpyalloc(timep);
+ if (*dp != '\0') {
+ ep = dp + strlen(dp) - 1;
+ switch (lowerit(*ep)) {
+ case 's': /* Standard */
+ rp->r_todisstd = TRUE;
+ rp->r_todisgmt = FALSE;
+ *ep = '\0';
+ break;
+ case 'w': /* Wall */
+ rp->r_todisstd = FALSE;
+ rp->r_todisgmt = FALSE;
+ *ep = '\0';
+ break;
+ case 'g': /* Greenwich */
+ case 'u': /* Universal */
+ case 'z': /* Zulu */
+ rp->r_todisstd = TRUE;
+ rp->r_todisgmt = TRUE;
+ *ep = '\0';
+ break;
+ }
+ }
+ rp->r_tod = gethms(dp, _("invalid time of day"), FALSE);
+ ifree(dp);
+ /*
+ ** Year work.
+ */
+ cp = loyearp;
+ lp = byword(cp, begin_years);
+ rp->r_lowasnum = lp == NULL;
+ if (!rp->r_lowasnum) switch ((int) lp->l_value) {
+ case YR_MINIMUM:
+ rp->r_loyear = INT_MIN;
+ break;
+ case YR_MAXIMUM:
+ rp->r_loyear = INT_MAX;
+ break;
+ default: /* "cannot happen" */
+ errx(EXIT_FAILURE,
+ _("panic: invalid l_value %d"), lp->l_value);
+ } else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
+ error(_("invalid starting year"));
+ return;
+ }
+ cp = hiyearp;
+ lp = byword(cp, end_years);
+ rp->r_hiwasnum = lp == NULL;
+ if (!rp->r_hiwasnum) switch ((int) lp->l_value) {
+ case YR_MINIMUM:
+ rp->r_hiyear = INT_MIN;
+ break;
+ case YR_MAXIMUM:
+ rp->r_hiyear = INT_MAX;
+ break;
+ case YR_ONLY:
+ rp->r_hiyear = rp->r_loyear;
+ break;
+ default: /* "cannot happen" */
+ errx(EXIT_FAILURE,
+ _("panic: invalid l_value %d"), lp->l_value);
+ } else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
+ error(_("invalid ending year"));
+ return;
+ }
+ if (rp->r_loyear > rp->r_hiyear) {
+ error(_("starting year greater than ending year"));
+ return;
+ }
+ if (*typep == '\0')
+ rp->r_yrtype = NULL;
+ else {
+ if (rp->r_loyear == rp->r_hiyear) {
+ error(_("typed single year"));
+ return;
+ }
+ rp->r_yrtype = ecpyalloc(typep);
+ }
+ /*
+ ** Day work.
+ ** Accept things such as:
+ ** 1
+ ** last-Sunday
+ ** Sun<=20
+ ** Sun>=7
+ */
+ dp = ecpyalloc(dayp);
+ if ((lp = byword(dp, lasts)) != NULL) {
+ rp->r_dycode = DC_DOWLEQ;
+ rp->r_wday = lp->l_value;
+ rp->r_dayofmonth = len_months[1][rp->r_month];
+ } else {
+ if ((ep = strchr(dp, '<')) != 0)
+ rp->r_dycode = DC_DOWLEQ;
+ else if ((ep = strchr(dp, '>')) != 0)
+ rp->r_dycode = DC_DOWGEQ;
+ else {
+ ep = dp;
+ rp->r_dycode = DC_DOM;
+ }
+ if (rp->r_dycode != DC_DOM) {
+ *ep++ = 0;
+ if (*ep++ != '=') {
+ error(_("invalid day of month"));
+ ifree(dp);
+ return;
+ }
+ if ((lp = byword(dp, wday_names)) == NULL) {
+ error(_("invalid weekday name"));
+ ifree(dp);
+ return;
+ }
+ rp->r_wday = lp->l_value;
+ }
+ if (sscanf(ep, scheck(ep, "%d"), &rp->r_dayofmonth) != 1 ||
+ rp->r_dayofmonth <= 0 ||
+ (rp->r_dayofmonth > len_months[1][rp->r_month])) {
+ error(_("invalid day of month"));
+ ifree(dp);
+ return;
+ }
+ }
+ ifree(dp);
+}
+
+static void
+convert(val, buf)
+const long val;
+char * const buf;
+{
+ register int i;
+ register int shift;
+
+ for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
+ buf[i] = val >> shift;
+}
+
+static void
+convert64(val, buf)
+const zic_t val;
+char * const buf;
+{
+ register int i;
+ register int shift;
+
+ for (i = 0, shift = 56; i < 8; ++i, shift -= 8)
+ buf[i] = val >> shift;
+}
+
+static void
+puttzcode(val, fp)
+const long val;
+FILE * const fp;
+{
+ char buf[4];
+
+ convert(val, buf);
+ (void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
+}
+
+static void
+puttzcode64(val, fp)
+const zic_t val;
+FILE * const fp;
+{
+ char buf[8];
+
+ convert64(val, buf);
+ (void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
+}
+
+static int
+atcomp(avp, bvp)
+const void * avp;
+const void * bvp;
+{
+ const zic_t a = ((const struct attype *) avp)->at;
+ const zic_t b = ((const struct attype *) bvp)->at;
+
+ return (a < b) ? -1 : (a > b);
+}
+
+static int
+is32(x)
+const zic_t x;
+{
+ return INT32_MIN <= x && x <= INT32_MAX;
+}
+
+static void
+writezone(name, string)
+const char * const name;
+const char * const string;
+{
+ register FILE * fp;
+ register int i, j;
+ register int leapcnt32, leapi32;
+ register int timecnt32, timei32;
+ register int pass;
+ static char * fullname;
+ static const struct tzhead tzh0;
+ static struct tzhead tzh;
+ zic_t ats[TZ_MAX_TIMES];
+ unsigned char types[TZ_MAX_TIMES];
+
+ /*
+ ** Sort.
+ */
+ if (timecnt > 1)
+ (void) qsort((void *) attypes, (size_t) timecnt,
+ (size_t) sizeof *attypes, atcomp);
+ /*
+ ** Optimize.
+ */
+ {
+ int fromi;
+ int toi;
+
+ toi = 0;
+ fromi = 0;
+ while (fromi < timecnt && attypes[fromi].at < min_time)
+ ++fromi;
+ if (isdsts[0] == 0)
+ while (fromi < timecnt && attypes[fromi].type == 0)
+ ++fromi; /* handled by default rule */
+ for ( ; fromi < timecnt; ++fromi) {
+ if (toi != 0 && ((attypes[fromi].at +
+ gmtoffs[attypes[toi - 1].type]) <=
+ (attypes[toi - 1].at + gmtoffs[toi == 1 ? 0
+ : attypes[toi - 2].type]))) {
+ attypes[toi - 1].type =
+ attypes[fromi].type;
+ continue;
+ }
+ if (toi == 0 ||
+ attypes[toi - 1].type != attypes[fromi].type)
+ attypes[toi++] = attypes[fromi];
+ }
+ timecnt = toi;
+ }
+ /*
+ ** Transfer.
+ */
+ for (i = 0; i < timecnt; ++i) {
+ ats[i] = attypes[i].at;
+ types[i] = attypes[i].type;
+ }
+ /*
+ ** Correct for leap seconds.
+ */
+ for (i = 0; i < timecnt; ++i) {
+ j = leapcnt;
+ while (--j >= 0)
+ if (ats[i] > trans[j] - corr[j]) {
+ ats[i] = tadd(ats[i], corr[j]);
+ break;
+ }
+ }
+ /*
+ ** Figure out 32-bit-limited starts and counts.
+ */
+ timecnt32 = timecnt;
+ timei32 = 0;
+ leapcnt32 = leapcnt;
+ leapi32 = 0;
+ while (timecnt32 > 0 && !is32(ats[timecnt32 - 1]))
+ --timecnt32;
+ while (timecnt32 > 0 && !is32(ats[timei32])) {
+ --timecnt32;
+ ++timei32;
+ }
+ while (leapcnt32 > 0 && !is32(trans[leapcnt32 - 1]))
+ --leapcnt32;
+ while (leapcnt32 > 0 && !is32(trans[leapi32])) {
+ --leapcnt32;
+ ++leapi32;
+ }
+ fullname = erealloc(fullname,
+ (int) (strlen(directory) + 1 + strlen(name) + 1));
+ (void) sprintf(fullname, "%s/%s", directory, name);
+
+ /*
+ * Remove old file, if any, to snap links.
+ */
+ if (!itsdir(fullname) && remove(fullname) != 0 && errno != ENOENT)
+ err(EXIT_FAILURE, _("can't remove %s"), fullname);
+
+ if ((fp = fopen(fullname, "wb")) == NULL) {
+ if (mkdirs(fullname) != 0)
+ exit(EXIT_FAILURE);
+ if ((fp = fopen(fullname, "wb")) == NULL)
+ err(EXIT_FAILURE, _("can't create %s"), fullname);
+ }
+ for (pass = 1; pass <= 2; ++pass) {
+ register int thistimei, thistimecnt;
+ register int thisleapi, thisleapcnt;
+ register int thistimelim, thisleaplim;
+ int writetype[TZ_MAX_TIMES];
+ int typemap[TZ_MAX_TYPES];
+ register int thistypecnt;
+ char thischars[TZ_MAX_CHARS];
+ char thischarcnt;
+ int indmap[TZ_MAX_CHARS];
+
+ if (pass == 1) {
+ thistimei = timei32;
+ thistimecnt = timecnt32;
+ thisleapi = leapi32;
+ thisleapcnt = leapcnt32;
+ } else {
+ thistimei = 0;
+ thistimecnt = timecnt;
+ thisleapi = 0;
+ thisleapcnt = leapcnt;
+ }
+ thistimelim = thistimei + thistimecnt;
+ thisleaplim = thisleapi + thisleapcnt;
+ for (i = 0; i < typecnt; ++i)
+ writetype[i] = thistimecnt == timecnt;
+ if (thistimecnt == 0) {
+ /*
+ ** No transition times fall in the current
+ ** (32- or 64-bit) window.
+ */
+ if (typecnt != 0)
+ writetype[typecnt - 1] = TRUE;
+ } else {
+ for (i = thistimei - 1; i < thistimelim; ++i)
+ if (i >= 0)
+ writetype[types[i]] = TRUE;
+ /*
+ ** For America/Godthab and Antarctica/Palmer
+ */
+ if (thistimei == 0)
+ writetype[0] = TRUE;
+ }
+#ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH
+ /*
+ ** For some pre-2011 systems: if the last-to-be-written
+ ** standard (or daylight) type has an offset different from the
+ ** most recently used offset,
+ ** append an (unused) copy of the most recently used type
+ ** (to help get global "altzone" and "timezone" variables
+ ** set correctly).
+ */
+ {
+ register int mrudst, mrustd, hidst, histd, type;
+
+ hidst = histd = mrudst = mrustd = -1;
+ for (i = thistimei; i < thistimelim; ++i)
+ if (isdsts[types[i]])
+ mrudst = types[i];
+ else mrustd = types[i];
+ for (i = 0; i < typecnt; ++i)
+ if (writetype[i]) {
+ if (isdsts[i])
+ hidst = i;
+ else histd = i;
+ }
+ if (hidst >= 0 && mrudst >= 0 && hidst != mrudst &&
+ gmtoffs[hidst] != gmtoffs[mrudst]) {
+ isdsts[mrudst] = -1;
+ type = addtype(gmtoffs[mrudst],
+ &chars[abbrinds[mrudst]],
+ TRUE,
+ ttisstds[mrudst],
+ ttisgmts[mrudst]);
+ isdsts[mrudst] = TRUE;
+ writetype[type] = TRUE;
+ }
+ if (histd >= 0 && mrustd >= 0 && histd != mrustd &&
+ gmtoffs[histd] != gmtoffs[mrustd]) {
+ isdsts[mrustd] = -1;
+ type = addtype(gmtoffs[mrustd],
+ &chars[abbrinds[mrustd]],
+ FALSE,
+ ttisstds[mrustd],
+ ttisgmts[mrustd]);
+ isdsts[mrustd] = FALSE;
+ writetype[type] = TRUE;
+ }
+ }
+#endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */
+ thistypecnt = 0;
+ for (i = 0; i < typecnt; ++i)
+ typemap[i] = writetype[i] ? thistypecnt++ : -1;
+ for (i = 0; i < sizeof indmap / sizeof indmap[0]; ++i)
+ indmap[i] = -1;
+ thischarcnt = 0;
+ for (i = 0; i < typecnt; ++i) {
+ register char * thisabbr;
+
+ if (!writetype[i])
+ continue;
+ if (indmap[abbrinds[i]] >= 0)
+ continue;
+ thisabbr = &chars[abbrinds[i]];
+ for (j = 0; j < thischarcnt; ++j)
+ if (strcmp(&thischars[j], thisabbr) == 0)
+ break;
+ if (j == thischarcnt) {
+ (void) strcpy(&thischars[(int) thischarcnt],
+ thisabbr);
+ thischarcnt += strlen(thisabbr) + 1;
+ }
+ indmap[abbrinds[i]] = j;
+ }
+#define DO(field) (void) fwrite((void *) tzh.field, \
+ (size_t) sizeof tzh.field, (size_t) 1, fp)
+ tzh = tzh0;
+ (void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
+ tzh.tzh_version[0] = ZIC_VERSION;
+ convert(eitol(thistypecnt), tzh.tzh_ttisgmtcnt);
+ convert(eitol(thistypecnt), tzh.tzh_ttisstdcnt);
+ convert(eitol(thisleapcnt), tzh.tzh_leapcnt);
+ convert(eitol(thistimecnt), tzh.tzh_timecnt);
+ convert(eitol(thistypecnt), tzh.tzh_typecnt);
+ convert(eitol(thischarcnt), tzh.tzh_charcnt);
+ DO(tzh_magic);
+ DO(tzh_version);
+ DO(tzh_reserved);
+ DO(tzh_ttisgmtcnt);
+ DO(tzh_ttisstdcnt);
+ DO(tzh_leapcnt);
+ DO(tzh_timecnt);
+ DO(tzh_typecnt);
+ DO(tzh_charcnt);
+#undef DO
+ for (i = thistimei; i < thistimelim; ++i)
+ if (pass == 1)
+ puttzcode((long) ats[i], fp);
+ else puttzcode64(ats[i], fp);
+ for (i = thistimei; i < thistimelim; ++i) {
+ unsigned char uc;
+
+ uc = typemap[types[i]];
+ (void) fwrite((void *) &uc,
+ (size_t) sizeof uc,
+ (size_t) 1,
+ fp);
+ }
+ for (i = 0; i < typecnt; ++i)
+ if (writetype[i]) {
+ puttzcode(gmtoffs[i], fp);
+ (void) putc(isdsts[i], fp);
+ (void) putc((unsigned char) indmap[abbrinds[i]], fp);
+ }
+ if (thischarcnt != 0)
+ (void) fwrite((void *) thischars,
+ (size_t) sizeof thischars[0],
+ (size_t) thischarcnt, fp);
+ for (i = thisleapi; i < thisleaplim; ++i) {
+ register zic_t todo;
+
+ if (roll[i]) {
+ if (timecnt == 0 || trans[i] < ats[0]) {
+ j = 0;
+ while (isdsts[j])
+ if (++j >= typecnt) {
+ j = 0;
+ break;
+ }
+ } else {
+ j = 1;
+ while (j < timecnt &&
+ trans[i] >= ats[j])
+ ++j;
+ j = types[j - 1];
+ }
+ todo = tadd(trans[i], -gmtoffs[j]);
+ } else todo = trans[i];
+ if (pass == 1)
+ puttzcode((long) todo, fp);
+ else puttzcode64(todo, fp);
+ puttzcode(corr[i], fp);
+ }
+ for (i = 0; i < typecnt; ++i)
+ if (writetype[i])
+ (void) putc(ttisstds[i], fp);
+ for (i = 0; i < typecnt; ++i)
+ if (writetype[i])
+ (void) putc(ttisgmts[i], fp);
+ }
+ (void) fprintf(fp, "\n%s\n", string);
+ if (ferror(fp) || fclose(fp))
+ errx(EXIT_FAILURE, _("error writing %s"), fullname);
+ if (chmod(fullname, mflag) < 0)
+ err(EXIT_FAILURE, _("cannot change mode of %s to %03o"),
+ fullname, (unsigned)mflag);
+ if ((uflag != (uid_t)-1 || gflag != (gid_t)-1)
+ && chown(fullname, uflag, gflag) < 0)
+ err(EXIT_FAILURE, _("cannot change ownership of %s"),
+ fullname);
+}
+
+static void
+doabbr(abbr, format, letters, isdst, doquotes)
+char * const abbr;
+const char * const format;
+const char * const letters;
+const int isdst;
+const int doquotes;
+{
+ register char * cp;
+ register char * slashp;
+ register int len;
+
+ slashp = strchr(format, '/');
+ if (slashp == NULL) {
+ if (letters == NULL)
+ (void) strcpy(abbr, format);
+ else (void) sprintf(abbr, format, letters);
+ } else if (isdst) {
+ (void) strcpy(abbr, slashp + 1);
+ } else {
+ if (slashp > format)
+ (void) strncpy(abbr, format,
+ (unsigned) (slashp - format));
+ abbr[slashp - format] = '\0';
+ }
+ if (!doquotes)
+ return;
+ for (cp = abbr; *cp != '\0'; ++cp)
+ if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", *cp) == NULL &&
+ strchr("abcdefghijklmnopqrstuvwxyz", *cp) == NULL)
+ break;
+ len = strlen(abbr);
+ if (len > 0 && *cp == '\0')
+ return;
+ abbr[len + 2] = '\0';
+ abbr[len + 1] = '>';
+ for ( ; len > 0; --len)
+ abbr[len] = abbr[len - 1];
+ abbr[0] = '<';
+}
+
+static void
+updateminmax(x)
+const int x;
+{
+ if (min_year > x)
+ min_year = x;
+ if (max_year < x)
+ max_year = x;
+}
+
+static int
+stringoffset(result, offset)
+char * result;
+long offset;
+{
+ register int hours;
+ register int minutes;
+ register int seconds;
+
+ result[0] = '\0';
+ if (offset < 0) {
+ (void) strcpy(result, "-");
+ offset = -offset;
+ }
+ seconds = offset % SECSPERMIN;
+ offset /= SECSPERMIN;
+ minutes = offset % MINSPERHOUR;
+ offset /= MINSPERHOUR;
+ hours = offset;
+ if (hours >= HOURSPERDAY) {
+ result[0] = '\0';
+ return -1;
+ }
+ (void) sprintf(end(result), "%d", hours);
+ if (minutes != 0 || seconds != 0) {
+ (void) sprintf(end(result), ":%02d", minutes);
+ if (seconds != 0)
+ (void) sprintf(end(result), ":%02d", seconds);
+ }
+ return 0;
+}
+
+static int
+stringrule(result, rp, dstoff, gmtoff)
+char * result;
+const struct rule * const rp;
+const long dstoff;
+const long gmtoff;
+{
+ register long tod;
+
+ result = end(result);
+ if (rp->r_dycode == DC_DOM) {
+ register int month, total;
+
+ if (rp->r_dayofmonth == 29 && rp->r_month == TM_FEBRUARY)
+ return -1;
+ total = 0;
+ for (month = 0; month < rp->r_month; ++month)
+ total += len_months[0][month];
+ (void) sprintf(result, "J%d", total + rp->r_dayofmonth);
+ } else {
+ 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",
+ rp->r_month + 1, week, rp->r_wday);
+ }
+ tod = rp->r_tod;
+ if (rp->r_todisgmt)
+ tod += gmtoff;
+ if (rp->r_todisstd && rp->r_stdoff == 0)
+ tod += dstoff;
+ if (tod < 0) {
+ result[0] = '\0';
+ return -1;
+ }
+ if (tod != 2 * SECSPERMIN * MINSPERHOUR) {
+ (void) strcat(result, "/");
+ if (stringoffset(end(result), tod) != 0)
+ return -1;
+ }
+ return 0;
+}
+
+static void
+stringzone(result, zpfirst, zonecount)
+char * result;
+const struct zone * const zpfirst;
+const int zonecount;
+{
+ register const struct zone * zp;
+ register struct rule * rp;
+ register struct rule * stdrp;
+ register struct rule * dstrp;
+ register int i;
+ register const char * abbrvar;
+
+ result[0] = '\0';
+ zp = zpfirst + zonecount - 1;
+ stdrp = dstrp = NULL;
+ for (i = 0; i < zp->z_nrules; ++i) {
+ rp = &zp->z_rules[i];
+ if (rp->r_hiwasnum || rp->r_hiyear != INT_MAX)
+ continue;
+ if (rp->r_yrtype != NULL)
+ continue;
+ if (rp->r_stdoff == 0) {
+ if (stdrp == NULL)
+ stdrp = rp;
+ else return;
+ } else {
+ if (dstrp == NULL)
+ dstrp = rp;
+ else return;
+ }
+ }
+ if (stdrp == NULL && dstrp == NULL) {
+ /*
+ ** There are no rules running through "max".
+ ** Let's find the latest rule.
+ */
+ for (i = 0; i < zp->z_nrules; ++i) {
+ rp = &zp->z_rules[i];
+ if (stdrp == NULL || rp->r_hiyear > stdrp->r_hiyear ||
+ (rp->r_hiyear == stdrp->r_hiyear &&
+ rp->r_month > stdrp->r_month))
+ stdrp = rp;
+ }
+ if (stdrp != NULL && stdrp->r_stdoff != 0)
+ return; /* We end up in DST (a POSIX no-no). */
+ /*
+ ** Horrid special case: if year is 2037,
+ ** presume this is a zone handled on a year-by-year basis;
+ ** do not try to apply a rule to the zone.
+ */
+ if (stdrp != NULL && stdrp->r_hiyear == 2037)
+ return;
+ }
+ if (stdrp == NULL && (zp->z_nrules != 0 || zp->z_stdoff != 0))
+ return;
+ abbrvar = (stdrp == NULL) ? "" : stdrp->r_abbrvar;
+ doabbr(result, zp->z_format, abbrvar, FALSE, TRUE);
+ if (stringoffset(end(result), -zp->z_gmtoff) != 0) {
+ result[0] = '\0';
+ return;
+ }
+ if (dstrp == NULL)
+ return;
+ doabbr(end(result), zp->z_format, dstrp->r_abbrvar, TRUE, TRUE);
+ if (dstrp->r_stdoff != SECSPERMIN * MINSPERHOUR)
+ if (stringoffset(end(result),
+ -(zp->z_gmtoff + dstrp->r_stdoff)) != 0) {
+ result[0] = '\0';
+ return;
+ }
+ (void) strcat(result, ",");
+ if (stringrule(result, dstrp, dstrp->r_stdoff, zp->z_gmtoff) != 0) {
+ result[0] = '\0';
+ return;
+ }
+ (void) strcat(result, ",");
+ if (stringrule(result, stdrp, dstrp->r_stdoff, zp->z_gmtoff) != 0) {
+ result[0] = '\0';
+ return;
+ }
+}
+
+static void
+outzone(zpfirst, zonecount)
+const struct zone * const zpfirst;
+const int zonecount;
+{
+ register const struct zone * zp;
+ register struct rule * rp;
+ register int i, j;
+ register int usestart, useuntil;
+ register zic_t starttime, untiltime;
+ register long gmtoff;
+ register long stdoff;
+ register int year;
+ register long startoff;
+ register int startttisstd;
+ register int startttisgmt;
+ register int type;
+ register char * startbuf;
+ register char * ab;
+ register char * envvar;
+ register int max_abbr_len;
+ register int max_envvar_len;
+
+ max_abbr_len = 2 + max_format_len + max_abbrvar_len;
+ max_envvar_len = 2 * max_abbr_len + 5 * 9;
+ startbuf = emalloc(max_abbr_len + 1);
+ ab = emalloc(max_abbr_len + 1);
+ envvar = emalloc(max_envvar_len + 1);
+ INITIALIZE(untiltime);
+ INITIALIZE(starttime);
+ /*
+ ** Now. . .finally. . .generate some useful data!
+ */
+ timecnt = 0;
+ typecnt = 0;
+ charcnt = 0;
+ /*
+ ** Thanks to Earl Chew
+ ** for noting the need to unconditionally initialize startttisstd.
+ */
+ startttisstd = FALSE;
+ startttisgmt = FALSE;
+ min_year = max_year = EPOCH_YEAR;
+ if (leapseen) {
+ updateminmax(leapminyear);
+ updateminmax(leapmaxyear + (leapmaxyear < INT_MAX));
+ }
+ for (i = 0; i < zonecount; ++i) {
+ zp = &zpfirst[i];
+ if (i < zonecount - 1)
+ updateminmax(zp->z_untilrule.r_loyear);
+ for (j = 0; j < zp->z_nrules; ++j) {
+ rp = &zp->z_rules[j];
+ if (rp->r_lowasnum)
+ updateminmax(rp->r_loyear);
+ if (rp->r_hiwasnum)
+ updateminmax(rp->r_hiyear);
+ }
+ }
+ /*
+ ** Generate lots of data if a rule can't cover all future times.
+ */
+ stringzone(envvar, zpfirst, zonecount);
+ if (noise && envvar[0] == '\0') {
+ register char * wp;
+
+wp = ecpyalloc(_("no POSIX environment variable for zone"));
+ wp = ecatalloc(wp, " ");
+ wp = ecatalloc(wp, zpfirst->z_name);
+ warning(wp);
+ ifree(wp);
+ }
+ if (envvar[0] == '\0') {
+ if (min_year >= INT_MIN + YEARSPERREPEAT)
+ min_year -= YEARSPERREPEAT;
+ else min_year = INT_MIN;
+ if (max_year <= INT_MAX - YEARSPERREPEAT)
+ max_year += YEARSPERREPEAT;
+ else max_year = INT_MAX;
+ }
+ /*
+ ** For the benefit of older systems,
+ ** generate data from 1900 through 2037.
+ */
+ if (min_year > 1900)
+ min_year = 1900;
+ if (max_year < 2037)
+ max_year = 2037;
+ for (i = 0; i < zonecount; ++i) {
+ /*
+ ** A guess that may well be corrected later.
+ */
+ stdoff = 0;
+ zp = &zpfirst[i];
+ usestart = i > 0 && (zp - 1)->z_untiltime > min_time;
+ useuntil = i < (zonecount - 1);
+ if (useuntil && zp->z_untiltime <= min_time)
+ continue;
+ gmtoff = zp->z_gmtoff;
+ eat(zp->z_filename, zp->z_linenum);
+ *startbuf = '\0';
+ startoff = zp->z_gmtoff;
+ if (zp->z_nrules == 0) {
+ stdoff = zp->z_stdoff;
+ doabbr(startbuf, zp->z_format,
+ (char *) NULL, stdoff != 0, FALSE);
+ type = addtype(oadd(zp->z_gmtoff, stdoff),
+ startbuf, stdoff != 0, startttisstd,
+ startttisgmt);
+ if (usestart) {
+ addtt(starttime, type);
+ usestart = FALSE;
+ } else if (stdoff != 0)
+ addtt(min_time, type);
+ } else for (year = min_year; year <= max_year; ++year) {
+ if (useuntil && year > zp->z_untilrule.r_hiyear)
+ break;
+ /*
+ ** Mark which rules to do in the current year.
+ ** For those to do, calculate rpytime(rp, year);
+ */
+ for (j = 0; j < zp->z_nrules; ++j) {
+ rp = &zp->z_rules[j];
+ eats(zp->z_filename, zp->z_linenum,
+ rp->r_filename, rp->r_linenum);
+ rp->r_todo = year >= rp->r_loyear &&
+ year <= rp->r_hiyear &&
+ yearistype(year, rp->r_yrtype);
+ if (rp->r_todo)
+ rp->r_temp = rpytime(rp, year);
+ }
+ for ( ; ; ) {
+ register int k;
+ register zic_t jtime, ktime;
+ register long offset;
+
+ INITIALIZE(ktime);
+ if (useuntil) {
+ /*
+ ** Turn untiltime into UTC
+ ** assuming the current gmtoff and
+ ** stdoff values.
+ */
+ untiltime = zp->z_untiltime;
+ if (!zp->z_untilrule.r_todisgmt)
+ untiltime = tadd(untiltime,
+ -gmtoff);
+ if (!zp->z_untilrule.r_todisstd)
+ untiltime = tadd(untiltime,
+ -stdoff);
+ }
+ /*
+ ** Find the rule (of those to do, if any)
+ ** that takes effect earliest in the year.
+ */
+ k = -1;
+ for (j = 0; j < zp->z_nrules; ++j) {
+ rp = &zp->z_rules[j];
+ if (!rp->r_todo)
+ continue;
+ eats(zp->z_filename, zp->z_linenum,
+ rp->r_filename, rp->r_linenum);
+ offset = rp->r_todisgmt ? 0 : gmtoff;
+ if (!rp->r_todisstd)
+ offset = oadd(offset, stdoff);
+ jtime = rp->r_temp;
+ if (jtime == min_time ||
+ jtime == max_time)
+ continue;
+ jtime = tadd(jtime, -offset);
+ if (k < 0 || jtime < ktime) {
+ k = j;
+ ktime = jtime;
+ }
+ }
+ if (k < 0)
+ break; /* go on to next year */
+ rp = &zp->z_rules[k];
+ rp->r_todo = FALSE;
+ if (useuntil && ktime >= untiltime)
+ break;
+ stdoff = rp->r_stdoff;
+ if (usestart && ktime == starttime)
+ usestart = FALSE;
+ if (usestart) {
+ if (ktime < starttime) {
+ startoff = oadd(zp->z_gmtoff,
+ stdoff);
+ doabbr(startbuf, zp->z_format,
+ rp->r_abbrvar,
+ rp->r_stdoff != 0,
+ FALSE);
+ continue;
+ }
+ if (*startbuf == '\0' &&
+ startoff == oadd(zp->z_gmtoff,
+ stdoff)) {
+ doabbr(startbuf,
+ zp->z_format,
+ rp->r_abbrvar,
+ rp->r_stdoff !=
+ 0,
+ FALSE);
+ }
+ }
+ eats(zp->z_filename, zp->z_linenum,
+ rp->r_filename, rp->r_linenum);
+ doabbr(ab, zp->z_format, rp->r_abbrvar,
+ rp->r_stdoff != 0, FALSE);
+ offset = oadd(zp->z_gmtoff, rp->r_stdoff);
+ type = addtype(offset, ab, rp->r_stdoff != 0,
+ rp->r_todisstd, rp->r_todisgmt);
+ addtt(ktime, type);
+ }
+ }
+ if (usestart) {
+ if (*startbuf == '\0' &&
+ zp->z_format != NULL &&
+ strchr(zp->z_format, '%') == NULL &&
+ strchr(zp->z_format, '/') == NULL)
+ (void) strcpy(startbuf, zp->z_format);
+ eat(zp->z_filename, zp->z_linenum);
+ if (*startbuf == '\0')
+error(_("can't determine time zone abbreviation to use just after until time"));
+ else addtt(starttime,
+ addtype(startoff, startbuf,
+ startoff != zp->z_gmtoff,
+ startttisstd,
+ startttisgmt));
+ }
+ /*
+ ** Now we may get to set starttime for the next zone line.
+ */
+ if (useuntil) {
+ startttisstd = zp->z_untilrule.r_todisstd;
+ startttisgmt = zp->z_untilrule.r_todisgmt;
+ starttime = zp->z_untiltime;
+ if (!startttisstd)
+ starttime = tadd(starttime, -stdoff);
+ if (!startttisgmt)
+ starttime = tadd(starttime, -gmtoff);
+ }
+ }
+ writezone(zpfirst->z_name, envvar);
+ ifree(startbuf);
+ ifree(ab);
+ ifree(envvar);
+}
+
+static void
+addtt(starttime, type)
+const zic_t starttime;
+int type;
+{
+ if (starttime <= min_time ||
+ (timecnt == 1 && attypes[0].at < min_time)) {
+ gmtoffs[0] = gmtoffs[type];
+ isdsts[0] = isdsts[type];
+ ttisstds[0] = ttisstds[type];
+ ttisgmts[0] = ttisgmts[type];
+ if (abbrinds[type] != 0)
+ (void) strcpy(chars, &chars[abbrinds[type]]);
+ abbrinds[0] = 0;
+ charcnt = strlen(chars) + 1;
+ typecnt = 1;
+ timecnt = 0;
+ type = 0;
+ }
+ if (timecnt >= TZ_MAX_TIMES) {
+ error(_("too many transitions?!"));
+ exit(EXIT_FAILURE);
+ }
+ attypes[timecnt].at = starttime;
+ attypes[timecnt].type = type;
+ ++timecnt;
+}
+
+static int
+addtype(gmtoff, abbr, isdst, ttisstd, ttisgmt)
+const long gmtoff;
+const char * const abbr;
+const int isdst;
+const int ttisstd;
+const int ttisgmt;
+{
+ register int i, j;
+
+ if (isdst != TRUE && isdst != FALSE) {
+ error(_("internal error - addtype called with bad isdst"));
+ exit(EXIT_FAILURE);
+ }
+ if (ttisstd != TRUE && ttisstd != FALSE) {
+ error(_("internal error - addtype called with bad ttisstd"));
+ exit(EXIT_FAILURE);
+ }
+ if (ttisgmt != TRUE && ttisgmt != FALSE) {
+ error(_("internal error - addtype called with bad ttisgmt"));
+ exit(EXIT_FAILURE);
+ }
+ /*
+ ** See if there's already an entry for this zone type.
+ ** If so, just return its index.
+ */
+ for (i = 0; i < typecnt; ++i) {
+ if (gmtoff == gmtoffs[i] && isdst == isdsts[i] &&
+ strcmp(abbr, &chars[abbrinds[i]]) == 0 &&
+ ttisstd == ttisstds[i] &&
+ ttisgmt == ttisgmts[i])
+ return i;
+ }
+ /*
+ ** There isn't one; add a new one, unless there are already too
+ ** many.
+ */
+ if (typecnt >= TZ_MAX_TYPES) {
+ error(_("too many local time types"));
+ exit(EXIT_FAILURE);
+ }
+ if (! (-1L - 2147483647L <= gmtoff && gmtoff <= 2147483647L)) {
+ error(_("UTC offset out of range"));
+ exit(EXIT_FAILURE);
+ }
+ gmtoffs[i] = gmtoff;
+ isdsts[i] = isdst;
+ ttisstds[i] = ttisstd;
+ ttisgmts[i] = ttisgmt;
+
+ for (j = 0; j < charcnt; ++j)
+ if (strcmp(&chars[j], abbr) == 0)
+ break;
+ if (j == charcnt)
+ newabbr(abbr);
+ abbrinds[i] = j;
+ ++typecnt;
+ return i;
+}
+
+static void
+leapadd(t, positive, rolling, count)
+const zic_t t;
+const int positive;
+const int rolling;
+int count;
+{
+ register int i, j;
+
+ if (leapcnt + (positive ? count : 1) > TZ_MAX_LEAPS) {
+ error(_("too many leap seconds"));
+ exit(EXIT_FAILURE);
+ }
+ for (i = 0; i < leapcnt; ++i)
+ if (t <= trans[i]) {
+ if (t == trans[i]) {
+ error(_("repeated leap second moment"));
+ exit(EXIT_FAILURE);
+ }
+ break;
+ }
+ do {
+ for (j = leapcnt; j > i; --j) {
+ trans[j] = trans[j - 1];
+ corr[j] = corr[j - 1];
+ roll[j] = roll[j - 1];
+ }
+ trans[i] = t;
+ corr[i] = positive ? 1L : eitol(-count);
+ roll[i] = rolling;
+ ++leapcnt;
+ } while (positive && --count != 0);
+}
+
+static void
+adjleap(void)
+{
+ register int i;
+ register long last = 0;
+
+ /*
+ ** propagate leap seconds forward
+ */
+ for (i = 0; i < leapcnt; ++i) {
+ trans[i] = tadd(trans[i], last);
+ last = corr[i] += last;
+ }
+}
+
+static int
+yearistype(year, type)
+const int year;
+const char * const type;
+{
+ static char * buf;
+ int result;
+
+ if (type == NULL || *type == '\0')
+ return TRUE;
+ buf = erealloc(buf, (int) (132 + strlen(yitcommand) + strlen(type)));
+ (void) sprintf(buf, "%s %d %s", yitcommand, year, type);
+ result = system(buf);
+ if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
+ case 0:
+ return TRUE;
+ case 1:
+ return FALSE;
+ }
+ error(_("wild result from command execution"));
+ warnx(_("command was '%s', result was %d"), buf, result);
+ for ( ; ; )
+ exit(EXIT_FAILURE);
+}
+
+static int
+lowerit(a)
+int a;
+{
+ a = (unsigned char) a;
+ return (isascii(a) && isupper(a)) ? tolower(a) : a;
+}
+
+static int
+ciequal(ap, bp) /* case-insensitive equality */
+register const char * ap;
+register const char * bp;
+{
+ while (lowerit(*ap) == lowerit(*bp++))
+ if (*ap++ == '\0')
+ return TRUE;
+ return FALSE;
+}
+
+static int
+itsabbr(abbr, word)
+register const char * abbr;
+register const char * word;
+{
+ if (lowerit(*abbr) != lowerit(*word))
+ return FALSE;
+ ++word;
+ while (*++abbr != '\0')
+ do {
+ if (*word == '\0')
+ return FALSE;
+ } while (lowerit(*word++) != lowerit(*abbr));
+ return TRUE;
+}
+
+static const struct lookup *
+byword(word, table)
+register const char * const word;
+register const struct lookup * const table;
+{
+ register const struct lookup * foundlp;
+ register const struct lookup * lp;
+
+ if (word == NULL || table == NULL)
+ return NULL;
+ /*
+ ** Look for exact match.
+ */
+ for (lp = table; lp->l_word != NULL; ++lp)
+ if (ciequal(word, lp->l_word))
+ return lp;
+ /*
+ ** Look for inexact match.
+ */
+ foundlp = NULL;
+ for (lp = table; lp->l_word != NULL; ++lp)
+ if (itsabbr(word, lp->l_word)) {
+ if (foundlp == NULL)
+ foundlp = lp;
+ else return NULL; /* multiple inexact matches */
+ }
+ return foundlp;
+}
+
+static char **
+getfields(cp)
+register char * cp;
+{
+ register char * dp;
+ register char ** array;
+ register int nsubs;
+
+ if (cp == NULL)
+ return NULL;
+ array = (char **) (void *)
+ emalloc((int) ((strlen(cp) + 1) * sizeof *array));
+ nsubs = 0;
+ for ( ; ; ) {
+ while (isascii((unsigned char) *cp) &&
+ isspace((unsigned char) *cp))
+ ++cp;
+ if (*cp == '\0' || *cp == '#')
+ break;
+ array[nsubs++] = dp = cp;
+ do {
+ if ((*dp = *cp++) != '"')
+ ++dp;
+ else while ((*dp = *cp++) != '"')
+ if (*dp != '\0')
+ ++dp;
+ else {
+ error(_("odd number of quotation marks"));
+ exit(EXIT_FAILURE);
+ }
+ } while (*cp != '\0' && *cp != '#' &&
+ (!isascii(*cp) || !isspace((unsigned char) *cp)));
+ if (isascii(*cp) && isspace((unsigned char) *cp))
+ ++cp;
+ *dp = '\0';
+ }
+ array[nsubs] = NULL;
+ return array;
+}
+
+static long
+oadd(t1, t2)
+const long t1;
+const long t2;
+{
+ register long t;
+
+ t = t1 + t2;
+ if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
+ error(_("time overflow"));
+ exit(EXIT_FAILURE);
+ }
+ return t;
+}
+
+static zic_t
+tadd(t1, t2)
+const zic_t t1;
+const long t2;
+{
+ register zic_t t;
+
+ if (t1 == max_time && t2 > 0)
+ return max_time;
+ if (t1 == min_time && t2 < 0)
+ return min_time;
+ t = t1 + t2;
+ if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
+ error(_("time overflow"));
+ exit(EXIT_FAILURE);
+ }
+ return t;
+}
+
+/*
+** Given a rule, and a year, compute the date - in seconds since January 1,
+** 1970, 00:00 LOCAL time - in that year that the rule refers to.
+*/
+
+static zic_t
+rpytime(rp, wantedy)
+register const struct rule * const rp;
+register const int wantedy;
+{
+ register int y, m, i;
+ register long dayoff; /* with a nod to Margaret O. */
+ register zic_t t;
+
+ if (wantedy == INT_MIN)
+ return min_time;
+ if (wantedy == INT_MAX)
+ return max_time;
+ dayoff = 0;
+ m = TM_JANUARY;
+ y = EPOCH_YEAR;
+ while (wantedy != y) {
+ if (wantedy > y) {
+ i = len_years[isleap(y)];
+ ++y;
+ } else {
+ --y;
+ i = -len_years[isleap(y)];
+ }
+ dayoff = oadd(dayoff, eitol(i));
+ }
+ while (m != rp->r_month) {
+ i = len_months[isleap(y)][m];
+ dayoff = oadd(dayoff, eitol(i));
+ ++m;
+ }
+ i = rp->r_dayofmonth;
+ if (m == TM_FEBRUARY && i == 29 && !isleap(y)) {
+ if (rp->r_dycode == DC_DOWLEQ)
+ --i;
+ else {
+ error(_("use of 2/29 in non leap-year"));
+ exit(EXIT_FAILURE);
+ }
+ }
+ --i;
+ dayoff = oadd(dayoff, eitol(i));
+ if (rp->r_dycode == DC_DOWGEQ || rp->r_dycode == DC_DOWLEQ) {
+ register long wday;
+
+#define LDAYSPERWEEK ((long) DAYSPERWEEK)
+ wday = eitol(EPOCH_WDAY);
+ /*
+ ** Don't trust mod of negative numbers.
+ */
+ if (dayoff >= 0)
+ wday = (wday + dayoff) % LDAYSPERWEEK;
+ else {
+ wday -= ((-dayoff) % LDAYSPERWEEK);
+ if (wday < 0)
+ wday += LDAYSPERWEEK;
+ }
+ while (wday != eitol(rp->r_wday))
+ if (rp->r_dycode == DC_DOWGEQ) {
+ dayoff = oadd(dayoff, (long) 1);
+ if (++wday >= LDAYSPERWEEK)
+ wday = 0;
+ ++i;
+ } else {
+ dayoff = oadd(dayoff, (long) -1);
+ if (--wday < 0)
+ wday = LDAYSPERWEEK - 1;
+ --i;
+ }
+ if (i < 0 || i >= len_months[isleap(y)][m]) {
+ if (noise)
+ warning(_("rule goes past start/end of month--\
+will not work with pre-2004 versions of zic"));
+ }
+ }
+ if (dayoff < min_time / SECSPERDAY)
+ return min_time;
+ if (dayoff > max_time / SECSPERDAY)
+ return max_time;
+ t = (zic_t) dayoff * SECSPERDAY;
+ return tadd(t, rp->r_tod);
+}
+
+static void
+newabbr(string)
+const char * const string;
+{
+ register int i;
+
+ if (strcmp(string, GRANDPARENTED) != 0) {
+ register const char * cp;
+ register char * wp;
+
+ cp = string;
+ wp = NULL;
+ while (isascii((unsigned char) *cp) &&
+ (isalnum((unsigned char)*cp) || *cp == '-' || *cp == '+'))
+ ++cp;
+ if (noise && cp - string > 3)
+wp = _("time zone abbreviation has more than 3 characters");
+ if (cp - string > ZIC_MAX_ABBR_LEN_WO_WARN)
+wp = _("time zone abbreviation has too many characters");
+ if (*cp != '\0')
+wp = _("time zone abbreviation differs from POSIX standard");
+ if (wp != NULL) {
+ wp = ecpyalloc(wp);
+ wp = ecatalloc(wp, " (");
+ wp = ecatalloc(wp, string);
+ wp = ecatalloc(wp, ")");
+ warning(wp);
+ ifree(wp);
+ }
+ }
+ i = strlen(string) + 1;
+ if (charcnt + i > TZ_MAX_CHARS) {
+ error(_("too many, or too long, time zone abbreviations"));
+ exit(EXIT_FAILURE);
+ }
+ (void) strcpy(&chars[charcnt], string);
+ charcnt += eitol(i);
+}
+
+static int
+mkdirs(argname)
+char * argname;
+{
+ register char * name;
+ register char * cp;
+
+ if (argname == NULL || *argname == '\0' || Dflag)
+ return 0;
+ cp = name = ecpyalloc(argname);
+ while ((cp = strchr(cp + 1, '/')) != 0) {
+ *cp = '\0';
+#ifndef unix
+ /*
+ ** DOS drive specifier?
+ */
+ if (isalpha((unsigned char) name[0]) &&
+ name[1] == ':' && name[2] == '\0') {
+ *cp = '/';
+ continue;
+ }
+#endif /* !defined unix */
+ if (!itsdir(name)) {
+ /*
+ ** It doesn't seem to exist, so we try to create it.
+ ** Creation may fail because of the directory being
+ ** created by some other multiprocessor, so we get
+ ** to do extra checking.
+ */
+ if (mkdir(name, MKDIR_UMASK) != 0
+ && (errno != EEXIST || !itsdir(name))) {
+ warn(_("can't create directory %s"), name);
+ ifree(name);
+ return -1;
+ }
+ }
+ *cp = '/';
+ }
+ ifree(name);
+ return 0;
+}
+
+static long
+eitol(i)
+const int i;
+{
+ long l;
+
+ l = i;
+ if ((i < 0 && l >= 0) || (i == 0 && l != 0) || (i > 0 && l <= 0))
+ errx(EXIT_FAILURE, _("%d did not sign extend correctly"), i);
+ return l;
+}
+
+#include <grp.h>
+#include <pwd.h>
+
+static void
+setgroup(flag, name)
+ gid_t *flag;
+ const char *name;
+{
+ struct group *gr;
+
+ if (*flag != (gid_t)-1)
+ errx(EXIT_FAILURE, _("multiple -g flags specified"));
+
+ gr = getgrnam(name);
+ if (gr == 0) {
+ char *ep;
+ unsigned long ul;
+
+ ul = strtoul(name, &ep, 10);
+ if (ul == (unsigned long)(gid_t)ul && *ep == '\0') {
+ *flag = ul;
+ return;
+ }
+ errx(EXIT_FAILURE, _("group `%s' not found"), name);
+ }
+ *flag = gr->gr_gid;
+}
+
+static void
+setuser(flag, name)
+ uid_t *flag;
+ const char *name;
+{
+ struct passwd *pw;
+
+ if (*flag != (gid_t)-1)
+ errx(EXIT_FAILURE, _("multiple -u flags specified"));
+
+ pw = getpwnam(name);
+ if (pw == 0) {
+ char *ep;
+ unsigned long ul;
+
+ ul = strtoul(name, &ep, 10);
+ if (ul == (unsigned long)(gid_t)ul && *ep == '\0') {
+ *flag = ul;
+ return;
+ }
+ errx(EXIT_FAILURE, _("user `%s' not found"), name);
+ }
+ *flag = pw->pw_uid;
+}
+
+/*
+** UNIX was a registered trademark of The Open Group in 2003.
+*/
Deleted: vendor/tzcode/dist/zic.8
===================================================================
--- vendor/tzcode/dist/zic.8 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zic.8 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,568 +0,0 @@
-.TH ZIC 8
-.SH NAME
-zic \- time zone compiler
-.SH SYNOPSIS
-.B zic
-[
-.I option
-\&... ] [
-.I filename
-\&... ]
-.SH DESCRIPTION
-.ie '\(lq'' .ds lq \&"\"
-.el .ds lq \(lq\"
-.ie '\(rq'' .ds rq \&"\"
-.el .ds rq \(rq\"
-.de q
-\\$3\*(lq\\$1\*(rq\\$2
-..
-.ie '\(la'' .ds < <
-.el .ds < \(la
-.ie '\(ra'' .ds > >
-.el .ds > \(ra
-.ie \n(.g \{\
-. ds : \:
-. ds - \f(CW-\fP
-.\}
-.el \{\
-. ds :
-. ds - \-
-.\}
-.I Zic
-reads text from the file(s) named on the command line
-and creates the time conversion information files specified in this input.
-If a
-.I filename
-is
-.q "\*-" ,
-the standard input is read.
-.PP
-These options are available:
-.TP
-.BI "\*-\*-version"
-Output version information and exit.
-.TP
-.BI "\*-d " directory
-Create time conversion information files in the named directory rather than
-in the standard directory named below.
-.TP
-.BI "\*-l " timezone
-Use the given time zone as local time.
-.I Zic
-will act as if the input contained a link line of the form
-.sp
-.ti +.5i
-Link \fItimezone\fP localtime
-.TP
-.BI "\*-p " timezone
-Use the given time zone's rules when handling POSIX-format
-time zone environment variables.
-.I Zic
-will act as if the input contained a link line of the form
-.sp
-.ti +.5i
-Link \fItimezone\fP posixrules
-.TP
-.BI "\*-L " leapsecondfilename
-Read leap second information from the file with the given name.
-If this option is not used,
-no leap second information appears in output files.
-.TP
-.B \*-v
-Be more verbose, and complain about the following situations:
-.RS
-.PP
-The input specifies a link to a link.
-.PP
-A year that appears in a data file is outside the range
-of years representable by
-.IR time (2)
-values.
-.PP
-A time of 24:00 or more appears in the input.
-Pre-1998 versions of
-.I zic
-prohibit 24:00, and pre-2007 versions prohibit times greater than 24:00.
-.PP
-A rule goes past the start or end of the month.
-Pre-2004 versions of
-.I zic
-prohibit this.
-.PP
-The output file does not contain all the information about the
-long-term future of a zone, because the future cannot be summarized as
-an extended POSIX TZ string. For example, as of 2013 this problem
-occurs for Iran's daylight-saving rules for the predicted future, as
-these rules are based on the Iranian calendar, which cannot be
-represented.
-.PP
-The output contains data that may not be handled properly by client
-code designed for older
-.I zic
-output formats. These compatibility issues affect only time stamps
-before 1970 or after the start of 2038.
-.PP
-A time zone abbreviation has fewer than 3 characters.
-POSIX requires at least 3.
-.PP
-An output file name contains a byte that is not an ASCII letter,
-.q "\*-" ,
-.q "/" ,
-or
-.q "_" ;
-or it contains a file name component that contains more than 14 bytes
-or that starts with
-.q "\*-" .
-.RE
-.TP
-.B \*-s
-Limit time values stored in output files to values that are the same
-whether they're taken to be signed or unsigned.
-You can use this option to generate SVVS-compatible files.
-.PP
-Input files should be text files, that is, they should be a series of
-zero or more lines, each ending in a newline byte and containing at
-most 511 bytes, and without any NUL bytes. The input text's encoding
-is typically UTF-8 or ASCII; it should have a unibyte representation
-for the POSIX Portable Character Set (PPCS)
-\*<http://pubs\*:.opengroup\*:.org/\*:onlinepubs/\*:9699919799/\*:basedefs/\*:V1_chap06\*:.html\*>
-and the encoding's non-unibyte characters should consist entirely of
-non-PPCS bytes. Non-PPCS characters typically occur only in comments:
-although output file names and time zone abbreviations can contain
-nearly any character, other software will work better if these are
-limited to the restricted syntax described under the
-.B \*-v
-option.
-.PP
-Input lines are made up of fields.
-Fields are separated from one another by one or more white space characters.
-The white space characters are space, form feed, carriage return, newline,
-tab, and vertical tab.
-Leading and trailing white space on input lines is ignored.
-An unquoted sharp character (#) in the input introduces a comment which extends
-to the end of the line the sharp character appears on.
-White space characters and sharp characters may be enclosed in double quotes
-(") if they're to be used as part of a field.
-Any line that is blank (after comment stripping) is ignored.
-Non-blank lines are expected to be of one of three types:
-rule lines, zone lines, and link lines.
-.PP
-Names (such as month names) must be in English and are case insensitive.
-Abbreviations, if used, must be unambiguous in context.
-.PP
-A rule line has the form
-.nf
-.ti +.5i
-.ta \w'Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'TYPE\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
-.sp
-Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-.sp
-For example:
-.ti +.5i
-.sp
-Rule US 1967 1973 \*- Apr lastSun 2:00 1:00 D
-.sp
-.fi
-The fields that make up a rule line are:
-.TP "\w'LETTER/S'u"
-.B NAME
-Gives the (arbitrary) name of the set of rules this rule is part of.
-.TP
-.B FROM
-Gives the first year in which the rule applies.
-Any integer year can be supplied; the proleptic Gregorian calendar is assumed.
-The word
-.B minimum
-(or an abbreviation) means the minimum year representable as an integer.
-The word
-.B maximum
-(or an abbreviation) means the maximum year representable as an integer.
-Rules can describe times that are not representable as time values,
-with the unrepresentable times ignored; this allows rules to be portable
-among hosts with differing time value types.
-.TP
-.B TO
-Gives the final year in which the rule applies.
-In addition to
-.B minimum
-and
-.B maximum
-(as above),
-the word
-.B only
-(or an abbreviation)
-may be used to repeat the value of the
-.B FROM
-field.
-.TP
-.B TYPE
-should be
-.q \*-
-and is present for compatibility with older versions of
-.I zic
-in which it could contain year types.
-.TP
-.B IN
-Names the month in which the rule takes effect.
-Month names may be abbreviated.
-.TP
-.B ON
-Gives the day on which the rule takes effect.
-Recognized forms include:
-.nf
-.in +.5i
-.sp
-.ta \w'Sun<=25\0\0'u
-5 the fifth of the month
-lastSun the last Sunday in the month
-lastMon the last Monday in the month
-Sun>=8 first Sunday on or after the eighth
-Sun<=25 last Sunday on or before the 25th
-.fi
-.in -.5i
-.sp
-Names of days of the week may be abbreviated or spelled out in full.
-Note that there must be no spaces within the
-.B ON
-field.
-.TP
-.B AT
-Gives the time of day at which the rule takes effect.
-Recognized forms include:
-.nf
-.in +.5i
-.sp
-.ta \w'1:28:13\0\0'u
-2 time in hours
-2:00 time in hours and minutes
-15:00 24-hour format time (for times after noon)
-1:28:14 time in hours, minutes, and seconds
-\*- equivalent to 0
-.fi
-.in -.5i
-.sp
-where hour 0 is midnight at the start of the day,
-and hour 24 is midnight at the end of the day.
-Any of these forms may be followed by the letter
-.B w
-if the given time is local
-.q "wall clock"
-time,
-.B s
-if the given time is local
-.q "standard"
-time, or
-.B u
-(or
-.B g
-or
-.BR z )
-if the given time is universal time;
-in the absence of an indicator,
-wall clock time is assumed.
-The intent is that a rule line describes the instants when a
-clock/calendar set to the type of time specified in the
-.B AT
-field would show the specified date and time of day.
-.TP
-.B SAVE
-Gives the amount of time to be added to local standard time when the rule is in
-effect.
-This field has the same format as the
-.B AT
-field
-(although, of course, the
-.B w
-and
-.B s
-suffixes are not used).
-Only the sum of standard time and this amount matters; for example,
-.I zic
-does not distinguish a 10:30 standard time plus an 0:30
-.B SAVE
-from a 10:00 standard time plus a 1:00
-.BR SAVE .
-.TP
-.B LETTER/S
-Gives the
-.q "variable part"
-(for example, the
-.q "S"
-or
-.q "D"
-in
-.q "EST"
-or
-.q "EDT" )
-of time zone abbreviations to be used when this rule is in effect.
-If this field is
-.q \*- ,
-the variable part is null.
-.PP
-A zone line has the form
-.sp
-.nf
-.ti +.5i
-.ta \w'Zone\0\0'u +\w'Australia/Adelaide\0\0'u +\w'GMTOFF\0\0'u +\w'RULES/SAVE\0\0'u +\w'FORMAT\0\0'u
-Zone NAME GMTOFF RULES/SAVE FORMAT [UNTILYEAR [MONTH [DAY [TIME]]]]
-.sp
-For example:
-.sp
-.ti +.5i
-Zone Australia/Adelaide 9:30 Aus AC%sT 1971 Oct 31 2:00
-.sp
-.fi
-The fields that make up a zone line are:
-.TP "\w'GMTOFF'u"
-.B NAME
-The name of the time zone.
-This is the name used in creating the time conversion information file for the
-zone.
-It should not contain a file name component
-.q ".\&"
-or
-.q ".." ;
-a file name component is a maximal substring that does not contain
-.q "/" .
-.TP
-.B GMTOFF
-The amount of time to add to UT to get standard time in this zone.
-This field has the same format as the
-.B AT
-and
-.B SAVE
-fields of rule lines;
-begin the field with a minus sign if time must be subtracted from UT.
-.TP
-.B RULES/SAVE
-The name of the rule(s) that apply in the time zone or,
-alternately, an amount of time to add to local standard time.
-If this field is
-.B \*-
-then standard time always applies in the time zone.
-When an amount of time is given, only the sum of standard time and
-this amount matters.
-.TP
-.B FORMAT
-The format for time zone abbreviations in this time zone.
-The pair of characters
-.B %s
-is used to show where the
-.q "variable part"
-of the time zone abbreviation goes.
-Alternately, a format can use the pair of characters
-.B %z
-to stand for the UTC offset in the form
-.RI \(+- hh ,
-.RI \(+- hhmm ,
-or
-.RI \(+- hhmmss ,
-using the shortest form that does not lose information, where
-.IR hh ,
-.IR mm ,
-and
-.I ss
-are the hours, minutes, and seconds east (+) or west (\(mi) of UTC.
-Alternately,
-a slash (/)
-separates standard and daylight abbreviations.
-To conform to POSIX, a time zone abbreviation should contain only
-alphanumeric ASCII characters, "+" and "\*-".
-.TP
-.B UNTILYEAR [MONTH [DAY [TIME]]]
-The time at which the UT offset or the rule(s) change for a location.
-It is specified as a year, a month, a day, and a time of day.
-If this is specified,
-the time zone information is generated from the given UT offset
-and rule change until the time specified, which is interpreted using
-the rules in effect just before the transition.
-The month, day, and time of day have the same format as the IN, ON, and AT
-fields of a rule; trailing fields can be omitted, and default to the
-earliest possible value for the missing fields.
-.IP
-The next line must be a
-.q "continuation"
-line; this has the same form as a zone line except that the
-string
-.q "Zone"
-and the name are omitted, as the continuation line will
-place information starting at the time specified as the
-.q "until"
-information in the previous line in the file used by the previous line.
-Continuation lines may contain
-.q "until"
-information, just as zone lines do, indicating that the next line is a further
-continuation.
-.PP
-If a zone changes at the same instant that a rule would otherwise take
-effect in the earlier zone or continuation line, the rule is ignored.
-In a single zone it is an error if two rules take effect at the same
-instant, or if two zone changes take effect at the same instant.
-.PP
-A link line has the form
-.sp
-.nf
-.ti +.5i
-.ta \w'Link\0\0'u +\w'Europe/Istanbul\0\0'u
-Link TARGET LINK-NAME
-.sp
-For example:
-.sp
-.ti +.5i
-Link Europe/Istanbul Asia/Istanbul
-.sp
-.fi
-The
-.B TARGET
-field should appear as the
-.B NAME
-field in some zone line.
-The
-.B LINK-NAME
-field is used as an alternate name for that zone;
-it has the same syntax as a zone line's
-.B NAME
-field.
-.PP
-Except for continuation lines,
-lines may appear in any order in the input.
-However, the behavior is unspecified if multiple zone or link lines
-define the same name, or if the source of one link line is the target
-of another.
-.PP
-Lines in the file that describes leap seconds have the following form:
-.nf
-.ti +.5i
-.ta \w'Leap\0\0'u +\w'YEAR\0\0'u +\w'MONTH\0\0'u +\w'DAY\0\0'u +\w'HH:MM:SS\0\0'u +\w'CORR\0\0'u
-.sp
-Leap YEAR MONTH DAY HH:MM:SS CORR R/S
-.sp
-For example:
-.ti +.5i
-.sp
-Leap 1974 Dec 31 23:59:60 + S
-.sp
-.fi
-The
-.BR YEAR ,
-.BR MONTH ,
-.BR DAY ,
-and
-.B HH:MM:SS
-fields tell when the leap second happened.
-The
-.B CORR
-field
-should be
-.q "+"
-if a second was added
-or
-.q "\*-"
-if a second was skipped.
-.\" There's no need to document the following, since it's impossible for more
-.\" than one leap second to be inserted or deleted at a time.
-.\" The C Standard is in error in suggesting the possibility.
-.\" See Terry J Quinn, The BIPM and the accurate measure of time,
-.\" Proc IEEE 79, 7 (July 1991), 894-905.
-.\" or
-.\" .q ++
-.\" if two seconds were added
-.\" or
-.\" .q --
-.\" if two seconds were skipped.
-The
-.B R/S
-field
-should be (an abbreviation of)
-.q "Stationary"
-if the leap second time given by the other fields should be interpreted as UTC
-or
-(an abbreviation of)
-.q "Rolling"
-if the leap second time given by the other fields should be interpreted as
-local wall clock time.
-.SH "EXTENDED EXAMPLE"
-Here is an extended example of
-.I zic
-input, intended to illustrate many of its features.
-.br
-.ne 22
-.nf
-.in +2m
-.ta \w'# Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'TYPE\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
-.sp
-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Swiss 1941 1942 \*- May Mon>=1 1:00 1:00 S
-Rule Swiss 1941 1942 \*- Oct Mon>=1 2:00 0 \*-
-.sp .5
-Rule EU 1977 1980 \*- Apr Sun>=1 1:00u 1:00 S
-Rule EU 1977 only \*- Sep lastSun 1:00u 0 \*-
-Rule EU 1978 only \*- Oct 1 1:00u 0 \*-
-Rule EU 1979 1995 \*- Sep lastSun 1:00u 0 \*-
-Rule EU 1981 max \*- Mar lastSun 1:00u 1:00 S
-Rule EU 1996 max \*- Oct lastSun 1:00u 0 \*-
-.sp
-.ta \w'# Zone\0\0'u +\w'Europe/Zurich\0\0'u +\w'GMTOFF\0\0'u +\w'RULES/SAVE\0\0'u +\w'FORMAT\0\0'u
-# Zone NAME GMTOFF RULES/SAVE FORMAT UNTIL
-Zone Europe/Zurich 0:34:08 \*- LMT 1853 Jul 16
- 0:29:46 \*- BMT 1894 Jun
- 1:00 Swiss CE%sT 1981
- 1:00 EU CE%sT
-.sp
-Link Europe/Zurich Switzerland
-.sp
-.in
-.fi
-In this example, the zone is named Europe/Zurich but it has an alias
-as Switzerland. This example says that Zurich was 34 minutes and 8
-seconds west of UT until 1853-07-16 at 00:00, when the legal offset
-was changed to 7\(de\|26\(fm\|22.50\(sd; although this works out to
-0:29:45.50, the input format cannot represent fractional seconds so it
-is rounded here. After 1894-06-01 at 00:00 Swiss daylight saving rules
-(defined with lines beginning with "Rule Swiss") apply, and the UT offset
-became one hour. From 1981 to the present, EU daylight saving rules have
-applied, and the UTC offset has remained at one hour.
-.PP
-In 1941 and 1942, daylight saving time applied from the first Monday
-in May at 01:00 to the first Monday in October at 02:00.
-The pre-1981 EU daylight-saving rules have no effect
-here, but are included for completeness. Since 1981, daylight
-saving has begun on the last Sunday in March at 01:00 UTC.
-Until 1995 it ended the last Sunday in September at 01:00 UTC,
-but this changed to the last Sunday in October starting in 1996.
-.PP
-For purposes of
-display, "LMT" and "BMT" were initially used, respectively. Since
-Swiss rules and later EU rules were applied, the display name for the
-time zone has been CET for standard time and CEST for daylight saving
-time.
-.SH NOTES
-For areas with more than two types of local time,
-you may need to use local standard time in the
-.B AT
-field of the earliest transition time's rule to ensure that
-the earliest transition time recorded in the compiled file is correct.
-.PP
-If,
-for a particular zone,
-a clock advance caused by the start of daylight saving
-coincides with and is equal to
-a clock retreat caused by a change in UT offset,
-.IR zic
-produces a single transition to daylight saving at the new UT offset
-(without any change in wall clock time).
-To get separate transitions
-use multiple zone continuation lines
-specifying transition instants using universal time.
-.PP
-Time stamps well before the Big Bang are silently omitted from the output.
-This works around bugs in software that mishandles large negative time
-stamps. Call it sour grapes, but pre-Big-Bang time stamps are
-physically suspect anyway. The pre-Big-Bang cutoff time is
-approximate and may change in future versions.
-.SH FILE
-/usr/local/etc/zoneinfo standard directory used for created files
-.SH "SEE ALSO"
-newctime(3), tzfile(5), zdump(8)
-.\" This file is in the public domain, so clarified as of
-.\" 2009-05-17 by Arthur David Olson.
Deleted: vendor/tzcode/dist/zic.8.txt
===================================================================
--- vendor/tzcode/dist/zic.8.txt 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zic.8.txt 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,351 +0,0 @@
-ZIC(8) System Manager's Manual ZIC(8)
-
-NAME
- zic - time zone compiler
-
-SYNOPSIS
- zic [ option ... ] [ filename ... ]
-
-DESCRIPTION
- Zic reads text from the file(s) named on the command line and creates
- the time conversion information files specified in this input. If a
- filename is "-", the standard input is read.
-
- These options are available:
-
- --version
- Output version information and exit.
-
- -d directory
- Create time conversion information files in the named directory
- rather than in the standard directory named below.
-
- -l timezone
- Use the given time zone as local time. Zic will act as if the
- input contained a link line of the form
-
- Link timezone localtime
-
- -p timezone
- Use the given time zone's rules when handling POSIX-format time
- zone environment variables. Zic will act as if the input
- contained a link line of the form
-
- Link timezone posixrules
-
- -L leapsecondfilename
- Read leap second information from the file with the given name.
- If this option is not used, no leap second information appears
- in output files.
-
- -v Be more verbose, and complain about the following situations:
-
- The input specifies a link to a link.
-
- A year that appears in a data file is outside the range of years
- representable by time(2) values.
-
- A time of 24:00 or more appears in the input. Pre-1998 versions
- of zic prohibit 24:00, and pre-2007 versions prohibit times
- greater than 24:00.
-
- A rule goes past the start or end of the month. Pre-2004
- versions of zic prohibit this.
-
- The output file does not contain all the information about the
- long-term future of a zone, because the future cannot be
- summarized as an extended POSIX TZ string. For example, as of
- 2013 this problem occurs for Iran's daylight-saving rules for
- the predicted future, as these rules are based on the Iranian
- calendar, which cannot be represented.
-
- The output contains data that may not be handled properly by
- client code designed for older zic output formats. These
- compatibility issues affect only time stamps before 1970 or
- after the start of 2038.
-
- A time zone abbreviation has fewer than 3 characters. POSIX
- requires at least 3.
-
- An output file name contains a byte that is not an ASCII letter,
- "-", "/", or "_"; or it contains a file name component that
- contains more than 14 bytes or that starts with "-".
-
- -s Limit time values stored in output files to values that are the
- same whether they're taken to be signed or unsigned. You can
- use this option to generate SVVS-compatible files.
-
- Input files should be text files, that is, they should be a series of
- zero or more lines, each ending in a newline byte and containing at
- most 511 bytes, and without any NUL bytes. The input text's encoding
- is typically UTF-8 or ASCII; it should have a unibyte representation
- for the POSIX Portable Character Set (PPCS) <http://pubs.opengroup.org/
- onlinepubs/9699919799/basedefs/V1_chap06.html> and the encoding's non-
- unibyte characters should consist entirely of non-PPCS bytes. Non-PPCS
- characters typically occur only in comments: although output file names
- and time zone abbreviations can contain nearly any character, other
- software will work better if these are limited to the restricted syntax
- described under the -v option.
-
- Input lines are made up of fields. Fields are separated from one
- another by one or more white space characters. The white space
- characters are space, form feed, carriage return, newline, tab, and
- vertical tab. Leading and trailing white space on input lines is
- ignored. An unquoted sharp character (#) in the input introduces a
- comment which extends to the end of the line the sharp character
- appears on. White space characters and sharp characters may be
- enclosed in double quotes (") if they're to be used as part of a field.
- Any line that is blank (after comment stripping) is ignored. Non-blank
- lines are expected to be of one of three types: rule lines, zone lines,
- and link lines.
-
- Names (such as month names) must be in English and are case
- insensitive. Abbreviations, if used, must be unambiguous in context.
-
- A rule line has the form
-
- Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-
- For example:
-
- Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
-
- The fields that make up a rule line are:
-
- NAME Gives the (arbitrary) name of the set of rules this rule is
- part of.
-
- FROM Gives the first year in which the rule applies. Any integer
- year can be supplied; the proleptic Gregorian calendar is
- assumed. The word minimum (or an abbreviation) means the
- minimum year representable as an integer. The word maximum (or
- an abbreviation) means the maximum year representable as an
- integer. Rules can describe times that are not representable
- as time values, with the unrepresentable times ignored; this
- allows rules to be portable among hosts with differing time
- value types.
-
- TO Gives the final year in which the rule applies. In addition to
- minimum and maximum (as above), the word only (or an
- abbreviation) may be used to repeat the value of the FROM
- field.
-
- TYPE should be "-" and is present for compatibility with older
- versions of zic in which it could contain year types.
-
- IN Names the month in which the rule takes effect. Month names
- may be abbreviated.
-
- ON Gives the day on which the rule takes effect. Recognized forms
- include:
-
- 5 the fifth of the month
- lastSun the last Sunday in the month
- lastMon the last Monday in the month
- Sun>=8 first Sunday on or after the eighth
- Sun<=25 last Sunday on or before the 25th
-
- Names of days of the week may be abbreviated or spelled out in
- full. Note that there must be no spaces within the ON field.
-
- AT Gives the time of day at which the rule takes effect.
- Recognized forms include:
-
- 2 time in hours
- 2:00 time in hours and minutes
- 15:00 24-hour format time (for times after noon)
- 1:28:14 time in hours, minutes, and seconds
- - equivalent to 0
-
- where hour 0 is midnight at the start of the day, and hour 24
- is midnight at the end of the day. Any of these forms may be
- followed by the letter w if the given time is local "wall
- clock" time, s if the given time is local "standard" time, or u
- (or g or z) if the given time is universal time; in the absence
- of an indicator, wall clock time is assumed. The intent is
- that a rule line describes the instants when a clock/calendar
- set to the type of time specified in the AT field would show
- the specified date and time of day.
-
- SAVE Gives the amount of time to be added to local standard time
- when the rule is in effect. This field has the same format as
- the AT field (although, of course, the w and s suffixes are not
- used). Only the sum of standard time and this amount matters;
- for example, zic does not distinguish a 10:30 standard time
- plus an 0:30 SAVE from a 10:00 standard time plus a 1:00 SAVE.
-
- LETTER/S
- Gives the "variable part" (for example, the "S" or "D" in "EST"
- or "EDT") of time zone abbreviations to be used when this rule
- is in effect. If this field is "-", the variable part is null.
-
- A zone line has the form
-
- Zone NAME GMTOFF RULES/SAVE FORMAT [UNTILYEAR [MONTH [DAY [TIME]]]]
-
- For example:
-
- Zone Australia/Adelaide 9:30 Aus AC%sT 1971 Oct 31 2:00
-
- The fields that make up a zone line are:
-
- NAME The name of the time zone. This is the name used in creating the
- time conversion information file for the zone. It should not
- contain a file name component "." or ".."; a file name component
- is a maximal substring that does not contain "/".
-
- GMTOFF
- The amount of time to add to UT to get standard time in this
- zone. This field has the same format as the AT and SAVE fields
- of rule lines; begin the field with a minus sign if time must be
- subtracted from UT.
-
- RULES/SAVE
- The name of the rule(s) that apply in the time zone or,
- alternately, an amount of time to add to local standard time. If
- this field is - then standard time always applies in the time
- zone. When an amount of time is given, only the sum of standard
- time and this amount matters.
-
- FORMAT
- The format for time zone abbreviations in this time zone. The
- pair of characters %s is used to show where the "variable part"
- of the time zone abbreviation goes. Alternately, a format can
- use the pair of characters %z to stand for the UTC offset in the
- form +-hh, +-hhmm, or +-hhmmss, using the shortest form that does
- not lose information, where hh, mm, and ss are the hours,
- minutes, and seconds east (+) or west (-) of UTC. Alternately, a
- slash (/) separates standard and daylight abbreviations. To
- conform to POSIX, a time zone abbreviation should contain only
- alphanumeric ASCII characters, "+" and "-".
-
- UNTILYEAR [MONTH [DAY [TIME]]]
- The time at which the UT offset or the rule(s) change for a
- location. It is specified as a year, a month, a day, and a time
- of day. If this is specified, the time zone information is
- generated from the given UT offset and rule change until the time
- specified, which is interpreted using the rules in effect just
- before the transition. The month, day, and time of day have the
- same format as the IN, ON, and AT fields of a rule; trailing
- fields can be omitted, and default to the earliest possible value
- for the missing fields.
-
- The next line must be a "continuation" line; this has the same
- form as a zone line except that the string "Zone" and the name
- are omitted, as the continuation line will place information
- starting at the time specified as the "until" information in the
- previous line in the file used by the previous line.
- Continuation lines may contain "until" information, just as zone
- lines do, indicating that the next line is a further
- continuation.
-
- If a zone changes at the same instant that a rule would otherwise take
- effect in the earlier zone or continuation line, the rule is ignored.
- In a single zone it is an error if two rules take effect at the same
- instant, or if two zone changes take effect at the same instant.
-
- A link line has the form
-
- Link TARGET LINK-NAME
-
- For example:
-
- Link Europe/Istanbul Asia/Istanbul
-
- The TARGET field should appear as the NAME field in some zone line.
- The LINK-NAME field is used as an alternate name for that zone; it has
- the same syntax as a zone line's NAME field.
-
- Except for continuation lines, lines may appear in any order in the
- input. However, the behavior is unspecified if multiple zone or link
- lines define the same name, or if the source of one link line is the
- target of another.
-
- Lines in the file that describes leap seconds have the following form:
-
- Leap YEAR MONTH DAY HH:MM:SS CORR R/S
-
- For example:
-
- Leap 1974 Dec 31 23:59:60 + S
-
- The YEAR, MONTH, DAY, and HH:MM:SS fields tell when the leap second
- happened. The CORR field should be "+" if a second was added or "-" if
- a second was skipped. The R/S field should be (an abbreviation of)
- "Stationary" if the leap second time given by the other fields should
- be interpreted as UTC or (an abbreviation of) "Rolling" if the leap
- second time given by the other fields should be interpreted as local
- wall clock time.
-
-EXTENDED EXAMPLE
- Here is an extended example of zic input, intended to illustrate many
- of its features.
-
- # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
- Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S
- Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 -
- Rule EU 1977 1980 - Apr Sun>=1 1:00u 1:00 S
- Rule EU 1977 only - Sep lastSun 1:00u 0 -
- Rule EU 1978 only - Oct 1 1:00u 0 -
- Rule EU 1979 1995 - Sep lastSun 1:00u 0 -
- Rule EU 1981 max - Mar lastSun 1:00u 1:00 S
- Rule EU 1996 max - Oct lastSun 1:00u 0 -
-
- # Zone NAME GMTOFF RULES/SAVE FORMAT UNTIL
- Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16
- 0:29:46 - BMT 1894 Jun
- 1:00 Swiss CE%sT 1981
- 1:00 EU CE%sT
-
- Link Europe/Zurich Switzerland
-
- In this example, the zone is named Europe/Zurich but it has an alias as
- Switzerland. This example says that Zurich was 34 minutes and 8
- seconds west of UT until 1853-07-16 at 00:00, when the legal offset was
- changed to 7o26'22.50''; although this works out to 0:29:45.50, the
- input format cannot represent fractional seconds so it is rounded here.
- After 1894-06-01 at 00:00 Swiss daylight saving rules (defined with
- lines beginning with "Rule Swiss") apply, and the UT offset became one
- hour. From 1981 to the present, EU daylight saving rules have applied,
- and the UTC offset has remained at one hour.
-
- In 1941 and 1942, daylight saving time applied from the first Monday in
- May at 01:00 to the first Monday in October at 02:00. The pre-1981 EU
- daylight-saving rules have no effect here, but are included for
- completeness. Since 1981, daylight saving has begun on the last Sunday
- in March at 01:00 UTC. Until 1995 it ended the last Sunday in
- September at 01:00 UTC, but this changed to the last Sunday in October
- starting in 1996.
-
- For purposes of display, "LMT" and "BMT" were initially used,
- respectively. Since Swiss rules and later EU rules were applied, the
- display name for the time zone has been CET for standard time and CEST
- for daylight saving time.
-
-NOTES
- For areas with more than two types of local time, you may need to use
- local standard time in the AT field of the earliest transition time's
- rule to ensure that the earliest transition time recorded in the
- compiled file is correct.
-
- If, for a particular zone, a clock advance caused by the start of
- daylight saving coincides with and is equal to a clock retreat caused
- by a change in UT offset, zic produces a single transition to daylight
- saving at the new UT offset (without any change in wall clock time).
- To get separate transitions use multiple zone continuation lines
- specifying transition instants using universal time.
-
- Time stamps well before the Big Bang are silently omitted from the
- output. This works around bugs in software that mishandles large
- negative time stamps. Call it sour grapes, but pre-Big-Bang time
- stamps are physically suspect anyway. The pre-Big-Bang cutoff time is
- approximate and may change in future versions.
-
-FILE
- /usr/local/etc/zoneinfo standard directory used for created
- files
-
-SEE ALSO
- newctime(3), tzfile(5), zdump(8)
-
- ZIC(8)
Deleted: vendor/tzcode/dist/zic.c
===================================================================
--- vendor/tzcode/dist/zic.c 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zic.c 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,3064 +0,0 @@
-/*
-** This file is in the public domain, so clarified as of
-** 2006-07-17 by Arthur David Olson.
-*/
-
-#include "version.h"
-#include "private.h"
-#include "locale.h"
-#include "tzfile.h"
-
-#include <stdarg.h>
-
-#define ZIC_VERSION_PRE_2013 '2'
-#define ZIC_VERSION '3'
-
-typedef int_fast64_t zic_t;
-#define ZIC_MIN INT_FAST64_MIN
-#define ZIC_MAX INT_FAST64_MAX
-#define SCNdZIC SCNdFAST64
-
-#ifndef ZIC_MAX_ABBR_LEN_WO_WARN
-#define ZIC_MAX_ABBR_LEN_WO_WARN 6
-#endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
-
-#ifdef HAVE_DIRECT_H
-# include <direct.h>
-# include <io.h>
-# undef mkdir
-# define mkdir(name, mode) _mkdir(name)
-#endif
-
-#if HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef S_IRUSR
-#define MKDIR_UMASK (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
-#else
-#define MKDIR_UMASK 0755
-#endif
-
-struct rule {
- const char * r_filename;
- int r_linenum;
- const char * r_name;
-
- zic_t r_loyear; /* for example, 1986 */
- zic_t r_hiyear; /* for example, 1986 */
- const char * r_yrtype;
- bool r_lowasnum;
- bool r_hiwasnum;
-
- int r_month; /* 0..11 */
-
- int r_dycode; /* see below */
- int r_dayofmonth;
- int r_wday;
-
- zic_t r_tod; /* time from midnight */
- bool r_todisstd; /* above is standard time if 1 */
- /* or wall clock time if 0 */
- bool r_todisgmt; /* above is GMT if 1 */
- /* or local time if 0 */
- zic_t r_stdoff; /* offset from standard time */
- const char * r_abbrvar; /* variable part of abbreviation */
-
- int r_todo; /* a rule to do (used in outzone) */
- zic_t r_temp; /* used in outzone */
-};
-
-/*
-** r_dycode r_dayofmonth r_wday
-*/
-
-#define DC_DOM 0 /* 1..31 */ /* unused */
-#define DC_DOWGEQ 1 /* 1..31 */ /* 0..6 (Sun..Sat) */
-#define DC_DOWLEQ 2 /* 1..31 */ /* 0..6 (Sun..Sat) */
-
-struct zone {
- const char * z_filename;
- int z_linenum;
-
- const char * z_name;
- zic_t z_gmtoff;
- const char * z_rule;
- const char * z_format;
- char z_format_specifier;
-
- zic_t z_stdoff;
-
- struct rule * z_rules;
- int z_nrules;
-
- struct rule z_untilrule;
- zic_t z_untiltime;
-};
-
-#if !HAVE_POSIX_DECLS
-extern int getopt(int argc, char * const argv[],
- const char * options);
-extern int link(const char * fromname, const char * toname);
-extern char * optarg;
-extern int optind;
-#endif
-
-#if ! HAVE_LINK
-# define link(from, to) (errno = ENOTSUP, -1)
-#endif
-#if ! HAVE_SYMLINK
-# define symlink(from, to) (errno = ENOTSUP, -1)
-#endif
-
-static void addtt(zic_t starttime, int type);
-static int addtype(zic_t, char const *, bool, bool, bool);
-static void leapadd(zic_t, bool, int, int);
-static void adjleap(void);
-static void associate(void);
-static void dolink(const char * fromfield, const char * tofield);
-static char ** getfields(char * buf);
-static zic_t gethms(const char * string, const char * errstring,
- bool);
-static void infile(const char * filename);
-static void inleap(char ** fields, int nfields);
-static void inlink(char ** fields, int nfields);
-static void inrule(char ** fields, int nfields);
-static bool inzcont(char ** fields, int nfields);
-static bool inzone(char ** fields, int nfields);
-static bool inzsub(char **, int, bool);
-static int itsdir(const char * name);
-static bool is_alpha(char a);
-static char lowerit(char);
-static bool mkdirs(char *);
-static void newabbr(const char * abbr);
-static zic_t oadd(zic_t t1, zic_t t2);
-static void outzone(const struct zone * zp, int ntzones);
-static zic_t rpytime(const struct rule * rp, zic_t wantedy);
-static void rulesub(struct rule * rp,
- const char * loyearp, const char * hiyearp,
- const char * typep, const char * monthp,
- const char * dayp, const char * timep);
-static zic_t tadd(zic_t t1, zic_t t2);
-static bool yearistype(int year, const char * type);
-
-/* Bound on length of what %z can expand to. */
-enum { PERCENT_Z_LEN_BOUND = sizeof "+995959" - 1 };
-
-/* If true, work around a bug in Qt 5.6.1 and earlier, which mishandles
- tzdata binary files whose POSIX-TZ-style strings contain '<'; see
- QTBUG-53071 <https://bugreports.qt.io/browse/QTBUG-53071>. This
- workaround will no longer be needed when Qt 5.6.1 and earlier are
- obsolete, say in the year 2021. */
-enum { WORK_AROUND_QTBUG_53071 = true };
-
-static int charcnt;
-static bool errors;
-static bool warnings;
-static const char * filename;
-static int leapcnt;
-static bool leapseen;
-static zic_t leapminyear;
-static zic_t leapmaxyear;
-static int linenum;
-static int max_abbrvar_len = PERCENT_Z_LEN_BOUND;
-static int max_format_len;
-static zic_t max_year;
-static zic_t min_year;
-static bool noise;
-static const char * rfilename;
-static int rlinenum;
-static const char * progname;
-static int timecnt;
-static int timecnt_alloc;
-static int typecnt;
-
-/*
-** Line codes.
-*/
-
-#define LC_RULE 0
-#define LC_ZONE 1
-#define LC_LINK 2
-#define LC_LEAP 3
-
-/*
-** Which fields are which on a Zone line.
-*/
-
-#define ZF_NAME 1
-#define ZF_GMTOFF 2
-#define ZF_RULE 3
-#define ZF_FORMAT 4
-#define ZF_TILYEAR 5
-#define ZF_TILMONTH 6
-#define ZF_TILDAY 7
-#define ZF_TILTIME 8
-#define ZONE_MINFIELDS 5
-#define ZONE_MAXFIELDS 9
-
-/*
-** Which fields are which on a Zone continuation line.
-*/
-
-#define ZFC_GMTOFF 0
-#define ZFC_RULE 1
-#define ZFC_FORMAT 2
-#define ZFC_TILYEAR 3
-#define ZFC_TILMONTH 4
-#define ZFC_TILDAY 5
-#define ZFC_TILTIME 6
-#define ZONEC_MINFIELDS 3
-#define ZONEC_MAXFIELDS 7
-
-/*
-** Which files are which on a Rule line.
-*/
-
-#define RF_NAME 1
-#define RF_LOYEAR 2
-#define RF_HIYEAR 3
-#define RF_COMMAND 4
-#define RF_MONTH 5
-#define RF_DAY 6
-#define RF_TOD 7
-#define RF_STDOFF 8
-#define RF_ABBRVAR 9
-#define RULE_FIELDS 10
-
-/*
-** Which fields are which on a Link line.
-*/
-
-#define LF_FROM 1
-#define LF_TO 2
-#define LINK_FIELDS 3
-
-/*
-** Which fields are which on a Leap line.
-*/
-
-#define LP_YEAR 1
-#define LP_MONTH 2
-#define LP_DAY 3
-#define LP_TIME 4
-#define LP_CORR 5
-#define LP_ROLL 6
-#define LEAP_FIELDS 7
-
-/*
-** Year synonyms.
-*/
-
-#define YR_MINIMUM 0
-#define YR_MAXIMUM 1
-#define YR_ONLY 2
-
-static struct rule * rules;
-static int nrules; /* number of rules */
-static int nrules_alloc;
-
-static struct zone * zones;
-static int nzones; /* number of zones */
-static int nzones_alloc;
-
-struct link {
- const char * l_filename;
- int l_linenum;
- const char * l_from;
- const char * l_to;
-};
-
-static struct link * links;
-static int nlinks;
-static int nlinks_alloc;
-
-struct lookup {
- const char * l_word;
- const int l_value;
-};
-
-static struct lookup const * byword(const char * string,
- const struct lookup * lp);
-
-static struct lookup const line_codes[] = {
- { "Rule", LC_RULE },
- { "Zone", LC_ZONE },
- { "Link", LC_LINK },
- { "Leap", LC_LEAP },
- { NULL, 0}
-};
-
-static struct lookup const mon_names[] = {
- { "January", TM_JANUARY },
- { "February", TM_FEBRUARY },
- { "March", TM_MARCH },
- { "April", TM_APRIL },
- { "May", TM_MAY },
- { "June", TM_JUNE },
- { "July", TM_JULY },
- { "August", TM_AUGUST },
- { "September", TM_SEPTEMBER },
- { "October", TM_OCTOBER },
- { "November", TM_NOVEMBER },
- { "December", TM_DECEMBER },
- { NULL, 0 }
-};
-
-static struct lookup const wday_names[] = {
- { "Sunday", TM_SUNDAY },
- { "Monday", TM_MONDAY },
- { "Tuesday", TM_TUESDAY },
- { "Wednesday", TM_WEDNESDAY },
- { "Thursday", TM_THURSDAY },
- { "Friday", TM_FRIDAY },
- { "Saturday", TM_SATURDAY },
- { NULL, 0 }
-};
-
-static struct lookup const lasts[] = {
- { "last-Sunday", TM_SUNDAY },
- { "last-Monday", TM_MONDAY },
- { "last-Tuesday", TM_TUESDAY },
- { "last-Wednesday", TM_WEDNESDAY },
- { "last-Thursday", TM_THURSDAY },
- { "last-Friday", TM_FRIDAY },
- { "last-Saturday", TM_SATURDAY },
- { NULL, 0 }
-};
-
-static struct lookup const begin_years[] = {
- { "minimum", YR_MINIMUM },
- { "maximum", YR_MAXIMUM },
- { NULL, 0 }
-};
-
-static struct lookup const end_years[] = {
- { "minimum", YR_MINIMUM },
- { "maximum", YR_MAXIMUM },
- { "only", YR_ONLY },
- { NULL, 0 }
-};
-
-static struct lookup const leap_types[] = {
- { "Rolling", true },
- { "Stationary", false },
- { NULL, 0 }
-};
-
-static const int len_months[2][MONSPERYEAR] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-};
-
-static const int len_years[2] = {
- DAYSPERNYEAR, DAYSPERLYEAR
-};
-
-static struct attype {
- zic_t at;
- unsigned char type;
-} * attypes;
-static zic_t gmtoffs[TZ_MAX_TYPES];
-static char isdsts[TZ_MAX_TYPES];
-static unsigned char abbrinds[TZ_MAX_TYPES];
-static bool ttisstds[TZ_MAX_TYPES];
-static bool ttisgmts[TZ_MAX_TYPES];
-static char chars[TZ_MAX_CHARS];
-static zic_t trans[TZ_MAX_LEAPS];
-static zic_t corr[TZ_MAX_LEAPS];
-static char roll[TZ_MAX_LEAPS];
-
-/*
-** Memory allocation.
-*/
-
-static _Noreturn void
-memory_exhausted(const char *msg)
-{
- fprintf(stderr, _("%s: Memory exhausted: %s\n"), progname, msg);
- exit(EXIT_FAILURE);
-}
-
-static ATTRIBUTE_PURE size_t
-size_product(size_t nitems, size_t itemsize)
-{
- if (SIZE_MAX / itemsize < nitems)
- memory_exhausted(_("size overflow"));
- return nitems * itemsize;
-}
-
-#if !HAVE_STRDUP
-static char *
-strdup(char const *str)
-{
- char *result = malloc(strlen(str) + 1);
- return result ? strcpy(result, str) : result;
-}
-#endif
-
-static ATTRIBUTE_PURE void *
-memcheck(void *ptr)
-{
- if (ptr == NULL)
- memory_exhausted(strerror(errno));
- return ptr;
-}
-
-static void *
-emalloc(size_t size)
-{
- return memcheck(malloc(size));
-}
-
-static void *
-erealloc(void *ptr, size_t size)
-{
- return memcheck(realloc(ptr, size));
-}
-
-static char *
-ecpyalloc (char const *str)
-{
- return memcheck(strdup(str));
-}
-
-static void *
-growalloc(void *ptr, size_t itemsize, int nitems, int *nitems_alloc)
-{
- if (nitems < *nitems_alloc)
- return ptr;
- else {
- int nitems_max = INT_MAX - WORK_AROUND_QTBUG_53071;
- int amax = nitems_max < SIZE_MAX ? nitems_max : SIZE_MAX;
- if ((amax - 1) / 3 * 2 < *nitems_alloc)
- memory_exhausted(_("int overflow"));
- *nitems_alloc = *nitems_alloc + (*nitems_alloc >> 1) + 1;
- return erealloc(ptr, size_product(*nitems_alloc, itemsize));
- }
-}
-
-/*
-** Error handling.
-*/
-
-static void
-eats(const char *const name, const int num, const char *const rname,
- const int rnum)
-{
- filename = name;
- linenum = num;
- rfilename = rname;
- rlinenum = rnum;
-}
-
-static void
-eat(const char *const name, const int num)
-{
- eats(name, num, NULL, -1);
-}
-
-static void ATTRIBUTE_FORMAT((printf, 1, 0))
-verror(const char *const string, va_list args)
-{
- /*
- ** Match the format of "cc" to allow sh users to
- ** zic ... 2>&1 | error -t "*" -v
- ** on BSD systems.
- */
- if (filename)
- fprintf(stderr, _("\"%s\", line %d: "), filename, linenum);
- vfprintf(stderr, string, args);
- if (rfilename != NULL)
- fprintf(stderr, _(" (rule from \"%s\", line %d)"),
- rfilename, rlinenum);
- fprintf(stderr, "\n");
-}
-
-static void ATTRIBUTE_FORMAT((printf, 1, 2))
-error(const char *const string, ...)
-{
- va_list args;
- va_start(args, string);
- verror(string, args);
- va_end(args);
- errors = true;
-}
-
-static void ATTRIBUTE_FORMAT((printf, 1, 2))
-warning(const char *const string, ...)
-{
- va_list args;
- fprintf(stderr, _("warning: "));
- va_start(args, string);
- verror(string, args);
- va_end(args);
- warnings = true;
-}
-
-static void
-close_file(FILE *stream, char const *name)
-{
- char const *e = (ferror(stream) ? _("I/O error")
- : fclose(stream) != 0 ? strerror(errno) : NULL);
- if (e) {
- fprintf(stderr, "%s: ", progname);
- if (name)
- fprintf(stderr, "%s: ", name);
- fprintf(stderr, "%s\n", e);
- exit(EXIT_FAILURE);
- }
-}
-
-static _Noreturn void
-usage(FILE *stream, int status)
-{
- fprintf(stream,
- _("%s: usage is %s [ --version ] [ --help ] [ -v ] \\\n"
- "\t[ -l localtime ] [ -p posixrules ] [ -d directory ] \\\n"
- "\t[ -L leapseconds ] [ filename ... ]\n\n"
- "Report bugs to %s.\n"),
- progname, progname, REPORT_BUGS_TO);
- if (status == EXIT_SUCCESS)
- close_file(stream, NULL);
- exit(status);
-}
-
-static const char * psxrules;
-static const char * lcltime;
-static const char * directory;
-static const char * leapsec;
-static const char * yitcommand;
-
-int
-main(int argc, char **argv)
-{
- register int i;
- register int j;
- register int c;
-
-#ifdef S_IWGRP
- umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
-#endif
-#if HAVE_GETTEXT
- setlocale(LC_ALL, "");
-#ifdef TZ_DOMAINDIR
- bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
-#endif /* defined TEXTDOMAINDIR */
- textdomain(TZ_DOMAIN);
-#endif /* HAVE_GETTEXT */
- progname = argv[0];
- if (TYPE_BIT(zic_t) < 64) {
- fprintf(stderr, "%s: %s\n", progname,
- _("wild compilation-time specification of zic_t"));
- return EXIT_FAILURE;
- }
- for (i = 1; i < argc; ++i)
- if (strcmp(argv[i], "--version") == 0) {
- printf("zic %s%s\n", PKGVERSION, TZVERSION);
- close_file(stdout, NULL);
- return EXIT_SUCCESS;
- } else if (strcmp(argv[i], "--help") == 0) {
- usage(stdout, EXIT_SUCCESS);
- }
- while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != EOF && c != -1)
- switch (c) {
- default:
- usage(stderr, EXIT_FAILURE);
- case 'd':
- if (directory == NULL)
- directory = optarg;
- else {
- fprintf(stderr,
-_("%s: More than one -d option specified\n"),
- progname);
- return EXIT_FAILURE;
- }
- break;
- case 'l':
- if (lcltime == NULL)
- lcltime = optarg;
- else {
- fprintf(stderr,
-_("%s: More than one -l option specified\n"),
- progname);
- return EXIT_FAILURE;
- }
- break;
- case 'p':
- if (psxrules == NULL)
- psxrules = optarg;
- else {
- fprintf(stderr,
-_("%s: More than one -p option specified\n"),
- progname);
- return EXIT_FAILURE;
- }
- break;
- case 'y':
- if (yitcommand == NULL)
- yitcommand = optarg;
- else {
- fprintf(stderr,
-_("%s: More than one -y option specified\n"),
- progname);
- return EXIT_FAILURE;
- }
- break;
- case 'L':
- if (leapsec == NULL)
- leapsec = optarg;
- else {
- fprintf(stderr,
-_("%s: More than one -L option specified\n"),
- progname);
- return EXIT_FAILURE;
- }
- break;
- case 'v':
- noise = true;
- break;
- case 's':
- warning(_("-s ignored"));
- break;
- }
- if (optind == argc - 1 && strcmp(argv[optind], "=") == 0)
- usage(stderr, EXIT_FAILURE); /* usage message by request */
- if (directory == NULL)
- directory = TZDIR;
- if (yitcommand == NULL)
- yitcommand = "yearistype";
-
- if (optind < argc && leapsec != NULL) {
- infile(leapsec);
- adjleap();
- }
-
- for (i = optind; i < argc; ++i)
- infile(argv[i]);
- if (errors)
- return EXIT_FAILURE;
- associate();
- for (i = 0; i < nzones; i = j) {
- /*
- ** Find the next non-continuation zone entry.
- */
- for (j = i + 1; j < nzones && zones[j].z_name == NULL; ++j)
- continue;
- outzone(&zones[i], j - i);
- }
- /*
- ** Make links.
- */
- for (i = 0; i < nlinks; ++i) {
- eat(links[i].l_filename, links[i].l_linenum);
- dolink(links[i].l_from, links[i].l_to);
- if (noise)
- for (j = 0; j < nlinks; ++j)
- if (strcmp(links[i].l_to,
- links[j].l_from) == 0)
- warning(_("link to link"));
- }
- if (lcltime != NULL) {
- eat(_("command line"), 1);
- dolink(lcltime, TZDEFAULT);
- }
- if (psxrules != NULL) {
- eat(_("command line"), 1);
- dolink(psxrules, TZDEFRULES);
- }
- if (warnings && (ferror(stderr) || fclose(stderr) != 0))
- return EXIT_FAILURE;
- return errors ? EXIT_FAILURE : EXIT_SUCCESS;
-}
-
-static bool
-componentcheck(char const *name, char const *component,
- char const *component_end)
-{
- enum { component_len_max = 14 };
- size_t component_len = component_end - component;
- if (component_len == 0) {
- if (!*name)
- error (_("empty file name"));
- else
- error (_(component == name
- ? "file name '%s' begins with '/'"
- : *component_end
- ? "file name '%s' contains '//'"
- : "file name '%s' ends with '/'"),
- name);
- return false;
- }
- if (0 < component_len && component_len <= 2
- && component[0] == '.' && component_end[-1] == '.') {
- error(_("file name '%s' contains '%.*s' component"),
- name, (int) component_len, component);
- return false;
- }
- if (noise) {
- if (0 < component_len && component[0] == '-')
- warning(_("file name '%s' component contains leading '-'"),
- name);
- if (component_len_max < component_len)
- warning(_("file name '%s' contains overlength component"
- " '%.*s...'"),
- name, component_len_max, component);
- }
- return true;
-}
-
-static bool
-namecheck(const char *name)
-{
- register char const *cp;
-
- /* Benign characters in a portable file name. */
- static char const benign[] =
- "-/_"
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
- /* Non-control chars in the POSIX portable character set,
- excluding the benign characters. */
- static char const printable_and_not_benign[] =
- " !\"#$%&'()*+,.0123456789:;<=>?@[\\]^`{|}~";
-
- register char const *component = name;
- for (cp = name; *cp; cp++) {
- unsigned char c = *cp;
- if (noise && !strchr(benign, c)) {
- warning((strchr(printable_and_not_benign, c)
- ? _("file name '%s' contains byte '%c'")
- : _("file name '%s' contains byte '\\%o'")),
- name, c);
- }
- if (c == '/') {
- if (!componentcheck(name, component, cp))
- return false;
- component = cp + 1;
- }
- }
- return componentcheck(name, component, cp);
-}
-
-static char *
-relname(char const *dir, char const *base)
-{
- if (*base == '/')
- return ecpyalloc(base);
- else {
- size_t dir_len = strlen(dir);
- bool needs_slash = dir_len && dir[dir_len - 1] != '/';
- char *result = emalloc(dir_len + needs_slash + strlen(base) + 1);
- result[dir_len] = '/';
- strcpy(result + dir_len + needs_slash, base);
- return memcpy(result, dir, dir_len);
- }
-}
-
-static void
-dolink(char const *fromfield, char const *tofield)
-{
- register char * fromname;
- register char * toname;
- register int fromisdir;
-
- fromname = relname(directory, fromfield);
- toname = relname(directory, tofield);
- /*
- ** We get to be careful here since
- ** there's a fair chance of root running us.
- */
- fromisdir = itsdir(fromname);
- if (fromisdir) {
- char const *e = strerror(fromisdir < 0 ? errno : EPERM);
- fprintf(stderr, _("%s: link from %s failed: %s"),
- progname, fromname, e);
- exit(EXIT_FAILURE);
- }
- if (link(fromname, toname) != 0) {
- int link_errno = errno;
- bool retry_if_link_supported = false;
-
- if (link_errno == ENOENT || link_errno == ENOTSUP) {
- if (! mkdirs(toname))
- exit(EXIT_FAILURE);
- retry_if_link_supported = true;
- }
- if ((link_errno == EEXIST || link_errno == ENOTSUP)
- && itsdir(toname) == 0
- && (remove(toname) == 0 || errno == ENOENT))
- retry_if_link_supported = true;
- if (retry_if_link_supported && link_errno != ENOTSUP)
- link_errno = link(fromname, toname) == 0 ? 0 : errno;
- if (link_errno != 0) {
- const char *s = fromfield;
- const char *t;
- char *p;
- size_t dotdots = 0;
- char *symlinkcontents;
- int symlink_result;
-
- do
- t = s;
- while ((s = strchr(s, '/'))
- && strncmp(fromfield, tofield, ++s - fromfield) == 0);
-
- for (s = tofield + (t - fromfield); *s; s++)
- dotdots += *s == '/';
- symlinkcontents = emalloc(3 * dotdots + strlen(t) + 1);
- for (p = symlinkcontents; dotdots-- != 0; p += 3)
- memcpy(p, "../", 3);
- strcpy(p, t);
- symlink_result = symlink(symlinkcontents, toname);
- free(symlinkcontents);
- if (symlink_result == 0) {
- if (link_errno != ENOTSUP)
- warning(_("symbolic link used because hard link failed: %s"),
- strerror (link_errno));
- } else {
- FILE *fp, *tp;
- int c;
- fp = fopen(fromname, "rb");
- if (!fp) {
- const char *e = strerror(errno);
- fprintf(stderr,
- _("%s: Can't read %s: %s\n"),
- progname, fromname, e);
- exit(EXIT_FAILURE);
- }
- tp = fopen(toname, "wb");
- if (!tp) {
- const char *e = strerror(errno);
- fprintf(stderr,
- _("%s: Can't create %s: %s\n"),
- progname, toname, e);
- exit(EXIT_FAILURE);
- }
- while ((c = getc(fp)) != EOF)
- putc(c, tp);
- close_file(fp, fromname);
- close_file(tp, toname);
- if (link_errno != ENOTSUP)
- warning(_("copy used because hard link failed: %s"),
- strerror (link_errno));
- }
- }
- }
- free(fromname);
- free(toname);
-}
-
-#define TIME_T_BITS_IN_FILE 64
-
-static zic_t const min_time = MINVAL (zic_t, TIME_T_BITS_IN_FILE);
-static zic_t const max_time = MAXVAL (zic_t, TIME_T_BITS_IN_FILE);
-
-/* Estimated time of the Big Bang, in seconds since the POSIX epoch.
- rounded downward to the negation of a power of two that is
- comfortably outside the error bounds.
-
- For the time of the Big Bang, see:
-
- Ade PAR, Aghanim N, Armitage-Caplan C et al. Planck 2013 results.
- I. Overview of products and scientific results.
- arXiv:1303.5062 2013-03-20 20:10:01 UTC
- <http://arxiv.org/pdf/1303.5062v1> [PDF]
-
- Page 36, Table 9, row Age/Gyr, column Planck+WP+highL+BAO 68% limits
- gives the value 13.798 plus-or-minus 0.037 billion years.
- Multiplying this by 1000000000 and then by 31557600 (the number of
- seconds in an astronomical year) gives a value that is comfortably
- less than 2**59, so BIG_BANG is - 2**59.
-
- BIG_BANG is approximate, and may change in future versions.
- Please do not rely on its exact value. */
-
-#ifndef BIG_BANG
-#define BIG_BANG (- (1LL << 59))
-#endif
-
-/* If true, work around GNOME bug 730332
- <https://bugzilla.gnome.org/show_bug.cgi?id=730332>
- by refusing to output time stamps before BIG_BANG.
- Such time stamps are physically suspect anyway.
-
- The GNOME bug is scheduled to be fixed in GNOME 3.22, and if so
- this workaround will no longer be needed when GNOME 3.21 and
- earlier are obsolete, say in the year 2021. */
-enum { WORK_AROUND_GNOME_BUG_730332 = true };
-
-static const zic_t early_time = (WORK_AROUND_GNOME_BUG_730332
- ? BIG_BANG
- : MINVAL(zic_t, TIME_T_BITS_IN_FILE));
-
-/* Return 1 if NAME is a directory, 0 if it's something else, -1 if trouble. */
-static int
-itsdir(char const *name)
-{
- struct stat st;
- int res = stat(name, &st);
-#ifdef S_ISDIR
- if (res == 0)
- return S_ISDIR(st.st_mode) != 0;
-#endif
- if (res == 0 || errno == EOVERFLOW) {
- char *nameslashdot = relname(name, ".");
- bool dir = stat(nameslashdot, &st) == 0 || errno == EOVERFLOW;
- free(nameslashdot);
- return dir;
- }
- return -1;
-}
-
-/*
-** Associate sets of rules with zones.
-*/
-
-/*
-** Sort by rule name.
-*/
-
-static int
-rcomp(const void *cp1, const void *cp2)
-{
- return strcmp(((const struct rule *) cp1)->r_name,
- ((const struct rule *) cp2)->r_name);
-}
-
-static void
-associate(void)
-{
- register struct zone * zp;
- register struct rule * rp;
- register int base, out;
- register int i, j;
-
- if (nrules != 0) {
- qsort(rules, nrules, sizeof *rules, rcomp);
- for (i = 0; i < nrules - 1; ++i) {
- if (strcmp(rules[i].r_name,
- rules[i + 1].r_name) != 0)
- continue;
- if (strcmp(rules[i].r_filename,
- rules[i + 1].r_filename) == 0)
- continue;
- eat(rules[i].r_filename, rules[i].r_linenum);
- warning(_("same rule name in multiple files"));
- eat(rules[i + 1].r_filename, rules[i + 1].r_linenum);
- warning(_("same rule name in multiple files"));
- for (j = i + 2; j < nrules; ++j) {
- if (strcmp(rules[i].r_name,
- rules[j].r_name) != 0)
- break;
- if (strcmp(rules[i].r_filename,
- rules[j].r_filename) == 0)
- continue;
- if (strcmp(rules[i + 1].r_filename,
- rules[j].r_filename) == 0)
- continue;
- break;
- }
- i = j - 1;
- }
- }
- for (i = 0; i < nzones; ++i) {
- zp = &zones[i];
- zp->z_rules = NULL;
- zp->z_nrules = 0;
- }
- for (base = 0; base < nrules; base = out) {
- rp = &rules[base];
- for (out = base + 1; out < nrules; ++out)
- if (strcmp(rp->r_name, rules[out].r_name) != 0)
- break;
- for (i = 0; i < nzones; ++i) {
- zp = &zones[i];
- if (strcmp(zp->z_rule, rp->r_name) != 0)
- continue;
- zp->z_rules = rp;
- zp->z_nrules = out - base;
- }
- }
- for (i = 0; i < nzones; ++i) {
- zp = &zones[i];
- if (zp->z_nrules == 0) {
- /*
- ** Maybe we have a local standard time offset.
- */
- eat(zp->z_filename, zp->z_linenum);
- zp->z_stdoff = gethms(zp->z_rule, _("unruly zone"),
- true);
- /*
- ** Note, though, that if there's no rule,
- ** a '%s' in the format is a bad thing.
- */
- if (zp->z_format_specifier == 's')
- error("%s", _("%s in ruleless zone"));
- }
- }
- if (errors)
- exit(EXIT_FAILURE);
-}
-
-static void
-infile(const char *name)
-{
- register FILE * fp;
- register char ** fields;
- register char * cp;
- register const struct lookup * lp;
- register int nfields;
- register bool wantcont;
- register int num;
- char buf[BUFSIZ];
-
- if (strcmp(name, "-") == 0) {
- name = _("standard input");
- fp = stdin;
- } else if ((fp = fopen(name, "r")) == NULL) {
- const char *e = strerror(errno);
-
- fprintf(stderr, _("%s: Can't open %s: %s\n"),
- progname, name, e);
- exit(EXIT_FAILURE);
- }
- wantcont = false;
- for (num = 1; ; ++num) {
- eat(name, num);
- if (fgets(buf, sizeof buf, fp) != buf)
- break;
- cp = strchr(buf, '\n');
- if (cp == NULL) {
- error(_("line too long"));
- exit(EXIT_FAILURE);
- }
- *cp = '\0';
- fields = getfields(buf);
- nfields = 0;
- while (fields[nfields] != NULL) {
- static char nada;
-
- if (strcmp(fields[nfields], "-") == 0)
- fields[nfields] = &nada;
- ++nfields;
- }
- if (nfields == 0) {
- /* nothing to do */
- } else if (wantcont) {
- wantcont = inzcont(fields, nfields);
- } else {
- lp = byword(fields[0], line_codes);
- if (lp == NULL)
- error(_("input line of unknown type"));
- else switch ((int) (lp->l_value)) {
- case LC_RULE:
- inrule(fields, nfields);
- wantcont = false;
- break;
- case LC_ZONE:
- wantcont = inzone(fields, nfields);
- break;
- case LC_LINK:
- inlink(fields, nfields);
- wantcont = false;
- break;
- case LC_LEAP:
- if (name != leapsec)
- warning(_("%s: Leap line in non leap"
- " seconds file %s"),
- progname, name);
- else inleap(fields, nfields);
- wantcont = false;
- break;
- default: /* "cannot happen" */
- fprintf(stderr,
-_("%s: panic: Invalid l_value %d\n"),
- progname, lp->l_value);
- exit(EXIT_FAILURE);
- }
- }
- free(fields);
- }
- close_file(fp, filename);
- if (wantcont)
- error(_("expected continuation line not found"));
-}
-
-/*
-** Convert a string of one of the forms
-** h -h hh:mm -hh:mm hh:mm:ss -hh:mm:ss
-** into a number of seconds.
-** A null string maps to zero.
-** Call error with errstring and return zero on errors.
-*/
-
-static zic_t
-gethms(char const *string, char const *errstring, bool signable)
-{
- zic_t hh;
- int mm, ss, sign;
- char xs;
-
- if (string == NULL || *string == '\0')
- return 0;
- if (!signable)
- sign = 1;
- else if (*string == '-') {
- sign = -1;
- ++string;
- } else sign = 1;
- if (sscanf(string, "%"SCNdZIC"%c", &hh, &xs) == 1)
- mm = ss = 0;
- else if (sscanf(string, "%"SCNdZIC":%d%c", &hh, &mm, &xs) == 2)
- ss = 0;
- else if (sscanf(string, "%"SCNdZIC":%d:%d%c", &hh, &mm, &ss, &xs)
- != 3) {
- error("%s", errstring);
- return 0;
- }
- if (hh < 0 ||
- mm < 0 || mm >= MINSPERHOUR ||
- ss < 0 || ss > SECSPERMIN) {
- error("%s", errstring);
- return 0;
- }
- if (ZIC_MAX / SECSPERHOUR < hh) {
- error(_("time overflow"));
- return 0;
- }
- if (noise && (hh > HOURSPERDAY ||
- (hh == HOURSPERDAY && (mm != 0 || ss != 0))))
-warning(_("values over 24 hours not handled by pre-2007 versions of zic"));
- return oadd(sign * hh * SECSPERHOUR,
- sign * (mm * SECSPERMIN + ss));
-}
-
-static void
-inrule(char **fields, int nfields)
-{
- static struct rule r;
-
- if (nfields != RULE_FIELDS) {
- error(_("wrong number of fields on Rule line"));
- return;
- }
- if (*fields[RF_NAME] == '\0') {
- error(_("nameless rule"));
- return;
- }
- r.r_filename = filename;
- r.r_linenum = linenum;
- r.r_stdoff = gethms(fields[RF_STDOFF], _("invalid saved time"), true);
- rulesub(&r, fields[RF_LOYEAR], fields[RF_HIYEAR], fields[RF_COMMAND],
- fields[RF_MONTH], fields[RF_DAY], fields[RF_TOD]);
- r.r_name = ecpyalloc(fields[RF_NAME]);
- r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
- if (max_abbrvar_len < strlen(r.r_abbrvar))
- max_abbrvar_len = strlen(r.r_abbrvar);
- rules = growalloc(rules, sizeof *rules, nrules, &nrules_alloc);
- rules[nrules++] = r;
-}
-
-static bool
-inzone(char **fields, int nfields)
-{
- register int i;
-
- if (nfields < ZONE_MINFIELDS || nfields > ZONE_MAXFIELDS) {
- error(_("wrong number of fields on Zone line"));
- return false;
- }
- if (strcmp(fields[ZF_NAME], TZDEFAULT) == 0 && lcltime != NULL) {
- error(
-_("\"Zone %s\" line and -l option are mutually exclusive"),
- TZDEFAULT);
- return false;
- }
- if (strcmp(fields[ZF_NAME], TZDEFRULES) == 0 && psxrules != NULL) {
- error(
-_("\"Zone %s\" line and -p option are mutually exclusive"),
- TZDEFRULES);
- return false;
- }
- for (i = 0; i < nzones; ++i)
- if (zones[i].z_name != NULL &&
- strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
- error(
-_("duplicate zone name %s (file \"%s\", line %d)"),
- fields[ZF_NAME],
- zones[i].z_filename,
- zones[i].z_linenum);
- return false;
- }
- return inzsub(fields, nfields, false);
-}
-
-static bool
-inzcont(char **fields, int nfields)
-{
- if (nfields < ZONEC_MINFIELDS || nfields > ZONEC_MAXFIELDS) {
- error(_("wrong number of fields on Zone continuation line"));
- return false;
- }
- return inzsub(fields, nfields, true);
-}
-
-static bool
-inzsub(char **fields, int nfields, bool iscont)
-{
- register char * cp;
- char * cp1;
- static struct zone z;
- register int i_gmtoff, i_rule, i_format;
- register int i_untilyear, i_untilmonth;
- register int i_untilday, i_untiltime;
- register bool hasuntil;
-
- if (iscont) {
- i_gmtoff = ZFC_GMTOFF;
- i_rule = ZFC_RULE;
- i_format = ZFC_FORMAT;
- i_untilyear = ZFC_TILYEAR;
- i_untilmonth = ZFC_TILMONTH;
- i_untilday = ZFC_TILDAY;
- i_untiltime = ZFC_TILTIME;
- z.z_name = NULL;
- } else if (!namecheck(fields[ZF_NAME]))
- return false;
- else {
- i_gmtoff = ZF_GMTOFF;
- i_rule = ZF_RULE;
- i_format = ZF_FORMAT;
- i_untilyear = ZF_TILYEAR;
- i_untilmonth = ZF_TILMONTH;
- i_untilday = ZF_TILDAY;
- i_untiltime = ZF_TILTIME;
- z.z_name = ecpyalloc(fields[ZF_NAME]);
- }
- z.z_filename = filename;
- z.z_linenum = linenum;
- z.z_gmtoff = gethms(fields[i_gmtoff], _("invalid UT offset"), true);
- if ((cp = strchr(fields[i_format], '%')) != 0) {
- if ((*++cp != 's' && *cp != 'z') || strchr(cp, '%')
- || strchr(fields[i_format], '/')) {
- error(_("invalid abbreviation format"));
- return false;
- }
- }
- z.z_rule = ecpyalloc(fields[i_rule]);
- z.z_format = cp1 = ecpyalloc(fields[i_format]);
- z.z_format_specifier = cp ? *cp : '\0';
- if (z.z_format_specifier == 'z') {
- if (noise)
- warning(_("format '%s' not handled by pre-2015 versions of zic"),
- z.z_format);
- cp1[cp - fields[i_format]] = 's';
- }
- if (max_format_len < strlen(z.z_format))
- max_format_len = strlen(z.z_format);
- hasuntil = nfields > i_untilyear;
- if (hasuntil) {
- z.z_untilrule.r_filename = filename;
- z.z_untilrule.r_linenum = linenum;
- rulesub(&z.z_untilrule,
- fields[i_untilyear],
- "only",
- "",
- (nfields > i_untilmonth) ?
- fields[i_untilmonth] : "Jan",
- (nfields > i_untilday) ? fields[i_untilday] : "1",
- (nfields > i_untiltime) ? fields[i_untiltime] : "0");
- z.z_untiltime = rpytime(&z.z_untilrule,
- z.z_untilrule.r_loyear);
- if (iscont && nzones > 0 &&
- z.z_untiltime > min_time &&
- z.z_untiltime < max_time &&
- zones[nzones - 1].z_untiltime > min_time &&
- zones[nzones - 1].z_untiltime < max_time &&
- zones[nzones - 1].z_untiltime >= z.z_untiltime) {
- error(_(
-"Zone continuation line end time is not after end time of previous line"
- ));
- return false;
- }
- }
- zones = growalloc(zones, sizeof *zones, nzones, &nzones_alloc);
- zones[nzones++] = z;
- /*
- ** If there was an UNTIL field on this line,
- ** there's more information about the zone on the next line.
- */
- return hasuntil;
-}
-
-static void
-inleap(char **fields, int nfields)
-{
- register const char * cp;
- register const struct lookup * lp;
- register int i, j;
- zic_t year;
- int month, day;
- zic_t dayoff, tod;
- zic_t t;
- char xs;
-
- if (nfields != LEAP_FIELDS) {
- error(_("wrong number of fields on Leap line"));
- return;
- }
- dayoff = 0;
- cp = fields[LP_YEAR];
- if (sscanf(cp, "%"SCNdZIC"%c", &year, &xs) != 1) {
- /*
- ** Leapin' Lizards!
- */
- error(_("invalid leaping year"));
- return;
- }
- if (!leapseen || leapmaxyear < year)
- leapmaxyear = year;
- if (!leapseen || leapminyear > year)
- leapminyear = year;
- leapseen = true;
- j = EPOCH_YEAR;
- while (j != year) {
- if (year > j) {
- i = len_years[isleap(j)];
- ++j;
- } else {
- --j;
- i = -len_years[isleap(j)];
- }
- dayoff = oadd(dayoff, i);
- }
- if ((lp = byword(fields[LP_MONTH], mon_names)) == NULL) {
- error(_("invalid month name"));
- return;
- }
- month = lp->l_value;
- j = TM_JANUARY;
- while (j != month) {
- i = len_months[isleap(year)][j];
- dayoff = oadd(dayoff, i);
- ++j;
- }
- cp = fields[LP_DAY];
- if (sscanf(cp, "%d%c", &day, &xs) != 1 ||
- day <= 0 || day > len_months[isleap(year)][month]) {
- error(_("invalid day of month"));
- return;
- }
- dayoff = oadd(dayoff, day - 1);
- if (dayoff < min_time / SECSPERDAY) {
- error(_("time too small"));
- return;
- }
- if (dayoff > max_time / SECSPERDAY) {
- error(_("time too large"));
- return;
- }
- t = dayoff * SECSPERDAY;
- tod = gethms(fields[LP_TIME], _("invalid time of day"), false);
- cp = fields[LP_CORR];
- {
- register bool positive;
- int count;
-
- if (strcmp(cp, "") == 0) { /* infile() turns "-" into "" */
- positive = false;
- count = 1;
- } else if (strcmp(cp, "--") == 0) {
- positive = false;
- count = 2;
- } else if (strcmp(cp, "+") == 0) {
- positive = true;
- count = 1;
- } else if (strcmp(cp, "++") == 0) {
- positive = true;
- count = 2;
- } else {
- error(_("illegal CORRECTION field on Leap line"));
- return;
- }
- if ((lp = byword(fields[LP_ROLL], leap_types)) == NULL) {
- error(_(
- "illegal Rolling/Stationary field on Leap line"
- ));
- return;
- }
- t = tadd(t, tod);
- if (t < early_time) {
- error(_("leap second precedes Big Bang"));
- return;
- }
- leapadd(t, positive, lp->l_value, count);
- }
-}
-
-static void
-inlink(char **fields, int nfields)
-{
- struct link l;
-
- if (nfields != LINK_FIELDS) {
- error(_("wrong number of fields on Link line"));
- return;
- }
- if (*fields[LF_FROM] == '\0') {
- error(_("blank FROM field on Link line"));
- return;
- }
- if (! namecheck(fields[LF_TO]))
- return;
- l.l_filename = filename;
- l.l_linenum = linenum;
- l.l_from = ecpyalloc(fields[LF_FROM]);
- l.l_to = ecpyalloc(fields[LF_TO]);
- links = growalloc(links, sizeof *links, nlinks, &nlinks_alloc);
- links[nlinks++] = l;
-}
-
-static void
-rulesub(struct rule *rp, const char *loyearp, const char *hiyearp,
- const char *typep, const char *monthp, const char *dayp,
- const char *timep)
-{
- register const struct lookup * lp;
- register const char * cp;
- register char * dp;
- register char * ep;
- char xs;
-
- if ((lp = byword(monthp, mon_names)) == NULL) {
- error(_("invalid month name"));
- return;
- }
- rp->r_month = lp->l_value;
- rp->r_todisstd = false;
- rp->r_todisgmt = false;
- dp = ecpyalloc(timep);
- if (*dp != '\0') {
- ep = dp + strlen(dp) - 1;
- switch (lowerit(*ep)) {
- case 's': /* Standard */
- rp->r_todisstd = true;
- rp->r_todisgmt = false;
- *ep = '\0';
- break;
- case 'w': /* Wall */
- rp->r_todisstd = false;
- rp->r_todisgmt = false;
- *ep = '\0';
- break;
- case 'g': /* Greenwich */
- case 'u': /* Universal */
- case 'z': /* Zulu */
- rp->r_todisstd = true;
- rp->r_todisgmt = true;
- *ep = '\0';
- break;
- }
- }
- rp->r_tod = gethms(dp, _("invalid time of day"), false);
- free(dp);
- /*
- ** Year work.
- */
- cp = loyearp;
- lp = byword(cp, begin_years);
- rp->r_lowasnum = lp == NULL;
- if (!rp->r_lowasnum) switch ((int) lp->l_value) {
- case YR_MINIMUM:
- rp->r_loyear = ZIC_MIN;
- break;
- case YR_MAXIMUM:
- rp->r_loyear = ZIC_MAX;
- break;
- default: /* "cannot happen" */
- fprintf(stderr,
- _("%s: panic: Invalid l_value %d\n"),
- progname, lp->l_value);
- exit(EXIT_FAILURE);
- } else if (sscanf(cp, "%"SCNdZIC"%c", &rp->r_loyear, &xs) != 1) {
- error(_("invalid starting year"));
- return;
- }
- cp = hiyearp;
- lp = byword(cp, end_years);
- rp->r_hiwasnum = lp == NULL;
- if (!rp->r_hiwasnum) switch ((int) lp->l_value) {
- case YR_MINIMUM:
- rp->r_hiyear = ZIC_MIN;
- break;
- case YR_MAXIMUM:
- rp->r_hiyear = ZIC_MAX;
- break;
- case YR_ONLY:
- rp->r_hiyear = rp->r_loyear;
- break;
- default: /* "cannot happen" */
- fprintf(stderr,
- _("%s: panic: Invalid l_value %d\n"),
- progname, lp->l_value);
- exit(EXIT_FAILURE);
- } else if (sscanf(cp, "%"SCNdZIC"%c", &rp->r_hiyear, &xs) != 1) {
- error(_("invalid ending year"));
- return;
- }
- if (rp->r_loyear > rp->r_hiyear) {
- error(_("starting year greater than ending year"));
- return;
- }
- if (*typep == '\0')
- rp->r_yrtype = NULL;
- else {
- if (rp->r_loyear == rp->r_hiyear) {
- error(_("typed single year"));
- return;
- }
- rp->r_yrtype = ecpyalloc(typep);
- }
- /*
- ** Day work.
- ** Accept things such as:
- ** 1
- ** last-Sunday
- ** Sun<=20
- ** Sun>=7
- */
- dp = ecpyalloc(dayp);
- if ((lp = byword(dp, lasts)) != NULL) {
- rp->r_dycode = DC_DOWLEQ;
- rp->r_wday = lp->l_value;
- rp->r_dayofmonth = len_months[1][rp->r_month];
- } else {
- if ((ep = strchr(dp, '<')) != 0)
- rp->r_dycode = DC_DOWLEQ;
- else if ((ep = strchr(dp, '>')) != 0)
- rp->r_dycode = DC_DOWGEQ;
- else {
- ep = dp;
- rp->r_dycode = DC_DOM;
- }
- if (rp->r_dycode != DC_DOM) {
- *ep++ = 0;
- if (*ep++ != '=') {
- error(_("invalid day of month"));
- free(dp);
- return;
- }
- if ((lp = byword(dp, wday_names)) == NULL) {
- error(_("invalid weekday name"));
- free(dp);
- return;
- }
- rp->r_wday = lp->l_value;
- }
- if (sscanf(ep, "%d%c", &rp->r_dayofmonth, &xs) != 1 ||
- rp->r_dayofmonth <= 0 ||
- (rp->r_dayofmonth > len_months[1][rp->r_month])) {
- error(_("invalid day of month"));
- free(dp);
- return;
- }
- }
- free(dp);
-}
-
-static void
-convert(const int_fast32_t val, char *const buf)
-{
- register int i;
- register int shift;
- unsigned char *const b = (unsigned char *) buf;
-
- for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
- b[i] = val >> shift;
-}
-
-static void
-convert64(const zic_t val, char *const buf)
-{
- register int i;
- register int shift;
- unsigned char *const b = (unsigned char *) buf;
-
- for (i = 0, shift = 56; i < 8; ++i, shift -= 8)
- b[i] = val >> shift;
-}
-
-static void
-puttzcode(const int_fast32_t val, FILE *const fp)
-{
- char buf[4];
-
- convert(val, buf);
- fwrite(buf, sizeof buf, 1, fp);
-}
-
-static void
-puttzcode64(const zic_t val, FILE *const fp)
-{
- char buf[8];
-
- convert64(val, buf);
- fwrite(buf, sizeof buf, 1, fp);
-}
-
-static int
-atcomp(const void *avp, const void *bvp)
-{
- const zic_t a = ((const struct attype *) avp)->at;
- const zic_t b = ((const struct attype *) bvp)->at;
-
- return (a < b) ? -1 : (a > b);
-}
-
-static bool
-is32(const zic_t x)
-{
- return INT32_MIN <= x && x <= INT32_MAX;
-}
-
-static void
-writezone(const char *const name, const char *const string, char version)
-{
- register FILE * fp;
- register int i, j;
- register int leapcnt32, leapi32;
- register int timecnt32, timei32;
- register int pass;
- char * fullname;
- static const struct tzhead tzh0;
- static struct tzhead tzh;
- zic_t one = 1;
- zic_t y2038_boundary = one << 31;
- int nats = timecnt + WORK_AROUND_QTBUG_53071;
- zic_t *ats = emalloc(size_product(nats, sizeof *ats + 1));
- void *typesptr = ats + nats;
- unsigned char *types = typesptr;
-
- /*
- ** Sort.
- */
- if (timecnt > 1)
- qsort(attypes, timecnt, sizeof *attypes, atcomp);
- /*
- ** Optimize.
- */
- {
- int fromi;
- int toi;
-
- toi = 0;
- fromi = 0;
- while (fromi < timecnt && attypes[fromi].at < early_time)
- ++fromi;
- for ( ; fromi < timecnt; ++fromi) {
- if (toi > 1 && ((attypes[fromi].at +
- gmtoffs[attypes[toi - 1].type]) <=
- (attypes[toi - 1].at +
- gmtoffs[attypes[toi - 2].type]))) {
- attypes[toi - 1].type =
- attypes[fromi].type;
- continue;
- }
- if (toi == 0 ||
- attypes[toi - 1].type != attypes[fromi].type)
- attypes[toi++] = attypes[fromi];
- }
- timecnt = toi;
- }
- if (noise && timecnt > 1200)
- warning(_("pre-2014 clients may mishandle"
- " more than 1200 transition times"));
- /*
- ** Transfer.
- */
- for (i = 0; i < timecnt; ++i) {
- ats[i] = attypes[i].at;
- types[i] = attypes[i].type;
- }
-
- /* Work around QTBUG-53071 for time stamps less than y2038_boundary - 1,
- by inserting a no-op transition at time y2038_boundary - 1.
- This works only for timestamps before the boundary, which
- should be good enough in practice as QTBUG-53071 should be
- long-dead by 2038. */
- if (WORK_AROUND_QTBUG_53071 && timecnt != 0
- && ats[timecnt - 1] < y2038_boundary - 1 && strchr(string, '<')) {
- ats[timecnt] = y2038_boundary - 1;
- types[timecnt] = types[timecnt - 1];
- timecnt++;
- }
-
- /*
- ** Correct for leap seconds.
- */
- for (i = 0; i < timecnt; ++i) {
- j = leapcnt;
- while (--j >= 0)
- if (ats[i] > trans[j] - corr[j]) {
- ats[i] = tadd(ats[i], corr[j]);
- break;
- }
- }
- /*
- ** Figure out 32-bit-limited starts and counts.
- */
- timecnt32 = timecnt;
- timei32 = 0;
- leapcnt32 = leapcnt;
- leapi32 = 0;
- while (timecnt32 > 0 && !is32(ats[timecnt32 - 1]))
- --timecnt32;
- while (timecnt32 > 0 && !is32(ats[timei32])) {
- --timecnt32;
- ++timei32;
- }
- /*
- ** Output an INT32_MIN "transition" if appropriate; see below.
- */
- if (timei32 > 0 && ats[timei32] > INT32_MIN) {
- --timei32;
- ++timecnt32;
- }
- while (leapcnt32 > 0 && !is32(trans[leapcnt32 - 1]))
- --leapcnt32;
- while (leapcnt32 > 0 && !is32(trans[leapi32])) {
- --leapcnt32;
- ++leapi32;
- }
- fullname = relname(directory, name);
- /*
- ** Remove old file, if any, to snap links.
- */
- if (itsdir(fullname) == 0 && remove(fullname) != 0 && errno != ENOENT) {
- const char *e = strerror(errno);
-
- fprintf(stderr, _("%s: Can't remove %s: %s\n"),
- progname, fullname, e);
- exit(EXIT_FAILURE);
- }
- if ((fp = fopen(fullname, "wb")) == NULL) {
- if (! mkdirs(fullname))
- exit(EXIT_FAILURE);
- if ((fp = fopen(fullname, "wb")) == NULL) {
- const char *e = strerror(errno);
-
- fprintf(stderr, _("%s: Can't create %s: %s\n"),
- progname, fullname, e);
- exit(EXIT_FAILURE);
- }
- }
- for (pass = 1; pass <= 2; ++pass) {
- register int thistimei, thistimecnt;
- register int thisleapi, thisleapcnt;
- register int thistimelim, thisleaplim;
- int writetype[TZ_MAX_TYPES];
- int typemap[TZ_MAX_TYPES];
- register int thistypecnt;
- char thischars[TZ_MAX_CHARS];
- char thischarcnt;
- int indmap[TZ_MAX_CHARS];
-
- if (pass == 1) {
- thistimei = timei32;
- thistimecnt = timecnt32;
- thisleapi = leapi32;
- thisleapcnt = leapcnt32;
- } else {
- thistimei = 0;
- thistimecnt = timecnt;
- thisleapi = 0;
- thisleapcnt = leapcnt;
- }
- thistimelim = thistimei + thistimecnt;
- thisleaplim = thisleapi + thisleapcnt;
- for (i = 0; i < typecnt; ++i)
- writetype[i] = thistimecnt == timecnt;
- if (thistimecnt == 0) {
- /*
- ** No transition times fall in the current
- ** (32- or 64-bit) window.
- */
- if (typecnt != 0)
- writetype[typecnt - 1] = true;
- } else {
- for (i = thistimei - 1; i < thistimelim; ++i)
- if (i >= 0)
- writetype[types[i]] = true;
- /*
- ** For America/Godthab and Antarctica/Palmer
- */
- if (thistimei == 0)
- writetype[0] = true;
- }
-#ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH
- /*
- ** For some pre-2011 systems: if the last-to-be-written
- ** standard (or daylight) type has an offset different from the
- ** most recently used offset,
- ** append an (unused) copy of the most recently used type
- ** (to help get global "altzone" and "timezone" variables
- ** set correctly).
- */
- {
- register int mrudst, mrustd, hidst, histd, type;
-
- hidst = histd = mrudst = mrustd = -1;
- for (i = thistimei; i < thistimelim; ++i)
- if (isdsts[types[i]])
- mrudst = types[i];
- else mrustd = types[i];
- for (i = 0; i < typecnt; ++i)
- if (writetype[i]) {
- if (isdsts[i])
- hidst = i;
- else histd = i;
- }
- if (hidst >= 0 && mrudst >= 0 && hidst != mrudst &&
- gmtoffs[hidst] != gmtoffs[mrudst]) {
- isdsts[mrudst] = -1;
- type = addtype(gmtoffs[mrudst],
- &chars[abbrinds[mrudst]],
- true,
- ttisstds[mrudst],
- ttisgmts[mrudst]);
- isdsts[mrudst] = 1;
- writetype[type] = true;
- }
- if (histd >= 0 && mrustd >= 0 && histd != mrustd &&
- gmtoffs[histd] != gmtoffs[mrustd]) {
- isdsts[mrustd] = -1;
- type = addtype(gmtoffs[mrustd],
- &chars[abbrinds[mrustd]],
- false,
- ttisstds[mrustd],
- ttisgmts[mrustd]);
- isdsts[mrustd] = 0;
- writetype[type] = true;
- }
- }
-#endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */
- thistypecnt = 0;
- for (i = 0; i < typecnt; ++i)
- typemap[i] = writetype[i] ? thistypecnt++ : -1;
- for (i = 0; i < sizeof indmap / sizeof indmap[0]; ++i)
- indmap[i] = -1;
- thischarcnt = 0;
- for (i = 0; i < typecnt; ++i) {
- register char * thisabbr;
-
- if (!writetype[i])
- continue;
- if (indmap[abbrinds[i]] >= 0)
- continue;
- thisabbr = &chars[abbrinds[i]];
- for (j = 0; j < thischarcnt; ++j)
- if (strcmp(&thischars[j], thisabbr) == 0)
- break;
- if (j == thischarcnt) {
- strcpy(&thischars[(int) thischarcnt],
- thisabbr);
- thischarcnt += strlen(thisabbr) + 1;
- }
- indmap[abbrinds[i]] = j;
- }
-#define DO(field) fwrite(tzh.field, sizeof tzh.field, 1, fp)
- tzh = tzh0;
- strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
- tzh.tzh_version[0] = version;
- convert(thistypecnt, tzh.tzh_ttisgmtcnt);
- convert(thistypecnt, tzh.tzh_ttisstdcnt);
- convert(thisleapcnt, tzh.tzh_leapcnt);
- convert(thistimecnt, tzh.tzh_timecnt);
- convert(thistypecnt, tzh.tzh_typecnt);
- convert(thischarcnt, tzh.tzh_charcnt);
- DO(tzh_magic);
- DO(tzh_version);
- DO(tzh_reserved);
- DO(tzh_ttisgmtcnt);
- DO(tzh_ttisstdcnt);
- DO(tzh_leapcnt);
- DO(tzh_timecnt);
- DO(tzh_typecnt);
- DO(tzh_charcnt);
-#undef DO
- for (i = thistimei; i < thistimelim; ++i)
- if (pass == 1)
- /*
- ** Output an INT32_MIN "transition"
- ** if appropriate; see above.
- */
- puttzcode(((ats[i] < INT32_MIN) ?
- INT32_MIN : ats[i]), fp);
- else puttzcode64(ats[i], fp);
- for (i = thistimei; i < thistimelim; ++i) {
- unsigned char uc;
-
- uc = typemap[types[i]];
- fwrite(&uc, sizeof uc, 1, fp);
- }
- for (i = 0; i < typecnt; ++i)
- if (writetype[i]) {
- puttzcode(gmtoffs[i], fp);
- putc(isdsts[i], fp);
- putc((unsigned char) indmap[abbrinds[i]], fp);
- }
- if (thischarcnt != 0)
- fwrite(thischars, sizeof thischars[0],
- thischarcnt, fp);
- for (i = thisleapi; i < thisleaplim; ++i) {
- register zic_t todo;
-
- if (roll[i]) {
- if (timecnt == 0 || trans[i] < ats[0]) {
- j = 0;
- while (isdsts[j])
- if (++j >= typecnt) {
- j = 0;
- break;
- }
- } else {
- j = 1;
- while (j < timecnt &&
- trans[i] >= ats[j])
- ++j;
- j = types[j - 1];
- }
- todo = tadd(trans[i], -gmtoffs[j]);
- } else todo = trans[i];
- if (pass == 1)
- puttzcode(todo, fp);
- else puttzcode64(todo, fp);
- puttzcode(corr[i], fp);
- }
- for (i = 0; i < typecnt; ++i)
- if (writetype[i])
- putc(ttisstds[i], fp);
- for (i = 0; i < typecnt; ++i)
- if (writetype[i])
- putc(ttisgmts[i], fp);
- }
- fprintf(fp, "\n%s\n", string);
- close_file(fp, fullname);
- free(ats);
- free(fullname);
-}
-
-static char const *
-abbroffset(char *buf, zic_t offset)
-{
- char sign = '+';
- int seconds, minutes;
-
- if (offset < 0) {
- offset = -offset;
- sign = '-';
- }
-
- seconds = offset % SECSPERMIN;
- offset /= SECSPERMIN;
- minutes = offset % MINSPERHOUR;
- offset /= MINSPERHOUR;
- if (100 <= offset) {
- error(_("%%z UTC offset magnitude exceeds 99:59:59"));
- return "%z";
- } else {
- char *p = buf;
- *p++ = sign;
- *p++ = '0' + offset / 10;
- *p++ = '0' + offset % 10;
- if (minutes | seconds) {
- *p++ = '0' + minutes / 10;
- *p++ = '0' + minutes % 10;
- if (seconds) {
- *p++ = '0' + seconds / 10;
- *p++ = '0' + seconds % 10;
- }
- }
- *p = '\0';
- return buf;
- }
-}
-
-static size_t
-doabbr(char *abbr, struct zone const *zp, char const *letters,
- zic_t stdoff, bool doquotes)
-{
- register char * cp;
- register char * slashp;
- register size_t len;
- char const *format = zp->z_format;
-
- slashp = strchr(format, '/');
- if (slashp == NULL) {
- char letterbuf[PERCENT_Z_LEN_BOUND + 1];
- if (zp->z_format_specifier == 'z')
- letters = abbroffset(letterbuf, zp->z_gmtoff + stdoff);
- else if (!letters)
- letters = "%s";
- sprintf(abbr, format, letters);
- } else if (stdoff != 0) {
- strcpy(abbr, slashp + 1);
- } else {
- memcpy(abbr, format, slashp - format);
- abbr[slashp - format] = '\0';
- }
- len = strlen(abbr);
- if (!doquotes)
- return len;
- for (cp = abbr; is_alpha(*cp); cp++)
- continue;
- if (len > 0 && *cp == '\0')
- return len;
- abbr[len + 2] = '\0';
- abbr[len + 1] = '>';
- memmove(abbr + 1, abbr, len);
- abbr[0] = '<';
- return len + 2;
-}
-
-static void
-updateminmax(const zic_t x)
-{
- if (min_year > x)
- min_year = x;
- if (max_year < x)
- max_year = x;
-}
-
-static int
-stringoffset(char *result, zic_t offset)
-{
- register int hours;
- register int minutes;
- register int seconds;
- bool negative = offset < 0;
- int len = negative;
-
- if (negative) {
- offset = -offset;
- result[0] = '-';
- }
- seconds = offset % SECSPERMIN;
- offset /= SECSPERMIN;
- minutes = offset % MINSPERHOUR;
- offset /= MINSPERHOUR;
- hours = offset;
- if (hours >= HOURSPERDAY * DAYSPERWEEK) {
- result[0] = '\0';
- return 0;
- }
- len += sprintf(result + len, "%d", hours);
- if (minutes != 0 || seconds != 0) {
- len += sprintf(result + len, ":%02d", minutes);
- if (seconds != 0)
- len += sprintf(result + len, ":%02d", seconds);
- }
- return len;
-}
-
-static int
-stringrule(char *result, const struct rule *const rp, const zic_t dstoff,
- const zic_t gmtoff)
-{
- register zic_t tod = rp->r_tod;
- register int compat = 0;
-
- if (rp->r_dycode == DC_DOM) {
- register int month, total;
-
- if (rp->r_dayofmonth == 29 && rp->r_month == TM_FEBRUARY)
- return -1;
- total = 0;
- for (month = 0; month < rp->r_month; ++month)
- total += len_months[0][month];
- /* Omit the "J" in Jan and Feb, as that's shorter. */
- if (rp->r_month <= 1)
- result += sprintf(result, "%d", total + rp->r_dayofmonth - 1);
- else
- result += sprintf(result, "J%d", total + rp->r_dayofmonth);
- } else {
- register int week;
- register int wday = rp->r_wday;
- register int wdayoff;
-
- if (rp->r_dycode == DC_DOWGEQ) {
- wdayoff = (rp->r_dayofmonth - 1) % DAYSPERWEEK;
- if (wdayoff)
- compat = 2013;
- wday -= wdayoff;
- tod += wdayoff * SECSPERDAY;
- week = 1 + (rp->r_dayofmonth - 1) / DAYSPERWEEK;
- } else if (rp->r_dycode == DC_DOWLEQ) {
- if (rp->r_dayofmonth == len_months[1][rp->r_month])
- week = 5;
- else {
- wdayoff = rp->r_dayofmonth % DAYSPERWEEK;
- if (wdayoff)
- compat = 2013;
- wday -= wdayoff;
- tod += wdayoff * SECSPERDAY;
- week = rp->r_dayofmonth / DAYSPERWEEK;
- }
- } else return -1; /* "cannot happen" */
- if (wday < 0)
- wday += DAYSPERWEEK;
- result += sprintf(result, "M%d.%d.%d",
- rp->r_month + 1, week, wday);
- }
- if (rp->r_todisgmt)
- tod += gmtoff;
- if (rp->r_todisstd && rp->r_stdoff == 0)
- tod += dstoff;
- if (tod != 2 * SECSPERMIN * MINSPERHOUR) {
- *result++ = '/';
- if (! stringoffset(result, tod))
- return -1;
- if (tod < 0) {
- if (compat < 2013)
- compat = 2013;
- } else if (SECSPERDAY <= tod) {
- if (compat < 1994)
- compat = 1994;
- }
- }
- return compat;
-}
-
-static int
-rule_cmp(struct rule const *a, struct rule const *b)
-{
- if (!a)
- return -!!b;
- if (!b)
- return 1;
- if (a->r_hiyear != b->r_hiyear)
- return a->r_hiyear < b->r_hiyear ? -1 : 1;
- if (a->r_month - b->r_month != 0)
- return a->r_month - b->r_month;
- return a->r_dayofmonth - b->r_dayofmonth;
-}
-
-enum { YEAR_BY_YEAR_ZONE = 1 };
-
-static int
-stringzone(char *result, const struct zone *const zpfirst, const int zonecount)
-{
- register const struct zone * zp;
- register struct rule * rp;
- register struct rule * stdrp;
- register struct rule * dstrp;
- register int i;
- register const char * abbrvar;
- register int compat = 0;
- register int c;
- size_t len;
- int offsetlen;
- struct rule stdr, dstr;
-
- result[0] = '\0';
- zp = zpfirst + zonecount - 1;
- stdrp = dstrp = NULL;
- for (i = 0; i < zp->z_nrules; ++i) {
- rp = &zp->z_rules[i];
- if (rp->r_hiwasnum || rp->r_hiyear != ZIC_MAX)
- continue;
- if (rp->r_yrtype != NULL)
- continue;
- if (rp->r_stdoff == 0) {
- if (stdrp == NULL)
- stdrp = rp;
- else return -1;
- } else {
- if (dstrp == NULL)
- dstrp = rp;
- else return -1;
- }
- }
- if (stdrp == NULL && dstrp == NULL) {
- /*
- ** There are no rules running through "max".
- ** Find the latest std rule in stdabbrrp
- ** and latest rule of any type in stdrp.
- */
- register struct rule *stdabbrrp = NULL;
- for (i = 0; i < zp->z_nrules; ++i) {
- rp = &zp->z_rules[i];
- if (rp->r_stdoff == 0 && rule_cmp(stdabbrrp, rp) < 0)
- stdabbrrp = rp;
- if (rule_cmp(stdrp, rp) < 0)
- stdrp = rp;
- }
- /*
- ** Horrid special case: if year is 2037,
- ** presume this is a zone handled on a year-by-year basis;
- ** do not try to apply a rule to the zone.
- */
- if (stdrp != NULL && stdrp->r_hiyear == 2037)
- return YEAR_BY_YEAR_ZONE;
-
- if (stdrp != NULL && stdrp->r_stdoff != 0) {
- /* Perpetual DST. */
- dstr.r_month = TM_JANUARY;
- dstr.r_dycode = DC_DOM;
- dstr.r_dayofmonth = 1;
- dstr.r_tod = 0;
- dstr.r_todisstd = dstr.r_todisgmt = false;
- dstr.r_stdoff = stdrp->r_stdoff;
- dstr.r_abbrvar = stdrp->r_abbrvar;
- stdr.r_month = TM_DECEMBER;
- stdr.r_dycode = DC_DOM;
- stdr.r_dayofmonth = 31;
- stdr.r_tod = SECSPERDAY + stdrp->r_stdoff;
- stdr.r_todisstd = stdr.r_todisgmt = false;
- stdr.r_stdoff = 0;
- stdr.r_abbrvar
- = (stdabbrrp ? stdabbrrp->r_abbrvar : "");
- dstrp = &dstr;
- stdrp = &stdr;
- }
- }
- if (stdrp == NULL && (zp->z_nrules != 0 || zp->z_stdoff != 0))
- return -1;
- abbrvar = (stdrp == NULL) ? "" : stdrp->r_abbrvar;
- len = doabbr(result, zp, abbrvar, 0, true);
- offsetlen = stringoffset(result + len, -zp->z_gmtoff);
- if (! offsetlen) {
- result[0] = '\0';
- return -1;
- }
- len += offsetlen;
- if (dstrp == NULL)
- return compat;
- len += doabbr(result + len, zp, dstrp->r_abbrvar, dstrp->r_stdoff, true);
- if (dstrp->r_stdoff != SECSPERMIN * MINSPERHOUR) {
- offsetlen = stringoffset(result + len,
- -(zp->z_gmtoff + dstrp->r_stdoff));
- if (! offsetlen) {
- result[0] = '\0';
- return -1;
- }
- len += offsetlen;
- }
- result[len++] = ',';
- c = stringrule(result + len, dstrp, dstrp->r_stdoff, zp->z_gmtoff);
- if (c < 0) {
- result[0] = '\0';
- return -1;
- }
- if (compat < c)
- compat = c;
- len += strlen(result + len);
- result[len++] = ',';
- c = stringrule(result + len, stdrp, dstrp->r_stdoff, zp->z_gmtoff);
- if (c < 0) {
- result[0] = '\0';
- return -1;
- }
- if (compat < c)
- compat = c;
- return compat;
-}
-
-static void
-outzone(const struct zone *zpfirst, int zonecount)
-{
- register const struct zone * zp;
- register struct rule * rp;
- register int i, j;
- register bool usestart, useuntil;
- register zic_t starttime, untiltime;
- register zic_t gmtoff;
- register zic_t stdoff;
- register zic_t year;
- register zic_t startoff;
- register bool startttisstd;
- register bool startttisgmt;
- register int type;
- register char * startbuf;
- register char * ab;
- register char * envvar;
- register int max_abbr_len;
- register int max_envvar_len;
- register bool prodstic; /* all rules are min to max */
- register int compat;
- register bool do_extend;
- register char version;
-
- max_abbr_len = 2 + max_format_len + max_abbrvar_len;
- max_envvar_len = 2 * max_abbr_len + 5 * 9;
- startbuf = emalloc(max_abbr_len + 1);
- ab = emalloc(max_abbr_len + 1);
- envvar = emalloc(max_envvar_len + 1);
- INITIALIZE(untiltime);
- INITIALIZE(starttime);
- /*
- ** Now. . .finally. . .generate some useful data!
- */
- timecnt = 0;
- typecnt = 0;
- charcnt = 0;
- prodstic = zonecount == 1;
- /*
- ** Thanks to Earl Chew
- ** for noting the need to unconditionally initialize startttisstd.
- */
- startttisstd = false;
- startttisgmt = false;
- min_year = max_year = EPOCH_YEAR;
- if (leapseen) {
- updateminmax(leapminyear);
- updateminmax(leapmaxyear + (leapmaxyear < ZIC_MAX));
- }
- for (i = 0; i < zonecount; ++i) {
- zp = &zpfirst[i];
- if (i < zonecount - 1)
- updateminmax(zp->z_untilrule.r_loyear);
- for (j = 0; j < zp->z_nrules; ++j) {
- rp = &zp->z_rules[j];
- if (rp->r_lowasnum)
- updateminmax(rp->r_loyear);
- if (rp->r_hiwasnum)
- updateminmax(rp->r_hiyear);
- if (rp->r_lowasnum || rp->r_hiwasnum)
- prodstic = false;
- }
- }
- /*
- ** Generate lots of data if a rule can't cover all future times.
- */
- compat = stringzone(envvar, zpfirst, zonecount);
- version = compat < 2013 ? ZIC_VERSION_PRE_2013 : ZIC_VERSION;
- do_extend = compat < 0 || compat == YEAR_BY_YEAR_ZONE;
- if (noise) {
- if (!*envvar)
- warning("%s %s",
- _("no POSIX environment variable for zone"),
- zpfirst->z_name);
- else if (compat != 0 && compat != YEAR_BY_YEAR_ZONE) {
- /* Circa-COMPAT clients, and earlier clients, might
- not work for this zone when given dates before
- 1970 or after 2038. */
- warning(_("%s: pre-%d clients may mishandle"
- " distant timestamps"),
- zpfirst->z_name, compat);
- }
- }
- if (do_extend) {
- /*
- ** Search through a couple of extra years past the obvious
- ** 400, to avoid edge cases. For example, suppose a non-POSIX
- ** rule applies from 2012 onwards and has transitions in March
- ** and September, plus some one-off transitions in November
- ** 2013. If zic looked only at the last 400 years, it would
- ** set max_year=2413, with the intent that the 400 years 2014
- ** through 2413 will be repeated. The last transition listed
- ** in the tzfile would be in 2413-09, less than 400 years
- ** after the last one-off transition in 2013-11. Two years
- ** might be overkill, but with the kind of edge cases
- ** available we're not sure that one year would suffice.
- */
- enum { years_of_observations = YEARSPERREPEAT + 2 };
-
- if (min_year >= ZIC_MIN + years_of_observations)
- min_year -= years_of_observations;
- else min_year = ZIC_MIN;
- if (max_year <= ZIC_MAX - years_of_observations)
- max_year += years_of_observations;
- else max_year = ZIC_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 + years_of_observations;
- }
- }
- /*
- ** For the benefit of older systems,
- ** generate data from 1900 through 2037.
- */
- if (min_year > 1900)
- min_year = 1900;
- if (max_year < 2037)
- max_year = 2037;
- for (i = 0; i < zonecount; ++i) {
- /*
- ** A guess that may well be corrected later.
- */
- stdoff = 0;
- zp = &zpfirst[i];
- usestart = i > 0 && (zp - 1)->z_untiltime > early_time;
- useuntil = i < (zonecount - 1);
- if (useuntil && zp->z_untiltime <= early_time)
- continue;
- gmtoff = zp->z_gmtoff;
- eat(zp->z_filename, zp->z_linenum);
- *startbuf = '\0';
- startoff = zp->z_gmtoff;
- if (zp->z_nrules == 0) {
- stdoff = zp->z_stdoff;
- doabbr(startbuf, zp, NULL, stdoff, false);
- type = addtype(oadd(zp->z_gmtoff, stdoff),
- startbuf, stdoff != 0, startttisstd,
- startttisgmt);
- if (usestart) {
- addtt(starttime, type);
- usestart = false;
- } else addtt(early_time, type);
- } else for (year = min_year; year <= max_year; ++year) {
- if (useuntil && year > zp->z_untilrule.r_hiyear)
- break;
- /*
- ** Mark which rules to do in the current year.
- ** For those to do, calculate rpytime(rp, year);
- */
- for (j = 0; j < zp->z_nrules; ++j) {
- rp = &zp->z_rules[j];
- eats(zp->z_filename, zp->z_linenum,
- rp->r_filename, rp->r_linenum);
- rp->r_todo = year >= rp->r_loyear &&
- year <= rp->r_hiyear &&
- yearistype(year, rp->r_yrtype);
- if (rp->r_todo)
- rp->r_temp = rpytime(rp, year);
- }
- for ( ; ; ) {
- register int k;
- register zic_t jtime, ktime;
- register zic_t offset;
-
- INITIALIZE(ktime);
- if (useuntil) {
- /*
- ** Turn untiltime into UT
- ** assuming the current gmtoff and
- ** stdoff values.
- */
- untiltime = zp->z_untiltime;
- if (!zp->z_untilrule.r_todisgmt)
- untiltime = tadd(untiltime,
- -gmtoff);
- if (!zp->z_untilrule.r_todisstd)
- untiltime = tadd(untiltime,
- -stdoff);
- }
- /*
- ** Find the rule (of those to do, if any)
- ** that takes effect earliest in the year.
- */
- k = -1;
- for (j = 0; j < zp->z_nrules; ++j) {
- rp = &zp->z_rules[j];
- if (!rp->r_todo)
- continue;
- eats(zp->z_filename, zp->z_linenum,
- rp->r_filename, rp->r_linenum);
- offset = rp->r_todisgmt ? 0 : gmtoff;
- if (!rp->r_todisstd)
- offset = oadd(offset, stdoff);
- jtime = rp->r_temp;
- if (jtime == min_time ||
- jtime == max_time)
- continue;
- jtime = tadd(jtime, -offset);
- if (k < 0 || jtime < ktime) {
- k = j;
- ktime = jtime;
- } else if (jtime == ktime) {
- char const *dup_rules_msg =
- _("two rules for same instant");
- eats(zp->z_filename, zp->z_linenum,
- rp->r_filename, rp->r_linenum);
- warning("%s", dup_rules_msg);
- rp = &zp->z_rules[k];
- eats(zp->z_filename, zp->z_linenum,
- rp->r_filename, rp->r_linenum);
- error("%s", dup_rules_msg);
- }
- }
- if (k < 0)
- break; /* go on to next year */
- rp = &zp->z_rules[k];
- rp->r_todo = false;
- if (useuntil && ktime >= untiltime)
- break;
- stdoff = rp->r_stdoff;
- if (usestart && ktime == starttime)
- usestart = false;
- if (usestart) {
- if (ktime < starttime) {
- startoff = oadd(zp->z_gmtoff,
- stdoff);
- doabbr(startbuf, zp,
- rp->r_abbrvar,
- rp->r_stdoff,
- false);
- continue;
- }
- if (*startbuf == '\0' &&
- startoff == oadd(zp->z_gmtoff,
- stdoff)) {
- doabbr(startbuf,
- zp,
- rp->r_abbrvar,
- rp->r_stdoff,
- false);
- }
- }
- eats(zp->z_filename, zp->z_linenum,
- rp->r_filename, rp->r_linenum);
- doabbr(ab, zp, rp->r_abbrvar,
- rp->r_stdoff, false);
- offset = oadd(zp->z_gmtoff, rp->r_stdoff);
- type = addtype(offset, ab, rp->r_stdoff != 0,
- rp->r_todisstd, rp->r_todisgmt);
- addtt(ktime, type);
- }
- }
- if (usestart) {
- if (*startbuf == '\0' &&
- zp->z_format != NULL &&
- strchr(zp->z_format, '%') == NULL &&
- strchr(zp->z_format, '/') == NULL)
- strcpy(startbuf, zp->z_format);
- eat(zp->z_filename, zp->z_linenum);
- if (*startbuf == '\0')
-error(_("can't determine time zone abbreviation to use just after until time"));
- else addtt(starttime,
- addtype(startoff, startbuf,
- startoff != zp->z_gmtoff,
- startttisstd,
- startttisgmt));
- }
- /*
- ** Now we may get to set starttime for the next zone line.
- */
- if (useuntil) {
- startttisstd = zp->z_untilrule.r_todisstd;
- startttisgmt = zp->z_untilrule.r_todisgmt;
- starttime = zp->z_untiltime;
- if (!startttisstd)
- starttime = tadd(starttime, -stdoff);
- if (!startttisgmt)
- starttime = tadd(starttime, -gmtoff);
- }
- }
- if (do_extend) {
- /*
- ** If we're extending the explicitly listed observations
- ** for 400 years because we can't fill the POSIX-TZ field,
- ** check whether we actually ended up explicitly listing
- ** observations through that period. If there aren't any
- ** near the end of the 400-year period, add a redundant
- ** one at the end of the final year, to make it clear
- ** that we are claiming to have definite knowledge of
- ** the lack of transitions up to that point.
- */
- struct rule xr;
- struct attype *lastat;
- xr.r_month = TM_JANUARY;
- xr.r_dycode = DC_DOM;
- xr.r_dayofmonth = 1;
- xr.r_tod = 0;
- for (lastat = &attypes[0], i = 1; i < timecnt; i++)
- if (attypes[i].at > lastat->at)
- lastat = &attypes[i];
- if (lastat->at < rpytime(&xr, max_year - 1)) {
- /*
- ** Create new type code for the redundant entry,
- ** to prevent it being optimized away.
- */
- if (typecnt >= TZ_MAX_TYPES) {
- error(_("too many local time types"));
- exit(EXIT_FAILURE);
- }
- gmtoffs[typecnt] = gmtoffs[lastat->type];
- isdsts[typecnt] = isdsts[lastat->type];
- ttisstds[typecnt] = ttisstds[lastat->type];
- ttisgmts[typecnt] = ttisgmts[lastat->type];
- abbrinds[typecnt] = abbrinds[lastat->type];
- ++typecnt;
- addtt(rpytime(&xr, max_year + 1), typecnt-1);
- }
- }
- writezone(zpfirst->z_name, envvar, version);
- free(startbuf);
- free(ab);
- free(envvar);
-}
-
-static void
-addtt(zic_t starttime, int type)
-{
- if (starttime <= early_time
- || (timecnt == 1 && attypes[0].at < early_time)) {
- gmtoffs[0] = gmtoffs[type];
- isdsts[0] = isdsts[type];
- ttisstds[0] = ttisstds[type];
- ttisgmts[0] = ttisgmts[type];
- if (abbrinds[type] != 0)
- strcpy(chars, &chars[abbrinds[type]]);
- abbrinds[0] = 0;
- charcnt = strlen(chars) + 1;
- typecnt = 1;
- timecnt = 0;
- type = 0;
- }
- attypes = growalloc(attypes, sizeof *attypes, timecnt, &timecnt_alloc);
- attypes[timecnt].at = starttime;
- attypes[timecnt].type = type;
- ++timecnt;
-}
-
-static int
-addtype(zic_t gmtoff, char const *abbr, bool isdst, bool ttisstd, bool ttisgmt)
-{
- register int i, j;
-
- /*
- ** See if there's already an entry for this zone type.
- ** If so, just return its index.
- */
- for (i = 0; i < typecnt; ++i) {
- if (gmtoff == gmtoffs[i] && isdst == isdsts[i] &&
- strcmp(abbr, &chars[abbrinds[i]]) == 0 &&
- ttisstd == ttisstds[i] &&
- ttisgmt == ttisgmts[i])
- return i;
- }
- /*
- ** There isn't one; add a new one, unless there are already too
- ** many.
- */
- if (typecnt >= TZ_MAX_TYPES) {
- error(_("too many local time types"));
- exit(EXIT_FAILURE);
- }
- if (! (-1L - 2147483647L <= gmtoff && gmtoff <= 2147483647L)) {
- error(_("UT offset out of range"));
- exit(EXIT_FAILURE);
- }
- gmtoffs[i] = gmtoff;
- isdsts[i] = isdst;
- ttisstds[i] = ttisstd;
- ttisgmts[i] = ttisgmt;
-
- for (j = 0; j < charcnt; ++j)
- if (strcmp(&chars[j], abbr) == 0)
- break;
- if (j == charcnt)
- newabbr(abbr);
- abbrinds[i] = j;
- ++typecnt;
- return i;
-}
-
-static void
-leapadd(zic_t t, bool positive, int rolling, int count)
-{
- register int i, j;
-
- if (leapcnt + (positive ? count : 1) > TZ_MAX_LEAPS) {
- error(_("too many leap seconds"));
- exit(EXIT_FAILURE);
- }
- for (i = 0; i < leapcnt; ++i)
- if (t <= trans[i]) {
- if (t == trans[i]) {
- error(_("repeated leap second moment"));
- exit(EXIT_FAILURE);
- }
- break;
- }
- do {
- for (j = leapcnt; j > i; --j) {
- trans[j] = trans[j - 1];
- corr[j] = corr[j - 1];
- roll[j] = roll[j - 1];
- }
- trans[i] = t;
- corr[i] = positive ? 1 : -count;
- roll[i] = rolling;
- ++leapcnt;
- } while (positive && --count != 0);
-}
-
-static void
-adjleap(void)
-{
- register int i;
- register zic_t last = 0;
-
- /*
- ** propagate leap seconds forward
- */
- for (i = 0; i < leapcnt; ++i) {
- trans[i] = tadd(trans[i], last);
- last = corr[i] += last;
- }
-}
-
-static bool
-yearistype(int year, const char *type)
-{
- static char * buf;
- int result;
-
- if (type == NULL || *type == '\0')
- return true;
- buf = erealloc(buf, 132 + strlen(yitcommand) + strlen(type));
- sprintf(buf, "%s %d %s", yitcommand, year, type);
- result = system(buf);
- if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
- case 0:
- return true;
- case 1:
- return false;
- }
- error(_("Wild result from command execution"));
- fprintf(stderr, _("%s: command was '%s', result was %d\n"),
- progname, buf, result);
- for ( ; ; )
- exit(EXIT_FAILURE);
-}
-
-/* Is A a space character in the C locale? */
-static bool
-is_space(char a)
-{
- switch (a) {
- default:
- return false;
- case ' ': case '\f': case '\n': case '\r': case '\t': case '\v':
- return true;
- }
-}
-
-/* Is A an alphabetic character in the C locale? */
-static bool
-is_alpha(char a)
-{
- switch (a) {
- default:
- return false;
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
- case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
- case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
- case 'V': case 'W': case 'X': case 'Y': case 'Z':
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
- case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
- case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
- case 'v': case 'w': case 'x': case 'y': case 'z':
- return true;
- }
-}
-
-/* If A is an uppercase character in the C locale, return its lowercase
- counterpart. Otherwise, return A. */
-static char
-lowerit(char a)
-{
- switch (a) {
- default: return a;
- case 'A': return 'a'; case 'B': return 'b'; case 'C': return 'c';
- case 'D': return 'd'; case 'E': return 'e'; case 'F': return 'f';
- case 'G': return 'g'; case 'H': return 'h'; case 'I': return 'i';
- case 'J': return 'j'; case 'K': return 'k'; case 'L': return 'l';
- case 'M': return 'm'; case 'N': return 'n'; case 'O': return 'o';
- case 'P': return 'p'; case 'Q': return 'q'; case 'R': return 'r';
- case 'S': return 's'; case 'T': return 't'; case 'U': return 'u';
- case 'V': return 'v'; case 'W': return 'w'; case 'X': return 'x';
- case 'Y': return 'y'; case 'Z': return 'z';
- }
-}
-
-/* case-insensitive equality */
-static ATTRIBUTE_PURE bool
-ciequal(register const char *ap, register const char *bp)
-{
- while (lowerit(*ap) == lowerit(*bp++))
- if (*ap++ == '\0')
- return true;
- return false;
-}
-
-static ATTRIBUTE_PURE bool
-itsabbr(register const char *abbr, register const char *word)
-{
- if (lowerit(*abbr) != lowerit(*word))
- return false;
- ++word;
- while (*++abbr != '\0')
- do {
- if (*word == '\0')
- return false;
- } while (lowerit(*word++) != lowerit(*abbr));
- return true;
-}
-
-static ATTRIBUTE_PURE const struct lookup *
-byword(const char *word, const struct lookup *table)
-{
- register const struct lookup * foundlp;
- register const struct lookup * lp;
-
- if (word == NULL || table == NULL)
- return NULL;
- /*
- ** Look for exact match.
- */
- for (lp = table; lp->l_word != NULL; ++lp)
- if (ciequal(word, lp->l_word))
- return lp;
- /*
- ** Look for inexact match.
- */
- foundlp = NULL;
- for (lp = table; lp->l_word != NULL; ++lp)
- if (itsabbr(word, lp->l_word)) {
- if (foundlp == NULL)
- foundlp = lp;
- else return NULL; /* multiple inexact matches */
- }
- return foundlp;
-}
-
-static char **
-getfields(register char *cp)
-{
- register char * dp;
- register char ** array;
- register int nsubs;
-
- if (cp == NULL)
- return NULL;
- array = emalloc(size_product(strlen(cp) + 1, sizeof *array));
- nsubs = 0;
- for ( ; ; ) {
- while (is_space(*cp))
- ++cp;
- if (*cp == '\0' || *cp == '#')
- break;
- array[nsubs++] = dp = cp;
- do {
- if ((*dp = *cp++) != '"')
- ++dp;
- else while ((*dp = *cp++) != '"')
- if (*dp != '\0')
- ++dp;
- else {
- error(_(
- "Odd number of quotation marks"
- ));
- exit(1);
- }
- } while (*cp && *cp != '#' && !is_space(*cp));
- if (is_space(*cp))
- ++cp;
- *dp = '\0';
- }
- array[nsubs] = NULL;
- return array;
-}
-
-static _Noreturn void
-time_overflow(void)
-{
- error(_("time overflow"));
- exit(EXIT_FAILURE);
-}
-
-static ATTRIBUTE_PURE zic_t
-oadd(zic_t t1, zic_t t2)
-{
- if (t1 < 0 ? t2 < ZIC_MIN - t1 : ZIC_MAX - t1 < t2)
- time_overflow();
- return t1 + t2;
-}
-
-static ATTRIBUTE_PURE zic_t
-tadd(zic_t t1, zic_t t2)
-{
- if (t1 < 0) {
- if (t2 < min_time - t1) {
- if (t1 != min_time)
- time_overflow();
- return min_time;
- }
- } else {
- if (max_time - t1 < t2) {
- if (t1 != max_time)
- time_overflow();
- return max_time;
- }
- }
- return t1 + t2;
-}
-
-/*
-** Given a rule, and a year, compute the date (in seconds since January 1,
-** 1970, 00:00 LOCAL time) in that year that the rule refers to.
-*/
-
-static zic_t
-rpytime(const struct rule *rp, zic_t wantedy)
-{
- register int m, i;
- register zic_t dayoff; /* with a nod to Margaret O. */
- register zic_t t, y;
-
- if (wantedy == ZIC_MIN)
- return min_time;
- if (wantedy == ZIC_MAX)
- return max_time;
- dayoff = 0;
- m = TM_JANUARY;
- y = EPOCH_YEAR;
- while (wantedy != y) {
- if (wantedy > y) {
- i = len_years[isleap(y)];
- ++y;
- } else {
- --y;
- i = -len_years[isleap(y)];
- }
- dayoff = oadd(dayoff, i);
- }
- while (m != rp->r_month) {
- i = len_months[isleap(y)][m];
- dayoff = oadd(dayoff, i);
- ++m;
- }
- i = rp->r_dayofmonth;
- if (m == TM_FEBRUARY && i == 29 && !isleap(y)) {
- if (rp->r_dycode == DC_DOWLEQ)
- --i;
- else {
- error(_("use of 2/29 in non leap-year"));
- exit(EXIT_FAILURE);
- }
- }
- --i;
- dayoff = oadd(dayoff, i);
- if (rp->r_dycode == DC_DOWGEQ || rp->r_dycode == DC_DOWLEQ) {
- register zic_t wday;
-
-#define LDAYSPERWEEK ((zic_t) DAYSPERWEEK)
- wday = EPOCH_WDAY;
- /*
- ** Don't trust mod of negative numbers.
- */
- if (dayoff >= 0)
- wday = (wday + dayoff) % LDAYSPERWEEK;
- else {
- wday -= ((-dayoff) % LDAYSPERWEEK);
- if (wday < 0)
- wday += LDAYSPERWEEK;
- }
- while (wday != rp->r_wday)
- if (rp->r_dycode == DC_DOWGEQ) {
- dayoff = oadd(dayoff, 1);
- if (++wday >= LDAYSPERWEEK)
- wday = 0;
- ++i;
- } else {
- dayoff = oadd(dayoff, -1);
- if (--wday < 0)
- wday = LDAYSPERWEEK - 1;
- --i;
- }
- if (i < 0 || i >= len_months[isleap(y)][m]) {
- if (noise)
- warning(_("rule goes past start/end of month; \
-will not work with pre-2004 versions of zic"));
- }
- }
- if (dayoff < min_time / SECSPERDAY)
- return min_time;
- if (dayoff > max_time / SECSPERDAY)
- return max_time;
- t = (zic_t) dayoff * SECSPERDAY;
- return tadd(t, rp->r_tod);
-}
-
-static void
-newabbr(const char *string)
-{
- register int i;
-
- if (strcmp(string, GRANDPARENTED) != 0) {
- register const char * cp;
- const char * mp;
-
- cp = string;
- mp = NULL;
- while (is_alpha(*cp) || ('0' <= *cp && *cp <= '9')
- || *cp == '-' || *cp == '+')
- ++cp;
- if (noise && cp - string < 3)
- mp = _("time zone abbreviation has fewer than 3 characters");
- if (cp - string > ZIC_MAX_ABBR_LEN_WO_WARN)
- mp = _("time zone abbreviation has too many characters");
- if (*cp != '\0')
-mp = _("time zone abbreviation differs from POSIX standard");
- if (mp != NULL)
- warning("%s (%s)", mp, string);
- }
- i = strlen(string) + 1;
- if (charcnt + i > TZ_MAX_CHARS) {
- error(_("too many, or too long, time zone abbreviations"));
- exit(EXIT_FAILURE);
- }
- strcpy(&chars[charcnt], string);
- charcnt += i;
-}
-
-static bool
-mkdirs(char *argname)
-{
- register char * name;
- register char * cp;
-
- if (argname == NULL || *argname == '\0')
- return true;
- cp = name = ecpyalloc(argname);
- while ((cp = strchr(cp + 1, '/')) != 0) {
- *cp = '\0';
-#ifdef HAVE_DOS_FILE_NAMES
- /*
- ** DOS drive specifier?
- */
- if (is_alpha(name[0]) && name[1] == ':' && name[2] == '\0') {
- *cp = '/';
- continue;
- }
-#endif
- /*
- ** Try to create it. It's OK if creation fails because
- ** the directory already exists, perhaps because some
- ** other process just created it.
- */
- if (mkdir(name, MKDIR_UMASK) != 0) {
- int err = errno;
- if (itsdir(name) <= 0) {
- char const *e = strerror(err);
- warning(_("%s: Can't create directory"
- " %s: %s"),
- progname, name, e);
- free(name);
- return false;
- }
- }
- *cp = '/';
- }
- free(name);
- return true;
-}
Deleted: vendor/tzcode/dist/zoneinfo2tdf.pl
===================================================================
--- vendor/tzcode/dist/zoneinfo2tdf.pl 2018-06-19 14:20:20 UTC (rev 11083)
+++ vendor/tzcode/dist/zoneinfo2tdf.pl 2018-06-19 14:22:45 UTC (rev 11084)
@@ -1,52 +0,0 @@
-#! /usr/bin/perl -w
-
-# Courtesy Ken Pizzini.
-
-use strict;
-
-#This file released to the public domain.
-
-#Note: error checking is poor --- only trust the output if the input
-#has been checked by zic.
-
-my $contZone = '';
-while (<>) {
- my $origline = $_;
- my @fields = ();
- while (s/^\s*((?:"[^"]*"|[^\s#])+)//) {
- push @fields, $1;
- }
- next unless @fields;
-
- my $type = lc($fields[0]);
- if ($contZone) {
- @fields >= 3 or warn "bad continuation line";
- unshift @fields, '+', $contZone;
- $type = 'zone';
- }
-
- $contZone = '';
- if ($type eq 'zone') {
- # Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
- my $nfields = @fields;
- $nfields >= 5 or warn "bad zone line";
- if ($nfields > 6) {
- #this splice is optional, depending on one's preference
- #(one big date-time field, or componentized date and time):
- splice(@fields, 5, $nfields-5, "@fields[5..$nfields-1]");
- }
- $contZone = $fields[1] if @fields > 5;
- } elsif ($type eq 'rule') {
- # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
- @fields == 10 or warn "bad rule line";
- } elsif ($type eq 'link') {
- # Link LINK-FROM LINK-TO
- @fields == 3 or warn "bad link line";
- } elsif ($type eq 'leap') {
- # Leap YEAR MONTH DAY HH:MM:SS CORR R/S
- @fields == 7 or warn "bad leap line";
- } else {
- warn "Fubar at input line $.: $origline";
- }
- print join("\t", @fields), "\n";
-}
More information about the Midnightbsd-cvs
mailing list