Welcome to 2014c
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.)
This commit is contained in:
parent
02288fa1cd
commit
4df4d972d3
|
@ -6,7 +6,7 @@
|
|||
PACKAGE= tzcode
|
||||
|
||||
# Version numbers of the code and data distributions.
|
||||
VERSION= 2013i
|
||||
VERSION= 2014c
|
||||
|
||||
# Email address for bug reports.
|
||||
BUGEMAIL= tz@iana.org
|
||||
|
@ -137,7 +137,7 @@ GCC_DEBUG_FLAGS = -Dlint -g3 -O3 -fno-common -fstrict-aliasing \
|
|||
-Wbad-function-cast -Wcast-align -Wcast-qual \
|
||||
-Wformat=2 -Winit-self \
|
||||
-Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes \
|
||||
-Wnested-externs \
|
||||
-Wnested-externs -Wno-address -Wno-cast-qual \
|
||||
-Wno-format-nonliteral -Wno-sign-compare -Wno-sign-conversion \
|
||||
-Wno-type-limits \
|
||||
-Wno-unused-parameter -Woverlength-strings -Wpointer-arith \
|
||||
|
@ -247,14 +247,13 @@ AWK= awk
|
|||
# is typically nicer if it works.
|
||||
KSHELL= /bin/bash
|
||||
|
||||
# The path where SGML DTDs are kept.
|
||||
# The default is appropriate for Ubuntu 12.10.
|
||||
# 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
|
||||
|
||||
# The catalog file(s) to use when validating.
|
||||
SGML_CATALOG_FILES= HTML4.cat
|
||||
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
|
||||
|
@ -445,7 +444,7 @@ check_web: $(WEB_PAGES)
|
|||
|
||||
clean_misc:
|
||||
rm -f core *.o *.out \
|
||||
date tzselect version.h zdump zic yearistype
|
||||
date tzselect version.h zdump zic yearistype libtz.a
|
||||
clean: clean_misc
|
||||
rm -fr tzpublic
|
||||
|
||||
|
|
|
@ -1,5 +1,138 @@
|
|||
News for the tz database
|
||||
|
||||
|
||||
Release 2014c - 2014-05-13 07:44:13 -0700
|
||||
|
||||
Changes affecting near-future time stamps
|
||||
|
||||
Egypt observes DST starting May 15. (Thanks to Ahmad El-Dardiry.)
|
||||
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 forseeable 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 Jose Miguel Garrido.)
|
||||
|
||||
Paraguay's 2014 DST will be as predicted. (Thanks to Carlos Raul 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 is available in both XML and JSON form.
|
||||
|
||||
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 Jaeger.)
|
||||
|
||||
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:
|
||||
|
@ -29,6 +162,7 @@ Release 2013i - 2013-12-17 07:25:23 -0800
|
|||
|
||||
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:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: checktab.awk,v 1.6 2013/09/20 19:06:54 christos Exp $
|
||||
# $NetBSD: checktab.awk,v 1.7 2014/05/13 16:33:56 christos Exp $
|
||||
|
||||
# Check tz tables for consistency.
|
||||
|
||||
|
@ -117,10 +117,14 @@ BEGIN {
|
|||
FS = " "
|
||||
}
|
||||
|
||||
$1 ~ /^#/ { next }
|
||||
|
||||
{
|
||||
tz = ""
|
||||
if ($1 == "Zone") tz = $2
|
||||
if ($1 == "Link") {
|
||||
tz = rules = ""
|
||||
if ($1 == "Zone") {
|
||||
tz = $2
|
||||
ruleUsed[$4] = 1
|
||||
} else if ($1 == "Link") {
|
||||
# Ignore Link commands if source and destination basenames
|
||||
# are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
|
||||
src = $2
|
||||
|
@ -128,6 +132,10 @@ BEGIN {
|
|||
while ((i = index(src, "/"))) src = substr(src, i+1)
|
||||
while ((i = index(dst, "/"))) dst = substr(dst, i+1)
|
||||
if (src != dst) tz = $3
|
||||
} else if ($1 == "Rule") {
|
||||
ruleDefined[$2] = 1
|
||||
} else {
|
||||
ruleUsed[$2] = 1
|
||||
}
|
||||
if (tz && tz ~ /\//) {
|
||||
if (!tztab[tz]) {
|
||||
|
@ -140,6 +148,12 @@ BEGIN {
|
|||
}
|
||||
|
||||
END {
|
||||
for (tz in ruleDefined) {
|
||||
if (!ruleUsed[tz]) {
|
||||
printf "%s: Rule never used\n", tz
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
for (tz in tz2cc) {
|
||||
if (!zoneSeen[tz]) {
|
||||
printf "%s:%d: no Zone table for `%s'\n", \
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: localtime.c,v 1.81 2013/12/26 18:34:28 christos Exp $ */
|
||||
/* $NetBSD: localtime.c,v 1.82 2014/05/13 16:33:56 christos Exp $ */
|
||||
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
|
@ -10,7 +10,7 @@
|
|||
#if 0
|
||||
static char elsieid[] = "@(#)localtime.c 8.17";
|
||||
#else
|
||||
__RCSID("$NetBSD: localtime.c,v 1.81 2013/12/26 18:34:28 christos Exp $");
|
||||
__RCSID("$NetBSD: localtime.c,v 1.82 2014/05/13 16:33:56 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
@ -388,7 +388,7 @@ tzload(timezone_t sp, const char *name, const int doextend)
|
|||
} u_t;
|
||||
u_t * up;
|
||||
|
||||
up = calloc(1, sizeof *up);
|
||||
up = malloc(sizeof *up);
|
||||
if (up == NULL)
|
||||
return -1;
|
||||
|
||||
|
@ -1062,6 +1062,7 @@ tzparse(timezone_t sp, const char *name, const int lastditch)
|
|||
sp->ttis[1].tt_gmtoff = -stdoffset;
|
||||
sp->ttis[1].tt_isdst = 0;
|
||||
sp->ttis[1].tt_abbrind = 0;
|
||||
sp->defaulttype = 0;
|
||||
timecnt = 0;
|
||||
janfirst = 0;
|
||||
sp->timecnt = 0;
|
||||
|
@ -1189,6 +1190,7 @@ tzparse(timezone_t sp, const char *name, const int lastditch)
|
|||
sp->ttis[1].tt_isdst = TRUE;
|
||||
sp->ttis[1].tt_abbrind = (int)(stdlen + 1);
|
||||
sp->typecnt = 2;
|
||||
sp->defaulttype = 0;
|
||||
}
|
||||
} else {
|
||||
dstlen = 0;
|
||||
|
@ -1198,6 +1200,7 @@ tzparse(timezone_t sp, const char *name, const int lastditch)
|
|||
sp->ttis[0].tt_gmtoff = -stdoffset;
|
||||
sp->ttis[0].tt_isdst = 0;
|
||||
sp->ttis[0].tt_abbrind = 0;
|
||||
sp->defaulttype = 0;
|
||||
}
|
||||
sp->charcnt = (int)(stdlen + 1);
|
||||
if (dstlen != 0)
|
||||
|
@ -1225,7 +1228,7 @@ gmtload(timezone_t sp)
|
|||
timezone_t
|
||||
tzalloc(const char *name)
|
||||
{
|
||||
timezone_t sp = calloc(1, sizeof *sp);
|
||||
timezone_t sp = malloc(sizeof *sp);
|
||||
if (sp == NULL)
|
||||
return NULL;
|
||||
if (tzload(sp, name, TRUE) != 0) {
|
||||
|
@ -1251,7 +1254,7 @@ tzsetwall_unlocked(void)
|
|||
|
||||
if (lclptr == NULL) {
|
||||
int saveerrno = errno;
|
||||
lclptr = calloc(1, sizeof *lclptr);
|
||||
lclptr = malloc(sizeof *lclptr);
|
||||
errno = saveerrno;
|
||||
if (lclptr == NULL) {
|
||||
settzname(); /* all we can do */
|
||||
|
@ -1304,7 +1307,7 @@ tzset_unlocked(void)
|
|||
|
||||
if (lclptr == NULL) {
|
||||
int saveerrno = errno;
|
||||
lclptr = calloc(1, sizeof *lclptr);
|
||||
lclptr = malloc(sizeof *lclptr);
|
||||
errno = saveerrno;
|
||||
if (lclptr == NULL) {
|
||||
settzname(); /* all we can do */
|
||||
|
@ -1469,7 +1472,7 @@ gmtsub(const timezone_t sp, const time_t *const timep,
|
|||
int saveerrno;
|
||||
gmt_is_set = TRUE;
|
||||
saveerrno = errno;
|
||||
gmtptr = calloc(1, sizeof *gmtptr);
|
||||
gmtptr = malloc(sizeof *gmtptr);
|
||||
errno = saveerrno;
|
||||
if (gmtptr != NULL)
|
||||
gmtload(gmtptr);
|
||||
|
@ -1482,13 +1485,8 @@ gmtsub(const timezone_t sp, const time_t *const timep,
|
|||
** "UT+xxxx" or "UT-xxxx" if offset is non-zero,
|
||||
** but this is no time for a treasure hunt.
|
||||
*/
|
||||
if (offset != 0)
|
||||
tmp->TM_ZONE = (__aconst char *)__UNCONST(wildabbr);
|
||||
else {
|
||||
if (gmtptr == NULL)
|
||||
tmp->TM_ZONE = (__aconst char *)__UNCONST(gmt);
|
||||
else tmp->TM_ZONE = gmtptr->chars;
|
||||
}
|
||||
tmp->TM_ZONE = offset ? __UNCONST(wildabbr) : gmtptr ? gmtptr->chars :
|
||||
__UNCONST(gmt);
|
||||
#endif /* defined TM_ZONE */
|
||||
return result;
|
||||
}
|
||||
|
@ -2075,17 +2073,15 @@ time1(const timezone_t sp, struct tm *const tmp, subfun_t funcp,
|
|||
if (tmp->tm_isdst > 1)
|
||||
tmp->tm_isdst = 1;
|
||||
t = time2(sp, tmp, funcp, offset, &okay);
|
||||
#ifdef PCTS
|
||||
/*
|
||||
** PCTS code courtesy Grant Sullivan.
|
||||
*/
|
||||
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 */
|
||||
#endif /* defined PCTS */
|
||||
#ifndef PCTS
|
||||
if (okay || tmp->tm_isdst < 0)
|
||||
#else
|
||||
return t;
|
||||
#endif /* !defined PCTS */
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: private.h,v 1.32 2013/12/26 18:34:28 christos Exp $ */
|
||||
/* $NetBSD: private.h,v 1.33 2014/05/13 16:33:56 christos Exp $ */
|
||||
|
||||
#ifndef PRIVATE_H
|
||||
#define PRIVATE_H
|
||||
|
@ -132,8 +132,9 @@
|
|||
*/
|
||||
#ifndef HAVE_STDINT_H
|
||||
#define HAVE_STDINT_H \
|
||||
(199901 <= __STDC_VERSION__ || \
|
||||
2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
|
||||
(199901 <= __STDC_VERSION__ \
|
||||
|| 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
|
||||
|| __CYGWIN__)
|
||||
#endif /* !defined HAVE_STDINT_H */
|
||||
|
||||
#if HAVE_STDINT_H
|
||||
|
@ -217,6 +218,10 @@ typedef unsigned long uintmax_t;
|
|||
#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__))
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<meta http-equiv="Content-type" content='text/html; charset="US-ASCII"'>
|
||||
<meta name="DC.Creator" content="Eggert, Paul">
|
||||
<meta name="DC.Contributor" content="Olson, Arthur David">
|
||||
<meta name="DC.Date" content="2013-10-21">
|
||||
<meta name="DC.Date" content="2014-03-10">
|
||||
<meta name="DC.Description"
|
||||
content="Sources of information about time zones and daylight saving time">
|
||||
<meta name="DC.Identifier"
|
||||
|
@ -49,6 +49,7 @@ title="Berkeley Software Distribution">BSD</abbr></a>,
|
|||
<a href="http://cygwin.com/">Cygwin</a>,
|
||||
<a href="http://www.delorie.com/djgpp/"><abbr
|
||||
title="DJ's GNU Programming Platform">DJGPP</abbr></a>,
|
||||
<a href="http://en.wikipedia.org/wiki/Symbian">Symbian</a>,
|
||||
<a href="http://en.wikipedia.org/wiki/WebOS"><abbr
|
||||
title="Web Operating System">webOS</abbr></a>,
|
||||
<a href="http://ibm.com/aix"><abbr
|
||||
|
@ -56,7 +57,6 @@ title="Advanced Interactive eXecutive">AIX</abbr></a>,
|
|||
<a href="http://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://h71000.www7.hp.com/">Open<abbr
|
||||
title="Virtual Memory System">VMS</abbr></a>,
|
||||
<a href="http://oracle.com/database">Oracle Database</a>,
|
||||
|
@ -92,8 +92,10 @@ 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 are in <code>tzdata<var>D</var>.tar.gz</code>,
|
||||
where <code><var>D</var></code> is the data's version.
|
||||
Each version is a four-digit year followed by lower-case letters
|
||||
(a through z, then za through zz, then zza through zzz, and so on).
|
||||
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
|
||||
|
@ -106,10 +108,8 @@ 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 -
|
||||
<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>
|
||||
|
@ -138,8 +138,8 @@ and browse the <a
|
|||
href="http://mm.icann.org/pipermail/tz/">archive of old
|
||||
messages</a>. For further information about updates, please see
|
||||
<a href="http://tools.ietf.org/html/rfc6557">Procedures for
|
||||
Maintaining the Time Zone Database</a> (Internet <abbr title="Request
|
||||
For Comments">RFC</abbr> 6557).</p>
|
||||
Maintaining the Time Zone Database</a> (Internet <abbr
|
||||
title="Request For Comments">RFC</abbr> 6557).</p>
|
||||
<p>
|
||||
The Web has several other sources for time zone and daylight saving time data.
|
||||
Here are some links that may be of interest.
|
||||
|
@ -150,7 +150,8 @@ Here are some links that may be of interest.
|
|||
<a href="http://en.wikipedia.org/wiki/Tz_database">tz database</a> is
|
||||
an encyclopedic summary.</li>
|
||||
<li><a href="http://www.cstdbill.com/tzdb/tz-how-to.html">How to Read the
|
||||
tz Database Source Files</a> explains the tz database format.</li>
|
||||
tz Database Source Files</a> explains the <code><abbr>tz</abbr></code>
|
||||
database format.</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
|
||||
|
@ -161,6 +162,8 @@ database's style.</li>
|
|||
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="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>
|
||||
|
@ -170,30 +173,35 @@ 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.telfort.nl/~t876506/TZworld.html">Complete
|
||||
<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://timeanddate.com/worldclock/">The World Clock –
|
||||
Time Zones</a> lets you sort zone names and convert times.</li>
|
||||
<li><a href="http://permatime.com/">Permatime</a> generates and views
|
||||
links that refer to a particular point in time and can be displayed in
|
||||
multiple timezones.</li>
|
||||
<li><a href="http://daylight-savings-time.info/">Daylight Saving Time info</a>
|
||||
shows a graph of time
|
||||
difference versus time for any pair of locations.</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://worldtime.io/">worldtime.io</a>
|
||||
also contains data about time zone boundaries; it supports queries via place
|
||||
names and shows location maps.</li>
|
||||
<li><a href="http://simpletimerclocks.mozdev.org/">Simple Timer + Clocks</a>
|
||||
is a Firefox add-on which uses a timezone data file generated from the
|
||||
tz data files.</li>
|
||||
</ul>
|
||||
<h2>Other time zone database formats</h2>
|
||||
<ul>
|
||||
<li>The <a href="http://tools.ietf.org/html/rfc5545">
|
||||
Internet Calendaring and Scheduling Core Object Specification
|
||||
(iCalendar)</a>, Internet <abbr>RFC</abbr> 5445
|
||||
(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="http://tools.ietf.org/html/rfc6321">xCal</a>
|
||||
(Internet RFC 6321) uses
|
||||
<a href="http://www.w3.org/XML/"><abbr
|
||||
title="Extensible Markup Language">XML</abbr></a> format, and a draft variant
|
||||
<a href="http://datatracker.ietf.org/doc/draft-ietf-jcardcal-jcal/">jCal</a>
|
||||
uses <a href="http://www.json.org/"><abbr
|
||||
title="JavaScript Object Notation">JSON</abbr></a> format.
|
||||
<a href="http://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
|
||||
|
@ -250,6 +258,8 @@ Unicode (<abbr>ICU</abbr>)</a> contains C/C++ and <a
|
|||
href="http://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>
|
||||
|
@ -259,10 +269,12 @@ 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 API
|
||||
for .NET</a> is similar to Joda Time, but for the .NET framework
|
||||
instead of Java. It is freely available under the
|
||||
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License</a>.</li>
|
||||
<li><a href="http://nodatime.org/">Noda Time – Date and time API 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://github.com/mde/timezone-js">TimezoneJS.Date</a>
|
||||
is a <a href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a>
|
||||
library that parses <code><abbr>tz</abbr></code> source files and interprets time
|
||||
|
@ -283,8 +295,7 @@ Library</a> is
|
|||
a <a href="http://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 <a href="http://www.w3.org/XML/"><abbr
|
||||
title="Extensible Markup Language">XML</abbr></a>-encoded
|
||||
is either proprietary or an <abbr>XML</abbr>-encoded
|
||||
representation.</li>
|
||||
<li>Starting with version 8.5, <a href="http://tcl.tk/">Tcl</a>
|
||||
contains a developer-oriented parser that compiles <code><abbr>tz</abbr></code>
|
||||
|
@ -318,10 +329,13 @@ It is freely available under the same terms as Perl
|
|||
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
|
||||
<a href="http://www.json.org/"><abbr title="JavaScript Object
|
||||
Notation">JSON</abbr></a>-format data suitable for use
|
||||
<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="http://haskell.org">Haskell</a> code that
|
||||
parses and uses <code><abbr>tz</abbr></code> binary data.</li>
|
||||
</ul>
|
||||
<h2>Other <code><abbr>tz</abbr></code>-based time zone software</h2>
|
||||
<ul>
|
||||
|
@ -393,9 +407,10 @@ gives current time zone rules for airports served by commercial aviation.</li>
|
|||
an undocumented format, with <abbr>ID</abbr>s that can be mapped to
|
||||
<code><abbr>TZ</abbr></code> values using the <a
|
||||
href="http://unicode.org/cldr/charts/supplemental/zone_tzid.html">Zone
|
||||
→ Tzid table</a> maintained by the <abbr
|
||||
title="Common Locale Data Repository">CLDR</abbr> data mentioned
|
||||
below.</li>
|
||||
→ Tzid table</a> in the <abbr>CLDR</abbr> data mentioned
|
||||
below, or via <a href="http://msdn.microsoft.com/en-us/windows/apps">Windows
|
||||
Store apps</a> classes such as <a
|
||||
href="http://msdn.microsoft.com/en-us/library/windows/apps/dn264145.aspx">DateTimeFormatter</a>.</li>
|
||||
</ul>
|
||||
<h2>Maps</h2>
|
||||
<ul>
|
||||
|
@ -418,6 +433,10 @@ 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://poisson.phc.unipi.it/~maggiolo/index.php/2014/01/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.</li>
|
||||
</ul>
|
||||
<h2>Time zone boundaries</h2>
|
||||
<ul>
|
||||
|
@ -431,7 +450,7 @@ 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.telfort.nl/~t876506/Multizones.html">Time
|
||||
<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
|
||||
|
@ -627,6 +646,16 @@ contentious issue.</li>
|
|||
</ul>
|
||||
<h2>Time notation</h2>
|
||||
<ul>
|
||||
<li>The <a href="http://unicode.org/cldr/">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 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
|
||||
|
@ -660,16 +689,6 @@ formats.</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>The <a
|
||||
href="http://unicode.org/cldr/">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". <a
|
||||
href="http://unicode.org/cldr/charts/by_type/index.html">By-Type
|
||||
Chart</a> shows these values for many locales.
|
||||
<abbr>ICU</abbr> contains a mechanism for using this data.</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, "<abbr>EST</abbr>" denotes 5 hours behind
|
||||
|
@ -687,8 +706,8 @@ maintainers.</li>
|
|||
<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>="<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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: tzfile.h,v 1.13 2013/12/26 18:34:28 christos Exp $ */
|
||||
/* $NetBSD: tzfile.h,v 1.14 2014/05/13 16:33:56 christos Exp $ */
|
||||
|
||||
#ifndef TZFILE_H
|
||||
#define TZFILE_H
|
||||
|
@ -98,7 +98,7 @@ struct tzhead {
|
|||
*/
|
||||
|
||||
#ifndef TZ_MAX_TIMES
|
||||
#define TZ_MAX_TIMES 1200
|
||||
#define TZ_MAX_TIMES 2000
|
||||
#endif /* !defined TZ_MAX_TIMES */
|
||||
|
||||
#ifndef TZ_MAX_TYPES
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.\" $NetBSD: tzset.3,v 1.27 2013/12/26 18:34:28 christos Exp $
|
||||
.Dd December 26, 2013
|
||||
.\" $NetBSD: tzset.3,v 1.28 2014/05/13 16:33:56 christos Exp $
|
||||
.Dd May 13, 2014
|
||||
.Dt TZSET 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
@ -237,7 +237,7 @@ first Sunday on or after January 18).
|
|||
.It IST\(mi2IDT,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
|
||||
Tuesday at 26:00 (i.e., 02:00 on the first Friday on or after March
|
||||
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.
|
||||
.It WART4WARST,J1/0,J365/25
|
||||
stands for Western Argentina Summer Time (WARST), 3 hours behind UTC.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: zdump.c,v 1.32 2013/12/26 18:34:28 christos Exp $ */
|
||||
/* $NetBSD: zdump.c,v 1.33 2014/05/13 16:33:56 christos Exp $ */
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
** 2009-05-17 by Arthur David Olson.
|
||||
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: zdump.c,v 1.32 2013/12/26 18:34:28 christos Exp $");
|
||||
__RCSID("$NetBSD: zdump.c,v 1.33 2014/05/13 16:33:56 christos Exp $");
|
||||
#endif /* !defined lint */
|
||||
|
||||
#include "version.h"
|
||||
|
@ -39,7 +39,9 @@ __RCSID("$NetBSD: zdump.c,v 1.32 2013/12/26 18:34:28 christos Exp $");
|
|||
|
||||
#ifndef HAVE_STDINT_H
|
||||
# define HAVE_STDINT_H \
|
||||
(199901 <= __STDC_VERSION__ || 2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
|
||||
(199901 <= __STDC_VERSION__ \
|
||||
|| 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
|
||||
|| __CYGWIN__)
|
||||
#endif
|
||||
#if HAVE_STDINT_H
|
||||
# include "stdint.h"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: zic.c,v 1.44 2013/12/26 18:34:28 christos Exp $ */
|
||||
/* $NetBSD: zic.c,v 1.45 2014/05/13 16:33:56 christos Exp $ */
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
** 2006-07-17 by Arthur David Olson.
|
||||
|
@ -10,7 +10,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: zic.c,v 1.44 2013/12/26 18:34:28 christos Exp $");
|
||||
__RCSID("$NetBSD: zic.c,v 1.45 2014/05/13 16:33:56 christos Exp $");
|
||||
#endif /* !defined lint */
|
||||
|
||||
#include "version.h"
|
||||
|
@ -176,6 +176,7 @@ static const char * rfilename;
|
|||
static int rlinenum;
|
||||
static const char * progname;
|
||||
static int timecnt;
|
||||
static int timecnt_alloc;
|
||||
static int typecnt;
|
||||
|
||||
/*
|
||||
|
@ -261,9 +262,11 @@ static int typecnt;
|
|||
|
||||
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;
|
||||
|
@ -274,6 +277,7 @@ struct link {
|
|||
|
||||
static struct link * links;
|
||||
static int nlinks;
|
||||
static int nlinks_alloc;
|
||||
|
||||
struct lookup {
|
||||
const char * l_word;
|
||||
|
@ -360,7 +364,7 @@ static const int len_years[2] = {
|
|||
static struct attype {
|
||||
zic_t at;
|
||||
unsigned char type;
|
||||
} attypes[TZ_MAX_TIMES];
|
||||
} * attypes;
|
||||
static zic_t gmtoffs[TZ_MAX_TYPES];
|
||||
static char isdsts[TZ_MAX_TYPES];
|
||||
static unsigned char abbrinds[TZ_MAX_TYPES];
|
||||
|
@ -375,16 +379,26 @@ 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;
|
||||
}
|
||||
|
||||
static ATTRIBUTE_PURE void *
|
||||
memcheck(void *const ptr)
|
||||
{
|
||||
if (ptr == NULL) {
|
||||
const char *e = strerror(errno);
|
||||
|
||||
(void) fprintf(stderr, _("%s: Memory exhausted: %s\n"),
|
||||
progname, e);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (ptr == NULL)
|
||||
memory_exhausted(strerror(errno));
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
@ -393,6 +407,20 @@ memcheck(void *const ptr)
|
|||
#define ecpyalloc(ptr) memcheck(icpyalloc(ptr))
|
||||
#define ecatalloc(oldp, newp) memcheck(icatalloc((oldp), (newp)))
|
||||
|
||||
static void *
|
||||
growalloc(void *ptr, size_t itemsize, int nitems, int *nitems_alloc)
|
||||
{
|
||||
if (nitems < *nitems_alloc)
|
||||
return ptr;
|
||||
else {
|
||||
int amax = INT_MAX < SIZE_MAX ? INT_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.
|
||||
*/
|
||||
|
@ -948,8 +976,6 @@ gethms(const char *string, const char *const errstring, const int signable)
|
|||
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"));
|
||||
|
@ -979,7 +1005,7 @@ inrule(char **const fields, const int nfields)
|
|||
r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
|
||||
if (max_abbrvar_len < strlen(r.r_abbrvar))
|
||||
max_abbrvar_len = strlen(r.r_abbrvar);
|
||||
rules = erealloc(rules, (nrules + 1) * sizeof *rules);
|
||||
rules = growalloc(rules, sizeof *rules, nrules, &nrules_alloc);
|
||||
rules[nrules++] = r;
|
||||
}
|
||||
|
||||
|
@ -1095,7 +1121,7 @@ inzsub(char **const fields, const int nfields, const int iscont)
|
|||
return FALSE;
|
||||
}
|
||||
}
|
||||
zones = erealloc(zones, (nzones + 1) * sizeof *zones);
|
||||
zones = growalloc(zones, sizeof *zones, nzones, &nzones_alloc);
|
||||
zones[nzones++] = z;
|
||||
/*
|
||||
** If there was an UNTIL field on this line,
|
||||
|
@ -1228,7 +1254,7 @@ inlink(char **const fields, const int nfields)
|
|||
l.l_linenum = linenum;
|
||||
l.l_from = ecpyalloc(fields[LF_FROM]);
|
||||
l.l_to = ecpyalloc(fields[LF_TO]);
|
||||
links = erealloc(links, (nlinks + 1) * sizeof *links);
|
||||
links = growalloc(links, sizeof *links, nlinks, &nlinks_alloc);
|
||||
links[nlinks++] = l;
|
||||
}
|
||||
|
||||
|
@ -1444,8 +1470,9 @@ writezone(const char *const name, const char *const string, char version)
|
|||
static char * fullname;
|
||||
static const struct tzhead tzh0;
|
||||
static struct tzhead tzh;
|
||||
zic_t ats[TZ_MAX_TIMES];
|
||||
unsigned char types[TZ_MAX_TIMES];
|
||||
zic_t *ats = emalloc(size_product(timecnt, sizeof *ats + 1));
|
||||
void *typesptr = ats + timecnt;
|
||||
unsigned char *types = typesptr;
|
||||
|
||||
/*
|
||||
** Sort.
|
||||
|
@ -1464,17 +1491,11 @@ writezone(const char *const name, const char *const string, char version)
|
|||
fromi = 0;
|
||||
while (fromi < timecnt && attypes[fromi].at < min_time)
|
||||
++fromi;
|
||||
/*
|
||||
** Remember that type 0 is reserved.
|
||||
*/
|
||||
if (isdsts[1] == 0)
|
||||
while (fromi < timecnt && attypes[fromi].type == 1)
|
||||
++fromi; /* handled by default rule */
|
||||
for ( ; fromi < timecnt; ++fromi) {
|
||||
if (toi != 0 && ((attypes[fromi].at +
|
||||
if (toi > 1 && ((attypes[fromi].at +
|
||||
gmtoffs[attypes[toi - 1].type]) <=
|
||||
(attypes[toi - 1].at + gmtoffs[toi == 1 ? 0
|
||||
: attypes[toi - 2].type]))) {
|
||||
(attypes[toi - 1].at +
|
||||
gmtoffs[attypes[toi - 2].type]))) {
|
||||
attypes[toi - 1].type =
|
||||
attypes[fromi].type;
|
||||
continue;
|
||||
|
@ -1485,6 +1506,9 @@ writezone(const char *const name, const char *const string, char version)
|
|||
}
|
||||
timecnt = toi;
|
||||
}
|
||||
if (noise && timecnt > 1200)
|
||||
warning(_("pre-2014 clients may mishandle"
|
||||
" more than 1200 transition times"));
|
||||
/*
|
||||
** Transfer.
|
||||
*/
|
||||
|
@ -1516,6 +1540,13 @@ writezone(const char *const name, const char *const string, char version)
|
|||
--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])) {
|
||||
|
@ -1550,7 +1581,7 @@ writezone(const char *const name, const char *const string, char version)
|
|||
int thistimei, thistimecnt;
|
||||
int thisleapi, thisleapcnt;
|
||||
int thistimelim, thisleaplim;
|
||||
int writetype[TZ_MAX_TIMES];
|
||||
int writetype[TZ_MAX_TYPES];
|
||||
int typemap[TZ_MAX_TYPES];
|
||||
int thistypecnt;
|
||||
char thischars[TZ_MAX_CHARS];
|
||||
|
@ -1570,11 +1601,7 @@ writezone(const char *const name, const char *const string, char version)
|
|||
}
|
||||
thistimelim = thistimei + thistimecnt;
|
||||
thisleaplim = thisleapi + thisleapcnt;
|
||||
/*
|
||||
** Remember that type 0 is reserved.
|
||||
*/
|
||||
writetype[0] = FALSE;
|
||||
for (i = 1; i < typecnt; ++i)
|
||||
for (i = 0; i < typecnt; ++i)
|
||||
writetype[i] = thistimecnt == timecnt;
|
||||
if (thistimecnt == 0) {
|
||||
/*
|
||||
|
@ -1590,11 +1617,8 @@ writezone(const char *const name, const char *const string, char version)
|
|||
/*
|
||||
** For America/Godthab and Antarctica/Palmer
|
||||
*/
|
||||
/*
|
||||
** Remember that type 0 is reserved.
|
||||
*/
|
||||
if (thistimei == 0)
|
||||
writetype[1] = TRUE;
|
||||
writetype[0] = TRUE;
|
||||
}
|
||||
#ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH
|
||||
/*
|
||||
|
@ -1647,26 +1671,8 @@ writezone(const char *const name, const char *const string, char version)
|
|||
}
|
||||
#endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */
|
||||
thistypecnt = 0;
|
||||
/*
|
||||
** Potentially, set type 0 to that of lowest-valued time.
|
||||
*/
|
||||
if (thistimei > 0) {
|
||||
for (i = 1; i < typecnt; ++i)
|
||||
if (writetype[i] && !isdsts[i])
|
||||
break;
|
||||
if (i != types[thistimei - 1]) {
|
||||
i = types[thistimei - 1];
|
||||
gmtoffs[0] = gmtoffs[i];
|
||||
isdsts[0] = isdsts[i];
|
||||
ttisstds[0] = ttisstds[i];
|
||||
ttisgmts[0] = ttisgmts[i];
|
||||
abbrinds[0] = abbrinds[i];
|
||||
writetype[0] = TRUE;
|
||||
writetype[i] = FALSE;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < typecnt; ++i)
|
||||
typemap[i] = writetype[i] ? thistypecnt++ : 0;
|
||||
typemap[i] = writetype[i] ? thistypecnt++ : -1;
|
||||
for (i = 0; i < (int)(sizeof indmap / sizeof indmap[0]); ++i)
|
||||
indmap[i] = -1;
|
||||
thischarcnt = 0;
|
||||
|
@ -1711,7 +1717,12 @@ writezone(const char *const name, const char *const string, char version)
|
|||
#undef DO
|
||||
for (i = thistimei; i < thistimelim; ++i)
|
||||
if (pass == 1)
|
||||
puttzcode(ats[i], fp);
|
||||
/*
|
||||
** 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;
|
||||
|
@ -1766,6 +1777,7 @@ writezone(const char *const name, const char *const string, char version)
|
|||
progname, fullname);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
free(ats);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2091,11 +2103,6 @@ outzone(const struct zone *const zpfirst, const int zonecount)
|
|||
updateminmax(leapminyear);
|
||||
updateminmax(leapmaxyear + (leapmaxyear < ZIC_MAX));
|
||||
}
|
||||
/*
|
||||
** Reserve type 0.
|
||||
*/
|
||||
gmtoffs[0] = isdsts[0] = ttisstds[0] = ttisgmts[0] = abbrinds[0] = -1;
|
||||
typecnt = 1;
|
||||
for (i = 0; i < zonecount; ++i) {
|
||||
zp = &zpfirst[i];
|
||||
if (i < zonecount - 1)
|
||||
|
@ -2195,8 +2202,7 @@ outzone(const struct zone *const zpfirst, const int zonecount)
|
|||
if (usestart) {
|
||||
addtt(starttime, type);
|
||||
usestart = FALSE;
|
||||
} else if (stdoff != 0)
|
||||
addtt(min_time, type);
|
||||
} else addtt(min_time, type);
|
||||
} else for (year = min_year; year <= max_year; ++year) {
|
||||
if (useuntil && year > zp->z_untilrule.r_hiyear)
|
||||
break;
|
||||
|
@ -2391,10 +2397,7 @@ addtt(const zic_t starttime, int type)
|
|||
timecnt = 0;
|
||||
type = 0;
|
||||
}
|
||||
if (timecnt >= TZ_MAX_TIMES) {
|
||||
error(_("too many transitions?!"));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
attypes = growalloc(attypes, sizeof *attypes, timecnt, &timecnt_alloc);
|
||||
attypes[timecnt].at = starttime;
|
||||
attypes[timecnt].type = type;
|
||||
++timecnt;
|
||||
|
@ -2592,7 +2595,7 @@ getfields(char *cp)
|
|||
|
||||
if (cp == NULL)
|
||||
return NULL;
|
||||
array = emalloc((strlen(cp) + 1) * sizeof *array);
|
||||
array = emalloc(size_product(strlen(cp) + 1, sizeof *array));
|
||||
nsubs = 0;
|
||||
for ( ; ; ) {
|
||||
while (isascii((unsigned char) *cp) &&
|
||||
|
|
Loading…
Reference in New Issue