Skip to content
Snippets Groups Projects
Commit 0a19fb42 authored by Bruce Momjian's avatar Bruce Momjian
Browse files

Pgindent timezone file, per request from Tom.

parent 63bd0db1
No related branches found
No related tags found
No related merge requests found
......@@ -5,54 +5,63 @@
#define nonzero(n) (((n) == 0) ? 1 : (n))
char *imalloc(const int n)
char *
imalloc(const int n)
{
return malloc((size_t) nonzero(n));
}
char *icalloc(int nelem, int elsize)
char *
icalloc(int nelem, int elsize)
{
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;
return calloc((size_t) nelem, (size_t) elsize);
}
void *irealloc(void *pointer, const int size)
void *
irealloc(void *pointer, const int size)
{
if (pointer == NULL)
return imalloc(size);
return realloc((void *) pointer, (size_t) nonzero(size));
}
char *icatalloc(char *old, const char *new)
char *
icatalloc(char *old, const char *new)
{
register char *result;
register int oldsize, newsize;
register int oldsize,
newsize;
newsize = (new == NULL) ? 0 : strlen(new);
if (old == NULL)
oldsize = 0;
else if (newsize == 0)
return old;
else oldsize = strlen(old);
else
oldsize = strlen(old);
if ((result = irealloc(old, oldsize + newsize + 1)) != NULL)
if (new != NULL)
(void) strcpy(result + oldsize, new);
return result;
}
char *icpyalloc(const char *string)
char *
icpyalloc(const char *string)
{
return icatalloc((char *) NULL, string);
}
void ifree(char *p)
void
ifree(char *p)
{
if (p != NULL)
(void) free(p);
}
void icfree(char *p)
void
icfree(char *p)
{
if (p != NULL)
(void) free(p);
......
......@@ -54,7 +54,8 @@ static const char gmt[] = "GMT";
*/
#define TZDEFRULESTRING ",M4.1.0,M10.5.0"
struct ttinfo { /* time type information */
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 */
......@@ -62,14 +63,16 @@ struct ttinfo { /* time type information */
int tt_ttisgmt; /* TRUE if transition is UTC */
};
struct lsinfo { /* leap second information */
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 {
struct state
{
int leapcnt;
int timecnt;
int typecnt;
......@@ -82,7 +85,8 @@ struct state {
struct lsinfo lsis[TZ_MAX_LEAPS];
};
struct 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 */
......@@ -92,7 +96,8 @@ struct 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 MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of
* week */
/*
** Prototypes for static functions.
......@@ -120,6 +125,7 @@ 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)
......@@ -138,7 +144,8 @@ static int gmt_is_set=0;
static struct pg_tm tm;
static long detzcode(const char *codep)
static long
detzcode(const char *codep)
{
register long result;
register int i;
......@@ -149,7 +156,8 @@ 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;
......@@ -164,7 +172,8 @@ static int tzload(register const char *name, register struct state *sp)
if (name[0] == ':')
++name;
doaccess = name[0] == '/';
if (!doaccess) {
if (!doaccess)
{
p = pg_TZDIR();
if (p == NULL)
return -1;
......@@ -173,6 +182,7 @@ 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.
*/
......@@ -187,7 +197,8 @@ static int tzload(register const char *name, register struct state *sp)
}
{
struct tzhead *tzhp;
union {
union
{
struct tzhead tzhead;
char buf[sizeof *sp + sizeof *tzhp];
} u;
......@@ -219,16 +230,19 @@ static int tzload(register const char *name, register struct state *sp)
ttisstdcnt + /* ttisstds */
ttisgmtcnt) /* ttisgmts */
return -1;
for (i = 0; i < sp->timecnt; ++i) {
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) {
for (i = 0; i < sp->typecnt; ++i)
{
register struct ttinfo *ttisp;
ttisp = &sp->ttis[i];
......@@ -245,7 +259,8 @@ static int tzload(register const char *name, register struct state *sp)
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) {
for (i = 0; i < sp->leapcnt; ++i)
{
register struct lsinfo *lsisp;
lsisp = &sp->lsis[i];
......@@ -254,26 +269,30 @@ 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) {
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;
}
}
for (i = 0; i < sp->typecnt; ++i) {
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)
......@@ -299,7 +318,8 @@ 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;
......@@ -316,7 +336,8 @@ 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;
......@@ -324,7 +345,8 @@ static const char *getnum(register const char *strp, int *nump, const int min, c
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 */
......@@ -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;
/*
** `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,14 +408,17 @@ 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;
if (*strp == '-') {
if (*strp == '-')
{
neg = 1;
++strp;
} else if (*strp == '+')
}
else if (*strp == '+')
++strp;
strp = getsecs(strp, offsetp);
if (strp == NULL)
......@@ -407,16 +435,20 @@ 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.
*/
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.
*/
......@@ -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.
*/
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.
*/
++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,23 +497,30 @@ 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;
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.
* * 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)
......@@ -482,15 +528,17 @@ static time_t transtime(const time_t janfirst, const int year, register const st
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.
* * 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.
*/
......@@ -499,8 +547,8 @@ static time_t transtime(const time_t janfirst, const int year, register const st
value += mon_lengths[leapyear][i] * SECSPERDAY;
/*
** Use Zeller's Congruence to get day-of-week of first day of
** month.
* * 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;
......@@ -512,14 +560,15 @@ static time_t transtime(const time_t janfirst, const int year, register const st
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.
* * "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) {
for (i = 1; i < rulep->r_week; ++i)
{
if (d + DAYSPERWEEK >=
mon_lengths[leapyear][rulep->r_mon - 1])
break;
......@@ -534,10 +583,10 @@ static time_t transtime(const time_t janfirst, const int year, register const st
}
/*
** "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,7 +596,8 @@ 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;
......@@ -561,13 +611,16 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi
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,20 +634,25 @@ 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 == ';') {
if (*name == ',' || *name == ';')
{
struct rule start;
struct rule end;
register int year;
......@@ -612,6 +670,7 @@ 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.
*/
......@@ -627,17 +686,21 @@ 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);
endtime = transtime(janfirst, year, &end,
dstoffset);
if (starttime > endtime) {
if (starttime > endtime)
{
*atp++ = endtime;
*typep++ = 1; /* DST ends */
*atp++ = starttime;
*typep++ = 0; /* DST begins */
} else {
}
else
{
*atp++ = starttime;
*typep++ = 0; /* DST begins */
*atp++ = endtime;
......@@ -646,7 +709,9 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi
janfirst += year_lengths[isleap(year)] *
SECSPERDAY;
}
} else {
}
else
{
register long theirstdoffset;
register long theirdstoffset;
register long theiroffset;
......@@ -656,60 +721,73 @@ static int tzparse(const char *name, register struct state *sp, const int lastdi
if (*name != '\0')
return -1;
/*
* * 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.
*/
isdst = FALSE;
theiroffset = theirstdoffset;
/*
** Now juggle transition times and types
** tracking offsets as you do.
* * Now juggle transition times and types * tracking offsets
* as you do.
*/
for (i = 0; i < sp->timecnt; ++i) {
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.
* * Transitions from DST to DDST * will effectively
* disappear since * POSIX provides for only one DST *
* offset.
*/
if (isdst && !sp->ttis[j].tt_ttisstd) {
if (isdst && !sp->ttis[j].tt_ttisstd)
{
sp->ats[i] += dstoffset -
theirdstoffset;
} else {
}
else
{
sp->ats[i] += stdoffset -
theirstdoffset;
}
......@@ -717,11 +795,13 @@ 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;
......@@ -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,21 +830,24 @@ 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 */
......@@ -770,7 +855,8 @@ bool pg_tzset(const char *name)
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,7 +879,8 @@ 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;
......@@ -801,32 +888,37 @@ static void localsub(const time_t *timep, const long offset, struct pg_tm *tmp)
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])
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,33 +929,37 @@ 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;
......@@ -878,10 +974,13 @@ static void timesub(const time_t *timep, const long offset, register const struc
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);
if (hit)
......@@ -889,7 +988,8 @@ static void timesub(const time_t *timep, const long offset, register const struc
sp->lsis[i].ls_trans ==
sp->lsis[i - 1].ls_trans + 1 &&
sp->lsis[i].ls_corr ==
sp->lsis[i - 1].ls_corr + 1) {
sp->lsis[i - 1].ls_corr + 1)
{
++hit;
--i;
}
......@@ -901,7 +1001,8 @@ 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.
*/
......@@ -910,20 +1011,23 @@ static void timesub(const time_t *timep, const long offset, register const struc
}
#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);
......@@ -931,7 +1035,8 @@ static void timesub(const time_t *timep, const long offset, register const struc
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)]) {
while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)])
{
register int newy;
newy = y + days / DAYSPERNYEAR;
......@@ -968,7 +1073,8 @@ 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;
......@@ -977,7 +1083,8 @@ static int increment_overflow(int *number, int 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;
......@@ -988,7 +1095,8 @@ 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;
......@@ -1006,15 +1114,18 @@ static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, str
register const struct state *sp;
register int dir;
register int bits;
register int i, j ;
register int i,
j;
register int saved_seconds;
time_t newt;
time_t t;
struct pg_tm yourtm, mytm;
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;
......@@ -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,65 +1174,74 @@ 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).
* * 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 ( ; ; ) {
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 */
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.
*/
sp = (const struct state *)
(((void *) funcp == (void *) localsub) ?
lclptr : gmtptr);
for (i = sp->typecnt - 1; i >= 0; --i) {
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 -
......@@ -1126,6 +1251,7 @@ static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, str
continue;
if (mytm.tm_isdst != yourtm.tm_isdst)
continue;
/*
* * We have a match.
*/
......@@ -1150,9 +1276,9 @@ static time_t time2(struct pg_tm *tmp, void(*funcp)(const time_t*, long, struct
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);
......@@ -1162,8 +1288,10 @@ static time_t time1(struct pg_tm *tmp, void (*funcp)(const time_t *, long, struc
{
register time_t t;
register const struct state *sp;
register int samei, otheri;
register int sameind, otherind;
register int samei,
otheri;
register int sameind,
otherind;
register int i;
register int nseen;
int seen[TZ_MAX_TYPES];
......@@ -1175,12 +1303,14 @@ static time_t time1(struct pg_tm *tmp, void (*funcp)(const time_t *, long, struc
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.
*/
......@@ -1190,15 +1320,18 @@ static time_t time1(struct pg_tm *tmp, void (*funcp)(const time_t *, long, struc
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;
......@@ -1216,7 +1349,8 @@ static time_t time1(struct pg_tm *tmp, void (*funcp)(const time_t *, long, struc
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;
......
......@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.10 2004/05/21 05:08:06 tgl Exp $
* $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.11 2004/05/21 12:30:25 momjian Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -47,15 +47,22 @@ pg_TZDIR(void)
#define T_YEAR (60*60*24*365)
#define T_MONTH (60*60*24*30)
struct tztry {
time_t std_t,dst_t;
char std_time[TZ_STRLEN_MAX+1],dst_time[TZ_STRLEN_MAX+1];
int std_ofs,dst_ofs;
struct tm std_tm, dst_tm;
struct tztry
{
time_t std_t,
dst_t;
char std_time[TZ_STRLEN_MAX + 1],
dst_time[TZ_STRLEN_MAX + 1];
int std_ofs,
dst_ofs;
struct tm std_tm,
dst_tm;
};
static bool compare_tm(struct tm *s, struct pg_tm *p) {
static bool
compare_tm(struct tm * s, struct pg_tm * p)
{
if (s->tm_sec != p->tm_sec ||
s->tm_min != p->tm_min ||
s->tm_hour != p->tm_hour ||
......@@ -69,11 +76,14 @@ static bool compare_tm(struct tm *s, struct pg_tm *p) {
return true;
}
static bool try_timezone(char *tzname, struct tztry *tt, bool checkdst) {
static bool
try_timezone(char *tzname, struct tztry * tt, bool checkdst)
{
struct pg_tm *pgtm;
if (!pg_tzset(tzname))
return false; /* If this timezone couldn't be picked at all */
return false; /* If this timezone couldn't be picked at
* all */
/* Verify standard time */
pgtm = pg_localtime(&(tt->std_t));
......@@ -95,7 +105,9 @@ static bool try_timezone(char *tzname, struct tztry *tt, bool checkdst) {
return true;
}
static int get_timezone_offset(struct tm *tm) {
static int
get_timezone_offset(struct tm * tm)
{
#if defined(HAVE_STRUCT_TM_TM_ZONE)
return tm->tm_gmtoff;
#elif defined(HAVE_INT_TIMEZONE)
......@@ -113,12 +125,15 @@ static int get_timezone_offset(struct tm *tm) {
#ifdef WIN32
#define TZABBREV(tz) win32_get_timezone_abbrev(tz)
static char *win32_get_timezone_abbrev(char *tz) {
static char *
win32_get_timezone_abbrev(char *tz)
{
static char w32tzabbr[TZ_STRLEN_MAX + 1];
int l = 0;
char *c;
for (c = tz; *c; c++) {
for (c = tz; *c; c++)
{
if (isupper(*c))
w32tzabbr[l++] = *c;
}
......@@ -153,10 +168,12 @@ identify_system_timezone(void)
memset(&tt, 0, sizeof(tt));
for (t = tnow; t < tnow+T_YEAR; t += T_MONTH) {
for (t = tnow; t < tnow + T_YEAR; t += T_MONTH)
{
struct tm *tm = localtime(&t);
if (tm->tm_isdst == 0 && !std_found) {
if (tm->tm_isdst == 0 && !std_found)
{
/* Standard time */
memcpy(&tt.std_tm, tm, sizeof(struct tm));
memset(cbuf, 0, sizeof(cbuf));
......@@ -166,7 +183,8 @@ identify_system_timezone(void)
tt.std_t = t;
std_found = true;
}
else if (tm->tm_isdst == 1 && !dst_found) {
else if (tm->tm_isdst == 1 && !dst_found)
{
/* Daylight time */
memcpy(&tt.dst_tm, tm, sizeof(struct tm));
memset(cbuf, 0, sizeof(cbuf));
......@@ -189,7 +207,8 @@ identify_system_timezone(void)
return NULL; /* go to GMT */
}
if (dst_found) {
if (dst_found)
{
/* Try STD<ofs>DST */
sprintf(__tzbuf, "%s%d%s", tt.std_time, -tt.std_ofs / 3600, tt.dst_time);
if (try_timezone(__tzbuf, &tt, dst_found))
......@@ -280,9 +299,12 @@ select_default_timezone(void)
* This is called after initial loading of postgresql.conf. If no TimeZone
* setting was found therein, we try to derive one from the environment.
*/
void pg_timezone_initialize(void) {
void
pg_timezone_initialize(void)
{
/* Do we need to try to figure the timezone? */
if (strcmp(GetConfigOption("timezone"), "UNKNOWN") == 0) {
if (strcmp(GetConfigOption("timezone"), "UNKNOWN") == 0)
{
const char *def_tz;
/* Select setting */
......
......@@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/timezone/pgtz.h,v 1.7 2004/05/21 05:08:06 tgl Exp $
* $PostgreSQL: pgsql/src/timezone/pgtz.h,v 1.8 2004/05/21 12:30:25 momjian Exp $
*
*-------------------------------------------------------------------------
*/
......
......@@ -53,6 +53,7 @@
#ifndef remove
extern int unlink(const char *filename);
#define remove unlink
#endif /* !defined remove */
......
......@@ -3,7 +3,8 @@
#include "private.h"
char *scheck(const char *string, const char *format)
char *
scheck(const char *string, const char *format)
{
register char *fbuf;
register const char *fp;
......@@ -21,10 +22,12 @@ char *scheck(const char *string, const char *format)
return result;
fp = format;
tp = fbuf;
while ((*tp++ = c = *fp++) != '\0') {
while ((*tp++ = c = *fp++) != '\0')
{
if (c != '%')
continue;
if (*fp == '%') {
if (*fp == '%')
{
*tp++ = *fp++;
continue;
}
......@@ -36,7 +39,8 @@ char *scheck(const char *string, const char *format)
if (*fp == 'l' || *fp == 'h')
*tp++ = *fp++;
else if (*fp == '[')
do *tp++ = *fp++;
do
*tp++ = *fp++;
while (*fp != '\0' && *fp != ']');
if ((*tp++ = *fp++) == '\0')
break;
......
......@@ -25,7 +25,8 @@
#include "tzfile.h"
struct lc_time_T {
struct lc_time_T
{
const char *mon[MONSPERYEAR];
const char *month[MONSPERYEAR];
const char *wday[DAYSPERWEEK];
......@@ -59,20 +60,15 @@ static const struct lc_time_T C_time_locale = {
"%H:%M:%S",
/*
** x_fmt
** C99 requires this format.
** Using just numbers (as here) makes Quakers happier;
** it's also compatible with SVR4.
* * x_fmt * C99 requires this format. * Using just numbers (as here)
* makes Quakers happier; * it's also compatible with SVR4.
*/
"%m/%d/%y",
/*
** c_fmt
** C99 requires this format.
** Previously this code used "%D %X", but we now conform to C99.
** Note that
** "%a %b %d %H:%M:%S %Y"
** is used by Solaris 2.3.
* * c_fmt * C99 requires this format. * Previously this code used "%D
* %X", but we now conform to C99. * Note that * "%a %b %d
* %H:%M:%S %Y" * is used by Solaris 2.3.
*/
"%a %b %e %T %Y",
......@@ -96,7 +92,8 @@ static char * _fmt (const char *, const struct pg_tm *, char *, const char *, in
#define IN_ALL 3
size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm *t)
size_t
pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm * t)
{
char *p;
int warn;
......@@ -109,12 +106,16 @@ size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_
return p - s;
}
static char * _fmt(const char *format, const struct pg_tm *t, char *pt, const char *ptlim, int *warnp)
static char *
_fmt(const char *format, const struct pg_tm * t, char *pt, const char *ptlim, int *warnp)
{
for (; *format; ++format)
{
if (*format == '%')
{
for ( ; *format; ++format) {
if (*format == '%') {
label:
switch (*++format) {
switch (*++format)
{
case '\0':
--format;
break;
......@@ -144,12 +145,11 @@ label:
pt, ptlim);
continue;
case 'C':
/*
** %C used to do a...
** _fmt("%a %b %e %X %Y", t);
** ...whereas now POSIX 1003.2 calls for
** something completely different.
** (ado, 1993-05-24)
* * %C used to do a... * _fmt("%a %b %e %X %Y", t); *
* ...whereas now POSIX 1003.2 calls for * something
* completely different. * (ado, 1993-05-24)
*/
pt = _conv((t->tm_year + TM_YEAR_BASE) / 100,
"%02d", pt, ptlim);
......@@ -173,14 +173,12 @@ label:
continue;
case 'E':
case 'O':
/*
** C99 locale modifiers.
** The sequences
** %Ec %EC %Ex %EX %Ey %EY
** %Od %oe %OH %OI %Om %OM
** %OS %Ou %OU %OV %Ow %OW %Oy
** are supposed to provide alternate
** representations.
* * C99 locale modifiers. * The sequences * %Ec %EC
* %Ex %EX %Ey %EY * %Od %oe %OH %OI %Om %OM * %OS
* %Ou %OU %OV %Ow %OW %Oy * are supposed to provide
* alternate * representations.
*/
goto label;
case 'e':
......@@ -201,20 +199,20 @@ label:
pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
continue;
case 'k':
/*
** This used to be...
** _conv(t->tm_hour % 12 ?
** t->tm_hour % 12 : 12, 2, ' ');
** ...and has been changed to the below to
** match SunOS 4.1.1 and Arnold Robbins'
** strftime version 3.0. That is, "%k" and
** "%l" have been swapped.
** (ado, 1993-05-24)
* * This used to be... * _conv(t->tm_hour % 12 ? *
* t->tm_hour % 12 : 12, 2, ' '); * ...and has been
* changed to the below to * match SunOS 4.1.1 and
* Arnold Robbins' * strftime version 3.0. That is,
* "%k" and * "%l" have been swapped. * (ado,
* 1993-05-24)
*/
pt = _conv(t->tm_hour, "%2d", pt, ptlim);
continue;
#ifdef KITCHEN_SINK
case 'K':
/*
* * After all this time, still unclaimed!
*/
......@@ -222,14 +220,13 @@ label:
continue;
#endif /* defined KITCHEN_SINK */
case 'l':
/*
** This used to be...
** _conv(t->tm_hour, 2, ' ');
** ...and has been changed to the below to
** match SunOS 4.1.1 and Arnold Robbin's
** strftime version 3.0. That is, "%k" and
** "%l" have been swapped.
** (ado, 1993-05-24)
* * This used to be... * _conv(t->tm_hour, 2, ' '); *
* ...and has been changed to the below to * match
* SunOS 4.1.1 and Arnold Robbin's * strftime version
* 3.0. That is, "%k" and * "%l" have been swapped. *
* (ado, 1993-05-24)
*/
pt = _conv((t->tm_hour % 12) ?
(t->tm_hour % 12) : 12,
......@@ -286,11 +283,11 @@ label:
"%02d", pt, ptlim);
continue;
case 'u':
/*
** From Arnold Robbins' strftime version 3.0:
** "ISO 8601: Weekday as a decimal number
** [1 (Monday) - 7]"
** (ado, 1993-05-24)
* * From Arnold Robbins' strftime version 3.0: * "ISO
* 8601: Weekday as a decimal number * [1 (Monday) -
* 7]" * (ado, 1993-05-24)
*/
pt = _conv((t->tm_wday == 0) ?
DAYSPERWEEK : t->tm_wday,
......@@ -326,7 +323,8 @@ label:
year = t->tm_year + TM_YEAR_BASE;
yday = t->tm_yday;
wday = t->tm_wday;
for ( ; ; ) {
for (;;)
{
int len;
int bot;
int top;
......@@ -334,27 +332,31 @@ label:
len = isleap(year) ?
DAYSPERLYEAR :
DAYSPERNYEAR;
/*
** What yday (-3 ... 3) does
** the ISO year begin on?
* * What yday (-3 ... 3) does * the ISO year
* begin on?
*/
bot = ((yday + 11 - wday) %
DAYSPERWEEK) - 3;
/*
** What yday does the NEXT
** ISO year begin on?
* * What yday does the NEXT * ISO year begin
* on?
*/
top = bot -
(len % DAYSPERWEEK);
if (top < -3)
top += DAYSPERWEEK;
top += len;
if (yday >= top) {
if (yday >= top)
{
++year;
w = 1;
break;
}
if (yday >= bot) {
if (yday >= bot)
{
w = 1 + ((yday - bot) /
DAYSPERWEEK);
break;
......@@ -367,19 +369,22 @@ label:
if (*format == 'V')
pt = _conv(w, "%02d",
pt, ptlim);
else if (*format == 'g') {
else if (*format == 'g')
{
*warnp = IN_ALL;
pt = _conv(year % 100, "%02d",
pt, ptlim);
} else pt = _conv(year, "%04d",
}
else
pt = _conv(year, "%04d",
pt, ptlim);
}
continue;
case 'v':
/*
** From Arnold Robbins' strftime version 3.0:
** "date as dd-bbb-YYYY"
** (ado, 1993-05-24)
* * From Arnold Robbins' strftime version 3.0: *
* "date as dd-bbb-YYYY" * (ado, 1993-05-24)
*/
pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp);
continue;
......@@ -419,10 +424,10 @@ label:
case 'Z':
if (t->tm_zone != NULL)
pt = _add(t->tm_zone, pt, ptlim);
/*
** C99 says that %Z must be replaced by the
** empty string if the time zone is not
** determinable.
* * C99 says that %Z must be replaced by the * empty
* string if the time zone is not * determinable.
*/
continue;
case 'z':
......@@ -433,10 +438,13 @@ label:
if (t->tm_isdst < 0)
continue;
diff = t->tm_gmtoff;
if (diff < 0) {
if (diff < 0)
{
sign = "-";
diff = -diff;
} else sign = "+";
}
else
sign = "+";
pt = _add(sign, pt, ptlim);
diff /= 60;
pt = _conv((diff / 60) * 100 + diff % 60,
......@@ -448,10 +456,11 @@ label:
warnp);
continue;
case '%':
/*
** X311J/88-090 (4.12.3.5): if conversion char is
** undefined, behavior is undefined. Print out the
** character itself as printf(3) also does.
* * X311J/88-090 (4.12.3.5): if conversion char is *
* undefined, behavior is undefined. Print out the *
* character itself as printf(3) also does.
*/
default:
break;
......@@ -464,7 +473,8 @@ label:
return pt;
}
static char * _conv(const int n, const char *format, char *pt, const char *ptlim)
static char *
_conv(const int n, const char *format, char *pt, const char *ptlim)
{
char buf[INT_STRLEN_MAXIMUM(int) +1];
......@@ -472,7 +482,8 @@ static char * _conv(const int n, const char *format, char *pt, const char *ptlim
return _add(buf, pt, ptlim);
}
static char *_add(const char *str, char *pt, const char *ptlim)
static char *
_add(const char *str, char *pt, const char *ptlim)
{
while (pt < ptlim && (*pt = *str++) != '\0')
++pt;
......
......@@ -28,11 +28,14 @@
#define TZ_MAGIC "TZif"
struct tzhead {
struct tzhead
{
char tzh_magic[4]; /* TZ_MAGIC */
char tzh_reserved[16]; /* reserved for future use */
char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */
char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
char tzh_ttisgmtcnt[4]; /* coded number of trans. time
* flags */
char tzh_ttisstdcnt[4]; /* coded number of trans. time
* flags */
char tzh_leapcnt[4]; /* coded number of leap seconds */
char tzh_timecnt[4]; /* coded number of transition times */
char tzh_typecnt[4]; /* coded number of local time types */
......@@ -77,12 +80,15 @@ struct tzhead {
*/
#define TZ_MAX_TIMES 370
#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can
* hold */
#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation
* characters */
/* (limited by what unsigned chars can hold) */
#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
#define TZ_MAX_LEAPS 50 /* Maximum number of leap second
* corrections */
#define SECSPERMIN 60
#define MINSPERHOUR 60
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment