-struct tm *
-localtime(tim)
-unsigned long *tim;
-{
- register int dayno;
- register struct tm *ct;
- register dalybeg, daylend;
- register struct dayrules *dr;
- register struct dstab *ds;
- int year;
- unsigned long copyt;
- struct timeval curtime;
- struct timezone zone;
-
- gettimeofday(&curtime, &zone);
- copyt = *tim - (unsigned long)zone.tz_minuteswest*60;
- ct = gmtime(©t);
- dayno = ct->tm_yday;
- for (dr = dayrules; dr->dst_type >= 0; dr++)
- if (dr->dst_type == zone.tz_dsttime)
- break;
- if (dr->dst_type >= 0) {
- year = ct->tm_year + 1900;
- for (ds = dr->dst_rules; ds->dayyr; ds++)
- if (ds->dayyr == year)
- break;
- dalybeg = ds->daylb; /* first Sun after dst starts */
- daylend = ds->dayle; /* first Sun after dst ends */
- dalybeg = sunday(ct, dalybeg);
- daylend = sunday(ct, daylend);
- switch (dr->dst_hemi) {
- case NTH:
- if (!(
- (dayno>dalybeg || (dayno==dalybeg && ct->tm_hour>=2)) &&
- (dayno<daylend || (dayno==daylend && ct->tm_hour<1))
- ))
- return(ct);
- break;
- case STH:
- if (!(
- (dayno>dalybeg || (dayno==dalybeg && ct->tm_hour>=2)) ||
- (dayno<daylend || (dayno==daylend && ct->tm_hour<2))
- ))
- return(ct);
- break;
- default:
- return(ct);
- }
- copyt += dr->dst_hrs*60*60;
- ct = gmtime(©t);
- ct->tm_isdst++;
- }
- return(ct);