xref: /aosp_15_r20/bionic/libc/tzcode/tzfile.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /* Layout and location of TZif files.  */
2*8d67ca89SAndroid Build Coastguard Worker 
3*8d67ca89SAndroid Build Coastguard Worker #ifndef TZFILE_H
4*8d67ca89SAndroid Build Coastguard Worker 
5*8d67ca89SAndroid Build Coastguard Worker #define TZFILE_H
6*8d67ca89SAndroid Build Coastguard Worker 
7*8d67ca89SAndroid Build Coastguard Worker /*
8*8d67ca89SAndroid Build Coastguard Worker ** This file is in the public domain, so clarified as of
9*8d67ca89SAndroid Build Coastguard Worker ** 1996-06-05 by Arthur David Olson.
10*8d67ca89SAndroid Build Coastguard Worker */
11*8d67ca89SAndroid Build Coastguard Worker 
12*8d67ca89SAndroid Build Coastguard Worker /*
13*8d67ca89SAndroid Build Coastguard Worker ** This header is for use ONLY with the time conversion code.
14*8d67ca89SAndroid Build Coastguard Worker ** There is no guarantee that it will remain unchanged,
15*8d67ca89SAndroid Build Coastguard Worker ** or that it will remain at all.
16*8d67ca89SAndroid Build Coastguard Worker ** Do NOT copy it to any system include directory.
17*8d67ca89SAndroid Build Coastguard Worker ** Thank you!
18*8d67ca89SAndroid Build Coastguard Worker */
19*8d67ca89SAndroid Build Coastguard Worker 
20*8d67ca89SAndroid Build Coastguard Worker /*
21*8d67ca89SAndroid Build Coastguard Worker ** Information about time zone files.
22*8d67ca89SAndroid Build Coastguard Worker */
23*8d67ca89SAndroid Build Coastguard Worker 
24*8d67ca89SAndroid Build Coastguard Worker #ifndef TZDIR
25*8d67ca89SAndroid Build Coastguard Worker # define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */
26*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZDIR */
27*8d67ca89SAndroid Build Coastguard Worker 
28*8d67ca89SAndroid Build Coastguard Worker #ifndef TZDEFAULT
29*8d67ca89SAndroid Build Coastguard Worker # define TZDEFAULT "/etc/localtime"
30*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZDEFAULT */
31*8d67ca89SAndroid Build Coastguard Worker 
32*8d67ca89SAndroid Build Coastguard Worker #ifndef TZDEFRULES
33*8d67ca89SAndroid Build Coastguard Worker # define TZDEFRULES "posixrules"
34*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZDEFRULES */
35*8d67ca89SAndroid Build Coastguard Worker 
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker /* See Internet RFC 8536 for more details about the following format.  */
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker /*
40*8d67ca89SAndroid Build Coastguard Worker ** Each file begins with. . .
41*8d67ca89SAndroid Build Coastguard Worker */
42*8d67ca89SAndroid Build Coastguard Worker 
43*8d67ca89SAndroid Build Coastguard Worker #define	TZ_MAGIC	"TZif"
44*8d67ca89SAndroid Build Coastguard Worker 
45*8d67ca89SAndroid Build Coastguard Worker struct tzhead {
46*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_magic[4];		/* TZ_MAGIC */
47*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_version[1];		/* '\0' or '2'-'4' as of 2021 */
48*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_reserved[15];	/* reserved; must be zero */
49*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_ttisutcnt[4];	/* coded number of trans. time flags */
50*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
51*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_leapcnt[4];		/* coded number of leap seconds */
52*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_timecnt[4];		/* coded number of transition times */
53*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_typecnt[4];		/* coded number of local time types */
54*8d67ca89SAndroid Build Coastguard Worker 	char	tzh_charcnt[4];		/* coded number of abbr. chars */
55*8d67ca89SAndroid Build Coastguard Worker };
56*8d67ca89SAndroid Build Coastguard Worker 
57*8d67ca89SAndroid Build Coastguard Worker /*
58*8d67ca89SAndroid Build Coastguard Worker ** . . .followed by. . .
59*8d67ca89SAndroid Build Coastguard Worker **
60*8d67ca89SAndroid Build Coastguard Worker **	tzh_timecnt (char [4])s		coded transition times a la time(2)
61*8d67ca89SAndroid Build Coastguard Worker **	tzh_timecnt (unsigned char)s	types of local time starting at above
62*8d67ca89SAndroid Build Coastguard Worker **	tzh_typecnt repetitions of
63*8d67ca89SAndroid Build Coastguard Worker **		one (char [4])		coded UT offset in seconds
64*8d67ca89SAndroid Build Coastguard Worker **		one (unsigned char)	used to set tm_isdst
65*8d67ca89SAndroid Build Coastguard Worker **		one (unsigned char)	that's an abbreviation list index
66*8d67ca89SAndroid Build Coastguard Worker **	tzh_charcnt (char)s		'\0'-terminated zone abbreviations
67*8d67ca89SAndroid Build Coastguard Worker **	tzh_leapcnt repetitions of
68*8d67ca89SAndroid Build Coastguard Worker **		one (char [4])		coded leap second transition times
69*8d67ca89SAndroid Build Coastguard Worker **		one (char [4])		total correction after above
70*8d67ca89SAndroid Build Coastguard Worker **	tzh_ttisstdcnt (char)s		indexed by type; if 1, transition
71*8d67ca89SAndroid Build Coastguard Worker **					time is standard time, if 0,
72*8d67ca89SAndroid Build Coastguard Worker **					transition time is local (wall clock)
73*8d67ca89SAndroid Build Coastguard Worker **					time; if absent, transition times are
74*8d67ca89SAndroid Build Coastguard Worker **					assumed to be local time
75*8d67ca89SAndroid Build Coastguard Worker **	tzh_ttisutcnt (char)s		indexed by type; if 1, transition
76*8d67ca89SAndroid Build Coastguard Worker **					time is UT, if 0, transition time is
77*8d67ca89SAndroid Build Coastguard Worker **					local time; if absent, transition
78*8d67ca89SAndroid Build Coastguard Worker **					times are assumed to be local time.
79*8d67ca89SAndroid Build Coastguard Worker **					When this is 1, the corresponding
80*8d67ca89SAndroid Build Coastguard Worker **					std/wall indicator must also be 1.
81*8d67ca89SAndroid Build Coastguard Worker */
82*8d67ca89SAndroid Build Coastguard Worker 
83*8d67ca89SAndroid Build Coastguard Worker /*
84*8d67ca89SAndroid Build Coastguard Worker ** If tzh_version is '2' or greater, the above is followed by a second instance
85*8d67ca89SAndroid Build Coastguard Worker ** of tzhead and a second instance of the data in which each coded transition
86*8d67ca89SAndroid Build Coastguard Worker ** time uses 8 rather than 4 chars,
87*8d67ca89SAndroid Build Coastguard Worker ** then a POSIX-TZ-environment-variable-style string for use in handling
88*8d67ca89SAndroid Build Coastguard Worker ** instants after the last transition time stored in the file
89*8d67ca89SAndroid Build Coastguard Worker ** (with nothing between the newlines if there is no POSIX representation for
90*8d67ca89SAndroid Build Coastguard Worker ** such instants).
91*8d67ca89SAndroid Build Coastguard Worker **
92*8d67ca89SAndroid Build Coastguard Worker ** If tz_version is '3' or greater, the above is extended as follows.
93*8d67ca89SAndroid Build Coastguard Worker ** First, the POSIX TZ string's hour offset may range from -167
94*8d67ca89SAndroid Build Coastguard Worker ** through 167 as compared to the POSIX-required 0 through 24.
95*8d67ca89SAndroid Build Coastguard Worker ** Second, its DST start time may be January 1 at 00:00 and its stop
96*8d67ca89SAndroid Build Coastguard Worker ** time December 31 at 24:00 plus the difference between DST and
97*8d67ca89SAndroid Build Coastguard Worker ** standard time, indicating DST all year.
98*8d67ca89SAndroid Build Coastguard Worker */
99*8d67ca89SAndroid Build Coastguard Worker 
100*8d67ca89SAndroid Build Coastguard Worker /*
101*8d67ca89SAndroid Build Coastguard Worker ** In the current implementation, "tzset()" refuses to deal with files that
102*8d67ca89SAndroid Build Coastguard Worker ** exceed any of the limits below.
103*8d67ca89SAndroid Build Coastguard Worker */
104*8d67ca89SAndroid Build Coastguard Worker 
105*8d67ca89SAndroid Build Coastguard Worker #ifndef TZ_MAX_TIMES
106*8d67ca89SAndroid Build Coastguard Worker /* This must be at least 242 for Europe/London with 'zic -b fat'.  */
107*8d67ca89SAndroid Build Coastguard Worker # define TZ_MAX_TIMES 2000
108*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZ_MAX_TIMES */
109*8d67ca89SAndroid Build Coastguard Worker 
110*8d67ca89SAndroid Build Coastguard Worker #ifndef TZ_MAX_TYPES
111*8d67ca89SAndroid Build Coastguard Worker /* This must be at least 18 for Europe/Vilnius with 'zic -b fat'.  */
112*8d67ca89SAndroid Build Coastguard Worker # define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
113*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZ_MAX_TYPES */
114*8d67ca89SAndroid Build Coastguard Worker 
115*8d67ca89SAndroid Build Coastguard Worker #ifndef TZ_MAX_CHARS
116*8d67ca89SAndroid Build Coastguard Worker /* This must be at least 40 for America/Anchorage.  */
117*8d67ca89SAndroid Build Coastguard Worker # define TZ_MAX_CHARS 50	/* Maximum number of abbreviation characters */
118*8d67ca89SAndroid Build Coastguard Worker 				/* (limited by what unsigned chars can hold) */
119*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZ_MAX_CHARS */
120*8d67ca89SAndroid Build Coastguard Worker 
121*8d67ca89SAndroid Build Coastguard Worker #ifndef TZ_MAX_LEAPS
122*8d67ca89SAndroid Build Coastguard Worker /* This must be at least 27 for leap seconds from 1972 through mid-2023.
123*8d67ca89SAndroid Build Coastguard Worker    There's a plan to discontinue leap seconds by 2035.  */
124*8d67ca89SAndroid Build Coastguard Worker # define TZ_MAX_LEAPS 50	/* Maximum number of leap second corrections */
125*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZ_MAX_LEAPS */
126*8d67ca89SAndroid Build Coastguard Worker 
127*8d67ca89SAndroid Build Coastguard Worker #define SECSPERMIN	60
128*8d67ca89SAndroid Build Coastguard Worker #define MINSPERHOUR	60
129*8d67ca89SAndroid Build Coastguard Worker #define HOURSPERDAY	24
130*8d67ca89SAndroid Build Coastguard Worker #define DAYSPERWEEK	7
131*8d67ca89SAndroid Build Coastguard Worker #define DAYSPERNYEAR	365
132*8d67ca89SAndroid Build Coastguard Worker #define DAYSPERLYEAR	366
133*8d67ca89SAndroid Build Coastguard Worker #define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
134*8d67ca89SAndroid Build Coastguard Worker #define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
135*8d67ca89SAndroid Build Coastguard Worker #define MONSPERYEAR	12
136*8d67ca89SAndroid Build Coastguard Worker 
137*8d67ca89SAndroid Build Coastguard Worker #define TM_SUNDAY	0
138*8d67ca89SAndroid Build Coastguard Worker #define TM_MONDAY	1
139*8d67ca89SAndroid Build Coastguard Worker #define TM_TUESDAY	2
140*8d67ca89SAndroid Build Coastguard Worker #define TM_WEDNESDAY	3
141*8d67ca89SAndroid Build Coastguard Worker #define TM_THURSDAY	4
142*8d67ca89SAndroid Build Coastguard Worker #define TM_FRIDAY	5
143*8d67ca89SAndroid Build Coastguard Worker #define TM_SATURDAY	6
144*8d67ca89SAndroid Build Coastguard Worker 
145*8d67ca89SAndroid Build Coastguard Worker #define TM_JANUARY	0
146*8d67ca89SAndroid Build Coastguard Worker #define TM_FEBRUARY	1
147*8d67ca89SAndroid Build Coastguard Worker #define TM_MARCH	2
148*8d67ca89SAndroid Build Coastguard Worker #define TM_APRIL	3
149*8d67ca89SAndroid Build Coastguard Worker #define TM_MAY		4
150*8d67ca89SAndroid Build Coastguard Worker #define TM_JUNE		5
151*8d67ca89SAndroid Build Coastguard Worker #define TM_JULY		6
152*8d67ca89SAndroid Build Coastguard Worker #define TM_AUGUST	7
153*8d67ca89SAndroid Build Coastguard Worker #define TM_SEPTEMBER	8
154*8d67ca89SAndroid Build Coastguard Worker #define TM_OCTOBER	9
155*8d67ca89SAndroid Build Coastguard Worker #define TM_NOVEMBER	10
156*8d67ca89SAndroid Build Coastguard Worker #define TM_DECEMBER	11
157*8d67ca89SAndroid Build Coastguard Worker 
158*8d67ca89SAndroid Build Coastguard Worker #define TM_YEAR_BASE	1900
159*8d67ca89SAndroid Build Coastguard Worker 
160*8d67ca89SAndroid Build Coastguard Worker #define EPOCH_YEAR	1970
161*8d67ca89SAndroid Build Coastguard Worker #define EPOCH_WDAY	TM_THURSDAY
162*8d67ca89SAndroid Build Coastguard Worker 
163*8d67ca89SAndroid Build Coastguard Worker #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
164*8d67ca89SAndroid Build Coastguard Worker 
165*8d67ca89SAndroid Build Coastguard Worker /*
166*8d67ca89SAndroid Build Coastguard Worker ** Since everything in isleap is modulo 400 (or a factor of 400), we know that
167*8d67ca89SAndroid Build Coastguard Worker **	isleap(y) == isleap(y % 400)
168*8d67ca89SAndroid Build Coastguard Worker ** and so
169*8d67ca89SAndroid Build Coastguard Worker **	isleap(a + b) == isleap((a + b) % 400)
170*8d67ca89SAndroid Build Coastguard Worker ** or
171*8d67ca89SAndroid Build Coastguard Worker **	isleap(a + b) == isleap(a % 400 + b % 400)
172*8d67ca89SAndroid Build Coastguard Worker ** This is true even if % means modulo rather than Fortran remainder
173*8d67ca89SAndroid Build Coastguard Worker ** (which is allowed by C89 but not C99).
174*8d67ca89SAndroid Build Coastguard Worker ** We use this to avoid addition overflow problems.
175*8d67ca89SAndroid Build Coastguard Worker */
176*8d67ca89SAndroid Build Coastguard Worker 
177*8d67ca89SAndroid Build Coastguard Worker #define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
178*8d67ca89SAndroid Build Coastguard Worker 
179*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined TZFILE_H */
180