tzfile.h revision 1dc9e472e19acfe6dc7f41e429236e7eef7ceda1
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** ID
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef NOID
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char	tzfilehid[] = "@(#)tzfile.h	8.1";
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined NOID */
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined lint */
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Information about time zone files.
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZDIR
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZDIR "/system/usr/share/zoneinfo" /* Time zone object file directory */
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZDIR */
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZDEFAULT
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZDEFAULT	"localtime"
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZDEFAULT */
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZDEFRULES
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZDEFRULES	"posixrules"
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZDEFRULES */
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Each file begins with. . .
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	TZ_MAGIC	"TZif"
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct tzhead {
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_magic[4];		/* TZ_MAGIC */
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_version[1];		/* '\0' or '2' as of 2005 */
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_reserved[15];	/* reserved--must be zero */
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_ttisgmtcnt[4];	/* coded number of trans. time flags */
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_leapcnt[4];		/* coded number of leap seconds */
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_timecnt[4];		/* coded number of transition times */
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_typecnt[4];		/* coded number of local time types */
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	char	tzh_charcnt[4];		/* coded number of abbr. chars */
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** . . .followed by. . .
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_timecnt (char [4])s		coded transition times a la time(2)
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_timecnt (unsigned char)s	types of local time starting at above
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_typecnt repetitions of
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**		one (char [4])		coded UTC offset in seconds
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**		one (unsigned char)	used to set tm_isdst
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**		one (unsigned char)	that's an abbreviation list index
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_charcnt (char)s		'\0'-terminated zone abbreviations
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_leapcnt repetitions of
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**		one (char [4])		coded leap second transition times
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**		one (char [4])		total correction after above
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_ttisstdcnt (char)s		indexed by type; if TRUE, transition
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					time is standard time, if FALSE,
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					transition time is wall clock time
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					if absent, transition times are
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					assumed to be wall clock time
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	tzh_ttisgmtcnt (char)s		indexed by type; if TRUE, transition
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					time is UTC, if FALSE,
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					transition time is local time
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					if absent, transition times are
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**					assumed to be local time
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** If tzh_version is '2' or greater, the above is followed by a second instance
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** of tzhead and a second instance of the data in which each coded transition
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** time uses 8 rather than 4 chars,
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** then a POSIX-TZ-environment-variable-style string for use in handling
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** instants after the last transition time stored in the file
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (with nothing between the newlines if there is no POSIX representation for
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** such instants).
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** In the current implementation, "tzset()" refuses to deal with files that
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** exceed any of the limits below.
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_TIMES
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZ_MAX_TIMES	1200
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_TIMES */
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_TYPES
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef NOSOLAR
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZ_MAX_TYPES	256 /* Limited by what (unsigned char)'s can hold */
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined NOSOLAR */
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef NOSOLAR
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Must be at least 14 for Europe/Riga as of Jan 12 1995,
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** as noted by Earl Chew.
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZ_MAX_TYPES	20	/* Maximum number of local time types */
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined NOSOLAR */
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_TYPES */
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_CHARS
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZ_MAX_CHARS	50	/* Maximum number of abbreviation characters */
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project				/* (limited by what unsigned chars can hold) */
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_CHARS */
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef TZ_MAX_LEAPS
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TZ_MAX_LEAPS	50	/* Maximum number of leap second corrections */
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZ_MAX_LEAPS */
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SECSPERMIN	60
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define MINSPERHOUR	60
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define HOURSPERDAY	24
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DAYSPERWEEK	7
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DAYSPERNYEAR	365
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DAYSPERLYEAR	366
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SECSPERDAY	((long) SECSPERHOUR * HOURSPERDAY)
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define MONSPERYEAR	12
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_SUNDAY	0
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_MONDAY	1
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_TUESDAY	2
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_WEDNESDAY	3
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_THURSDAY	4
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_FRIDAY	5
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_SATURDAY	6
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_JANUARY	0
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_FEBRUARY	1
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_MARCH	2
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_APRIL	3
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_MAY		4
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_JUNE		5
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_JULY		6
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_AUGUST	7
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_SEPTEMBER	8
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_OCTOBER	9
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_NOVEMBER	10
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_DECEMBER	11
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TM_YEAR_BASE	1900
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EPOCH_YEAR	1970
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EPOCH_WDAY	TM_THURSDAY
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Since everything in isleap is modulo 400 (or a factor of 400), we know that
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	isleap(y) == isleap(y % 400)
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** and so
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	isleap(a + b) == isleap((a + b) % 400)
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** or
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**	isleap(a + b) == isleap(a % 400 + b % 400)
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** This is true even if % means modulo rather than Fortran remainder
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (which is allowed by C89 but not C99).
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** We use this to avoid addition overflow problems.
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define isleap_sum(a, b)	isleap((a) % 400 + (b) % 400)
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TZFILE_H */
181