mbtowcが-1を返すと以後ずっと-1を返すのです。
何か内部状態をクリアする方法が用意されているのでしょうか。
バグっぽいですけど。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <limits.h>
int main(void)
{
char mb[3];
setlocale(LC_CTYPE, "");
/* UTF-8で'あ' */
mb[0] = 0xe3;
mb[1] = 0x81;
mb[2] = 0x82;
puts(mbtowc(NULL, mb, 3) > 0 ? "OK" : "NG");
puts(mbtowc(NULL, mb, 2) > 0 ? "OK" : "NG");
puts(mbtowc(NULL, mb, 3) > 0 ? "OK" : "NG");
return 0;
}
OK
NG
NG
と出力されました。
Cygwinのgcc 4.5.3では
OK
NG
OK
と出力されます。