Description: Add options '-l' and '-w'.
Author: Michael Meskes <meskes@debian.org>

diff -ru bsdmainutils/usr.bin/calendar.orig/calendar.1 bsdmainutils/usr.bin/calendar/calendar.1
--- bsdmainutils/usr.bin/calendar.orig/calendar.1	2016-03-08 16:25:58.340534841 +0100
+++ bsdmainutils/usr.bin/calendar/calendar.1	2016-03-08 16:26:02.236572294 +0100
@@ -40,6 +40,8 @@
 .Op Fl abw
 .Op Fl A Ar num
 .Op Fl B Ar num
+.Op Fl l Ar num
+.Op Fl e Ar num
 .Op Fl f Ar calendarfile
 .Op Fl t Oo Oo Oo Ar cc Oc Ns Ar yy Oc Ns Ar mm Oc Ns Ar dd
 .Sh DESCRIPTION
@@ -59,6 +61,7 @@
 Print lines from today and next
 .Ar num
 days (forward, future).
+Defaults to one (same as \-l).
 .It Fl a
 Process the
 .Dq calendar
@@ -71,6 +74,18 @@
 days (backward, past).
 .It Fl b
 Enforce special date calculation mode for Cyrillic calendars.
+.It Fl l Ar num
+Print lines from today and next
+.Ar num
+days (forward, future).
+Defaults to one (same as \-A).
+.It Fl e Ar num
+Print lines from today and next
+.Ar num
+days, only if today is Friday (forward, future).
+Defaults to two, which causes
+.Nm
+to print entries through the weekend on Fridays.
 .It Fl f Ar calendarfile
 Use
 .Ar calendarfile
@@ -95,6 +108,13 @@
 .Dq Paskha=<national_name>
 (for Orthodox Easter) can be used.
 .Pp
+A special locale name exists:
+.Sq utf-8 .
+Specifying
+.Dq LANG=utf-8
+indicates that the dates will be read using the C locale, and the descriptions
+will be encoded in UTF-8.  This is usually used for the distributed calendar
+files.
 The
 .Dq CALENDAR
 variable can be used to specify the style.
@@ -114,6 +134,11 @@
 .Dq BODUN=<bodun_prefix>
 where <local_name> can be ru_RU.UTF-8, uk_UA.UTF-8 or by_BY.UTF-8.
 .Pp
+Note that the locale is reset to the user's default for each new file that is
+read.
+This is so that locales from one file do not accidentally carry over into
+another file.
+.Pp
 Other lines should begin with a month and day.
 They may be entered in almost any format, either numeric or as character
 strings.
@@ -155,6 +179,8 @@
 .Xr cpp 1
 searches in the current (or home) directory first, and then in the
 directory
+.Pa /etc/calendar ,
+and finally in
 .Pa /usr/share/calendar .
 Empty lines and lines protected by the C commenting syntax
 .Pq Li /* ... */
@@ -261,6 +287,40 @@
 in the line.
 This is no longer true: the date is only recognized when it occurs
 at the beginning of a line.
+.Sh COMPATIBILITY
+The
+.Nm
+command will only display lines that use a <tab> character to separate the date
+and description, or that begin with a <tab>.
+This is different than in previous releases.
+.Pp
+The
+Fl t
+flag argument syntax is from the original FreeBSD
+.Nm
+program.
+.Pp
+The
+.Fl l
+and
+.Fl e
+flags are Debian-specific enhancements.
+Option
+.Fl e
+used to be called
+.Fl w
+in Debian, but this option is now used differently by upstream.
+Also, the original
+.Nm
+program did not accept
+.Li 0
+as an argument to the
+.Fl A
+flag.
+.Pp
+Using
+.Sq utf-8
+as a locale name is a Debian-specific enhancement.
 .Sh HISTORY
 A
 .Nm
