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>
This commit is contained in:
Jim Meyering
2007-10-21 12:38:33 +02:00
parent c365bafa81
commit af5d0c363a
5 changed files with 23 additions and 18 deletions

View File

@@ -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.

2
NEWS
View File

@@ -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]

1
THANKS
View File

@@ -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

View File

@@ -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"));

View 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