7.3
予定変更。Mungerについての続き。
Universal Headersを検索してMungerを検索してみたところ、TextUtils.hにあった。これによると、関数の形は以下のとおりである。
long Munger(Handle h, long offset, const void *ptr1, long len1, const void
*ptr2, long len2);
これを見て気になるのは、やはり「offset」。ヘッダファイルを見ただけではなんとも言えないが、これは「検索を開始する場所」を指定するものではないだろうか。そういえば、DiskCopyではここに0を渡していたはず(clr.l
-(a7))。要するに、常に「最初から」検索するようになっていたということではないか。
IMでMungerを探してみると、テキストの置き換えルーチンとしてReplaceTextとMungerが載っていた。そこの解説によると、ReplaceTextは2バイト文字に対応しているがMungerは対応していないとのこと。昨日書いた「Mungerは2バイトに対応していない」というのが実証された。参考までにReplaceTextの呼び出し方法を書いておくと、
short ReplaceText(Handle baseText, Handle substitutionText, Str15 key);
となっている。Mungerにくらべると、何文字目から探すかを指定できなかったり探す文字列が15文字までしかだめだったりするが、2バイト文字の置き換えをしたい場合にはいいかもしれない。
さて、DiskCopyだが、Mungerでは検索を始める場所を指定できるのだから、見つかった場所よりあとの部分から探すことにすれば永久ループに入ることはないはずだ。たぶん元のルーチンでは、素直にCで書くと
Handle h;
void *str1,*str2;
long len1,len2;
// hに元の文字列へのハンドル、str1には"^0"、len1には2を入れる
// str2にはファイル名、len2にはその長さを入れる
do
{
offset=Munger(h,0,str1,len1,str2,len2);
} while (offset>0)
こんな処理になっているのだと思われるがこれを例えば
long offset;
offset=0;
while
{
offset=Munger(h,offset,str1,len1,str2,len2);
if (offset==0) break;
offset+=len2;
}
こう書き換えればうまくいくのではないだろうか。バイト数が若干多くなるから簡単なパッチでは対応できないと思うが…。と、今回はこんなもんで。
GoldenLogresは、やっと5億点を少しこえることができた。ふー。しかしまだクリアできない…。コンティニューして一応1回クリアしたけどやはりコンティニューなしでクリアしたい。キャメロット台とランズエンド台はだいぶ慣れてきたから昨日も書いたけどフィッシャーキング台の練習か…。キックバックがないのはなかなか厳しいな…。
|