diff -ru bsdmainutils/usr.bin/calendar.orig/calendar.c bsdmainutils/usr.bin/calendar/calendar.c
--- bsdmainutils/usr.bin/calendar.orig/calendar.c	2016-03-08 16:25:58.352534957 +0100
+++ bsdmainutils/usr.bin/calendar/calendar.c	2016-03-08 16:32:52.468490287 +0100
@@ -58,6 +58,7 @@
 time_t f_time = 0;
 int bodun_always = 0;
 
+int weekend = 2;
 int f_dayAfter = 0;	/* days after current date */
 int f_dayBefore = 0;	/* days before current date */
 int f_Setday = 0;	/* calendar invoked with -A */
@@ -75,7 +76,7 @@
 
 	(void)setlocale(LC_ALL, "");
 
-	while ((ch = getopt(argc, argv, "abwf:t:A:B:-")) != -1)
+	while ((ch = getopt(argc, argv, "abwf:l:t:e:A:B:-")) != -1)
 		switch (ch) {
 		case '-':		/* backward contemptible */
 		case 'a':
@@ -97,6 +98,7 @@
 				errx(1, "specified date is outside allowed range");
 			break;
 
+		case 'l':
 		case 'A': /* days after current date */
 			f_dayAfter = strtonum(optarg, 0, INT_MAX, &errstr);
 			if (errstr)
@@ -104,6 +106,12 @@
 			f_SetdayAfter = 1;
 			break;
 
+		case 'e':
+			weekend = strtonum(optarg, 0, INT_MAX, &errstr);
+ 			if (errstr)
+ 				errx(1, "-A %s: %s", optarg, errstr);
+			break;
+
 		case 'B': /* days before current date */
 			f_dayBefore = strtonum(optarg, 0, INT_MAX, &errstr);
 			if (errstr)
@@ -255,7 +263,7 @@
 usage(void)
 {
 	(void)fprintf(stderr,
-	    "usage: calendar [-abw] [-A num] [-B num] [-f calendarfile] "
+	    "usage: calendar [-abw] [-A num] [-B num] [-l num] [-e num] [-f calendarfile] "
 	    "[-t [[[cc]yy]mm]dd]\n");
 	exit(1);
 }
Nur in bsdmainutils/usr.bin/calendar: calendar.c.orig.
diff -ru bsdmainutils/usr.bin/calendar.orig/calendar.h bsdmainutils/usr.bin/calendar/calendar.h
--- bsdmainutils/usr.bin/calendar.orig/calendar.h	2016-03-08 16:25:58.340534841 +0100
+++ bsdmainutils/usr.bin/calendar/calendar.h	2016-03-08 16:26:02.236572294 +0100
@@ -103,6 +103,7 @@
 #define	SECSPERDAY	(24 * 60 * 60)
 #define	isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
 
+extern int weekend;    /* how many days to look ahead if today is Friday */
 extern int f_dayAfter;	/* days after current date */
 extern int f_dayBefore;	/* days before current date */
 extern int f_SetdayAfter; /* calendar invoked with -A */
Nur in bsdmainutils/usr.bin/calendar: calendar.h.orig.
diff -ru bsdmainutils/usr.bin/calendar.orig/day.c bsdmainutils/usr.bin/calendar/day.c
--- bsdmainutils/usr.bin/calendar.orig/day.c	2016-03-08 16:25:58.340534841 +0100
+++ bsdmainutils/usr.bin/calendar/day.c	2016-03-08 16:26:02.236572294 +0100
@@ -164,8 +164,8 @@
 		cumdays = daytab[1];
 	else
 		cumdays = daytab[0];
-	/* Friday displays Monday's events */
-	offset = tp->tm_wday == 5 ? 3 : 1;
+	/* Friday displays Monday's events if not configured otherwise */
+	offset = tp->tm_wday == 5 ? 1 + weekend : 1;
 	if (f_Setday)
 		offset = 0;	/* Except not when range is set explicitly */
 	header[5].iov_base = dayname;
