The Man Who Fell From The Wrong Side Of The Sky:2010年3月7日分

[最新版] [一覧] [前月] [今月] [翌月]

2010/3/7(Sun)

[NetBSD] libedit I18N への道 (その5.3.1)

@

ちうことで、さすがにバイナリ互換壊れたままは不味いもう一杯なので メールかいたのですが
このpatchをcommitした christos氏曰く 大丈夫じゃね?と。

というのも、前回書いた話

ま唯一の救いは、新しい libeditは char よりも大きな wchar_t のサイズを持つ
記憶領域へのポインタを古いバイナリ側が用意した override 関数に渡すので 

正にこの事実を逆に利用して、el_wgetc(3) の中で

420         num_read = (*el->el_read.read_char)(el, cp);
421 #ifdef WIDECHAR
422         if (el->el_flags & NARROW_READ)
423                 *cp = *(char *)(void *)cp;
424 #endif

として、wchar_t を char に整形してたという、汚いなさすが kludge きたない

この NARROW_READ flag は el_set(3) の中でセットしてまんな。

        /* XXX: do we need to change el_rfunc_t? */
        case EL_GETCFN:         /* el_rfunc_t */
                ret = el_wset(el, op, va_arg(ap, el_rfunc_t));
                el->el_flags |= NARROW_READ;
                break;


そもそも el_set(3) があるのに el_wset(3) とか必要ねーだろ説。
それにdo we needとか疑問形にせんでも、EL_WGETCFN を追加して
ワイド文字版の el_rfunc_t を別定義するが普通だと思います、まぁもう手遅れですが。

めんどくさくなったのでもうバイナリ互換OKならなんでもいいや。

しかしそもそも現在 EL_GETCFN のデフォルト値である EL_BUILTIN_GETCFN(=read_char)
を置き換えられちゃうと、マルチバイト→ワイド文字の変換をやっとるのはここなので
el_set(EL_GETCFN) されると el_wgetc(3) でまともにMB_CUR_MAX > 1な文字が扱えなくなりますな。
そこは 理解していただいてるようでなにより。


[ホームへ] [ページトップへ]