home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_11_02
/
1102018a
< prev
next >
Wrap
Text File
|
1992-12-09
|
1KB
|
62 lines
/* _Isdst function */
#include <stdlib.h>
#include "xtime.h"
int _Isdst(const struct tm *t)
{ /* test whether Daylight Savings Time
in effect */
Dstrule *pr;
static const char *olddst = NULL;
static Dstrule *rules = NULL;
if (olddst != _Times._Isdst)
{ /* find current dst_rules */
if (_Times._Isdst[0] == '\0')
{ /* look beyond time_zone info */
int n;
if (_Times._Tzone[0] == '\0')
_Times._Tzone = _Getzone();
_Times._Isdst = _Gettime(_Times._Tzone,
3, &n);
if (_Times._Isdst[0] != '\0')
--_Times._Isdst; /* point to
delimiter */
}
if ((pr = _Getdst(_Times._Isdst)) == NULL)
return (-1);
free(rules);
rules = pr;
olddst = _Times._Isdst;
}
{ /* check time against rules */
int ans = 0;
const int d0 = _Daysto(t->tm_year, 0);
const int hour = t->tm_hour + 24 * t->tm_yday;
const int wd0 = (365L * t->tm_year + d0 + WDAY)
% 7 + 14;
for (pr = rules; pr->wday != (unsigned char)-1; ++pr)
if (pr->year <= t->tm_year)
{ /* found early enough year */
int rday = _Daysto(t->tm_year, pr->mon)
- d0 + pr->day;
if (0 < pr->wday)
{ /* shift to specific weekday */
int wd = (rday + wd0 - pr->wday) % 7;
rday += wd == 0 ? 0 : 7 - wd;
if (pr->wday <= 7)
rday -= 7; /* strictly before */
}
if (hour < rday * 24 + pr->hour)
return (ans);
ans = pr->year == (pr + 1)->year
? !ans : 0;
}
return (ans);
}
}