Fix tr(1) squeezing

Okay, it took me a while and another look at the Posix spec to see that
I have been dealing with squeezing in a way too complicated way.
What just needed to be done is before doing the final write to deploy
the squeeze-check. We actually do not need this atomically complicated
squeeze check in every single edge-case. Now it should work properly.
This commit is contained in:
FRIGN 2016-10-05 19:31:50 +02:00
parent fac091b7cc
commit 9de401a495

20
tr.c
View File

@ -213,7 +213,7 @@ read:
for (i = 0; i < set1ranges; i++) {
if (set1[i].start <= r && r <= set1[i].end) {
if (dflag) {
if (!cflag || (sflag && r == lastrune))
if (!cflag)
goto read;
else
goto write;
@ -244,13 +244,7 @@ read:
}
if (set1check && set1check(r)) {
if (dflag) {
if (!cflag || (sflag && r == lastrune))
goto read;
else
goto write;
}
if (sflag) {
if (r == lastrune)
if (!cflag)
goto read;
else
goto write;
@ -268,9 +262,15 @@ read:
}
if (dflag && cflag)
goto read;
if (dflag && sflag && r == lastrune)
goto read;
write:
if (sflag && r == lastrune) {
if (set2check && set2check(r))
goto read;
for (i = 0; i < set2ranges; i++) {
if (set2[i].start <= r && r <= set2[i].end)
goto read;
}
}
lastrune = r;
efputrune(&r, stdout, "<stdout>");
goto read;