From c8805632003c8fb39d8ebf9c921e9c1a90bfa52a Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 7 Oct 2016 16:10:28 +0200 Subject: [PATCH] cal: support abbreviated month names Signed-off-by: Karel Zak --- misc-utils/cal.1 | 6 +++--- misc-utils/cal.c | 19 ++++++++++++++++++- 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; } -- 2.39.2