tr: do not reject an unmatched [:lower:] or [:upper:] in SET1.
authorJim Meyering <meyering@redhat.com>
Sun, 21 Oct 2007 10:38:33 +0000 (12:38 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 21 Oct 2007 12:01:28 +0000 (14:01 +0200)
* 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>
ChangeLog
NEWS
THANKS
src/tr.c
tests/tr/Test.pm

index 2d73177..4dcd62b 100644 (file)
--- 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 beda7f8..8fb3f50 100644 (file)
--- 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 (file)
--- 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
index f79f3ba..dff602e 100644 (file)
--- 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"));
 
index 1bb9aca..804c5cb 100644 (file)
@@ -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