instr関数の検索対象に入ってしまうバグを発見しました。
(HSP3.51とHSP3.6β3で同様の現象が発生することを確認)
例えば、下記の例では「ほげほげふがふが」という8バイトの内容が書かれた"hoge.txt"を
先頭5バイトだけ読み込んだ場合に、前回読み込まれた内容を含めて検索してしまうようです…
// "ほげほげふがふが"という内容の hoge.txt を用意
_buf="ほげほげふがふが" notesel _buf notesave "hoge.txt" // 先頭5バイトだけ読み込む buf="" notesel buf noteload "hoge.txt", 5 mes buf mes "strlen:" + strlen(buf) + ", instr(ふが):" + instr(buf, 0, "ふが") + "\n" // 全部読み込む noteload "hoge.txt" mes buf mes "strlen:" + strlen(buf) + ", instr(ふが):" + instr(buf, 0, "ふが") + "\n" // 再度、先頭5バイトだけ読み込む → instr関数が前回読み込んだ内容を読んでしまう noteload "hoge.txt", 5 mes buf mes "strlen:" + strlen(buf) + ", instr(ふが):" + instr(buf, 0, "ふが") + "\n"
実行結果:
ほげ€(※本来、最後の行は「strlen:5, instr(ふが):-1」となるはず)
strlen:5, instr(ふが):-1 ほげほげふがふが strlen:16, instr(ふが):8 ほげ€ strlen:5, instr(ふが):8
はじめは、Shift-JISの全角文字の1バイト目'\x82'のあとのNULL文字が無視されているのかと予想しました。
ただ、その場合は最後のbufのメモリ内容は"ほげほげ\x82\0がふが"となり、instr関数の結果は
8ではなく12になる(後ろの方の"ふが"がヒットする)はずなので、単純にinstr関数でNULL文字が
無視されているという訳でもなさそうです。(そもそもnoteload命令はNULL文字を明示的に挿入していない?)
半端なサイズで読み込んだファイル内容をShift-JIS文字列が前提のinstr関数にかけるのが悪いのですが、
instr関数以外に良い検索命令がないもので、少し困っています。
(具体的には、上記プログラムと似たような感じで、テキスト形式で書かれた巨大なファイルの先頭の数百byteだけ読み出して、
ヘッダ部分が全部読み込めたかどうかを調べるために、ヘッダの終端文字列が含まれているかどうか確認する処理に使っています。)