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