tzfile.h revision 627d37cd1f7bb6680f611dbe5f28b74a086567a7
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