From af5d0c363a52e787a4311a11f035209eecdc4115 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sun, 21 Oct 2007 12:38:33 +0200 Subject: [PATCH] tr: do not reject an unmatched [:lower:] or [:upper:] in SET1. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * NEWS: Mention this. * src/tr.c (get_next) [RE_CHAR_CLASS]: Don't skip the loop when processing [:lower:] and [:upper:]. (main): Require [:lower:] or [:upper:] in SET1 only when when one of those is specified in SET2. * tests/tr/Test.pm: Add tests for this fix. Reported by Per Starbäck. Signed-off-by: Jim Meyering --- ChangeLog | 11 +++++++++++ NEWS | 2 ++ THANKS | 1 + src/tr.c | 23 +++++------------------ tests/tr/Test.pm | 4 ++++ 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d73177..4dcd62b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-10-21 Jim Meyering + + tr: do not reject an unmatched [:lower:] or [:upper:] in SET1. + * NEWS: Mention this. + * src/tr.c (get_next) [RE_CHAR_CLASS]: Don't skip the loop when + processing [:lower:] and [:upper:]. + (main): Require [:lower:] or [:upper:] in SET1 only when + when one of those is specified in SET2. + * tests/tr/Test.pm: Add tests for this fix. + Reported by Per Starbäck. + 2007-10-20 Jim Meyering * tests/misc/help-version: Add a comment. diff --git a/NEWS b/NEWS index beda7f8..8fb3f50 100644 --- a/NEWS +++ b/NEWS @@ -148,6 +148,8 @@ GNU coreutils NEWS -*- outline -*- tr -c no longer aborts when translating with Set2 larger than the complement of Set1. [introduced with the original version, in 1992] + tr no longer rejects an unmatched [:lower:] or [:upper:] in SET1. + * Noteworthy changes in release 6.9 (2007-03-22) [stable] diff --git a/THANKS b/THANKS index cdddec4..0b0124b 100644 --- a/THANKS +++ b/THANKS @@ -407,6 +407,7 @@ Paul Worrall paul@basilisk.uklinux.net Pawel Prokop pablo@wizard.ae.krakow.pl Per Cederqvist ceder@lysator.liu.se Per Kristian Hove perhov@math.ntnu.no +Per Starbäck starback@stp.lingfil.uu.se Peter Breitenlohner peb@mppmu.mpg.de Peter Dyballa peter_dyballa@web.de Peter Eriksson peter@ifm.liu.se diff --git a/src/tr.c b/src/tr.c index f79f3ba..dff602e 100644 --- a/src/tr.c +++ b/src/tr.c @@ -1077,27 +1077,15 @@ get_next (struct Spec_list *s, enum Upper_Lower_class *class) case RE_CHAR_CLASS: if (class) { - bool upper_or_lower; switch (p->u.char_class) { case CC_LOWER: *class = UL_LOWER; - upper_or_lower = true; break; case CC_UPPER: *class = UL_UPPER; - upper_or_lower = true; break; default: - upper_or_lower = false; - break; - } - - if (upper_or_lower) - { - s->tail = p->next; - s->state = NEW_ELEMENT; - return_val = 0; break; } } @@ -1833,12 +1821,11 @@ main (int argc, char **argv) c1 = get_next (s1, &class_s1); c2 = get_next (s2, &class_s2); - /* When constructing the translation array, either one of the - values returned by paired calls to get_next must be from - [:upper:] and the other is [:lower:], or neither can be from - upper or lower. */ - - if ((class_s1 == UL_NONE) != (class_s2 == UL_NONE)) + /* When translating and there is an [:upper:] or [:lower:] + class in SET2, then there must be a corresponding [:lower:] + or [:upper:] class in SET1. */ + if (class_s1 == UL_NONE + && (class_s2 == UL_LOWER || class_s2 == UL_UPPER)) error (EXIT_FAILURE, 0, _("misaligned [:upper:] and/or [:lower:] construct")); diff --git a/tests/tr/Test.pm b/tests/tr/Test.pm index 1bb9aca..804c5cb 100644 --- a/tests/tr/Test.pm +++ b/tests/tr/Test.pm @@ -135,6 +135,10 @@ my @tv = ( # Prior to coreutils-6.10, this would provoke a failed assertion. ['no-abort-1', '-c ' . q|a '[b*256]'|, 'abc', 'abb', 0], + +# Up to coreutils-6.9, tr rejected an unmatched [:lower:] or [:upper:] in SET1. +['s1-lower', q|'[:lower:]' '[.*]'|, '#$%123abcABC', '#$%123...ABC', 0], +['s1-upper', q|'[:upper:]' '[.*]'|, '#$%123abcABC', '#$%123abc...', 0], ); sub test_vector -- 2.7.4