+ register struct tm * tmp;
+
+ tmp = offtime(clock, 0L);
+ tzname[0] = "GMT";
+ tmp->tm_zone = "GMT"; /* UCT ? */
+ return tmp;
+}
+
+static int mon_lengths[2][MONS_PER_YEAR] = {
+ 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 int year_lengths[2] = {
+ DAYS_PER_NYEAR, DAYS_PER_LYEAR
+};
+
+struct tm *
+offtime(clock, offset)
+time_t * clock;
+long offset;
+{
+ register struct tm * tmp;
+ register long days;
+ register long rem;
+ register int y;
+ register int yleap;
+ register int * ip;
+ static struct tm tm;
+
+ tmp = &tm;
+ days = *clock / SECS_PER_DAY;
+ rem = *clock % SECS_PER_DAY;
+ rem += offset;
+ while (rem < 0) {
+ rem += SECS_PER_DAY;
+ --days;
+ }
+ while (rem >= SECS_PER_DAY) {
+ rem -= SECS_PER_DAY;
+ ++days;
+ }
+ tmp->tm_hour = (int) (rem / SECS_PER_HOUR);
+ rem = rem % SECS_PER_HOUR;
+ tmp->tm_min = (int) (rem / SECS_PER_MIN);
+ tmp->tm_sec = (int) (rem % SECS_PER_MIN);
+ tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYS_PER_WEEK);
+ if (tmp->tm_wday < 0)
+ tmp->tm_wday += DAYS_PER_WEEK;
+ y = EPOCH_YEAR;
+ if (days >= 0)
+ for ( ; ; ) {
+ yleap = isleap(y);
+ if (days < (long) year_lengths[yleap])
+ break;
+ ++y;
+ days = days - (long) year_lengths[yleap];
+ }
+ else do {
+ --y;
+ yleap = isleap(y);
+ days = days + (long) year_lengths[yleap];
+ } while (days < 0);
+ tmp->tm_year = y - TM_YEAR_BASE;
+ tmp->tm_yday = (int) days;
+ ip = mon_lengths[yleap];
+ for (tmp->tm_mon = 0; days >= (long) ip[tmp->tm_mon]; ++(tmp->tm_mon))
+ days = days - (long) ip[tmp->tm_mon];
+ tmp->tm_mday = (int) (days + 1);
+ tmp->tm_isdst = 0;
+ tmp->tm_zone = "";
+ tmp->tm_gmtoff = offset;
+ return tmp;