寺西です。
NOKUBI Takatsugu wrote:
>
> > 割り当てたメモリのポインタが 0xffffffff (= -1) になることはないのでは?
> > 割り当てるメモリサイズが1バイトではありませんから。
>
> 元のコードは if (fromutf8 < 0) といった記述だったので、2GBを越えたら
> 負の値になりそうだと思ったわけです。
いや、元のコードは
if (fromutf8 == -1)
だったはず。
ワーニングが出るから
if (fromutf8 == (iconv_t)-1)
にしましょうという話。
> エラー処理については昨日の段階でassertを突っ込んだだけなので、これが
> ちゃんとしたエラー処理かというと微妙なところです。
> 一番楽なのは例外を発行することなんですが、Cでそれは無理ですからね...
> どうしたものでしょうか。
こっちはちょっと勘違いしてました。
> となっており、iconv_open で (iconv_t)-1 が返って来てた場合のエラー
> 処理がありませんね。
> # 以前のコードにはエラー処理があったのでは??
と思っていましたが、元々エラー処理はありませんでしたね。
エラーなら iconv 通すのはまずいでしょうから、そのままリターンとか
で良いのでしょうかね。
あるいは全角文字は〓に、半角文字は?に変換して返すか...。
if (fromutf8 == (iconv_t) -1)
fromutf8 = iconv_open("EUC-JP", "UTF-8");
if (fromutf8 != (iconv_t) -1) {
/* エラー処理 */
return;
}
l = iconv(fromutf8, &from, &fromlen, &to, &tolen);
if (l == (size_t)(-1)) {
/* エラー処理 */
return;
}
if (tolen == 1) {
unget1byte(eucj[1]); /* これは \0 ? */
unget1byte(eucj[0]);
} else { /* tolen == 2 しか想定してない? */
unget1byte(eucj[2]); /* これは \0 ? */
unget1byte(eucj[1]);
unget1byte(eucj[0]);
}
getkanji(c);
return;
UTF-8 から EUC-JP の3バイト文字に変換されるケースもあるかと思います
が、tolen が 3 なので、きっと iconv は -1 を返すのだと思います。
その時、エラー処理をしないと不定値の eucj[0] から eucj[2] が返される
ので、ちょっとまずいことが起きそうです。
KAKASI って他のところでエラーが起こった場合はどうしているのでしたっけ?
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)
[メールアドレス保護]
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E
_______________________________________________
Kakasi-dev mailing list
[email protected]
http://www.namazu.org/cgi-bin/mailman/listinfo/kakasi-dev