Index | Thread | Search

From:
Jeremie Courreges-Anglas <jca@wxcvbn.org>
Subject:
Re: cal's -y flag usage
To:
Johannes Thyssen Tishman <jtt@openbsd.org>, tech@openbsd.org
Date:
Fri, 26 Jun 2026 16:34:57 +0200

Download raw body.

Thread
On Fri, Jun 26, 2026 at 12:40:23PM +0000, Johannes Thyssen Tishman wrote:
> 2026-06-25T21:47:47+0200 Jeremie Courreges-Anglas <jca@wxcvbn.org>:
> > On Thu, Jun 25, 2026 at 09:13:44AM +0000, Johannes Thyssen Tishman wrote:
> > > While playing with cal I noticed that using the -y flag along with a
> > > single non-numerical argument or with two arguments would essentially
> > > cause the option to be ignored:
> > > 
> > > $ cal -y jun
> > > $ cal -y jun 2026
> > > $ cal -y 06 2026
> > > 
> > > All three commands output the calendar for June 2026 instead of the
> > > entire year. Before I try to patch this, is this the desired/intended
> > > behaviour?
> > 
> > IMO -y should be ignored when a year is later specified on the command
> > line (current behavior), and should conflict with specifying a month.
> 
> So, like this (diff below)?
> 
> $ cal -y          # calendar for year 2026
> $ cal -y 2000     # calendar for year 2000
> $ cal -y jul      # error
> $ cal -y jul 2000 # error
> 
> > > In case a change is desired, would it make sense to split the SYNOPSIS
> > > in the man page into two lines? E.g.:
> > > 
> > > cal [-jmw] [month] [year]
> > > cal [-jmwy] [year]
> > 
> > It doesn't really make sense to specify [year] when you specify -y.
> > I'm not sure the synopsis needs to be amended.
> 
> I agree, I forgot that cal yyyy would print the year calendar already.
> 
> Index: usr.bin/cal/cal.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/cal/cal.1,v
> diff -u -p -r1.33 cal.1
> --- usr.bin/cal/cal.1	31 Jul 2024 17:09:23 -0000	1.33
> +++ usr.bin/cal/cal.1	26 Jun 2026 12:35:41 -0000
> @@ -72,6 +72,10 @@ and
>  are mutually exclusive.
>  .It Fl y
>  Display a calendar for the current year.
> +This option is ignored if
> +.Ar year
> +is specified and conflicts with specifying a
> +.Ar month .
>  .El
>  .Pp
>  A single numerical parameter specifies the

ok jca@

> Index: usr.bin/cal/cal.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/cal/cal.c,v
> diff -u -p -r1.33 cal.c
> --- usr.bin/cal/cal.c	26 Jun 2026 12:34:45 -0000	1.33
> +++ usr.bin/cal/cal.c	26 Jun 2026 12:35:41 -0000
> @@ -193,10 +193,14 @@ main(int argc, char *argv[])
>  	month = 0;
>  	switch(argc) {
>  	case 2:
> +		if (yflag)
> +			errx(1, "illegal year value: use 1-9999");
>  		month = parsemonth(*argv++);
>  		/* FALLTHROUGH */
>  	case 1:
>  		if (argc == 1 && !isdigit((unsigned char)*argv[0])) {
> +			if (yflag)
> +				errx(1, "illegal year value: use 1-9999");
>  			month = parsemonth(*argv);
>  			(void)time(&now);
>  			local_time = localtime(&now);

The error message isn't accurate.  I'd rather you use something like
below.  ok jca@ if you like it.


Index: cal.c
===================================================================
RCS file: /cvs/src/usr.bin/cal/cal.c,v
diff -u -p -r1.33 cal.c
--- cal.c	26 Jun 2026 12:34:45 -0000	1.33
+++ cal.c	26 Jun 2026 14:32:12 -0000
@@ -193,10 +193,14 @@ main(int argc, char *argv[])
 	month = 0;
 	switch(argc) {
 	case 2:
+		if (yflag)
+			errx(1, "specifying a month conflicts with -y");
 		month = parsemonth(*argv++);
 		/* FALLTHROUGH */
 	case 1:
 		if (argc == 1 && !isdigit((unsigned char)*argv[0])) {
+			if (yflag)
+				errx(1, "specifying a month conflicts with -y");
 			month = parsemonth(*argv);
 			(void)time(&now);
 			local_time = localtime(&now);


-- 
jca