[PATCH] cal: Add support for highlighting an arbitrary date

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



`cal` already supports highlighting "today",
on terminals that support it.

The attached patch extends this slightly so that an arbitrary
day can be highlighted using the following syntax:

cal 14 9 1752

cheers,
Pádraig.
>From 6e83570d2244b2b40ba4ef27bc2101287cb1590a Mon Sep 17 00:00:00 2001
From: =?utf-8?q?P=C3=A1draig_Brady?= <P@xxxxxxxxxxxxxx>
Date: Tue, 2 Oct 2007 00:22:45 +0100
Subject: [PATCH] cal: Add support for highlighting an arbitrary date.
This is done by calling cal with the extra day parameter like:

cal 14 9 1752

Note the tests were updated to use the new syntax.

Note also that this patch changes the -y option
to always print a full year, even if a month or
the -[13] options are specified.
This matches the cal operation from bsdmainutils on debian
and also allows one to print a full year while
highlighting a particular date.

Signed-off-by: Pádraig Brady <P@xxxxxxxxxxxxxx>
---
 TODO                   |    2 -
 misc-utils/Makefile.am |    6 -----
 misc-utils/cal.1       |    6 +++-
 misc-utils/cal.c       |   49 +++++++++++++++++++++++++++--------------------
 tests/commands.sh.in   |    1 -
 tests/ts-cal-1         |   18 ++++++++--------
 tests/ts-cal-3         |   18 ++++++++--------
 tests/ts-cal-y         |   18 ++++++++--------
 8 files changed, 59 insertions(+), 59 deletions(-)

diff --git a/TODO b/TODO
index 9777371..774fed6 100644
--- a/TODO
+++ b/TODO
@@ -29,8 +29,6 @@
 	From: LaMont Jones <lamont@xxxxxxxxxxxx>
 	Subject: Re: [PATCH] losetup: support password hashing and specifying the key length
 
- * add an option to the cal command to control highlight date
-
  * convet po/ files to UTF-8
 
  * use rpmatch() for all Y/N questions
diff --git a/misc-utils/Makefile.am b/misc-utils/Makefile.am
index e9f304f..45ee3cc 100644
--- a/misc-utils/Makefile.am
+++ b/misc-utils/Makefile.am
@@ -75,9 +75,3 @@ install-exec-hook::
 endif
 endif
 endif
-
-noinst_PROGRAMS = cal_test
-cal_test_SOURCES = cal.c
-cal_test_CPPFLAGS = -DTEST_CAL $(AM_CPPFLAGS)
-cal_test_LDADD = $(cal_LDADD)
-
diff --git a/misc-utils/cal.1 b/misc-utils/cal.1
index 8ec44b0..7d7ef21 100644
--- a/misc-utils/cal.1
+++ b/misc-utils/cal.1
@@ -43,14 +43,14 @@
 .Sh SYNOPSIS
 .Nm cal
 .Op Fl smjy13
-.Op [ Ar month ] Ar year
+.Op [ [ Ar day] Ar month ] Ar year
 .Sh DESCRIPTION
 .Nm Cal
 displays a simple calendar.
 If arguments are not specified,
 the current month is displayed.
 The options are as follows:
-.Bl -tag -width Ds
+eBl -tag -width Ds
 .It Fl 1
 Display single month output.
 (This is the default.)
@@ -76,6 +76,8 @@ will
 .Em not
 display a calendar for 1989.
 Two parameters denote the month (1 - 12) and year.
+Three parameters denote the day (1-31), month and year,
+and the day will be highlighted if the calendar is displayed on a terminal.
 If no parameters are specified, the current month's calendar is
 displayed.
 .Pp
