Barbarism begins at internet:2004年11月22日分

2004/11/22(Mon)

@vfscanf/vfprintf

おもいっきりwchar_tの中身を覗いてるとことか、
酷いコードだったのでちょっとコードを整理。

先日の^[$B%s%s ... を食わせるとinput_failureってのは
今のcitrus_iso2022.cの実装からすると誤り、^[$B%sまで変換したところで
mbsinitは0を返す(initial state)のでマッチします。
JISが呼び出されてるのにinitial stateってのは違和感有るけどまあいいや。
あと下のコードがAbortしてしまうのはバグですかね?

#include <errno.h>
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(int argc, char **argv)
{
	wchar_t wc;
	char *s = "^[$B%s^[(B^[$B%s^[(B";
	mbstate_t st;
	int n;

	setlocale(LC_CTYPE, "ja_JP.ISO2022-JP");
	memset(&st, 0, sizeof(st));
	for (;;) {
		n = mbrtowc(&wc, s, 1, &st);
		if (n == (size_t)-1) {
			abort();
		} else if (n == (size_t)-2) {
			s++;
		} else {
			s += n;
			if (wc == 0)
				break;
		}
	}
	return (0);
}