summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2007-10-21 12:38:33 +0200
committerJim Meyering <meyering@redhat.com>2007-10-21 14:01:28 +0200
commitaf5d0c363a52e787a4311a11f035209eecdc4115 (patch)
tree30ee17355928ee3ba04a78d66b2f290d8a47e159
parentc365bafa815695e187089ab711eca4ca55282b0d (diff)
downloadcoreutils-af5d0c363a52e787a4311a11f035209eecdc4115.tar.xz
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. Signed-off-by: Jim Meyering <meyering@redhat.com>
-rw-r--r--ChangeLog11
-rw-r--r--NEWS2
-rw-r--r--THANKS1
-rw-r--r--src/tr.c23
-rw-r--r--tests/tr/Test.pm4
5 files changed, 23 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 2d73177f7..4dcd62bab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2007-10-21 Jim Meyering <meyering@redhat.com>
+
+ 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 <meyering@redhat.com>
* tests/misc/help-version: Add a comment.
diff --git a/NEWS b/NEWS
index beda7f860..8fb3f50d9 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 cdddec497..0b0124b90 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 f79f3bac1..dff602e6b 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 1bb9aca44..804c5cb38 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