(nitpick)

When invoked with a single argument and this argument is not a number,
cal(1) thinks it is a month name and calls parsemonth() on it.

If this non-numeric argument is not a valid month name, it exit with the
following error message:

> invalid month: use 1-12 or a name

That error message is OK when invoking cal(1) like this

> cal le_month 2023

"le_month" is indeed an invalid month name.

However, invoking cal(1) like this:

> cal le_month

warns the same error message:

> invalid month: use 1-12 or a name

A 1-12 number there is interpreted as a year number, not as a month.

The errx(3) call in parsemonth() is not necessary, for its return value
is already checked when parsemonth() is called.  I then removed the call
to errx(3) and just returned 0, which is checked against by the caller.


Index: usr.bin/cal/cal.c
===================================================================
RCS file: /cvs/src/usr.bin/cal/cal.c,v
retrieving revision 1.30
diff -u -p -r1.30 cal.c
--- usr.bin/cal/cal.c   9 Oct 2015 01:37:06 -0000       1.30
+++ usr.bin/cal/cal.c   24 Jan 2023 04:16:42 -0000
@@ -196,7 +196,7 @@ main(int argc, char *argv[])
        case 2:
                month = parsemonth(*argv++);
                if (!month)
-                       errx(1, "Unable to parse month");
+                       errx(1, "invalid month: use 1-12 or a name");
                /* FALLTHROUGH */
        case 1:
                if (argc == 1 && !isdigit((unsigned char)*argv[0])) {
@@ -559,6 +559,6 @@ parsemonth(const char *s)
                        v = tm.tm_mon + 1;
        }
        if (v <= 0 || v > 12)
-               errx(1, "invalid month: use 1-12 or a name");
+               return 0;
        return (v);
 }

Reply via email to