The day_in_week() does not need to perform fullfledged September 1752 calculations, that month is dealt as static assignment. Reported-by: Thomas Bächler <thomas@xxxxxxxxxxxxx> References: http://www.spinics.net/lists/util-linux-ng/msg07910.html Signed-off-by: Sami Kerola <kerolasa@xxxxxx> --- misc-utils/cal.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/misc-utils/cal.c b/misc-utils/cal.c index 78f092d..d9b07bf 100644 --- a/misc-utils/cal.c +++ b/misc-utils/cal.c @@ -164,7 +164,6 @@ enum { }; #define FIRST_WEEKDAY SATURDAY /* Jan 1st, 1 was a Saturday */ -#define REFORMATION_WEEKDAY THURSDAY /* after reformation it was Thursday */ #define REFORMATION_YEAR 1752 /* Signed-off-by: Lord Chesterfield */ #define REFORMATION_MONTH 9 /* September */ #define FIRST_MISSING_DAY 639799 /* 3 Sep 1752 */ @@ -702,9 +701,9 @@ static int day_in_year(int day, int month, int year) /* * 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. + * 31 Dec. 9999. Assumes the Gregorian reformation dates + * 3 Sep. 1752 through 13 Sep. 1752 are handled as statically + * assigned array, see day_array(). */ static int day_in_week(int day, int month, int year) { @@ -715,10 +714,10 @@ static int day_in_week(int day, int month, int year) leap_years_since_year_1(year - SMALLEST_YEAR) + day_in_year(day, month, year); if (temp < FIRST_MISSING_DAY) - return ((temp - 1 + FIRST_WEEKDAY) % DAYS_IN_WEEK); - if (temp >= (FIRST_MISSING_DAY + NUMBER_MISSING_DAYS)) - return (((temp - 1 + FIRST_WEEKDAY) - NUMBER_MISSING_DAYS) % DAYS_IN_WEEK); - return(REFORMATION_WEEKDAY); + return ((temp + (FIRST_WEEKDAY - 1)) % DAYS_IN_WEEK); + if (temp > FIRST_MISSING_DAY) + return ((temp + (FIRST_WEEKDAY - 1 - NUMBER_MISSING_DAYS)) % DAYS_IN_WEEK); + abort(); } static char *ascii_day(const int julian, char *p, int day) -- 1.8.2.2 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html