ものがたり(旧)

atsushieno.hatenablog.com に続く

SeekableStreamReader

mcsのSeekableStreamReaderは厄介な代物なので、できれば消しておきたいクラスのひとつだ。

StreamReaderのBaseStreamのPositionをいじって、行ったり来たりできるようにしたい、というのは、この辺をヘビーにいじる必要がある人なら考えることもあると思う。だけど、このやり方は通用しないと思った方が良い、と僕は思う。

というのは、使用しているEncodingがstateを維持していると、予期しないストリームの位置に戻って読み直しをすると、decoderが想定外のデータを返すことがあるからだ。一番典型的な例が、漢字IN/OUTなどをもつiso-2022-jpで、ストリームのある位置で漢字INを読み、その後漢字OUTに出くわす前にPositionを漢字IN以前の位置に移動させられると、漢字INまでのバイトは非漢字モードであるにも関わらず、漢字モードとして読まれてしまう(はずだ(と思う))。

一度はmcsをいじって消した(消せた)のだけど、gmcsがmcs以上に依存していて、結局今に至っても消せていない。たぶん、tokenizerとparserのインタラクションをStreamの巻き戻しで対応するのではなく、tokenizerにparserから解析モードみたいなのを渡すか、あるいはtokenizerの中でモード遷移のようなものを実装していれば良いのだろうけど*1、これを整理するには時間がかかりそうな気がする。

*1:かつてXQuery仕様の一部であったコレにインスパイアされている