2010/03/07(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な文字が扱えなくなりますな。
そこは
理解していただいてるようでなにより。