summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/ncal/ncal.124
-rw-r--r--usr.bin/ncal/ncal.c42
2 files changed, 45 insertions, 21 deletions
diff --git a/usr.bin/ncal/ncal.1 b/usr.bin/ncal/ncal.1
index 6bcddd2..ccb711b 100644
--- a/usr.bin/ncal/ncal.1
+++ b/usr.bin/ncal/ncal.1
@@ -30,7 +30,7 @@
.Sh NAME
.Nm cal ,
.Nm ncal
-.Nd displays a calendar and the date of easter
+.Nd displays a calendar and the date of Easter
.Sh SYNOPSIS
.Nm
.Op Fl jy
@@ -57,7 +57,7 @@ The
.Nm
utility displays a simple calendar in traditional format and
.Nm ncal
-offers an alternative layout, more options and the date of easter.
+offers an alternative layout, more options and the date of Easter.
The new format is a little cramped but it makes a year fit
on a 25x80 terminal.
If arguments are not specified,
@@ -68,16 +68,24 @@ The options are as follows:
.It Fl J
Display Julian Calendar, if combined with the
.Fl e
-option, display date of easter according to the Julian Calendar.
+option, display date of Easter according to the Julian Calendar.
.It Fl e
-Display date of easter (for western churches).
+Display date of Easter (for western churches).
.It Fl j
Display Julian days (days one-based, numbered from January 1).
.It Fl m Ar month
Display the specified
.Ar month .
+If
+.Ar month
+is specified as a decimal number, it may be followed by the letter
+.Ql f
+or
+.Ql p
+to indicate the following or preceding month of that number,
+respectively.
.It Fl o
-Display date of orthodox easter (Greek and Russian
+Display date of Orthodox Easter (Greek and Russian
Orthodox Churches).
.It Fl p
Print the country codes and switching days from Julian to Gregorian
@@ -101,7 +109,7 @@ Print the number of the week below each week column.
Display a calendar for the specified year.
.El
.Pp
-A single parameter specifies the year (1 - 9999) to be displayed;
+A single parameter specifies the year (1\(en9999) to be displayed;
note the year must be fully specified:
.Dq Li cal 89
will
@@ -113,7 +121,7 @@ Month and year default to those of the current system clock and time zone (so
.Dq Li cal -m 8
will display a calendar for the month of August in the current year).
.Pp
-A year starts on Jan 1.
+A year starts on January 1.
.Sh SEE ALSO
.Xr calendar 3 ,
.Xr strftime 3
@@ -132,7 +140,7 @@ The
command and manual were written by
.An Wolfgang Helbig Aq helbig@FreeBSD.org .
.Sh BUGS
-The assignment of Julian\(emGregorian switching dates to
+The assignment of Julian\(enGregorian switching dates to
country codes is historically naive for many countries.
.Pp
The
diff --git a/usr.bin/ncal/ncal.c b/usr.bin/ncal/ncal.c
index 7e0d5ee..1b125d6 100644
--- a/usr.bin/ncal/ncal.c
+++ b/usr.bin/ncal/ncal.c
@@ -162,7 +162,7 @@ char *center(char *s, char *t, int w);
void mkmonth(int year, int month, int jd_flag, struct monthlines * monthl);
void mkmonthb(int year, int month, int jd_flag, struct monthlines * monthl);
void mkweekdays(struct weekdays * wds);
-int parsemonth(const char *s);
+int parsemonth(const char *s, int *m, int *y);
void printcc(void);
void printeaster(int year, int julian, int orthodox);
void printmonth(int year, int month, int jd_flag);
@@ -322,11 +322,11 @@ main(int argc, char *argv[])
}
if (flag_month != NULL) {
- m = parsemonth(flag_month);
- if (m < 1 || m > 12)
+ if (parsemonth(flag_month, &m, &y)) {
errx(EX_USAGE,
"%s is neither a month number (1..12) nor a name",
flag_month);
+ }
}
if (flag_easter)
@@ -859,18 +859,34 @@ center(char *s, char *t, int w)
}
int
-parsemonth(const char *s)
+parsemonth(const char *s, int *m, int *y)
{
- int v;
+ int nm, ny;
char *cp;
struct tm tm;
- v = (int)strtol(s, &cp, 10);
- if (cp != s)
- return (v);
- if (strptime(s, "%B", &tm) != NULL)
- return (tm.tm_mon + 1);
- if (strptime(s, "%b", &tm) != NULL)
- return (tm.tm_mon + 1);
- return (0);
+ nm = (int)strtol(s, &cp, 10);
+ if (cp != s) {
+ ny = *y;
+ if (*cp == '\0') {
+ ; /* no special action */
+ } else if (*cp == 'f' || *cp == 'F') {
+ if (nm <= *m)
+ ny++;
+ } else if (*cp == 'p' || *cp == 'P') {
+ if (nm >= *m)
+ ny--;
+ } else
+ return (1);
+ if (nm < 1 || nm > 12)
+ return 1;
+ *m = nm;
+ *y = ny;
+ return (0);
+ }
+ if (strptime(s, "%B", &tm) != NULL || strptime(s, "%b", &tm) != NULL) {
+ *m = tm.tm_mon + 1;
+ return (0);
+ }
+ return (1);
}
OpenPOWER on IntegriCloud