diff --git a/misc-utils/cal.c b/misc-utils/cal.c
index 77333d8..a981729 100644
--- a/misc-utils/cal.c
+++ b/misc-utils/cal.c
@@ -341,6 +341,10 @@ main(int argc, char **argv) {
 
 	day = month = year = 0;
 	switch(argc) {
+	case 3:
+		if ((day = atoi(*argv++)) < 1 || month > 31)
+			errx(1, _("illegal day value: use 1-%d"), 31);
+		/* FALLTHROUGH */
 	case 2:
 		if ((month = atoi(*argv++)) < 1 || month > 12)
 			errx(1, _("illegal month value: use 1-12"));
@@ -348,38 +352,38 @@ main(int argc, char **argv) {
 	case 1:
 		if ((year = atoi(*argv)) < 1 || year > 9999)
 			errx(1, _("illegal year value: use 1-9999"));
+		if (day) {
+			int dm = days_in_month[leap_year(year)][month];
+			if (day > dm)
+				errx(1, _("illegal day value: use 1-%d"), dm);
+			day = day_in_year(day, month, year);
+		}
+		if (!month)
+			yflag=1;
 		break;
 	case 0:
-	{
-#ifdef TEST_CAL
-		char *e = getenv("TEST_TIME");
-
-		if (e && isdigit((unsigned char) *e))
-			now = atol(e);
-		else
-#endif
-			time(&now);
-	}
+		time(&now);
 		local_time = localtime(&now);
-		if (isatty(1))
-			day = local_time->tm_yday + 1;
+		day = local_time->tm_yday + 1;
 		year = local_time->tm_year + 1900;
-		if (!yflag)
-			month = local_time->tm_mon + 1;
+		month = local_time->tm_mon + 1;
 		break;
 	default:
 		usage();
 	}
 	headers_init();
 
-	if (month && num_months == 1)
-		monthly(day, month, year);
-	else if (month && num_months == 3)
-		monthly3(day, month, year);
-	else if (julian)
+	if (!isatty(1))
+		day = 0; /* don't highlight */
+
+	if (yflag && julian)
 		j_yearly(day, year);
-	else
+	else if (yflag)
 		yearly(day, year);
+	else if (num_months == 1)
+		monthly(day, month, year);
+	else if (num_months == 3)
+		monthly3(day, month, year);
 	exit(0);
 }
 
@@ -633,6 +637,9 @@ day_array(int day, int month, int year, int *days) {
 	if (month == 9 && year == 1752) {
 		d_sep1752 = julian ? j_sep1752 : sep1752;
 		memcpy(days, d_sep1752 + week1stday, MAXDAYS * sizeof(int));
+		for (dm=0; dm<MAXDAYS; dm++)
+			if (j_sep1752[dm] == day)
+				days[dm] |= TODAY_FLAG;
 		return;
 	}
 	memcpy(days, empty, MAXDAYS * sizeof(int));
@@ -806,6 +813,6 @@ void
 usage()
 {
 
-	(void)fprintf(stderr, _("usage: cal [-13smjyV] [[month] year]\n"));
+	(void)fprintf(stderr, _("usage: cal [-13smjyV] [[[day] month] year]\n"));
 	exit(1);
 }
diff --git a/tests/commands.sh.in b/tests/commands.sh.in
index 5e0bb50..c96a422 100644
--- a/tests/commands.sh.in
+++ b/tests/commands.sh.in
@@ -32,7 +32,6 @@ TS_CMD_COL=${TS_CMD_COL:-"$TOPDIR/text-utils/col"}
 TS_CMD_NAMEI=${TS_CMD_NAMEI-"$TOPDIR/misc-utils/namei"}
 TS_CMD_LOOK=${TS_CMD_LOOK-"$TOPDIR/misc-utils/look"}
 TS_CMD_CAL=${TS_CMD_CAL-"$TOPDIR/misc-utils/cal"}
-TS_CMD_CALTEST=${TS_CMD_CALTEST-"$TOPDIR/misc-utils/cal_test"}
 TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"$TOPDIR/misc-utils/script"}
 
 TS_CMD_CHECKTTY=${TS_CMD_CHECKTTY-"$TOPDIR/login-utils/checktty_test"}
diff --git a/tests/ts-cal-1 b/tests/ts-cal-1
index 414cc83..53a1395 100755
--- a/tests/ts-cal-1
+++ b/tests/ts-cal-1
@@ -26,35 +26,35 @@ ts_init "$*"
 set -o pipefail
 
 USETERM=$( ts_has_option "useterm" "$*" )
-MYTIME=1159350000
+MYTIME="27 09 2006"
 
 [ "$USETERM" == "yes" ] && TS_VERBOSE="yes"
 ts_log ""
 
 ts_log "Gregorian - Monday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -1m
+	$TS_CMD_CAL -1m $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -1m >> $TS_OUTPUT
+$TS_CMD_CAL -1m $MYTIME >> $TS_OUTPUT
 
 ts_log "Gregorian - Sunday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -1s
+	$TS_CMD_CAL -1s $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -1s >> $TS_OUTPUT
+$TS_CMD_CAL -1s $MYTIME >> $TS_OUTPUT
 
 
 ts_log "Julian - Monday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -1mj
+	$TS_CMD_CAL -1mj $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -1mj >> $TS_OUTPUT
+$TS_CMD_CAL -1mj $MYTIME >> $TS_OUTPUT
 
 ts_log "Julian - Sunday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -1sj
+	$TS_CMD_CAL -1sj $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -1sj >> $TS_OUTPUT
+$TS_CMD_CAL -1sj $MYTIME >> $TS_OUTPUT
 
 ts_finalize
 
diff --git a/tests/ts-cal-3 b/tests/ts-cal-3
index 877c194..aa815f5 100755
--- a/tests/ts-cal-3
+++ b/tests/ts-cal-3
@@ -26,35 +26,35 @@ ts_init "$*"
 set -o pipefail
 
 USETERM=$( ts_has_option "useterm" "$*" )
-MYTIME=1159350000
+MYTIME="27 09 2006"
 
 [ "$USETERM" == "yes" ] && TS_VERBOSE="yes"
 ts_log ""
 
 ts_log "Gregorian - Monday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME  $TS_CMD_CALTEST -3m
+	 $TS_CMD_CAL -3m $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -3m >> $TS_OUTPUT
+$TS_CMD_CAL -3m $MYTIME >> $TS_OUTPUT
 
 ts_log "Gregorian - Sunday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME  $TS_CMD_CALTEST -3s
+	 $TS_CMD_CAL -3s $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -3s >> $TS_OUTPUT
+$TS_CMD_CAL -3s $MYTIME >> $TS_OUTPUT
 
 
 ts_log "Julian - Monday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -3mj
+	$TS_CMD_CAL -3mj $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -3mj >> $TS_OUTPUT
+$TS_CMD_CAL -3mj $MYTIME >> $TS_OUTPUT
 
 ts_log "Julian - Sunday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME  $TS_CMD_CALTEST -3sj
+	 $TS_CMD_CAL -3sj $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -3sj >> $TS_OUTPUT
+$TS_CMD_CAL -3sj $MYTIME >> $TS_OUTPUT
 
 ts_finalize
 
diff --git a/tests/ts-cal-y b/tests/ts-cal-y
index 4a18445..769373a 100755
--- a/tests/ts-cal-y
+++ b/tests/ts-cal-y
@@ -26,35 +26,35 @@ ts_init "$*"
 set -o pipefail
 
 USETERM=$( ts_has_option "useterm" "$*" )
-MYTIME=1164800000 # 29-Nov-2006
+MYTIME="29 11 2006"
 
 [ "$USETERM" == "yes" ] && TS_VERBOSE="yes"
 ts_log ""
 
 ts_log "Gregorian - Monday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -ym
+	$TS_CMD_CAL -ym $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -ym >> $TS_OUTPUT
+$TS_CMD_CAL -ym $MYTIME >> $TS_OUTPUT
 
 ts_log "Gregorian - Sunday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -ys
+	$TS_CMD_CAL -ys $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -ys >> $TS_OUTPUT
+$TS_CMD_CAL -ys $MYTIME >> $TS_OUTPUT
 
 
 ts_log "Julian - Monday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -ymj
+	$TS_CMD_CAL -ymj $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -ymj >> $TS_OUTPUT
+$TS_CMD_CAL -ymj $MYTIME >> $TS_OUTPUT
 
 ts_log "Julian - Sunday-based week"
 if [ "$USETERM" == "yes" ]; then
-	TEST_TIME=$MYTIME $TS_CMD_CALTEST -ysj
+	$TS_CMD_CAL -ysj $MYTIME
 fi
-TEST_TIME=$MYTIME $TS_CMD_CALTEST -ysj >> $TS_OUTPUT
+$TS_CMD_CAL -ysj $MYTIME >> $TS_OUTPUT
 
 ts_finalize
 
-- 
1.5.0.6


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux