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:
parent
fac091b7cc
commit
9de401a495
20
tr.c
20
tr.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user