]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
cal: simplify day_in_week() calculation
authorSami Kerola <kerolasa@iki.fi>
Mon, 29 Apr 2013 21:30:51 +0000 (22:30 +0100)
committerSami Kerola <kerolasa@iki.fi>
Sun, 26 May 2013 08:59:20 +0000 (09:59 +0100)
The day_in_week() can be made easier to read, and should return invalid
weekday at the time of missing 11 days at September 1752.

Reported-by: Thomas Bächler <thomas@archlinux.org>
References: http://www.spinics.net/lists/util-linux-ng/msg07910.html
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
misc-utils/cal.c

index 159ad5eceab63de59c43211531e4664f4b08ad63..4d45145ac9a9ded12dacfbac11225470262d0f26 100644 (file)
@@ -160,11 +160,11 @@ enum {
        THURSDAY,
        FRIDAY,
        SATURDAY,
-       DAYS_IN_WEEK
+       DAYS_IN_WEEK,
+       NONEDAY
 };
 
 #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 */
@@ -677,8 +677,8 @@ 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.
+ *     3 Sep. 1752 through 13 Sep. 1752, and returns invalid weekday
+ *     during the period of 11 days.
  */
 static int
 day_in_week(int day, int month, int year) {
@@ -689,10 +689,10 @@ 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);
+               return ((temp + (FIRST_WEEKDAY - 1)) % 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 - NUMBER_MISSING_DAYS)) % DAYS_IN_WEEK);
+       return (NONEDAY);
 }
 
 static char *