extern time_t mktime(struct tm* ts) { time_t t; Tm_t tm; tm.tm_sec = ts->tm_sec; tm.tm_min = ts->tm_min; tm.tm_hour = ts->tm_hour; tm.tm_mday = ts->tm_mday; tm.tm_mon = ts->tm_mon; tm.tm_year = ts->tm_year; tm.tm_wday = ts->tm_wday; tm.tm_yday = ts->tm_yday; tm.tm_isdst = ts->tm_isdst; t = tmtime(&tm, TM_LOCALZONE); ts->tm_sec = tm.tm_sec; ts->tm_min = tm.tm_min; ts->tm_hour = tm.tm_hour; ts->tm_mday = tm.tm_mday; ts->tm_mon = tm.tm_mon; ts->tm_year = tm.tm_year; ts->tm_wday = tm.tm_wday; ts->tm_yday = tm.tm_yday; ts->tm_isdst = tm.tm_isdst; return t; }
extern size_t strftime(char* buf, size_t len, const char* format, const struct tm* tm) { register char* s; time_t t; Tm_t tl; memset(&tl, 0, sizeof(tl)); /* * nl_langinfo() may call strftime() with bogus tm except for * one value -- what a way to go */ if (tm->tm_sec < 0 || tm->tm_sec > 60 || tm->tm_min < 0 || tm->tm_min > 59 || tm->tm_hour < 0 || tm->tm_hour > 23 || tm->tm_wday < 0 || tm->tm_wday > 6 || tm->tm_mday < 1 || tm->tm_mday > 31 || tm->tm_mon < 0 || tm->tm_mon > 11 || tm->tm_year < 0 || tm->tm_year > (2138 - 1900)) { if (tm->tm_sec >= 0 && tm->tm_sec <= 60) tl.tm_sec = tm->tm_sec; if (tm->tm_min >= 0 && tm->tm_min <= 59) tl.tm_min = tm->tm_min; if (tm->tm_hour >= 0 && tm->tm_hour <= 23) tl.tm_hour = tm->tm_hour; if (tm->tm_wday >= 0 && tm->tm_wday <= 6) tl.tm_wday = tm->tm_wday; if (tm->tm_mday >= 0 && tm->tm_mday <= 31) tl.tm_mday = tm->tm_mday; if (tm->tm_mon >= 0 && tm->tm_mon <= 11) tl.tm_mon = tm->tm_mon; if (tm->tm_year >= 0 && tm->tm_year <= (2138 - 1900)) tl.tm_year = tm->tm_year; } else { tl.tm_sec = tm->tm_sec; tl.tm_min = tm->tm_min; tl.tm_hour = tm->tm_hour; tl.tm_mday = tm->tm_mday; tl.tm_mon = tm->tm_mon; tl.tm_year = tm->tm_year; tl.tm_wday = tm->tm_wday; tl.tm_yday = tm->tm_yday; tl.tm_isdst = tm->tm_isdst; } t = tmtime(&tl, TM_LOCALZONE); if (!(s = tmfmt(buf, len, format, &t))) return 0; return s - buf; }
Tm_t* tmfix(register Tm_t* tm) { register int n; register int w; Tm_t* p; time_t t; /* * check for special case that adjusts tm_wday at the end * this happens during * nl_langinfo() => strftime() => tmfmt() */ if (w = !tm->tm_sec && !tm->tm_min && !tm->tm_mday && !tm->tm_year && !tm->tm_yday && !tm->tm_isdst) { tm->tm_year = 99; tm->tm_mday = 2; } /* * adjust from shortest to longest units */ if ((n = tm->tm_nsec) < 0) { tm->tm_sec -= (TMX_RESOLUTION - n) / TMX_RESOLUTION; tm->tm_nsec = TMX_RESOLUTION - (-n) % TMX_RESOLUTION; } else if (n >= TMX_RESOLUTION) { tm->tm_sec += n / TMX_RESOLUTION; tm->tm_nsec %= TMX_RESOLUTION; } if ((n = tm->tm_sec) < 0) { tm->tm_min -= (60 - n) / 60; tm->tm_sec = 60 - (-n) % 60; } else if (n > (59 + TM_MAXLEAP)) { tm->tm_min += n / 60; tm->tm_sec %= 60; } if ((n = tm->tm_min) < 0) { tm->tm_hour -= (60 - n) / 60; n = tm->tm_min = 60 - (-n) % 60; } if (n > 59) { tm->tm_hour += n / 60; tm->tm_min %= 60; } if ((n = tm->tm_hour) < 0) { tm->tm_mday -= (23 - n) / 24; tm->tm_hour = 24 - (-n) % 24; } else if (n >= 24) { tm->tm_mday += n / 24; tm->tm_hour %= 24; } if (tm->tm_mon >= 12) { tm->tm_year += tm->tm_mon / 12; tm->tm_mon %= 12; } else if (tm->tm_mon < 0) { tm->tm_year--; if ((tm->tm_mon += 12) < 0) { tm->tm_year += tm->tm_mon / 12; tm->tm_mon = (-tm->tm_mon) % 12; } } while (tm->tm_mday < -365) { tm->tm_year--; tm->tm_mday += 365 + LEAP(tm); } while (tm->tm_mday > 365) { tm->tm_mday -= 365 + LEAP(tm); tm->tm_year++; } while (tm->tm_mday < 1) { if (--tm->tm_mon < 0) { tm->tm_mon = 11; tm->tm_year--; } tm->tm_mday += DAYS(tm); } while (tm->tm_mday > (n = DAYS(tm))) { tm->tm_mday -= n; if (++tm->tm_mon > 11) { tm->tm_mon = 0; tm->tm_year++; } } if (w) { w = tm->tm_wday; t = tmtime(tm, TM_LOCALZONE); p = tmmake(&t); if (w = (w - p->tm_wday)) { if (w < 0) w += 7; tm->tm_wday += w; if ((tm->tm_mday += w) > DAYS(tm)) tm->tm_mday -= 7; } } tm->tm_yday = tm_data.sum[tm->tm_mon] + (tm->tm_mon > 1 && LEAP(tm)) + tm->tm_mday - 1; n = tm->tm_year + 1900 - 1; tm->tm_wday = (n + n / 4 - n / 100 + n / 400 + tm->tm_yday + 1) % 7; /* * tm_isdst is adjusted by tmtime() */ return tm; }