11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZFILE_H
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZFILE_H
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** This file is in the public domain, so clarified as of
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 1996-06-05 by Arthur David Olson.
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** This header is for use ONLY with the time conversion code.
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** There is no guarantee that it will remain unchanged,
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** or that it will remain at all.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Do NOT copy it to any system include directory.
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Thank you!
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Information about time zone files.
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZDIR
23ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZDIR	"/usr/local/etc/zoneinfo" /* Time zone object file directory */
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZDIR */
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZDEFAULT
27ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZDEFAULT	"localtime"
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZDEFAULT */
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZDEFRULES
31ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZDEFRULES	"posixrules"
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZDEFRULES */
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Each file begins with. . .
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
38ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define	TZ_MAGIC	"TZif"
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct tzhead {
41ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_magic[4];		/* TZ_MAGIC */
42e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes	char	tzh_version[1];		/* '\0' or '2' or '3' as of 2013 */
43ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_reserved[15];	/* reserved--must be zero */
44ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_ttisgmtcnt[4];	/* coded number of trans. time flags */
45ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
46ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_leapcnt[4];		/* coded number of leap seconds */
47ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_timecnt[4];		/* coded number of transition times */
48ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_typecnt[4];		/* coded number of local time types */
49ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes	char	tzh_charcnt[4];		/* coded number of abbr. chars */
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** . . .followed by. . .
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**
55ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_timecnt (char [4])s		coded transition times a la time(2)
56ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_timecnt (unsigned char)s	types of local time starting at above
57ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_typecnt repetitions of
58e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes**		one (char [4])		coded UT offset in seconds
59ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**		one (unsigned char)	used to set tm_isdst
60ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**		one (unsigned char)	that's an abbreviation list index
61ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_charcnt (char)s		'\0'-terminated zone abbreviations
62ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_leapcnt repetitions of
63ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**		one (char [4])		coded leap second transition times
64ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**		one (char [4])		total correction after above
65ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_ttisstdcnt (char)s		indexed by type; if TRUE, transition
66ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					time is standard time, if FALSE,
67ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					transition time is wall clock time
68ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					if absent, transition times are
69ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					assumed to be wall clock time
70ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	tzh_ttisgmtcnt (char)s		indexed by type; if TRUE, transition
71e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes**					time is UT, if FALSE,
72ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					transition time is local time
73ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					if absent, transition times are
74ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**					assumed to be local time
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** If tzh_version is '2' or greater, the above is followed by a second instance
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** of tzhead and a second instance of the data in which each coded transition
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** time uses 8 rather than 4 chars,
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** then a POSIX-TZ-environment-variable-style string for use in handling
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** instants after the last transition time stored in the file
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (with nothing between the newlines if there is no POSIX representation for
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** such instants).
85e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes**
86e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes** If tz_version is '3' or greater, the above is extended as follows.
87e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes** First, the POSIX TZ string's hour offset may range from -167
88e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes** through 167 as compared to the POSIX-required 0 through 24.
89e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes** Second, its DST start time may be January 1 at 00:00 and its stop
90e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes** time December 31 at 24:00 plus the difference between DST and
91e0d0b15de6eaee6c3975e13ad2b0e1238d0fdd8fElliott Hughes** standard time, indicating DST all year.
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** In the current implementation, "tzset()" refuses to deal with files that
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** exceed any of the limits below.
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_TIMES
100ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZ_MAX_TIMES	1200
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_TIMES */
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_TYPES
104627d37cd1f7bb6680f611dbe5f28b74a086567a7Calin Juravle/* This must be at least 17 for Europe/Samara and Europe/Vilnius.  */
105ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZ_MAX_TYPES	256 /* Limited by what (unsigned char)'s can hold */
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_TYPES */
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_CHARS
109ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZ_MAX_CHARS	50	/* Maximum number of abbreviation characters */
110ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes				/* (limited by what unsigned chars can hold) */
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_CHARS */
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_LEAPS
114ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TZ_MAX_LEAPS	50	/* Maximum number of leap second corrections */
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_LEAPS */
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
117ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define SECSPERMIN	60
118ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define MINSPERHOUR	60
119ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define HOURSPERDAY	24
120ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define DAYSPERWEEK	7
121ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define DAYSPERNYEAR	365
122ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define DAYSPERLYEAR	366
123ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
124ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
125ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define MONSPERYEAR	12
126ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes
127ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_SUNDAY	0
128ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_MONDAY	1
129ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_TUESDAY	2
130ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_WEDNESDAY	3
131ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_THURSDAY	4
132ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_FRIDAY	5
133ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_SATURDAY	6
134ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes
135ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_JANUARY	0
136ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_FEBRUARY	1
137ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_MARCH	2
138ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_APRIL	3
139ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_MAY		4
140ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_JUNE		5
141ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_JULY		6
142ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_AUGUST	7
143ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_SEPTEMBER	8
144ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_OCTOBER	9
145ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_NOVEMBER	10
146ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_DECEMBER	11
147ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes
148ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define TM_YEAR_BASE	1900
149ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes
150ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define EPOCH_YEAR	1970
151ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define EPOCH_WDAY	TM_THURSDAY
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Since everything in isleap is modulo 400 (or a factor of 400), we know that
157ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	isleap(y) == isleap(y % 400)
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** and so
159ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	isleap(a + b) == isleap((a + b) % 400)
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** or
161ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes**	isleap(a + b) == isleap(a % 400 + b % 400)
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** This is true even if % means modulo rather than Fortran remainder
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (which is allowed by C89 but not C99).
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** We use this to avoid addition overflow problems.
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
167ce4783ce76a4ef888466e02e4c6f3a0a3910bce8Elliott Hughes#define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZFILE_H */
170