1988-02-18 16:11:16 -05:00
|
|
|
#ifndef TZFILE_H
|
1989-03-22 18:16:57 -05:00
|
|
|
|
1988-02-18 16:11:16 -05:00
|
|
|
#define TZFILE_H
|
1989-03-22 18:16:57 -05:00
|
|
|
|
1996-06-05 08:02:01 -04:00
|
|
|
/*
|
|
|
|
|
** This file is in the public domain, so clarified as of
|
2005-12-08 11:35:32 -05:00
|
|
|
** 1996-06-05 by Arthur David Olson.
|
1996-06-05 08:02:01 -04:00
|
|
|
*/
|
|
|
|
|
|
1989-03-22 18:16:57 -05:00
|
|
|
/*
|
|
|
|
|
** 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!
|
|
|
|
|
*/
|
|
|
|
|
|
1986-01-13 17:21:35 -05:00
|
|
|
/*
|
1986-03-02 22:03:25 -05:00
|
|
|
** Information about time zone files.
|
1986-01-13 17:21:35 -05:00
|
|
|
*/
|
|
|
|
|
|
1986-01-21 09:12:11 -05:00
|
|
|
#ifndef TZDIR
|
1989-03-22 18:09:15 -05:00
|
|
|
#define TZDIR "/usr/local/etc/zoneinfo" /* Time zone object file directory */
|
1988-02-18 09:02:09 -05:00
|
|
|
#endif /* !defined TZDIR */
|
1986-01-21 09:12:11 -05:00
|
|
|
|
|
|
|
|
#ifndef TZDEFAULT
|
1986-01-16 08:50:46 -05:00
|
|
|
#define TZDEFAULT "localtime"
|
1988-02-18 09:02:09 -05:00
|
|
|
#endif /* !defined TZDEFAULT */
|
1986-01-21 09:12:11 -05:00
|
|
|
|
1989-01-31 10:20:26 -05:00
|
|
|
#ifndef TZDEFRULES
|
1989-01-31 23:10:37 -05:00
|
|
|
#define TZDEFRULES "posixrules"
|
1989-01-31 10:20:26 -05:00
|
|
|
#endif /* !defined TZDEFRULES */
|
|
|
|
|
|
1986-03-02 22:03:25 -05:00
|
|
|
/*
|
|
|
|
|
** Each file begins with. . .
|
|
|
|
|
*/
|
|
|
|
|
|
1997-11-20 17:34:40 -05:00
|
|
|
#define TZ_MAGIC "TZif"
|
|
|
|
|
|
1986-03-02 22:03:25 -05:00
|
|
|
struct tzhead {
|
2005-01-31 14:06:07 -05:00
|
|
|
char tzh_magic[4]; /* TZ_MAGIC */
|
2013-09-08 23:04:07 -07:00
|
|
|
char tzh_version[1]; /* '\0' or '2' or '3' as of 2013 */
|
2014-06-17 18:46:31 -07:00
|
|
|
char tzh_reserved[15]; /* reserved; must be zero */
|
1995-01-03 20:09:48 -05:00
|
|
|
char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */
|
1989-03-02 10:17:51 -05:00
|
|
|
char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
|
1988-01-25 10:37:57 -05:00
|
|
|
char tzh_leapcnt[4]; /* coded number of leap seconds */
|
1986-11-15 20:19:16 -05:00
|
|
|
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 */
|
1986-03-02 22:03:25 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
** . . .followed by. . .
|
|
|
|
|
**
|
1986-11-15 20:19:16 -05:00
|
|
|
** tzh_timecnt (char [4])s coded transition times a la time(2)
|
1986-03-02 22:03:25 -05:00
|
|
|
** tzh_timecnt (unsigned char)s types of local time starting at above
|
1986-11-15 20:19:16 -05:00
|
|
|
** tzh_typecnt repetitions of
|
2013-09-04 19:07:31 -07:00
|
|
|
** one (char [4]) coded UT offset in seconds
|
1989-03-02 10:17:51 -05:00
|
|
|
** one (unsigned char) used to set tm_isdst
|
1986-11-15 20:19:16 -05:00
|
|
|
** one (unsigned char) that's an abbreviation list index
|
1988-01-25 12:08:12 -05:00
|
|
|
** tzh_charcnt (char)s '\0'-terminated zone abbreviations
|
1988-01-25 10:37:57 -05:00
|
|
|
** tzh_leapcnt repetitions of
|
|
|
|
|
** one (char [4]) coded leap second transition times
|
|
|
|
|
** one (char [4]) total correction after above
|
Use bool for boolean.
The tz source code predates C99 and so used int, 0 and 1 for boolean,
but nowadays bool is available and makes the code clearer.
Include backwards-compatibility definitions for pre-C99 platforms,
and don't go beyond what the backwards-compatibility defintions support.
* date.c (main, reset, sametm, convert, checkfinal, iffy, netsettime):
* localtime.c (struct ttinfo, struct state, gmt_is_set)
(differ_by_repeat, tzload, typesequiv, getoffset, transtime)
(tzparse, gmtload, tzsetwall_unlocked, tzset_unlocked, gmtcheck)
(localtime_tzset, timesub, increment_overflow)
(increment_overflow32, increment_overflow_time)
(normalize_overflow, normalize_overflow32, time2sub, time2)
(time1):
* strftime.c (_fmt, _yconv, _loc):
* zdump.c (warned, errout, is_alpha, my_localtime, abbrok)
(main, hunt, show):
* zic.c (struct rule, errors, warnings, leapseen, noise)
(leap_types, ttisstds, ttisgmts, error, warning, main, dolink)
(associate, infile, gethms, inzone, inzcont, inzsub, inleap)
(rulesub, is32, writezone, doabbr, stringoffset, stringrule)
(stringzone, outzone, addtype, leapadd, yearistype, is_space)
(is_alpha, ciequal, itsabbr, mkdirs):
Use bool for boolean.
* localtime.c (tzload, tzparse):
* zic.c (stringoffset, mkdirs):
Return true for success and false for failure instead of 0 and -1.
All callers changed.
* private.h, zdump.c (TRUE, FALSE): Remove, replacing by ...
(true, false, bool): Define by <stdbool.h> if C99 or later,
by macros otherwise.
* tzfile.h: Remove mention of TRUE and FALSE from commentary.
* zic.c (addtype): Remove now-unnecessary checks that a bool is a
boolean.
2014-08-20 08:13:31 -07:00
|
|
|
** tzh_ttisstdcnt (char)s indexed by type; if 1, transition
|
|
|
|
|
** time is standard time, if 0,
|
1989-03-02 10:17:51 -05:00
|
|
|
** transition time is wall clock time
|
|
|
|
|
** if absent, transition times are
|
|
|
|
|
** assumed to be wall clock time
|
Use bool for boolean.
The tz source code predates C99 and so used int, 0 and 1 for boolean,
but nowadays bool is available and makes the code clearer.
Include backwards-compatibility definitions for pre-C99 platforms,
and don't go beyond what the backwards-compatibility defintions support.
* date.c (main, reset, sametm, convert, checkfinal, iffy, netsettime):
* localtime.c (struct ttinfo, struct state, gmt_is_set)
(differ_by_repeat, tzload, typesequiv, getoffset, transtime)
(tzparse, gmtload, tzsetwall_unlocked, tzset_unlocked, gmtcheck)
(localtime_tzset, timesub, increment_overflow)
(increment_overflow32, increment_overflow_time)
(normalize_overflow, normalize_overflow32, time2sub, time2)
(time1):
* strftime.c (_fmt, _yconv, _loc):
* zdump.c (warned, errout, is_alpha, my_localtime, abbrok)
(main, hunt, show):
* zic.c (struct rule, errors, warnings, leapseen, noise)
(leap_types, ttisstds, ttisgmts, error, warning, main, dolink)
(associate, infile, gethms, inzone, inzcont, inzsub, inleap)
(rulesub, is32, writezone, doabbr, stringoffset, stringrule)
(stringzone, outzone, addtype, leapadd, yearistype, is_space)
(is_alpha, ciequal, itsabbr, mkdirs):
Use bool for boolean.
* localtime.c (tzload, tzparse):
* zic.c (stringoffset, mkdirs):
Return true for success and false for failure instead of 0 and -1.
All callers changed.
* private.h, zdump.c (TRUE, FALSE): Remove, replacing by ...
(true, false, bool): Define by <stdbool.h> if C99 or later,
by macros otherwise.
* tzfile.h: Remove mention of TRUE and FALSE from commentary.
* zic.c (addtype): Remove now-unnecessary checks that a bool is a
boolean.
2014-08-20 08:13:31 -07:00
|
|
|
** tzh_ttisgmtcnt (char)s indexed by type; if 1, transition
|
|
|
|
|
** time is UT, if 0,
|
1995-01-03 20:09:48 -05:00
|
|
|
** transition time is local time
|
|
|
|
|
** if absent, transition times are
|
|
|
|
|
** assumed to be local time
|
1986-03-02 22:03:25 -05:00
|
|
|
*/
|
|
|
|
|
|
2006-02-20 09:53:12 -05:00
|
|
|
/*
|
|
|
|
|
** 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).
|
2013-09-08 23:04:07 -07:00
|
|
|
**
|
2013-09-10 13:15:22 -07:00
|
|
|
** If tz_version is '3' or greater, the above is extended as follows.
|
2013-09-08 23:04:07 -07:00
|
|
|
** 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.
|
2006-02-20 09:53:12 -05:00
|
|
|
*/
|
|
|
|
|
|
1986-03-02 22:03:25 -05:00
|
|
|
/*
|
1987-02-21 18:26:45 -05:00
|
|
|
** In the current implementation, "tzset()" refuses to deal with files that
|
1986-03-02 22:03:25 -05:00
|
|
|
** exceed any of the limits below.
|
|
|
|
|
*/
|
|
|
|
|
|
1986-02-15 17:44:41 -05:00
|
|
|
#ifndef TZ_MAX_TIMES
|
2014-03-20 18:39:12 -07:00
|
|
|
#define TZ_MAX_TIMES 2000
|
1988-02-18 09:02:09 -05:00
|
|
|
#endif /* !defined TZ_MAX_TIMES */
|
1986-01-21 09:12:11 -05:00
|
|
|
|
|
|
|
|
#ifndef TZ_MAX_TYPES
|
2013-11-04 11:24:16 -08:00
|
|
|
/* This must be at least 17 for Europe/Samara and Europe/Vilnius. */
|
1993-11-22 12:58:27 -05:00
|
|
|
#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
|
1988-02-18 09:02:09 -05:00
|
|
|
#endif /* !defined TZ_MAX_TYPES */
|
1986-01-21 09:12:11 -05:00
|
|
|
|
1986-03-02 22:03:25 -05:00
|
|
|
#ifndef TZ_MAX_CHARS
|
|
|
|
|
#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
|
1992-11-23 11:25:33 -05:00
|
|
|
/* (limited by what unsigned chars can hold) */
|
1988-02-18 09:02:09 -05:00
|
|
|
#endif /* !defined TZ_MAX_CHARS */
|
1986-12-31 16:37:04 -05:00
|
|
|
|
1988-01-25 10:37:57 -05:00
|
|
|
#ifndef TZ_MAX_LEAPS
|
1993-11-22 12:39:05 -05:00
|
|
|
#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
|
1988-02-18 09:02:09 -05:00
|
|
|
#endif /* !defined TZ_MAX_LEAPS */
|
1988-01-25 10:37:57 -05:00
|
|
|
|
1988-02-27 19:15:51 -05:00
|
|
|
#define SECSPERMIN 60
|
|
|
|
|
#define MINSPERHOUR 60
|
|
|
|
|
#define HOURSPERDAY 24
|
|
|
|
|
#define DAYSPERWEEK 7
|
|
|
|
|
#define DAYSPERNYEAR 365
|
|
|
|
|
#define DAYSPERLYEAR 366
|
|
|
|
|
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
|
Port to NetBSD, where, e.g., 'time_t' is wider than 'long'.
I audited the code and fixed as many width-asssumptions as I could
find, including several places where the code assumed that 'time_t'
was no wider than 'long'; this assumption is not true on 32-bit
NetBSD platforms. This caught every problem that is already fixed
in the NetBSD zic.c, and caught quite a few more.
* Makefile: Add comments re HAVE_DOS_FILE_NAMES and HAVE_INTTYPES_H.
* date.c (checkfinal, netsettime): Don't use 'long' where 'int' will do.
* difftime.c (difftime): Mark with ATTRIBUTE_CONST.
Use uintmax_t, not unsigned long, for the widest unsigned integer type.
Use long double, not double, if time_t is wider than uintmax_t;
this can in theory help on nonstandard platforms, such as GCC
with 64-bit uintmax_t and 128-bit __int128_t.
* localtime.c (struct ttinfo.tt_gmtoff, struct rule.r_time)
(detzcode, getsecs, getoffset, gmtsub, localsub, increment_overflow32)
(normalize_overflow32, time1, time2, timesub, transtime, tzparse)
(time2sub, timeoff, gtime):
* tzfile.h (SECSPERDAY):
* zdump.c (SECSPERDAY):
* zic.c (convert, puttzcode):
Use int_fast32_t, not long, when all we care is that values up to
2**31 can be stored. This doesn't fix any bugs, but it allows
more opportunity for compiler optimization.
(struct lsinfo.ls_corr, timesub, leapcorr):
Use int_fast64_t, not long, when values up to 2**63 can be stored.
(timesub): Make it clearer when we are truncating 0.5 to 0.
(increment_overflow32): Rename from long_increment_overflow.
All uses changed.
(normalize_overflow32): Rename from long_normalize_overflow.
All uses changed.
* private.h (HAVE_INTTYPES_H, ATTRIBUTE_CONST): New macros.
Include <inttypes.h> if HAVE_INTTYPES_H.
(INT_FAST64_MIN, INT_FAST64_MAX, SCNdFAST64, int_fast32_t, PRIdMAX)
(uintmax_t, PRIuMAX, _Noreturn):
Define to reasonable values if it's an older compiler.
* scheck.c (scheck): Add support for arbitrary formats, such as
those that SCNdFAST64 can expand to, at the price of no longer
supporting weird conversion specs like "%[%]".
* strftime.c (_fmt): Use intmax_t and uintmax_t to format time_t,
not long and unsigned long.
* zdump.c (int_fast32_t, intmax_t, PRIdMAX, SCNdMAX):
Define for pre-C99 compilers, like private.h does.
(delta, yeartot, main): Use intmax_t, not long.
(hunt): Use time_t, not long, since the diff must be nonnegative.
(tformat): Allow for time_t wider than long.
* zic.c (ZIC_MIN, ZIC_MAX, SCNdZIC): New macros.
(OFFSET_STRLEN_MAXIMUM, RULE_STRLEN_MAXIMUM): Remove.
(struct rule): Make r_loyear, r_hiyear, r_tod, r_stdoff, z_gmtoff,
z_stdoff zic_t, not long.
(addtype, gethms, oadd, rpytime, tadd, gmtoffs, corr, inleap)
(stringoffset, stringrule, outzone, addtype, adjleap, rpytime)
(LDAYSPERWEEK):
Use zic_t, not long.
(leapminyear, leapmaxyear, min_year, max_year, rulesub, updateminmax)
(outzone, rpytime):
Use zic_t, not int.
(usage): Now _Noreturn.
(main): Use S_IWGRP, not 'unix', to determine whether to call umask.
(writezone): Omit unnecessary cast.
(mkdirs): Use HAVE_DOS_FILE_NAMES, not 'unix', to determine
whether to parse DOS file anmes.
(eitol): Remove; no longer needed.
2013-05-27 21:26:18 -07:00
|
|
|
#define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
|
1988-02-27 19:15:51 -05:00
|
|
|
#define MONSPERYEAR 12
|
1986-12-31 16:37:04 -05:00
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
|
1987-02-16 16:58:07 -05:00
|
|
|
#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
|
|
|
|
|
|
1986-12-31 16:37:04 -05:00
|
|
|
#define TM_YEAR_BASE 1900
|
|
|
|
|
|
|
|
|
|
#define EPOCH_YEAR 1970
|
|
|
|
|
#define EPOCH_WDAY TM_THURSDAY
|
1987-02-19 08:32:17 -05:00
|
|
|
|
1996-01-16 12:04:07 -05:00
|
|
|
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
|
1989-03-18 19:24:39 -05:00
|
|
|
|
2004-10-05 10:17:24 -04:00
|
|
|
/*
|
|
|
|
|
** 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)
|
2004-10-11 15:10:09 -04:00
|
|
|
** This is true even if % means modulo rather than Fortran remainder
|
|
|
|
|
** (which is allowed by C89 but not C99).
|
2004-10-05 10:17:24 -04:00
|
|
|
** We use this to avoid addition overflow problems.
|
|
|
|
|
*/
|
|
|
|
|
|
2004-10-11 15:10:09 -04:00
|
|
|
#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
|
2004-10-05 10:17:24 -04:00
|
|
|
|
1989-03-22 18:16:57 -05:00
|
|
|
#endif /* !defined TZFILE_H */
|