1*b7bd7dbeSmillert /* $OpenBSD: tzfile.h,v 1.9 2012/09/13 11:14:20 millert Exp $ */ 2df930be7Sderaadt 3df930be7Sderaadt #ifndef TZFILE_H 40bce2915Smillert 5df930be7Sderaadt #define TZFILE_H 6df930be7Sderaadt 7df930be7Sderaadt /* 80bce2915Smillert ** This file is in the public domain, so clarified as of 922740e74Smillert ** 1996-06-05 by Arthur David Olson. 100bce2915Smillert */ 110bce2915Smillert 120bce2915Smillert /* 13df930be7Sderaadt ** This header is for use ONLY with the time conversion code. 14df930be7Sderaadt ** There is no guarantee that it will remain unchanged, 15df930be7Sderaadt ** or that it will remain at all. 16df930be7Sderaadt ** Do NOT copy it to any system include directory. 17df930be7Sderaadt ** Thank you! 18df930be7Sderaadt */ 19df930be7Sderaadt 20df930be7Sderaadt /* 21df930be7Sderaadt ** Information about time zone files. 22df930be7Sderaadt */ 23df930be7Sderaadt 240bce2915Smillert #ifndef TZDIR 250bce2915Smillert #define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */ 26df930be7Sderaadt #endif /* !defined TZDIR */ 27df930be7Sderaadt 28df930be7Sderaadt #ifndef TZDEFAULT 29df930be7Sderaadt #define TZDEFAULT "/etc/localtime" 30df930be7Sderaadt #endif /* !defined TZDEFAULT */ 31df930be7Sderaadt 32df930be7Sderaadt #ifndef TZDEFRULES 33df930be7Sderaadt #define TZDEFRULES "posixrules" 34df930be7Sderaadt #endif /* !defined TZDEFRULES */ 35df930be7Sderaadt 36df930be7Sderaadt /* 37df930be7Sderaadt ** Each file begins with. . . 38df930be7Sderaadt */ 39df930be7Sderaadt 407c79c202Smillert #define TZ_MAGIC "TZif" 417c79c202Smillert 42df930be7Sderaadt struct tzhead { 437c79c202Smillert char tzh_magic[4]; /* TZ_MAGIC */ 446ee5f097Smillert char tzh_version[1]; /* '\0' or '2' as of 2005 */ 456ee5f097Smillert char tzh_reserved[15]; /* reserved--must be zero */ 46df930be7Sderaadt char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */ 47df930be7Sderaadt char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ 48df930be7Sderaadt char tzh_leapcnt[4]; /* coded number of leap seconds */ 49df930be7Sderaadt char tzh_timecnt[4]; /* coded number of transition times */ 50df930be7Sderaadt char tzh_typecnt[4]; /* coded number of local time types */ 51df930be7Sderaadt char tzh_charcnt[4]; /* coded number of abbr. chars */ 52df930be7Sderaadt }; 53df930be7Sderaadt 54df930be7Sderaadt /* 55df930be7Sderaadt ** . . .followed by. . . 56df930be7Sderaadt ** 57df930be7Sderaadt ** tzh_timecnt (char [4])s coded transition times a la time(2) 58df930be7Sderaadt ** tzh_timecnt (unsigned char)s types of local time starting at above 59df930be7Sderaadt ** tzh_typecnt repetitions of 607c79c202Smillert ** one (char [4]) coded UTC offset in seconds 61df930be7Sderaadt ** one (unsigned char) used to set tm_isdst 62df930be7Sderaadt ** one (unsigned char) that's an abbreviation list index 63df930be7Sderaadt ** tzh_charcnt (char)s '\0'-terminated zone abbreviations 64df930be7Sderaadt ** tzh_leapcnt repetitions of 65df930be7Sderaadt ** one (char [4]) coded leap second transition times 66df930be7Sderaadt ** one (char [4]) total correction after above 67df930be7Sderaadt ** tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition 68df930be7Sderaadt ** time is standard time, if FALSE, 69df930be7Sderaadt ** transition time is wall clock time 70df930be7Sderaadt ** if absent, transition times are 71df930be7Sderaadt ** assumed to be wall clock time 72df930be7Sderaadt ** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition 737c79c202Smillert ** time is UTC, if FALSE, 74df930be7Sderaadt ** transition time is local time 75df930be7Sderaadt ** if absent, transition times are 76df930be7Sderaadt ** assumed to be local time 77df930be7Sderaadt */ 78df930be7Sderaadt 79df930be7Sderaadt /* 806ee5f097Smillert ** If tzh_version is '2' or greater, the above is followed by a second instance 816ee5f097Smillert ** of tzhead and a second instance of the data in which each coded transition 826ee5f097Smillert ** time uses 8 rather than 4 chars, 836ee5f097Smillert ** then a POSIX-TZ-environment-variable-style string for use in handling 846ee5f097Smillert ** instants after the last transition time stored in the file 856ee5f097Smillert ** (with nothing between the newlines if there is no POSIX representation for 866ee5f097Smillert ** such instants). 876ee5f097Smillert */ 886ee5f097Smillert 896ee5f097Smillert /* 90df930be7Sderaadt ** In the current implementation, "tzset()" refuses to deal with files that 91df930be7Sderaadt ** exceed any of the limits below. 92df930be7Sderaadt */ 93df930be7Sderaadt 94df930be7Sderaadt #ifndef TZ_MAX_TIMES 956ee5f097Smillert #define TZ_MAX_TIMES 1200 96df930be7Sderaadt #endif /* !defined TZ_MAX_TIMES */ 97df930be7Sderaadt 98df930be7Sderaadt #ifndef TZ_MAX_TYPES 99df930be7Sderaadt #ifndef NOSOLAR 100df930be7Sderaadt #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ 101df930be7Sderaadt #endif /* !defined NOSOLAR */ 102df930be7Sderaadt #ifdef NOSOLAR 103df930be7Sderaadt /* 104df930be7Sderaadt ** Must be at least 14 for Europe/Riga as of Jan 12 1995, 10522740e74Smillert ** as noted by Earl Chew. 106df930be7Sderaadt */ 107df930be7Sderaadt #define TZ_MAX_TYPES 20 /* Maximum number of local time types */ 108df930be7Sderaadt #endif /* !defined NOSOLAR */ 109df930be7Sderaadt #endif /* !defined TZ_MAX_TYPES */ 110df930be7Sderaadt 111df930be7Sderaadt #ifndef TZ_MAX_CHARS 112df930be7Sderaadt #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ 113df930be7Sderaadt /* (limited by what unsigned chars can hold) */ 114df930be7Sderaadt #endif /* !defined TZ_MAX_CHARS */ 115df930be7Sderaadt 116df930be7Sderaadt #ifndef TZ_MAX_LEAPS 117df930be7Sderaadt #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ 118df930be7Sderaadt #endif /* !defined TZ_MAX_LEAPS */ 119df930be7Sderaadt 120df930be7Sderaadt #define SECSPERMIN 60 121df930be7Sderaadt #define MINSPERHOUR 60 122df930be7Sderaadt #define HOURSPERDAY 24 123df930be7Sderaadt #define DAYSPERWEEK 7 124df930be7Sderaadt #define DAYSPERNYEAR 365 125df930be7Sderaadt #define DAYSPERLYEAR 366 126df930be7Sderaadt #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) 127df930be7Sderaadt #define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY) 128df930be7Sderaadt #define MONSPERYEAR 12 129df930be7Sderaadt 130df930be7Sderaadt #define TM_SUNDAY 0 131df930be7Sderaadt #define TM_MONDAY 1 132df930be7Sderaadt #define TM_TUESDAY 2 133df930be7Sderaadt #define TM_WEDNESDAY 3 134df930be7Sderaadt #define TM_THURSDAY 4 135df930be7Sderaadt #define TM_FRIDAY 5 136df930be7Sderaadt #define TM_SATURDAY 6 137df930be7Sderaadt 138df930be7Sderaadt #define TM_JANUARY 0 139df930be7Sderaadt #define TM_FEBRUARY 1 140df930be7Sderaadt #define TM_MARCH 2 141df930be7Sderaadt #define TM_APRIL 3 142df930be7Sderaadt #define TM_MAY 4 143df930be7Sderaadt #define TM_JUNE 5 144df930be7Sderaadt #define TM_JULY 6 145df930be7Sderaadt #define TM_AUGUST 7 146df930be7Sderaadt #define TM_SEPTEMBER 8 147df930be7Sderaadt #define TM_OCTOBER 9 148df930be7Sderaadt #define TM_NOVEMBER 10 149df930be7Sderaadt #define TM_DECEMBER 11 150df930be7Sderaadt 151df930be7Sderaadt #define TM_YEAR_BASE 1900 152df930be7Sderaadt 153df930be7Sderaadt #define EPOCH_YEAR 1970 154df930be7Sderaadt #define EPOCH_WDAY TM_THURSDAY 155df930be7Sderaadt 156c93c0418Sderaadt #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) 157df930be7Sderaadt 158df930be7Sderaadt /* 1593f56448eSmillert ** Since everything in isleap is modulo 400 (or a factor of 400), we know that 1603f56448eSmillert ** isleap(y) == isleap(y % 400) 1613f56448eSmillert ** and so 1623f56448eSmillert ** isleap(a + b) == isleap((a + b) % 400) 1633f56448eSmillert ** or 1643f56448eSmillert ** isleap(a + b) == isleap(a % 400 + b % 400) 1653f56448eSmillert ** This is true even if % means modulo rather than Fortran remainder 1663f56448eSmillert ** (which is allowed by C89 but not C99). 1673f56448eSmillert ** We use this to avoid addition overflow problems. 168df930be7Sderaadt */ 169df930be7Sderaadt 1703f56448eSmillert #define isleap_sum(a, b) isleap((a) % 400 + (b) % 400) 171df930be7Sderaadt 172df930be7Sderaadt #endif /* !defined TZFILE_H */ 173