From: Jim Meyering Date: Sat, 24 Nov 2012 19:36:15 +0000 (-0800) Subject: cut: do not print extraneous delimiters in some unusual cases X-Git-Tag: v8.21~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06aeeecb3fe2655fd5e4e12948b389873a79884b;p=thirdparty%2Fcoreutils.git cut: do not print extraneous delimiters in some unusual cases When printing output delimiters, and when a to-EOL range subsumes at least one other range, cut would mistakenly print delimiters for the subsumed range. This bug was probably introduced via commit v5.2.1-639-g847e066. * src/cut.c (set_fields): Ignore any range that is subsumed by a to-EOL range. Also, move two declarations down. * tests/misc/cut.pl: Add tests to exercise this. * NEWS (Bug fixes): Mention it. Reported by Marcel Böhme in http://bugs.gnu.org/12966 --- diff --git a/NEWS b/NEWS index 63583c1a77..d4aebeb213 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,10 @@ GNU coreutils NEWS -*- outline -*- interpret "-b2-,3-" like "-b3-". Now it's treated like "-b2-". [This bug was present in "the beginning".] + cut no longer prints extraneous delimiters when a to-EOL range subsumes + another range. Before, "echo 123|cut --output-delim=: -b2-,3" would print + "2:3". Now it prints "23". [bug introduced in 5.3.0] + install -m M SOURCE DEST no longer has a race condition where DEST's permissions are temporarily derived from SOURCE instead of from M. diff --git a/src/cut.c b/src/cut.c index b464840d74..4219d24e9a 100644 --- a/src/cut.c +++ b/src/cut.c @@ -514,17 +514,18 @@ set_fields (const char *fieldstr) /* Set the array entries corresponding to integers in the ranges of RP. */ for (i = 0; i < n_rp; i++) { - size_t j; - size_t rsi_candidate; + /* Ignore any range that is subsumed by the to-EOL range. */ + if (eol_range_start && eol_range_start <= rp[i].lo) + continue; /* Record the range-start indices, i.e., record each start index that is not part of any other (lo..hi] range. */ - rsi_candidate = complement ? rp[i].hi + 1 : rp[i].lo; + size_t rsi_candidate = complement ? rp[i].hi + 1 : rp[i].lo; if (output_delimiter_specified && !is_printable_field (rsi_candidate)) mark_range_start (rsi_candidate); - for (j = rp[i].lo; j <= rp[i].hi; j++) + for (size_t j = rp[i].lo; j <= rp[i].hi; j++) mark_printable_field (j); } diff --git a/tests/misc/cut.pl b/tests/misc/cut.pl index cb4781a7d1..27768ff291 100755 --- a/tests/misc/cut.pl +++ b/tests/misc/cut.pl @@ -166,6 +166,15 @@ my @Tests = ['overlapping-unbounded-1', '-b3-,2-', {IN=>"1234\n"}, {OUT=>"234\n"}], ['overlapping-unbounded-2', '-b2-,3-', {IN=>"1234\n"}, {OUT=>"234\n"}], + + # When printing output delimiters, and with one or more ranges subsumed + # by a to-EOL range, cut 8.20 and earlier would print extraneous delimiters. + ['EOL-subsumed-1', '--output-d=: -b2-,3,4-4,5', + {IN=>"123456\n"}, {OUT=>"23456\n"}], + ['EOL-subsumed-2', '--output-d=: -b3,4-4,5,2-', + {IN=>"123456\n"}, {OUT=>"23456\n"}], + ['EOL-subsumed-3', '--complement -b3,4-4,5,2-', + {IN=>"123456\n"}, {OUT=>"1\n"}], ); if ($mb_locale ne 'C')