作者: うぇいく
日時: 2008/12/25(14:29)
 ふたたびこんにちは。うぇいくです。

 一通り、処理を読んでみました。なるほど、これがlcs・・・
# 仕様書の代わりにソースを読むタイプ。

 マルチバイトの文字列を、ワイドキャラの文字列に変換しているのと
似たような処理を行っているので、内部コードをUnicode化すると、
かなりすっきりすると思われます。

 問題の、0x8000ですが、以下の目的で使用しているようです。
・ファイル1と、ファイル2を比較してゆく中で、あるファイル1内の文字が
 ファイル2に存在しなかった場合、比較範囲が同じ間は、同じ文字による
 検索を行わないためにマークしておく。

これは、
・ファイル1の内容を保持している、WORDの配列(Buf)
・ファイル2の内容を保持している、WORDの配列(Bufのファイル1の後ろに)
・ファイル1の読み飛ばせる文字を管理しているBOOL配列(Bufの0x8000を利用)
※WORDはunsigned shortのこと。
※BOOLは通常は処理の早いint。lcsでは、容量が節約できる1bitだけ使用している。
の3つに分けるとわかりやすいんでしょうが・・・それを、(おそらくDOS時代の
メモリの容量の都合もあり)Bufに押し込んでいるわけです。

 おそらく高速化のためですので、0x8000に関連する処理をざっくりと消して
しまっても、(ちゃんと取り除く分には)動作には影響なさそうです。Unicode用の
型に、1bitほどの余り、もしくは決め打ちできるbit(他のbitや値から1か0かを
判断できる)がある場合には同じように実装してしまうことも可能です。
# あまり良い仕組みとはいえませんが・・・・
 メモリ事情もだいぶ変わってはいますので、文字数と同じサイズの配列を
別途確保して、そちらで管理するようにするとよいかもしれません。


>ここで言う「日本語」とはS-JISや日本語EUCなどのデータ内で、ASCII文字列と
>非ASCII文字列とを扱う場合、という意味に受け取って良いでしょうか?

そうですね、7bitsで表現できない文字を扱うケース全てとなります。

# plain charの件は知らなかった・・・