> - add an option to the cal command to control highlight date
> (cal -v YYYY/MM/DD)
I've done this TODO.
If the specified date is within the displayed calendar(s), this date will
be highlighted.
This option can be used with other options such as option -3.
The manpage has been updated accordingly.
Signed-off-by: Li Zefan <[EMAIL PROTECTED]>
---
cal.1 | 3 +++
cal.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/misc-utils/cal.1 b/misc-utils/cal.1
index 0f6af65..db1f89a 100644
--- a/misc-utils/cal.1
+++ b/misc-utils/cal.1
@@ -42,6 +42,7 @@
.Nd displays a calendar
.Sh SYNOPSIS
.Nm cal
+.Op Fl v Ar date
.Op Fl smjy13
.Op [ Ar month ] Ar year
.Sh DESCRIPTION
@@ -63,6 +64,8 @@ Display Sunday as the first day of the week.
Display Monday as the first day of the week.
.It Fl j
Display Julian dates (days one-based, numbered from January 1).
+.It Fl v Ar date
+Highlight the specified date(YYYY/MM/DD).
.It Fl y
Display a calendar for the current year.
.El
diff --git a/misc-utils/cal.c b/misc-utils/cal.c
index f5ede93..818f90b 100644
--- a/misc-utils/cal.c
+++ b/misc-utils/cal.c
@@ -264,6 +264,7 @@ main(int argc, char **argv) {
int ch, day, month, year, yflag;
char *progname, *p;
int num_months = NUM_MONTHS;
+ char *hl_date = NULL;
progname = argv[0];
if ((p = strrchr(progname, '/')) != NULL)
@@ -309,7 +310,7 @@ main(int argc, char **argv) {
#endif
yflag = 0;
- while ((ch = getopt(argc, argv, "13mjsyV")) != -1)
+ while ((ch = getopt(argc, argv, "13mjsv:yV")) != -1)
switch(ch) {
case '1':
num_months = 1; /* default */
@@ -326,6 +327,9 @@ main(int argc, char **argv) {
case 'j':
julian = 1;
break;
+ case 'v':
+ hl_date = optarg;
+ break;
case 'y':
yflag = 1;
break;
@@ -371,6 +375,47 @@ main(int argc, char **argv) {
default:
usage();
}
+
+ /* control highlight date */
+ if (isatty(1) && hl_date != NULL) {
+ int hl_day, hl_month, hl_year;
+ int mday;
+ int highlight;
+
+ if (sscanf(hl_date, "%d/%d/%d", &hl_year, &hl_month, &hl_day)
!= 3)
+ errx(1, _("illegal date value: use YYYY/MM/DD"));
+ if (hl_year < 1 || hl_year > 9999)
+ errx(1, _("illegal year value: use 1-9999"));
+ if (hl_month < 1 || hl_month > 12)
+ errx(1, _("illegal month value: use 1-12"));
+ mday = days_in_month[leap_year(hl_year)][hl_month];
+ if (hl_day < 1 || hl_day > mday)
+ errx(1, _("illegal day value: use 1-%d"), mday);
+
+ highlight = 0;
+ if (!month) {
+ if (hl_year == year)
+ highlight = 1;
+ }
+ else if (month && num_months == 1) {
+ if (hl_year == year && hl_month == month)
+ highlight = 1;
+ }
+ else if (month && num_months == 3) {
+ if (hl_year == year && abs(hl_month - month) <= 1)
+ highlight = 1;
+ else if (hl_year == year - 1 && month == 1 && hl_month
== 12)
+ highlight = 1;
+ else if (hl_year == year + 1 && month == 12 && hl_month
== 1)
+ highlight = 1;
+ }
+
+ if (highlight)
+ day = day_in_year(hl_day, hl_month, hl_year);
+ else
+ day = 0;
+ }
+
headers_init();
if (month && num_months == 1)
@@ -806,7 +851,6 @@ center(str, len, separate)
void
usage()
{
-
- (void)fprintf(stderr, _("usage: cal [-13smjyV] [[month] year]\n"));
+ fprintf(stderr, _("usage: cal [-v YYYY/MM/DD] [-13smjyV] [[month]
year]\n"));
exit(1);
}
---
-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html