]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
cal: fix julian calendars for large years
authorJ William Piggott <elseifthen@gmx.com>
Thu, 18 Jan 2018 02:21:02 +0000 (21:21 -0500)
committerKarel Zak <kzak@redhat.com>
Mon, 22 Jan 2018 10:33:20 +0000 (11:33 +0100)
Before:
cal --r julian 31 12 2147483646
 December 2147483646
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Patched:
cal --r julian 31 12 2147483646
 December 2147483646
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

Signed-off-by: J William Piggott <elseifthen@gmx.com>
misc-utils/cal.c

index 543fbc6e1e18182ea2f2c158110536ceb6dfd8bf..a854eaf9d073382d277bce99ea608746eeb0d064 100644 (file)
@@ -924,14 +924,15 @@ static int day_in_week(const struct cal_control *ctl, int day,
            || (year == ctl->reform_year && REFORMATION_MONTH < month)
            || (year == ctl->reform_year
                && month == REFORMATION_MONTH && 13 < day)) {
-               int64_t long_year = year;
-               return (long_year + (year / 4) - (year / 100) + (year / 400) +
-                       reform[month - 1] + day) % DAYS_IN_WEEK;
+               return ((int64_t) year + (year / 4)
+                       - (year / 100) + (year / 400)
+                       reform[month - 1] + day) % DAYS_IN_WEEK;
        }
        if (year < ctl->reform_year
            || (year == ctl->reform_year && month < REFORMATION_MONTH)
            || (year == ctl->reform_year && month == REFORMATION_MONTH && day < 3))
-               return (year + year / 4 + old[month - 1] + day) % DAYS_IN_WEEK;
+               return ((int64_t) year + year / 4 + old[month - 1] + day)
+                       % DAYS_IN_WEEK;
        return NONEDAY;
 }