uniq: Fix off-by-one bug in -cD case.

When printing only duplicated lines, the first line of each set is not
printed until we encounter the second.  When that happens, we need to
increment the repetition count between printing the first and the
second line, so that if we are also printing counts, we don't print the
same (pre-increment) count twice.

MFC after:	1 week
PR:		275764
Reported by:	Yu-Sheng Ma <s110062131@m110.nthu.edu.tw>
Submitted by:	Daniel Tameling <tamelingdaniel@gmail.com> (original patch)
Sponsored by:	Klara, Inc.
Reviewed by:	tamelingdaniel_gmail.com, asomers, emaste
Differential Revision:	https://reviews.freebsd.org/D48000
This commit is contained in:
Dag-Erling Smørgrav 2024-12-09 20:44:46 +01:00
parent b93791f5e7
commit c3f8900e69
2 changed files with 22 additions and 1 deletions

View file

@ -80,6 +80,25 @@ all_repeated_body() {
atf_check_uniq --all-repeated=separate
}
atf_test_case count_all_repeated
count_all_repeated_head() {
atf_set descr "count and print every instance of repeated lines"
}
count_all_repeated_body() {
printf "a\na\nb\na\na\n" >input
printf " 1 a\n 2 a\n 1 a\n 2 a\n" >expected
atf_check_uniq -D -c
atf_check_uniq -Dnone -c
atf_check_uniq -cD
atf_check_uniq -cDnone
atf_check_uniq -c -D
atf_check_uniq -c -Dnone
atf_check_uniq --all-repeated --count
atf_check_uniq --all-repeated=none --count
atf_check_uniq --count --all-repeated
atf_check_uniq --count --all-repeated=none
}
atf_test_case skip_fields
skip_fields_head() {
atf_set descr "skip fields"
@ -196,6 +215,7 @@ atf_init_test_cases()
atf_add_test_case repeated
atf_add_test_case count_repeated
atf_add_test_case all_repeated
atf_add_test_case count_all_repeated
atf_add_test_case skip_fields
atf_add_test_case skip_fields_tab
atf_add_test_case ignore_case

View file

@ -225,12 +225,13 @@ main (int argc, char *argv[])
fputc('\n', ofp);
show(ofp, prevline);
}
show(ofp, thisline);
} else if (dflag && !cflag) {
if (repeats == 0)
show(ofp, prevline);
}
++repeats;
if (Dflag)
show(ofp, thisline);
}
}
if (ferror(ifp))