ふたたびこんにちは。うぇいくです。
一通り、処理を読んでみました。なるほど、これが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の件は知らなかった・・・