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.
diff --git a/tr.c b/tr.c
index 361ac40..d6d1044 100644
--- a/tr.c
+++ b/tr.c
@@ -213,7 +213,7 @@
 	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 @@
 	}
 	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 @@
 	}
 	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;