diff options
Diffstat (limited to 'src/timezone/localtime.c')
-rw-r--r-- | src/timezone/localtime.c | 991 |
1 files changed, 563 insertions, 428 deletions
diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c index f39049a6af0..c48b1ea2069 100644 --- a/src/timezone/localtime.c +++ b/src/timezone/localtime.c @@ -32,18 +32,18 @@ ** 5. They might reference tm.TM_ZONE after calling offtime. ** What's best to do in the above cases is open to debate; ** for now, we just set things up so that in any of the five cases -** WILDABBR is used. Another possibility: initialize tzname[0] to the +** WILDABBR is used. Another possibility: initialize tzname[0] to the ** string "tzname[0] used before set", and similarly for the other cases. ** And another: initialize tzname[0] to "ERA", with an explanation in the ** manual page of what this "time zone abbreviation" means (doing this so ** that tzname[0] has the "normal" length of three characters). */ #define WILDABBR " " -#endif /* !defined WILDABBR */ +#endif /* !defined WILDABBR */ -static char wildabbr[] = "WILDABBR"; +static char wildabbr[] = "WILDABBR"; -static const char gmt[] = "GMT"; +static const char gmt[] = "GMT"; /* ** The DST rules to use if TZ has no rules and we can't load TZDEFRULES. @@ -54,45 +54,50 @@ static const char gmt[] = "GMT"; */ #define TZDEFRULESTRING ",M4.1.0,M10.5.0" -struct ttinfo { /* time type information */ - long tt_gmtoff; /* UTC offset in seconds */ - int tt_isdst; /* used to set tm_isdst */ - int tt_abbrind; /* abbreviation list index */ - int tt_ttisstd; /* TRUE if transition is std time */ - int tt_ttisgmt; /* TRUE if transition is UTC */ +struct ttinfo +{ /* time type information */ + long tt_gmtoff; /* UTC offset in seconds */ + int tt_isdst; /* used to set tm_isdst */ + int tt_abbrind; /* abbreviation list index */ + int tt_ttisstd; /* TRUE if transition is std time */ + int tt_ttisgmt; /* TRUE if transition is UTC */ }; -struct lsinfo { /* leap second information */ - time_t ls_trans; /* transition time */ - long ls_corr; /* correction to apply */ +struct lsinfo +{ /* leap second information */ + time_t ls_trans; /* transition time */ + long ls_corr; /* correction to apply */ }; #define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) -struct state { - int leapcnt; - int timecnt; - int typecnt; - int charcnt; +struct state +{ + int leapcnt; + int timecnt; + int typecnt; + int charcnt; time_t ats[TZ_MAX_TIMES]; - unsigned char types[TZ_MAX_TIMES]; - struct ttinfo ttis[TZ_MAX_TYPES]; + unsigned char types[TZ_MAX_TIMES]; + struct ttinfo ttis[TZ_MAX_TYPES]; char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt), - (2 * (TZ_STRLEN_MAX + 1)))]; - struct lsinfo lsis[TZ_MAX_LEAPS]; + (2 * (TZ_STRLEN_MAX + 1)))]; + struct lsinfo lsis[TZ_MAX_LEAPS]; }; -struct rule { - int r_type; /* type of rule--see below */ - int r_day; /* day number of rule */ - int r_week; /* week number of rule */ - int r_mon; /* month number of rule */ - long r_time; /* transition time of rule */ +struct rule +{ + int r_type; /* type of rule--see below */ + int r_day; /* day number of rule */ + int r_week; /* week number of rule */ + int r_mon; /* month number of rule */ + long r_time; /* transition time of rule */ }; -#define JULIAN_DAY 0 /* Jn - Julian day */ -#define DAY_OF_YEAR 1 /* n - day of year */ -#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */ +#define JULIAN_DAY 0 /* Jn - Julian day */ +#define DAY_OF_YEAR 1 /* n - day of year */ +#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of + * week */ /* ** Prototypes for static functions. @@ -103,29 +108,30 @@ static const char *getzname(const char *strp); static const char *getnum(const char *strp, int *nump, int min, int max); static const char *getsecs(const char *strp, long *secsp); static const char *getoffset(const char *strp, long *offsetp); -static const char *getrule(const char *strp, struct rule *rulep); -static void gmtload(struct state *sp); -static void gmtsub(const time_t *timep, long offset, struct pg_tm *tmp); -static void localsub(const time_t *timep, long offset, struct pg_tm *tmp); -static int increment_overflow(int *number, int delta); -static int normalize_overflow(int *tensptr, int *unitsptr, int base); -static time_t time1(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), long offset); -static time_t time2(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), long offset, int *okayp); -static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), long offset, int *okayp, int do_norm_secs); -static void timesub(const time_t *timep, long offset, const struct state *sp, struct pg_tm *tmp); -static int tmcomp(const struct pg_tm *atmp, const struct pg_tm *btmp); -static time_t transtime(time_t janfirst, int year, const struct rule *rulep, long offset); -static int tzload(const char *name, struct state *sp); -static int tzparse(const char *name, struct state *sp, int lastditch); - -static struct state lclmem; -static struct state gmtmem; +static const char *getrule(const char *strp, struct rule * rulep); +static void gmtload(struct state * sp); +static void gmtsub(const time_t *timep, long offset, struct pg_tm * tmp); +static void localsub(const time_t *timep, long offset, struct pg_tm * tmp); +static int increment_overflow(int *number, int delta); +static int normalize_overflow(int *tensptr, int *unitsptr, int base); +static time_t time1(struct pg_tm * tmp, void (*funcp) (const time_t *, long, struct pg_tm *), long offset); +static time_t time2(struct pg_tm * tmp, void (*funcp) (const time_t *, long, struct pg_tm *), long offset, int *okayp); +static time_t time2sub(struct pg_tm * tmp, void (*funcp) (const time_t *, long, struct pg_tm *), long offset, int *okayp, int do_norm_secs); +static void timesub(const time_t *timep, long offset, const struct state * sp, struct pg_tm * tmp); +static int tmcomp(const struct pg_tm * atmp, const struct pg_tm * btmp); +static time_t transtime(time_t janfirst, int year, const struct rule * rulep, long offset); +static int tzload(const char *name, struct state * sp); +static int tzparse(const char *name, struct state * sp, int lastditch); + +static struct state lclmem; +static struct state gmtmem; + #define lclptr (&lclmem) #define gmtptr (&gmtmem) -static char lcl_TZname[TZ_STRLEN_MAX + 1]; -static int lcl_is_set=0; -static int gmt_is_set=0; +static char lcl_TZname[TZ_STRLEN_MAX + 1]; +static int lcl_is_set = 0; +static int gmt_is_set = 0; /* ** Section 4.12.3 of X3.159-1989 requires that @@ -135,13 +141,14 @@ static int gmt_is_set=0; ** Thanks to Paul Eggert (eggert@twinsun.com) for noting this. */ -static struct pg_tm tm; +static struct pg_tm tm; -static long detzcode(const char *codep) +static long +detzcode(const char *codep) { - register long result; - register int i; + register long result; + register int i; result = (codep[0] & 0x80) ? ~0L : 0L; for (i = 0; i < 4; ++i) @@ -149,22 +156,24 @@ static long detzcode(const char *codep) return result; } -static int tzload(register const char *name, register struct state *sp) +static int +tzload(register const char *name, register struct state * sp) { - register const char * p; - register int i; - register int fid; + register const char *p; + register int i; + register int fid; if (name == NULL && (name = TZDEFAULT) == NULL) return -1; { - register int doaccess; + register int doaccess; char fullname[MAXPGPATH]; if (name[0] == ':') ++name; doaccess = name[0] == '/'; - if (!doaccess) { + if (!doaccess) + { p = pg_TZDIR(); if (p == NULL) return -1; @@ -173,9 +182,10 @@ static int tzload(register const char *name, register struct state *sp) (void) strcpy(fullname, p); (void) strcat(fullname, "/"); (void) strcat(fullname, name); + /* - ** Set doaccess if '.' (as in "../") shows up in name. - */ + * * Set doaccess if '.' (as in "../") shows up in name. + */ if (strchr(name, '.') != NULL) doaccess = TRUE; name = fullname; @@ -186,13 +196,14 @@ static int tzload(register const char *name, register struct state *sp) return -1; } { - struct tzhead * tzhp; - union { - struct tzhead tzhead; + struct tzhead *tzhp; + union + { + struct tzhead tzhead; char buf[sizeof *sp + sizeof *tzhp]; - } u; - int ttisstdcnt; - int ttisgmtcnt; + } u; + int ttisstdcnt; + int ttisgmtcnt; i = read(fid, u.buf, sizeof u.buf); if (close(fid) != 0) @@ -210,26 +221,29 @@ static int tzload(register const char *name, register struct state *sp) sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS || (ttisstdcnt != sp->typecnt && ttisstdcnt != 0) || (ttisgmtcnt != sp->typecnt && ttisgmtcnt != 0)) - return -1; - if (i - (p - u.buf) < sp->timecnt * 4 + /* ats */ - sp->timecnt + /* types */ + return -1; + if (i - (p - u.buf) < sp->timecnt * 4 + /* ats */ + sp->timecnt + /* types */ sp->typecnt * (4 + 2) + /* ttinfos */ - sp->charcnt + /* chars */ + sp->charcnt + /* chars */ sp->leapcnt * (4 + 4) + /* lsinfos */ - ttisstdcnt + /* ttisstds */ + ttisstdcnt + /* ttisstds */ ttisgmtcnt) /* ttisgmts */ - return -1; - for (i = 0; i < sp->timecnt; ++i) { + return -1; + for (i = 0; i < sp->timecnt; ++i) + { sp->ats[i] = detzcode(p); p += 4; } - for (i = 0; i < sp->timecnt; ++i) { + for (i = 0; i < sp->timecnt; ++i) + { sp->types[i] = (unsigned char) *p++; if (sp->types[i] >= sp->typecnt) return -1; } - for (i = 0; i < sp->typecnt; ++i) { - register struct ttinfo * ttisp; + for (i = 0; i < sp->typecnt; ++i) + { + register struct ttinfo *ttisp; ttisp = &sp->ttis[i]; ttisp->tt_gmtoff = detzcode(p); @@ -240,13 +254,14 @@ static int tzload(register const char *name, register struct state *sp) ttisp->tt_abbrind = (unsigned char) *p++; if (ttisp->tt_abbrind < 0 || ttisp->tt_abbrind > sp->charcnt) - return -1; + return -1; } for (i = 0; i < sp->charcnt; ++i) sp->chars[i] = *p++; sp->chars[i] = '\0'; /* ensure '\0' at end */ - for (i = 0; i < sp->leapcnt; ++i) { - register struct lsinfo * lsisp; + for (i = 0; i < sp->leapcnt; ++i) + { + register struct lsinfo *lsisp; lsisp = &sp->lsis[i]; lsisp->ls_trans = detzcode(p); @@ -254,42 +269,46 @@ static int tzload(register const char *name, register struct state *sp) lsisp->ls_corr = detzcode(p); p += 4; } - for (i = 0; i < sp->typecnt; ++i) { - register struct ttinfo * ttisp; + for (i = 0; i < sp->typecnt; ++i) + { + register struct ttinfo *ttisp; ttisp = &sp->ttis[i]; if (ttisstdcnt == 0) ttisp->tt_ttisstd = FALSE; - else { + else + { ttisp->tt_ttisstd = *p++; if (ttisp->tt_ttisstd != TRUE && ttisp->tt_ttisstd != FALSE) - return -1; + return -1; } } - for (i = 0; i < sp->typecnt; ++i) { - register struct ttinfo * ttisp; + for (i = 0; i < sp->typecnt; ++i) + { + register struct ttinfo *ttisp; ttisp = &sp->ttis[i]; if (ttisgmtcnt == 0) ttisp->tt_ttisgmt = FALSE; - else { + else + { ttisp->tt_ttisgmt = *p++; if (ttisp->tt_ttisgmt != TRUE && ttisp->tt_ttisgmt != FALSE) - return -1; + return -1; } } } return 0; } -static const int mon_lengths[2][MONSPERYEAR] = { - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +static const int mon_lengths[2][MONSPERYEAR] = { + {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; -static const int year_lengths[2] = { +static const int year_lengths[2] = { DAYSPERNYEAR, DAYSPERLYEAR }; @@ -299,13 +318,14 @@ static const int year_lengths[2] = { ** character. */ -static const char *getzname(register const char *strp) +static const char * +getzname(register const char *strp) { - register char c; + register char c; while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' && - c != '+') - ++strp; + c != '+') + ++strp; return strp; } @@ -316,22 +336,24 @@ static const char *getzname(register const char *strp) ** Otherwise, return a pointer to the first character not part of the number. */ -static const char *getnum(register const char *strp, int *nump, const int min, const int max) +static const char * +getnum(register const char *strp, int *nump, const int min, const int max) { - register char c; - register int num; + register char c; + register int num; if (strp == NULL || !is_digit(c = *strp)) return NULL; num = 0; - do { + do + { num = num * 10 + (c - '0'); if (num > max) - return NULL; /* illegal value */ + return NULL; /* illegal value */ c = *++strp; } while (is_digit(c)); if (num < min) - return NULL; /* illegal value */ + return NULL; /* illegal value */ *nump = num; return strp; } @@ -344,27 +366,30 @@ static const char *getnum(register const char *strp, int *nump, const int min, c ** of seconds. */ -static const char *getsecs(register const char *strp, long *secsp) +static const char * +getsecs(register const char *strp, long *secsp) { - int num; + int num; /* - ** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like - ** "M10.4.6/26", which does not conform to Posix, - ** but which specifies the equivalent of - ** ``02:00 on the first Sunday on or after 23 Oct''. - */ + * * `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like * + * "M10.4.6/26", which does not conform to Posix, * but which + * specifies the equivalent of * ``02:00 on the first Sunday on or + * after 23 Oct''. + */ strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1); if (strp == NULL) return NULL; *secsp = num * (long) SECSPERHOUR; - if (*strp == ':') { + if (*strp == ':') + { ++strp; strp = getnum(strp, &num, 0, MINSPERHOUR - 1); if (strp == NULL) return NULL; *secsp += num * SECSPERMIN; - if (*strp == ':') { + if (*strp == ':') + { ++strp; /* `SECSPERMIN' allows for leap seconds. */ strp = getnum(strp, &num, 0, SECSPERMIN); @@ -383,18 +408,21 @@ static const char *getsecs(register const char *strp, long *secsp) ** Otherwise, return a pointer to the first character not part of the time. */ -static const char *getoffset(register const char *strp, long *offsetp) +static const char * +getoffset(register const char *strp, long *offsetp) { - register int neg = 0; + register int neg = 0; - if (*strp == '-') { + if (*strp == '-') + { neg = 1; ++strp; - } else if (*strp == '+') + } + else if (*strp == '+') ++strp; strp = getsecs(strp, offsetp); if (strp == NULL) - return NULL; /* illegal time */ + return NULL; /* illegal time */ if (neg) *offsetp = -*offsetp; return strp; @@ -407,19 +435,23 @@ static const char *getoffset(register const char *strp, long *offsetp) ** Otherwise, return a pointer to the first character not part of the rule. */ -static const char *getrule(const char *strp, register struct rule *rulep) +static const char * +getrule(const char *strp, register struct rule * rulep) { - if (*strp == 'J') { + if (*strp == 'J') + { /* - ** Julian day. - */ + * * Julian day. + */ rulep->r_type = JULIAN_DAY; ++strp; strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR); - } else if (*strp == 'M') { + } + else if (*strp == 'M') + { /* - ** Month, week, day. - */ + * * Month, week, day. + */ rulep->r_type = MONTH_NTH_DAY_OF_WEEK; ++strp; strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR); @@ -433,22 +465,29 @@ static const char *getrule(const char *strp, register struct rule *rulep) if (*strp++ != '.') return NULL; strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1); - } else if (is_digit(*strp)) { + } + else if (is_digit(*strp)) + { /* - ** Day of year. - */ + * * Day of year. + */ rulep->r_type = DAY_OF_YEAR; strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1); - } else return NULL; /* invalid format */ + } + else + return NULL; /* invalid format */ if (strp == NULL) return NULL; - if (*strp == '/') { + if (*strp == '/') + { /* - ** Time specified. - */ + * * Time specified. + */ ++strp; strp = getsecs(strp, &rulep->r_time); - } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */ + } + else + rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */ return strp; } @@ -458,87 +497,97 @@ static const char *getrule(const char *strp, register struct rule *rulep) ** calculate the Epoch-relative time that rule takes effect. */ -static time_t transtime(const time_t janfirst, const int year, register const struct rule *rulep, const long offset) +static time_t +transtime(const time_t janfirst, const int year, register const struct rule * rulep, const long offset) { - register int leapyear; - register time_t value = 0; - register int i; - int d, m1, yy0, yy1, yy2, dow; + register int leapyear; + register time_t value = 0; + register int i; + int d, + m1, + yy0, + yy1, + yy2, + dow; leapyear = isleap(year); - switch (rulep->r_type) { + switch (rulep->r_type) + { - case JULIAN_DAY: - /* - ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap - ** years. - ** In non-leap years, or if the day number is 59 or less, just - ** add SECSPERDAY times the day number-1 to the time of - ** January 1, midnight, to get the day. - */ - value = janfirst + (rulep->r_day - 1) * SECSPERDAY; - if (leapyear && rulep->r_day >= 60) - value += SECSPERDAY; - break; - - case DAY_OF_YEAR: - /* - ** n - day of year. - ** Just add SECSPERDAY times the day number to the time of - ** January 1, midnight, to get the day. - */ - value = janfirst + rulep->r_day * SECSPERDAY; - break; - - case MONTH_NTH_DAY_OF_WEEK: - /* - ** Mm.n.d - nth "dth day" of month m. - */ - value = janfirst; - for (i = 0; i < rulep->r_mon - 1; ++i) - value += mon_lengths[leapyear][i] * SECSPERDAY; + case JULIAN_DAY: - /* - ** Use Zeller's Congruence to get day-of-week of first day of - ** month. - */ - m1 = (rulep->r_mon + 9) % 12 + 1; - yy0 = (rulep->r_mon <= 2) ? (year - 1) : year; - yy1 = yy0 / 100; - yy2 = yy0 % 100; - dow = ((26 * m1 - 2) / 10 + - 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; - if (dow < 0) - dow += DAYSPERWEEK; + /* + * * Jn - Julian day, 1 == January 1, 60 == March 1 even in + * leap * years. * In non-leap years, or if the day number is + * 59 or less, just * add SECSPERDAY times the day number-1 to + * the time of * January 1, midnight, to get the day. + */ + value = janfirst + (rulep->r_day - 1) * SECSPERDAY; + if (leapyear && rulep->r_day >= 60) + value += SECSPERDAY; + break; - /* - ** "dow" is the day-of-week of the first day of the month. Get - ** the day-of-month (zero-origin) of the first "dow" day of the - ** month. - */ - d = rulep->r_day - dow; - if (d < 0) - d += DAYSPERWEEK; - for (i = 1; i < rulep->r_week; ++i) { - if (d + DAYSPERWEEK >= - mon_lengths[leapyear][rulep->r_mon - 1]) + case DAY_OF_YEAR: + + /* + * * n - day of year. * Just add SECSPERDAY times the day + * number to the time of * January 1, midnight, to get the + * day. + */ + value = janfirst + rulep->r_day * SECSPERDAY; + break; + + case MONTH_NTH_DAY_OF_WEEK: + + /* + * * Mm.n.d - nth "dth day" of month m. + */ + value = janfirst; + for (i = 0; i < rulep->r_mon - 1; ++i) + value += mon_lengths[leapyear][i] * SECSPERDAY; + + /* + * * Use Zeller's Congruence to get day-of-week of first day + * of * month. + */ + m1 = (rulep->r_mon + 9) % 12 + 1; + yy0 = (rulep->r_mon <= 2) ? (year - 1) : year; + yy1 = yy0 / 100; + yy2 = yy0 % 100; + dow = ((26 * m1 - 2) / 10 + + 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; + if (dow < 0) + dow += DAYSPERWEEK; + + /* + * * "dow" is the day-of-week of the first day of the month. + * Get * the day-of-month (zero-origin) of the first "dow" day + * of the * month. + */ + d = rulep->r_day - dow; + if (d < 0) + d += DAYSPERWEEK; + for (i = 1; i < rulep->r_week; ++i) + { + if (d + DAYSPERWEEK >= + mon_lengths[leapyear][rulep->r_mon - 1]) break; - d += DAYSPERWEEK; - } + d += DAYSPERWEEK; + } - /* - ** "d" is the day-of-month (zero-origin) of the day we want. - */ - value += d * SECSPERDAY; - break; + /* + * * "d" is the day-of-month (zero-origin) of the day we want. + */ + value += d * SECSPERDAY; + break; } /* - ** "value" is the Epoch-relative time of 00:00:00 UTC on the day in - ** question. To get the Epoch-relative time of the specified local - ** time on that day, add the transition time and the current offset - ** from UTC. - */ + * * "value" is the Epoch-relative time of 00:00:00 UTC on the day in * + * question. To get the Epoch-relative time of the specified local * + * time on that day, add the transition time and the current offset * + * from UTC. + */ return value + rulep->r_time + offset; } @@ -547,27 +596,31 @@ static time_t transtime(const time_t janfirst, const int year, register const st ** appropriate. */ -static int tzparse(const char *name, register struct state *sp, const int lastditch) +static int +tzparse(const char *name, register struct state * sp, const int lastditch) { - const char * stdname; - const char * dstname = NULL; - size_t stdlen; - size_t dstlen; - long stdoffset; - long dstoffset; - register time_t * atp; - register unsigned char * typep; - register char * cp; - register int load_result; + const char *stdname; + const char *dstname = NULL; + size_t stdlen; + size_t dstlen; + long stdoffset; + long dstoffset; + register time_t *atp; + register unsigned char *typep; + register char *cp; + register int load_result; stdname = name; - if (lastditch) { + if (lastditch) + { stdlen = strlen(name); /* length of standard zone name */ name += stdlen; if (stdlen >= sizeof sp->chars) stdlen = (sizeof sp->chars) - 1; stdoffset = 0; - } else { + } + else + { name = getzname(name); stdlen = name - stdname; if (stdlen < 3) @@ -581,24 +634,29 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi load_result = tzload(TZDEFRULES, sp); if (load_result != 0) sp->leapcnt = 0; /* so, we're off a little */ - if (*name != '\0') { + if (*name != '\0') + { dstname = name; name = getzname(name); dstlen = name - dstname; /* length of DST zone name */ if (dstlen < 3) return -1; - if (*name != '\0' && *name != ',' && *name != ';') { + if (*name != '\0' && *name != ',' && *name != ';') + { name = getoffset(name, &dstoffset); if (name == NULL) return -1; - } else dstoffset = stdoffset - SECSPERHOUR; + } + else + dstoffset = stdoffset - SECSPERHOUR; if (*name == '\0' && load_result != 0) name = TZDEFRULESTRING; - if (*name == ',' || *name == ';') { - struct rule start; - struct rule end; - register int year; - register time_t janfirst; + if (*name == ',' || *name == ';') + { + struct rule start; + struct rule end; + register int year; + register time_t janfirst; time_t starttime; time_t endtime; @@ -612,9 +670,10 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi if (*name != '\0') return -1; sp->typecnt = 2; /* standard time and DST */ + /* - ** Two transitions per year, from EPOCH_YEAR to 2037. - */ + * * Two transitions per year, from EPOCH_YEAR to 2037. + */ sp->timecnt = 2 * (2037 - EPOCH_YEAR + 1); if (sp->timecnt > TZ_MAX_TIMES) return -1; @@ -627,89 +686,108 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi atp = sp->ats; typep = sp->types; janfirst = 0; - for (year = EPOCH_YEAR; year <= 2037; ++year) { + for (year = EPOCH_YEAR; year <= 2037; ++year) + { starttime = transtime(janfirst, year, &start, - stdoffset); + stdoffset); endtime = transtime(janfirst, year, &end, - dstoffset); - if (starttime > endtime) { + dstoffset); + if (starttime > endtime) + { *atp++ = endtime; - *typep++ = 1; /* DST ends */ + *typep++ = 1; /* DST ends */ *atp++ = starttime; - *typep++ = 0; /* DST begins */ - } else { + *typep++ = 0; /* DST begins */ + } + else + { *atp++ = starttime; - *typep++ = 0; /* DST begins */ + *typep++ = 0; /* DST begins */ *atp++ = endtime; - *typep++ = 1; /* DST ends */ + *typep++ = 1; /* DST ends */ } janfirst += year_lengths[isleap(year)] * SECSPERDAY; } - } else { - register long theirstdoffset; - register long theirdstoffset; - register long theiroffset; - register int isdst; - register int i; - register int j; + } + else + { + register long theirstdoffset; + register long theirdstoffset; + register long theiroffset; + register int isdst; + register int i; + register int j; if (*name != '\0') return -1; + /* - ** Initial values of theirstdoffset and theirdstoffset. - */ + * * Initial values of theirstdoffset and theirdstoffset. + */ theirstdoffset = 0; - for (i = 0; i < sp->timecnt; ++i) { + for (i = 0; i < sp->timecnt; ++i) + { j = sp->types[i]; - if (!sp->ttis[j].tt_isdst) { + if (!sp->ttis[j].tt_isdst) + { theirstdoffset = -sp->ttis[j].tt_gmtoff; break; } } theirdstoffset = 0; - for (i = 0; i < sp->timecnt; ++i) { + for (i = 0; i < sp->timecnt; ++i) + { j = sp->types[i]; - if (sp->ttis[j].tt_isdst) { + if (sp->ttis[j].tt_isdst) + { theirdstoffset = -sp->ttis[j].tt_gmtoff; break; } } + /* - ** Initially we're assumed to be in standard time. - */ + * * Initially we're assumed to be in standard time. + */ isdst = FALSE; theiroffset = theirstdoffset; + /* - ** Now juggle transition times and types - ** tracking offsets as you do. - */ - for (i = 0; i < sp->timecnt; ++i) { + * * Now juggle transition times and types * tracking offsets + * as you do. + */ + for (i = 0; i < sp->timecnt; ++i) + { j = sp->types[i]; sp->types[i] = sp->ttis[j].tt_isdst; - if (sp->ttis[j].tt_ttisgmt) { + if (sp->ttis[j].tt_ttisgmt) + { /* No adjustment to transition time */ - } else { + } + else + { /* - ** If summer time is in effect, and the - ** transition time was not specified as - ** standard time, add the summer time - ** offset to the transition time; - ** otherwise, add the standard time - ** offset to the transition time. - */ + * * If summer time is in effect, and the * transition + * time was not specified as * standard time, add the + * summer time * offset to the transition time; * + * otherwise, add the standard time * offset to the + * transition time. + */ + /* - ** Transitions from DST to DDST - ** will effectively disappear since - ** POSIX provides for only one DST - ** offset. - */ - if (isdst && !sp->ttis[j].tt_ttisstd) { + * * Transitions from DST to DDST * will effectively + * disappear since * POSIX provides for only one DST * + * offset. + */ + if (isdst && !sp->ttis[j].tt_ttisstd) + { sp->ats[i] += dstoffset - theirdstoffset; - } else { + } + else + { sp->ats[i] += stdoffset - theirstdoffset; } @@ -717,12 +795,14 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi theiroffset = -sp->ttis[j].tt_gmtoff; if (sp->ttis[j].tt_isdst) theirdstoffset = theiroffset; - else theirstdoffset = theiroffset; + else + theirstdoffset = theiroffset; } + /* - ** Finally, fill in ttis. - ** ttisstd and ttisgmt need not be handled. - */ + * * Finally, fill in ttis. * ttisstd and ttisgmt need not be + * handled. + */ sp->ttis[0].tt_gmtoff = -stdoffset; sp->ttis[0].tt_isdst = FALSE; sp->ttis[0].tt_abbrind = 0; @@ -731,7 +811,9 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi sp->ttis[1].tt_abbrind = stdlen + 1; sp->typecnt = 2; } - } else { + } + else + { dstlen = 0; sp->typecnt = 1; /* only standard time */ sp->timecnt = 0; @@ -748,29 +830,33 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi (void) strncpy(cp, stdname, stdlen); cp += stdlen; *cp++ = '\0'; - if (dstlen != 0) { + if (dstlen != 0) + { (void) strncpy(cp, dstname, dstlen); *(cp + dstlen) = '\0'; } return 0; } -static void gmtload(struct state *sp) +static void +gmtload(struct state * sp) { if (tzload(gmt, sp) != 0) (void) tzparse(gmt, sp, TRUE); } -bool pg_tzset(const char *name) +bool +pg_tzset(const char *name) { if (lcl_is_set && strcmp(lcl_TZname, name) == 0) - return true; /* no change */ + return true; /* no change */ if (strlen(name) >= sizeof(lcl_TZname)) return false; /* not gonna fit */ - if (tzload(name, lclptr) != 0) { + if (tzload(name, lclptr) != 0) + { if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0) { /* Unknown timezone. Fail our call instead of loading GMT! */ @@ -793,40 +879,46 @@ bool pg_tzset(const char *name) ** The unused offset argument is for the benefit of mktime variants. */ -static void localsub(const time_t *timep, const long offset, struct pg_tm *tmp) +static void +localsub(const time_t *timep, const long offset, struct pg_tm * tmp) { - register struct state * sp; - register const struct ttinfo * ttisp; - register int i; - const time_t t = *timep; + register struct state *sp; + register const struct ttinfo *ttisp; + register int i; + const time_t t = *timep; sp = lclptr; - if (sp->timecnt == 0 || t < sp->ats[0]) { + if (sp->timecnt == 0 || t < sp->ats[0]) + { i = 0; while (sp->ttis[i].tt_isdst) - if (++i >= sp->typecnt) { + if (++i >= sp->typecnt) + { i = 0; break; } - } else { + } + else + { for (i = 1; i < sp->timecnt; ++i) - if (t < sp->ats[i]) + if (t < sp->ats[i]) break; i = sp->types[i - 1]; } ttisp = &sp->ttis[i]; + /* - ** To get (wrong) behavior that's compatible with System V Release 2.0 - ** you'd replace the statement below with - ** t += ttisp->tt_gmtoff; - ** timesub(&t, 0L, sp, tmp); - */ + * * To get (wrong) behavior that's compatible with System V Release + * 2.0 * you'd replace the statement below with * t += + * ttisp->tt_gmtoff; * timesub(&t, 0L, sp, tmp); + */ timesub(&t, ttisp->tt_gmtoff, sp, tmp); tmp->tm_isdst = ttisp->tt_isdst; tmp->tm_zone = &sp->chars[ttisp->tt_abbrind]; } -struct pg_tm *pg_localtime(const time_t *timep) +struct pg_tm * +pg_localtime(const time_t *timep) { localsub(timep, 0L, &tm); return &tm; @@ -837,61 +929,69 @@ struct pg_tm *pg_localtime(const time_t *timep) ** gmtsub is to gmtime as localsub is to localtime. */ -static void gmtsub(const time_t *timep, const long offset, struct pg_tm *tmp) +static void +gmtsub(const time_t *timep, const long offset, struct pg_tm * tmp) { - if (!gmt_is_set) { + if (!gmt_is_set) + { gmt_is_set = TRUE; gmtload(gmtptr); } timesub(timep, offset, gmtptr, tmp); + /* - ** Could get fancy here and deliver something such as - ** "UTC+xxxx" or "UTC-xxxx" if offset is non-zero, - ** but this is no time for a treasure hunt. - */ + * * Could get fancy here and deliver something such as * "UTC+xxxx" + * or "UTC-xxxx" if offset is non-zero, * but this is no time for a + * treasure hunt. + */ if (offset != 0) tmp->tm_zone = wildabbr; - else { + else tmp->tm_zone = gmtptr->chars; - } } -struct pg_tm *pg_gmtime(const time_t *timep) +struct pg_tm * +pg_gmtime(const time_t *timep) { gmtsub(timep, 0L, &tm); return &tm; } -static void timesub(const time_t *timep, const long offset, register const struct state *sp, register struct pg_tm *tmp) +static void +timesub(const time_t *timep, const long offset, register const struct state * sp, register struct pg_tm * tmp) { - register const struct lsinfo * lp; - register long days; - register long rem; - register int y; - register int yleap; - register const int * ip; - register long corr; - register int hit; - register int i; + register const struct lsinfo *lp; + register long days; + register long rem; + register int y; + register int yleap; + register const int *ip; + register long corr; + register int hit; + register int i; corr = 0; hit = 0; i = sp->leapcnt; - while (--i >= 0) { + while (--i >= 0) + { lp = &sp->lsis[i]; - if (*timep >= lp->ls_trans) { - if (*timep == lp->ls_trans) { + if (*timep >= lp->ls_trans) + { + if (*timep == lp->ls_trans) + { hit = ((i == 0 && lp->ls_corr > 0) || - lp->ls_corr > sp->lsis[i - 1].ls_corr); + lp->ls_corr > sp->lsis[i - 1].ls_corr); if (hit) while (i > 0 && - sp->lsis[i].ls_trans == - sp->lsis[i - 1].ls_trans + 1 && - sp->lsis[i].ls_corr == - sp->lsis[i - 1].ls_corr + 1) { - ++hit; - --i; + sp->lsis[i].ls_trans == + sp->lsis[i - 1].ls_trans + 1 && + sp->lsis[i].ls_corr == + sp->lsis[i - 1].ls_corr + 1) + { + ++hit; + --i; } } corr = lp->ls_corr; @@ -901,38 +1001,43 @@ static void timesub(const time_t *timep, const long offset, register const struc days = *timep / SECSPERDAY; rem = *timep % SECSPERDAY; #ifdef mc68k - if (*timep == 0x80000000) { + if (*timep == 0x80000000) + { /* - ** A 3B1 muffs the division on the most negative number. - */ + * * A 3B1 muffs the division on the most negative number. + */ days = -24855; rem = -11648; } -#endif /* defined mc68k */ +#endif /* defined mc68k */ rem += (offset - corr); - while (rem < 0) { + while (rem < 0) + { rem += SECSPERDAY; --days; } - while (rem >= SECSPERDAY) { + while (rem >= SECSPERDAY) + { rem -= SECSPERDAY; ++days; } tmp->tm_hour = (int) (rem / SECSPERHOUR); rem = rem % SECSPERHOUR; tmp->tm_min = (int) (rem / SECSPERMIN); + /* - ** A positive leap second requires a special - ** representation. This uses "... ??:59:60" et seq. - */ + * * A positive leap second requires a special * representation. This + * uses "... ??:59:60" et seq. + */ tmp->tm_sec = (int) (rem % SECSPERMIN) + hit; tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYSPERWEEK); if (tmp->tm_wday < 0) tmp->tm_wday += DAYSPERWEEK; y = EPOCH_YEAR; #define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) - while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) { - register int newy; + while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) + { + register int newy; newy = y + days / DAYSPERNYEAR; if (days < 0) @@ -968,18 +1073,20 @@ static void timesub(const time_t *timep, const long offset, register const struc ** Simplified normalize logic courtesy Paul Eggert (eggert@twinsun.com). */ -static int increment_overflow(int *number, int delta) +static int +increment_overflow(int *number, int delta) { - int number0; + int number0; number0 = *number; *number += delta; return (*number < number0) != (delta < 0); } -static int normalize_overflow(int *tensptr, int *unitsptr, const int base) +static int +normalize_overflow(int *tensptr, int *unitsptr, const int base) { - register int tensdelta; + register int tensdelta; tensdelta = (*unitsptr >= 0) ? (*unitsptr / base) : @@ -988,36 +1095,40 @@ static int normalize_overflow(int *tensptr, int *unitsptr, const int base) return increment_overflow(tensptr, tensdelta); } -static int tmcomp(register const struct pg_tm *atmp, register const struct pg_tm *btmp) +static int +tmcomp(register const struct pg_tm * atmp, register const struct pg_tm * btmp) { - register int result; + register int result; if ((result = (atmp->tm_year - btmp->tm_year)) == 0 && (result = (atmp->tm_mon - btmp->tm_mon)) == 0 && (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && (result = (atmp->tm_min - btmp->tm_min)) == 0) - result = atmp->tm_sec - btmp->tm_sec; + result = atmp->tm_sec - btmp->tm_sec; return result; } -static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), const long offset, int *okayp, const int do_norm_secs) +static time_t time2sub(struct pg_tm * tmp, void (*funcp) (const time_t *, long, struct pg_tm *), const long offset, int *okayp, const int do_norm_secs) { - register const struct state * sp; - register int dir; - register int bits; - register int i, j ; - register int saved_seconds; - time_t newt; - time_t t; - struct pg_tm yourtm, mytm; + register const struct state *sp; + register int dir; + register int bits; + register int i, + j; + register int saved_seconds; + time_t newt; + time_t t; + struct pg_tm yourtm, + mytm; *okayp = FALSE; yourtm = *tmp; - if (do_norm_secs) { + if (do_norm_secs) + { if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec, - SECSPERMIN)) - return WRONG; + SECSPERMIN)) + return WRONG; } if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR)) return WRONG; @@ -1025,30 +1136,35 @@ static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, str return WRONG; if (normalize_overflow(&yourtm.tm_year, &yourtm.tm_mon, MONSPERYEAR)) return WRONG; + /* - ** Turn yourtm.tm_year into an actual year number for now. - ** It is converted back to an offset from TM_YEAR_BASE later. - */ + * * Turn yourtm.tm_year into an actual year number for now. * It is + * converted back to an offset from TM_YEAR_BASE later. + */ if (increment_overflow(&yourtm.tm_year, TM_YEAR_BASE)) return WRONG; - while (yourtm.tm_mday <= 0) { + while (yourtm.tm_mday <= 0) + { if (increment_overflow(&yourtm.tm_year, -1)) return WRONG; i = yourtm.tm_year + (1 < yourtm.tm_mon); yourtm.tm_mday += year_lengths[isleap(i)]; } - while (yourtm.tm_mday > DAYSPERLYEAR) { + while (yourtm.tm_mday > DAYSPERLYEAR) + { i = yourtm.tm_year + (1 < yourtm.tm_mon); yourtm.tm_mday -= year_lengths[isleap(i)]; if (increment_overflow(&yourtm.tm_year, 1)) return WRONG; } - for ( ; ; ) { + for (;;) + { i = mon_lengths[isleap(yourtm.tm_year)][yourtm.tm_mon]; if (yourtm.tm_mday <= i) break; yourtm.tm_mday -= i; - if (++yourtm.tm_mon >= MONSPERYEAR) { + if (++yourtm.tm_mon >= MONSPERYEAR) + { yourtm.tm_mon = 0; if (increment_overflow(&yourtm.tm_year, 1)) return WRONG; @@ -1058,77 +1174,87 @@ static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, str return WRONG; if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN) saved_seconds = 0; - else if (yourtm.tm_year + TM_YEAR_BASE < EPOCH_YEAR) { + else if (yourtm.tm_year + TM_YEAR_BASE < EPOCH_YEAR) + { /* - ** We can't set tm_sec to 0, because that might push the - ** time below the minimum representable time. - ** Set tm_sec to 59 instead. - ** This assumes that the minimum representable time is - ** not in the same minute that a leap second was deleted from, - ** which is a safer assumption than using 58 would be. - */ + * * We can't set tm_sec to 0, because that might push the * time + * below the minimum representable time. * Set tm_sec to 59 + * instead. * This assumes that the minimum representable time is * + * not in the same minute that a leap second was deleted from, * + * which is a safer assumption than using 58 would be. + */ if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN)) return WRONG; saved_seconds = yourtm.tm_sec; yourtm.tm_sec = SECSPERMIN - 1; - } else { + } + else + { saved_seconds = yourtm.tm_sec; yourtm.tm_sec = 0; } + /* - ** Divide the search space in half - ** (this works whether time_t is signed or unsigned). - */ - bits = TYPE_BIT(time_t) - 1; + * * Divide the search space in half * (this works whether time_t is + * signed or unsigned). + */ + bits = TYPE_BIT(time_t) -1; + /* - ** If time_t is signed, then 0 is just above the median, - ** assuming two's complement arithmetic. - ** If time_t is unsigned, then (1 << bits) is just above the median. - */ + * * If time_t is signed, then 0 is just above the median, * assuming + * two's complement arithmetic. * If time_t is unsigned, then (1 << + * bits) is just above the median. + */ t = TYPE_SIGNED(time_t) ? 0 : (((time_t) 1) << bits); - for ( ; ; ) { - (*funcp)(&t, offset, &mytm); + for (;;) + { + (*funcp) (&t, offset, &mytm); dir = tmcomp(&mytm, &yourtm); - if (dir != 0) { + if (dir != 0) + { if (bits-- < 0) return WRONG; if (bits < 0) - --t; /* may be needed if new t is minimal */ + --t; /* may be needed if new t is minimal */ else if (dir > 0) t -= ((time_t) 1) << bits; - else t += ((time_t) 1) << bits; + else + t += ((time_t) 1) << bits; continue; } if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst) break; + /* - ** Right time, wrong type. - ** Hunt for right time, right type. - ** It's okay to guess wrong since the guess - ** gets checked. - */ + * * Right time, wrong type. * Hunt for right time, right type. * + * It's okay to guess wrong since the guess * gets checked. + */ + /* - ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. - */ + * * The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. + */ sp = (const struct state *) (((void *) funcp == (void *) localsub) ? - lclptr : gmtptr); - for (i = sp->typecnt - 1; i >= 0; --i) { + lclptr : gmtptr); + for (i = sp->typecnt - 1; i >= 0; --i) + { if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) continue; - for (j = sp->typecnt - 1; j >= 0; --j) { + for (j = sp->typecnt - 1; j >= 0; --j) + { if (sp->ttis[j].tt_isdst == yourtm.tm_isdst) continue; newt = t + sp->ttis[j].tt_gmtoff - sp->ttis[i].tt_gmtoff; - (*funcp)(&newt, offset, &mytm); + (*funcp) (&newt, offset, &mytm); if (tmcomp(&mytm, &yourtm) != 0) continue; if (mytm.tm_isdst != yourtm.tm_isdst) continue; + /* - ** We have a match. - */ + * * We have a match. + */ t = newt; goto label; } @@ -1140,83 +1266,91 @@ label: if ((newt < t) != (saved_seconds < 0)) return WRONG; t = newt; - (*funcp)(&t, offset, tmp); + (*funcp) (&t, offset, tmp); *okayp = TRUE; return t; } -static time_t time2(struct pg_tm *tmp, void(*funcp)(const time_t*, long, struct pg_tm*), const long offset, int *okayp) +static time_t time2(struct pg_tm * tmp, void (*funcp) (const time_t *, long, struct pg_tm *), const long offset, int *okayp) { - time_t t; + time_t t; /* - ** First try without normalization of seconds - ** (in case tm_sec contains a value associated with a leap second). - ** If that fails, try with normalization of seconds. - */ + * * First try without normalization of seconds * (in case tm_sec + * contains a value associated with a leap second). * If that fails, + * try with normalization of seconds. + */ t = time2sub(tmp, funcp, offset, okayp, FALSE); return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE); } -static time_t time1(struct pg_tm *tmp, void (*funcp)(const time_t *, long, struct pg_tm *), const long offset) +static time_t time1(struct pg_tm * tmp, void (*funcp) (const time_t *, long, struct pg_tm *), const long offset) { - register time_t t; - register const struct state * sp; - register int samei, otheri; - register int sameind, otherind; - register int i; - register int nseen; - int seen[TZ_MAX_TYPES]; - int types[TZ_MAX_TYPES]; - int okay; + register time_t t; + register const struct state *sp; + register int samei, + otheri; + register int sameind, + otherind; + register int i; + register int nseen; + int seen[TZ_MAX_TYPES]; + int types[TZ_MAX_TYPES]; + int okay; if (tmp->tm_isdst > 1) tmp->tm_isdst = 1; t = time2(tmp, funcp, offset, &okay); if (okay || tmp->tm_isdst < 0) return t; + /* - ** We're supposed to assume that somebody took a time of one type - ** and did some math on it that yielded a "struct pg_tm" that's bad. - ** We try to divine the type they started from and adjust to the - ** type they need. - */ + * * We're supposed to assume that somebody took a time of one type * + * and did some math on it that yielded a "struct pg_tm" that's bad. * + * We try to divine the type they started from and adjust to the * + * type they need. + */ + /* - ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. - */ + * * The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. + */ sp = (const struct state *) (((void *) funcp == (void *) localsub) ? - lclptr : gmtptr); + lclptr : gmtptr); for (i = 0; i < sp->typecnt; ++i) seen[i] = FALSE; nseen = 0; for (i = sp->timecnt - 1; i >= 0; --i) - if (!seen[sp->types[i]]) { + if (!seen[sp->types[i]]) + { seen[sp->types[i]] = TRUE; types[nseen++] = sp->types[i]; } - for (sameind = 0; sameind < nseen; ++sameind) { + for (sameind = 0; sameind < nseen; ++sameind) + { samei = types[sameind]; if (sp->ttis[samei].tt_isdst != tmp->tm_isdst) continue; - for (otherind = 0; otherind < nseen; ++otherind) { + for (otherind = 0; otherind < nseen; ++otherind) + { otheri = types[otherind]; if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst) continue; tmp->tm_sec += sp->ttis[otheri].tt_gmtoff - - sp->ttis[samei].tt_gmtoff; + sp->ttis[samei].tt_gmtoff; tmp->tm_isdst = !tmp->tm_isdst; t = time2(tmp, funcp, offset, &okay); if (okay) return t; tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff - - sp->ttis[samei].tt_gmtoff; + sp->ttis[samei].tt_gmtoff; tmp->tm_isdst = !tmp->tm_isdst; } } return WRONG; } -time_t pg_mktime(struct pg_tm *tmp) +time_t +pg_mktime(struct pg_tm * tmp) { return time1(tmp, localsub, 0L); } @@ -1225,7 +1359,8 @@ time_t pg_mktime(struct pg_tm *tmp) * Return the name of the current timezone */ const char * -pg_get_current_timezone(void) { +pg_get_current_timezone(void) +{ if (lcl_is_set) return lcl_TZname; return NULL; |