I know I believe in nothing but it is my sweet nothing.:2004年01月18日分

2004/01/18(Sun)

(tbs

@ungetwc

FILE *fp;
wchar_t wc;
int c;
...
ungetwc(wc, fp);
c = fgetc(fp);

とかやった場合の動作なんだけど、
Solaris、glibcなんかのバヤイ、cの値はfpに書き戻したwcの先頭バイトを返すけども、
NetBSDの場合、書き戻したwcのbufferは使われずfpの先頭バイトを返す。
なんでかってーと、ungetwcを呼んだときにfgetwcが内部的に使うmbstate_tまで
元に戻すのは難しいからで、known problem らしい。
(glibcはstateful encoding localeをサポートしないので特別問題にならない、Solarisも?)

真面目に実装しようとしたら、例えば、ISO2022-JPなんかで

wc = fgetwc(fp); /* wc = ASCII */
ungetwc(L'あ', fp); /* JISX0208 */

つーことをやったと考えた場合、fpには

ESC$B$"ESC(B

を書き戻してやればいいんだろか...
_citrus_${ENCODING}_put_state_reset()あたりを拡張すればなんとかなるか?