> - 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

Reply via email to