aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2016-10-07 16:10:28 +0200
committerKarel Zak <kzak@redhat.com>2016-10-07 16:10:28 +0200
commitc8805632003c8fb39d8ebf9c921e9c1a90bfa52a (patch)
treee31e87c9c92c3516be10153e749db96a2eca384b
parent535fd6d2b6b3fec9507b2e435460be317e0485a1 (diff)
downloadutil-linux-c8805632003c8fb39d8ebf9c921e9c1a90bfa52a.tar.gz
cal: support abbreviated month names
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--misc-utils/cal.16
-rw-r--r--misc-utils/cal.c19
2 files changed, 21 insertions, 4 deletions
diff --git a/misc-utils/cal.1 b/misc-utils/cal.1
index 39378cfe2a..162916fe97 100644
--- a/misc-utils/cal.1
+++ b/misc-utils/cal.1
@@ -50,8 +50,8 @@ cal \- display a calendar
displays a simple calendar. If no arguments are specified, the current
month is displayed.
.sp
-The \fImonth\fR may be specified as a number (1-12) or as a month name according
-to the current locales.
+The \fImonth\fR may be specified as a number (1-12), as a month name or as an
+abbreviated month name according to the current locales.
.SH OPTIONS
.TP
\fB\-1\fR, \fB\-\-one\fR
@@ -104,7 +104,7 @@ Specifies the \fIyear\fR to be displayed; note the year must be fully specified:
will not display a calendar for 1989.
.TP
\fBSingle string parameter (e.g. 'cal tomorrow' or 'cal August')\fR
-Specifies \fItimestamp\fR or a \fImonth name\fR according to the current
+Specifies \fItimestamp\fR or a \fImonth name\fR (or abbreviated name) according to the current
locales.
.sp
The special placeholders are accepted when parsing timestamp, "now" may be used
diff --git a/misc-utils/cal.c b/misc-utils/cal.c
index 5c56e74805..5e7b356c8f 100644
--- a/misc-utils/cal.c
+++ b/misc-utils/cal.c
@@ -203,6 +203,8 @@ struct cal_request {
struct cal_control {
const char *full_month[MONTHS_IN_YEAR]; /* month names */
+ const char *abbr_month[MONTHS_IN_YEAR]; /* abbreviated month names */
+
int colormode; /* day and week number highlight */
int num_months; /* number of requested monts */
int span_months; /* span the date */
@@ -548,16 +550,31 @@ static void init_monthnames(struct cal_control *ctl)
ctl->full_month[i] = nl_langinfo(MON_1 + i);
}
+static void init_abbr_monthnames(struct cal_control *ctl)
+{
+ size_t i;
+
+ if (ctl->abbr_month[0] != '\0')
+ return; /* already initialized */
+
+ for (i = 0; i < MONTHS_IN_YEAR; i++)
+ ctl->abbr_month[i] = nl_langinfo(ABMON_1 + i);
+}
+
static int monthname_to_number(struct cal_control *ctl, const char *name)
{
size_t i;
init_monthnames(ctl);
-
for (i = 0; i < MONTHS_IN_YEAR; i++)
if (strcasecmp(ctl->full_month[i], name) == 0)
return i + 1;
+ init_abbr_monthnames(ctl);
+ for (i = 0; i < MONTHS_IN_YEAR; i++)
+ if (strcasecmp(ctl->abbr_month[i], name) == 0)
+ return i + 1;
+
return -EINVAL;
}