/* * day_in_week * return the 0 based day number for any date from 1 Jan. 1 to * 31 Dec. 9999. Assumes the Gregorian reformation eliminates * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all * missing days. */ int day_in_week(int day, int month, int year) { long temp; temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) + day_in_year(day, month, year); if (temp < FIRST_MISSING_DAY) return ((temp - 1 + SATURDAY) % 7); if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)) return (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7); return (THURSDAY); }
/* * day_array -- * Fill in an array of 42 integers with a calendar. Assume for a moment * that you took the (maximum) 6 rows in a calendar and stretched them * out end to end. You would have 42 numbers or spaces. This routine * builds that array for any month from Jan. 1 through Dec. 9999. */ static void day_array(unsigned month, unsigned year, unsigned *days) { unsigned long temp; unsigned i; unsigned day, dw, dm; memset(days, SPACE, MAXDAYS * sizeof(int)); if ((month == 9) && (year == 1752)) { /* Assumes the Gregorian reformation eliminates * 3 Sep. 1752 through 13 Sep. 1752. */ unsigned j_offset = julian * 244; size_t oday = 0; do { days[oday+2] = sep1752[oday] + j_offset; } while (++oday < sizeof(sep1752)); return; } /* day_in_year * return the 1 based day number within the year */ day = 1; if ((month > 2) && leap_year(year)) { ++day; } i = month; while (i) { day += days_in_month[--i]; } /* day_in_week * return the 0 based day number for any date from 1 Jan. 1 to * 31 Dec. 9999. Assumes the Gregorian reformation eliminates * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all * missing days. */ temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) + day; if (temp < FIRST_MISSING_DAY) { dw = ((temp - 1 + SATURDAY) % 7); } else { dw = (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7); } if (!julian) { day = 1; } dm = days_in_month[month]; if ((month == 2) && leap_year(year)) { ++dm; } do { days[dw++] = day++; } while (--dm); }
/* * day_array -- * Fill in an array of 42 integers with a calendar. Assume for a moment * that you took the (maximum) 6 rows in a calendar and stretched them * out end to end. You would have 42 numbers or spaces. This routine * builds that array for any month from Jan. 1 through Dec. 9999. */ static void day_array(int month, int year, int *days) { long temp; int i; int j_offset; int day, dw, dm; memset(days, SPACE, MAXDAYS * sizeof(int)); if ((month == 9) && (year == 1752)) { j_offset = julian * 244; i = 0; do { days[i+2] = sep1752[i] + j_offset; } while (++i < sizeof(sep1752)); return; } /* day_in_year * return the 1 based day number within the year */ day = 1; if ((month > 2) && leap_year(year)) { ++day; } i = month; while (i) { day += days_in_month[--i]; } /* day_in_week * return the 0 based day number for any date from 1 Jan. 1 to * 31 Dec. 9999. Assumes the Gregorian reformation eliminates * 3 Sep. 1752 through 13 Sep. 1752. Returns Thursday for all * missing days. */ dw = THURSDAY; temp = (long)(year - 1) * 365 + leap_years_since_year_1(year - 1) + day; if (temp < FIRST_MISSING_DAY) { dw = ((temp - 1 + SATURDAY) % 7); } else if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)) { dw = (((temp - 1 + SATURDAY) - NUMBER_MISSING_DAYS) % 7); } if (!julian) { day = 1; } dm = days_in_month[month]; if ((month == 2) && leap_year(year)) { ++dm; } while (dm) { days[dw++] = day++; --dm; } }