[tz] [PATCH 1/2] Fix zic parsing of abbreviated line codes
Paul Eggert
eggert at cs.ucla.edu
Fri Jun 2 20:03:04 UTC 2017
* NEWS: Document this.
* zic.8: Document more clearly that "Zone" etc. can be abbreviated.
* zic.c (line_codes): Remove, replacing with ...
(zi_line_codes, leap_line_codes): ... these new constants.
(infile): Use them to distinguish context more accurately.
Remove no-longer-applicable warning.
---
NEWS | 9 +++++++++
zic.8 | 9 ++++++++-
zic.c | 16 +++++++++-------
3 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/NEWS b/NEWS
index 0a76781..99f5d64 100644
--- a/NEWS
+++ b/NEWS
@@ -48,6 +48,15 @@ Unreleased, experimental changes
Also, zic warns about the undocumented usage with a "last-"
prefix, e.g., "last-Fri".
+ Similarly, zic now accepts the unambiguous abbreviation "L" for
+ "Link" in ordinary context and for "Leap" in leap-second context.
+ Conversely, zic no longer accepts non-prefixes such as "La" as
+ abbreviations for words like "Leap".
+
+ zic no longer accepts leap second lines in ordinary input, or
+ ordinary lines in leap second input. Formerly, zic sometimes
+ warned about this undocumented usage and handled it incorrectly.
+
Several minor changes have been made to the code to make it a
bit easier to port to MS-Windows. (Thanks to Kees Dekker for
reporting the problems.)
diff --git a/zic.8 b/zic.8
index 6fee96d..ab95b08 100644
--- a/zic.8
+++ b/zic.8
@@ -147,7 +147,14 @@ Any line that is blank (after comment stripping) is ignored.
Non-blank lines are expected to be of one of three types:
rule lines, zone lines, and link lines.
.PP
-Names (such as month names) must be in English and are case insensitive.
+Names must be in English and are case insensitive.
+They appear in several contexts, and include month and weekday names
+and keywords such as
+.BR "maximum" ,
+.BR "only" ,
+.BR "Rolling" ,
+and
+.BR "Zone" .
A name can be abbreviated by omitting all but an initial prefix; any
abbreviation must be unambiguous in context.
.PP
diff --git a/zic.c b/zic.c
index 33cb4e7..ff71af6 100644
--- a/zic.c
+++ b/zic.c
@@ -298,10 +298,13 @@ struct lookup {
static struct lookup const * byword(const char * string,
const struct lookup * lp);
-static struct lookup const line_codes[] = {
+static struct lookup const zi_line_codes[] = {
{ "Rule", LC_RULE },
{ "Zone", LC_ZONE },
{ "Link", LC_LINK },
+ { NULL, 0 }
+};
+static struct lookup const leap_line_codes[] = {
{ "Leap", LC_LEAP },
{ NULL, 0}
};
@@ -1114,6 +1117,8 @@ infile(const char *name)
} else if (wantcont) {
wantcont = inzcont(fields, nfields);
} else {
+ struct lookup const *line_codes
+ = name == leapsec ? leap_line_codes : zi_line_codes;
lp = byword(fields[0], line_codes);
if (lp == NULL)
error(_("input line of unknown type"));
@@ -1130,11 +1135,7 @@ infile(const char *name)
wantcont = false;
break;
case LC_LEAP:
- if (name != leapsec)
- warning(_("%s: Leap line in non leap"
- " seconds file %s"),
- progname, name);
- else inleap(fields, nfields);
+ inleap(fields, nfields);
wantcont = false;
break;
default: /* "cannot happen" */
@@ -1586,7 +1587,8 @@ rulesub(struct rule *rp, const char *loyearp, const char *hiyearp,
** Day work.
** Accept things such as:
** 1
- ** last-Sunday
+ ** lastSunday
+ ** last-Sunday (undocumented; warn about this)
** Sun<=20
** Sun>=7
*/
--
2.9.4
More information about the tz
mailing list