遠藤です。

tr_sは、perlのtr///sと一緒でしたか。使ったことないもんで、
久しぶりにProgramming Perlを開いてしまいました。スクイーズ
した結果が前の文字と同じならコピーしないということでしょうか。
ということなら、
  while (s < send) {
    c = trans[*s++ & 0xff] & 0xff;
    if (s[-1] == c || c != c0) {
      c0 = (s[-1] == c)?-1:c;
      if (*t != c) {
        *t = c;
        modify = 1;}
      *t++ = c;}}
を
  while (s < send) {
    c = trans[*s++ & 0xff] & 0xff;
    if (s[-1] == c || c !=c0) {
      c = c0;
      if (*t != c){*t = c; modify = 1} 
      t++}
    else
      modify = 1}
で、いいでしょうか。論理もCもいまいち自信がありませんが、元
のは、スクイーズしなかった次の文字は必ずコピーされてしまい、
Perlと挙動が違います。もっともPerlと違うこの仕様もあり得ます。
そもそもスクイーズを何に使うのかいまいち分かってません。もと
もとマニュアルと違ってます、というだけでしたから。
否定の方はちらっと見ただけですが、テーブルを作るところでrepl
の方を1文字ずついれてるところがおかしそうではありました。
-- 
Akira Endo, akendo / t3.rim.or.jp