summaryrefslogtreecommitdiff
path: root/misc-utils/cal.c
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2009-07-17 13:39:07 +0200
committerKarel Zak <kzak@redhat.com>2009-07-20 15:33:50 +0200
commitf06602a42a0ea3551a15f6d8d0caa40e993c4cb4 (patch)
treee785af1c1d45326eb18bef550ee6a8d11a3a3227 /misc-utils/cal.c
parent32dec5ac256b982af21cd00c83881b47fe543364 (diff)
downloadutil-linux-old-f06602a42a0ea3551a15f6d8d0caa40e993c4cb4.tar.gz
cal: fix broken computation for Sep 1752
Signed-off-by: Peter Breitenlohner <peb@mppmu.mpg.de> Signed-off-by: Pádraig Brady <P@draigBrady.com>
Diffstat (limited to 'misc-utils/cal.c')
-rw-r--r--misc-utils/cal.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/misc-utils/cal.c b/misc-utils/cal.c
index 3e38f8ed..bda3a963 100644
--- a/misc-utils/cal.c
+++ b/misc-utils/cal.c
@@ -162,7 +162,7 @@ char *Hrow; /* pointer to highlighted row in month */
#define FIRST_MISSING_DAY 639799 /* 3 Sep 1752 */
#define NUMBER_MISSING_DAYS 11 /* 11 day correction */
-#define MAXDAYS 43 /* max slots in a month array */
+#define MAXDAYS 42 /* slots in a month array */
#define SPACE -1 /* used in day array */
static int days_in_month[2][13] = {
@@ -170,30 +170,34 @@ static int days_in_month[2][13] = {
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
};
-int sep1752[MAXDAYS] = {
+#define SEP1752_OFS 4 /* sep1752[4] is a Sunday */
+
+/* 1 Sep 1752 is represented by sep1752[6] and j_sep1752[6] */
+int sep1752[MAXDAYS+6] = {
+ SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, 1, 2, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE
-}, j_sep1752[MAXDAYS] = {
+ SPACE, SPACE
+}, j_sep1752[MAXDAYS+6] = {
+ SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, 245, 246, 258, 259, 260,
261, 262, 263, 264, 265, 266, 267,
268, 269, 270, 271, 272, 273, 274,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE
+ SPACE, SPACE
}, empty[MAXDAYS] = {
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
- SPACE
+ SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE
};
#define DAY_LEN 3 /* 3 spaces per day */
@@ -629,10 +633,11 @@ day_array(int day, int month, int year, int *days) {
int *d_sep1752;
if (month == 9 && year == 1752) {
+ int sep1752_ofs = (weekstart + SEP1752_OFS) % 7;
d_sep1752 = julian ? j_sep1752 : sep1752;
- memcpy(days, d_sep1752 + weekstart, MAXDAYS * sizeof(int));
+ memcpy(days, d_sep1752 + sep1752_ofs, MAXDAYS * sizeof(int));
for (dm=0; dm<MAXDAYS; dm++)
- if (j_sep1752[dm] == day)
+ if (j_sep1752[dm + sep1752_ofs] == day)
days[dm] |= TODAY_FLAG;
return;
}