diff options
Diffstat (limited to 'newlib/libc/time/mktm_r.c')
-rw-r--r-- | newlib/libc/time/mktm_r.c | 277 |
1 files changed, 0 insertions, 277 deletions
diff --git a/newlib/libc/time/mktm_r.c b/newlib/libc/time/mktm_r.c deleted file mode 100644 index 2668efd7c..000000000 --- a/newlib/libc/time/mktm_r.c +++ /dev/null @@ -1,277 +0,0 @@ -/* - * mktm_r.c - * Original Author: Adapted from tzcode maintained by Arthur David Olson. - * Modifications: Changed to mktm_r and added __tzcalc_limits - 04/10/02, Jeff Johnston - * Fixed bug in mday computations - 08/12/04, Alex Mogilnikov <alx@intellectronika.ru> - * Fixed bug in __tzcalc_limits - 08/12/04, Alex Mogilnikov <alx@intellectronika.ru> - * - * Converts the calendar time pointed to by tim_p into a broken-down time - * expressed as local time. Returns a pointer to a structure containing the - * broken-down time. - */ - -#include <stdlib.h> -#include <time.h> -#include "local.h" - -/* there are 97 leap years in 400-year periods */ -#define DAYS_PER_400_YEARS ((400 - 97) * 365 + 97 * 366) -/* there are 24 leap years in 100-year periods */ -#define DAYS_PER_100_YEARS ((100 - 24) * 365 + 24 * 366) -/* there is one leap year every 4 years */ -#define DAYS_PER_4_YEARS (3 * 365 + 366) - -static _CONST int mon_lengths[2][MONSPERYEAR] = { - {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 _CONST int days_per_year[4] = { - 365, /* 1970 or 1966 */ - 365, /* 1971 or 1967 */ - 366, /* 1972 or 1968 */ - 365 /* 1973 or 1969 */ -} ; - -struct tm * -_DEFUN (_mktm_r, (tim_p, res, is_gmtime), - _CONST time_t * tim_p _AND - struct tm *res _AND - int is_gmtime) -{ - long days, rem; - time_t lcltime; - int y; - int years400, years100, years4; - int yleap; - _CONST int *ip; - __tzinfo_type *tz = __gettzinfo (); - - /* base decision about std/dst time on current time */ - lcltime = *tim_p; - - days = ((long)lcltime) / SECSPERDAY; - rem = ((long)lcltime) % SECSPERDAY; - while (rem < 0) - { - rem += SECSPERDAY; - --days; - } - while (rem >= SECSPERDAY) - { - rem -= SECSPERDAY; - ++days; - } - - /* compute hour, min, and sec */ - res->tm_hour = (int) (rem / SECSPERHOUR); - rem %= SECSPERHOUR; - res->tm_min = (int) (rem / SECSPERMIN); - res->tm_sec = (int) (rem % SECSPERMIN); - - /* compute day of week */ - if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0) - res->tm_wday += DAYSPERWEEK; - - /* compute year & day of year */ - years400 = days / DAYS_PER_400_YEARS; - days -= years400 * DAYS_PER_400_YEARS; - years100 = days / DAYS_PER_100_YEARS; - days -= years100 * DAYS_PER_100_YEARS; - years4 = days / DAYS_PER_4_YEARS; - days -= years4 * DAYS_PER_4_YEARS; - - y = EPOCH_YEAR + years400 * 400 + years100 * 100 + years4 * 4; - - /* the value left in days is based in 1970 */ - if (days < 0) - { - ip = &days_per_year[3]; - while (days < 0) - { - days += *ip--; - --y; - } - } - else - { - ip = &days_per_year[0]; - while (days >= *ip) - { - days -= *ip++; - ++y; - } - } - - res->tm_year = y - YEAR_BASE; - res->tm_yday = days; - yleap = isleap(y); - ip = mon_lengths[yleap]; - for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon) - days -= ip[res->tm_mon]; - res->tm_mday = days + 1; - - if (!is_gmtime) - { - long offset; - int hours, mins, secs; - - TZ_LOCK; - if (_daylight) - { - if (y == tz->__tzyear || __tzcalc_limits (y)) - res->tm_isdst = (tz->__tznorth - ? (*tim_p >= tz->__tzrule[0].change - && *tim_p < tz->__tzrule[1].change) - : (*tim_p >= tz->__tzrule[0].change - || *tim_p < tz->__tzrule[1].change)); - else - res->tm_isdst = -1; - } - else - res->tm_isdst = 0; - - offset = (res->tm_isdst == 1 - ? tz->__tzrule[1].offset - : tz->__tzrule[0].offset); - - hours = (int) (offset / SECSPERHOUR); - offset = offset % SECSPERHOUR; - - mins = (int) (offset / SECSPERMIN); - secs = (int) (offset % SECSPERMIN); - - res->tm_sec -= secs; - res->tm_min -= mins; - res->tm_hour -= hours; - - if (res->tm_sec >= SECSPERMIN) - { - res->tm_min += 1; - res->tm_sec -= SECSPERMIN; - } - else if (res->tm_sec < 0) - { - res->tm_min -= 1; - res->tm_sec += SECSPERMIN; - } - if (res->tm_min >= MINSPERHOUR) - { - res->tm_hour += 1; - res->tm_min -= MINSPERHOUR; - } - else if (res->tm_min < 0) - { - res->tm_hour -= 1; - res->tm_min += MINSPERHOUR; - } - if (res->tm_hour >= HOURSPERDAY) - { - ++res->tm_yday; - ++res->tm_wday; - if (res->tm_wday > 6) - res->tm_wday = 0; - ++res->tm_mday; - res->tm_hour -= HOURSPERDAY; - if (res->tm_mday > ip[res->tm_mon]) - { - res->tm_mday -= ip[res->tm_mon]; - res->tm_mon += 1; - if (res->tm_mon == 12) - { - res->tm_mon = 0; - res->tm_year += 1; - res->tm_yday = 0; - } - } - } - else if (res->tm_hour < 0) - { - res->tm_yday -= 1; - res->tm_wday -= 1; - if (res->tm_wday < 0) - res->tm_wday = 6; - res->tm_mday -= 1; - res->tm_hour += 24; - if (res->tm_mday == 0) - { - res->tm_mon -= 1; - if (res->tm_mon < 0) - { - res->tm_mon = 11; - res->tm_year -= 1; - res->tm_yday = 364 + isleap(res->tm_year + 1900); - } - res->tm_mday = ip[res->tm_mon]; - } - } - TZ_UNLOCK; - } - else - res->tm_isdst = 0; - - return (res); -} - -int -_DEFUN (__tzcalc_limits, (year), - int year) -{ - int days, year_days, years; - int i, j; - __tzinfo_type *tz = __gettzinfo (); - - if (year < EPOCH_YEAR) - return 0; - - tz->__tzyear = year; - - years = (year - EPOCH_YEAR); - - year_days = years * 365 + - (years - 1 + EPOCH_YEARS_SINCE_LEAP) / 4 - (years - 1 + EPOCH_YEARS_SINCE_CENTURY) / 100 + - (years - 1 + EPOCH_YEARS_SINCE_LEAP_CENTURY) / 400; - - for (i = 0; i < 2; ++i) - { - if (tz->__tzrule[i].ch == 'J') { - /* The Julian day n (1 <= n <= 365). */ - days = year_days + tz->__tzrule[i].d + - (isleap(year) && tz->__tzrule[i].d >= 60); - /* Convert to yday */ - --days; - } else if (tz->__tzrule[i].ch == 'D') - days = year_days + tz->__tzrule[i].d; - else - { - int yleap = isleap(year); - int m_day, m_wday, wday_diff; - _CONST int *ip = mon_lengths[yleap]; - - days = year_days; - - for (j = 1; j < tz->__tzrule[i].m; ++j) - days += ip[j-1]; - - m_wday = (EPOCH_WDAY + days) % DAYSPERWEEK; - - wday_diff = tz->__tzrule[i].d - m_wday; - if (wday_diff < 0) - wday_diff += DAYSPERWEEK; - m_day = (tz->__tzrule[i].n - 1) * DAYSPERWEEK + wday_diff; - - while (m_day >= ip[j-1]) - m_day -= DAYSPERWEEK; - - days += m_day; - } - - /* store the change-over time in GMT form by adding offset */ - tz->__tzrule[i].change = days * SECSPERDAY + - tz->__tzrule[i].s + tz->__tzrule[i].offset; - } - - tz->__tznorth = (tz->__tzrule[0].change < tz->__tzrule[1].change); - - return 1; -} |