mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-07-27 19:10:17 +02:00
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
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user