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