1 #ifndef TZFILE_INCLUDED
2 #define TZFILE_INCLUDED
3 
4 /* Copyright (c) 2004, 2006, 2007 MySQL AB, 2009 Sun Microsystems, Inc.
5    Use is subject to license terms.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License, version 2.0,
9    as published by the Free Software Foundation.
10 
11    This program is also distributed with certain software (including
12    but not limited to OpenSSL) that is licensed under separate terms,
13    as designated in a particular file or component or in included license
14    documentation.  The authors of MySQL hereby grant you an additional
15    permission to link the program and your derivative works with the
16    separately licensed software that they have included with MySQL.
17 
18    This program is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21    GNU General Public License, version 2.0, for more details.
22 
23    You should have received a copy of the GNU General Public License
24    along with this program; if not, write to the Free Software Foundation,
25    51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
26 
27 /*
28    This file is based on public domain code from ftp://elsie.ncih.nist.gov/
29    Initial source code is in the public domain, so clarified as of
30    1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
31 */
32 
33 /*
34   Information about time zone files.
35 */
36 
37 #ifndef TZDIR
38 #define TZDIR	"/usr/share/zoneinfo" /* Time zone object file directory */
39 #endif /* !defined TZDIR */
40 
41 /*
42   Each file begins with. . .
43 */
44 
45 #define	TZ_MAGIC	"TZif"
46 
47 struct tzhead {
48  	uchar	tzh_magic[4];		/* TZ_MAGIC */
49 	uchar	tzh_reserved[16];	/* reserved for future use */
50 	uchar	tzh_ttisgmtcnt[4];	/* coded number of trans. time flags */
51 	uchar	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
52 	uchar	tzh_leapcnt[4];		/* coded number of leap seconds */
53 	uchar	tzh_timecnt[4];		/* coded number of transition times */
54 	uchar	tzh_typecnt[4];		/* coded number of local time types */
55 	uchar	tzh_charcnt[4];		/* coded number of abbr. chars */
56 };
57 
58 /*
59   . . .followed by. . .
60 
61   tzh_timecnt (char [4])s               coded transition times a la time(2)
62   tzh_timecnt (unsigned char)s          types of local time starting at above
63   tzh_typecnt repetitions of
64     one (char [4])                      coded UTC offset in seconds
65     one (unsigned char)                 used to set tm_isdst
66     one (unsigned char)                 that's an abbreviation list index
67   tzh_charcnt (char)s                   '\0'-terminated zone abbreviations
68   tzh_leapcnt repetitions of
69     one (char [4])                      coded leap second transition times
70     one (char [4])                      total correction after above
71   tzh_ttisstdcnt (char)s                indexed by type; if TRUE, transition
72                                         time is standard time, if FALSE,
73                                         transition time is wall clock time
74                                         if absent, transition times are
75                                         assumed to be wall clock time
76   tzh_ttisgmtcnt (char)s                indexed by type; if TRUE, transition
77                                         time is UTC, if FALSE,
78                                         transition time is local time
79                                         if absent, transition times are
80                                         assumed to be local time
81 */
82 
83 /*
84   In the current implementation, we refuse to deal with files that
85   exceed any of the limits below.
86 */
87 
88 #ifndef TZ_MAX_TIMES
89 /*
90   The TZ_MAX_TIMES value below is enough to handle a bit more than a
91   year's worth of solar time (corrected daily to the nearest second) or
92   138 years of Pacific Presidential Election time
93   (where there are three time zone transitions every fourth year).
94 */
95 #define TZ_MAX_TIMES	370
96 #endif /* !defined TZ_MAX_TIMES */
97 
98 #ifndef TZ_MAX_TYPES
99 #ifdef SOLAR
100 #define TZ_MAX_TYPES	256 /* Limited by what (unsigned char)'s can hold */
101 #else
102 /*
103   Must be at least 14 for Europe/Riga as of Jan 12 1995,
104   as noted by Earl Chew <earl@hpato.aus.hp.com>.
105 */
106 #define TZ_MAX_TYPES	20	/* Maximum number of local time types */
107 #endif /* defined SOLAR */
108 #endif /* !defined TZ_MAX_TYPES */
109 
110 #ifndef TZ_MAX_CHARS
111 #define TZ_MAX_CHARS	50	/* Maximum number of abbreviation characters */
112 				/* (limited by what unsigned chars can hold) */
113 #endif /* !defined TZ_MAX_CHARS */
114 
115 #ifndef TZ_MAX_LEAPS
116 #define TZ_MAX_LEAPS	50	/* Maximum number of leap second corrections */
117 #endif /* !defined TZ_MAX_LEAPS */
118 
119 #ifndef TZ_MAX_REV_RANGES
120 #ifdef SOLAR
121 /* Solar (Asia/RiyadhXX) zones need significantly bigger TZ_MAX_REV_RANGES */
122 #define TZ_MAX_REV_RANGES (TZ_MAX_TIMES*2+TZ_MAX_LEAPS*2+2)
123 #else
124 #define TZ_MAX_REV_RANGES (TZ_MAX_TIMES+TZ_MAX_LEAPS+2)
125 #endif
126 #endif
127 
128 #define SECS_PER_MIN	60
129 #define MINS_PER_HOUR	60
130 #define HOURS_PER_DAY	24
131 #define DAYS_PER_WEEK	7
132 #define DAYS_PER_NYEAR	365
133 #define DAYS_PER_LYEAR	366
134 #define SECS_PER_HOUR	(SECS_PER_MIN * MINS_PER_HOUR)
135 #define SECS_PER_DAY	((long) SECS_PER_HOUR * HOURS_PER_DAY)
136 #define MONS_PER_YEAR	12
137 
138 #define TM_YEAR_BASE	1900
139 
140 #define EPOCH_YEAR	1970
141 
142 /*
143   Accurate only for the past couple of centuries,
144   that will probably do.
145 */
146 
147 #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
148 
149 #endif
150