寺西です。

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)  
[&#x30E1;&#x30FC;&#x30EB;&#x30A2;&#x30C9;&#x30EC;&#x30B9;&#x4FDD;&#x8B77;]
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

メールによる返信