Date: Wed, 7 Nov 2018 23:17:48 +0900 From: =?utf-8?B?5YaF6JekIOelkOS4gOmDjg==?= <naito.yuichiro@gmail.com> To: Kouichi Hirabayashi <kh@mogami.com> Cc: freebsd-users-jp@freebsd.org Subject: [FreeBSD-users-jp 96347] Re: =?utf-8?b?RnJlZUJTRC0xMS4yIOOBriBqYV9KUC5ldWNKUCDnkrDlooM=?= Message-ID: <038F6229-6740-48FF-B347-5BF095189C94@gmail.com> In-Reply-To: <20181107174239.55278a66865a3b406a5ea219@mogami.com> References: <20181014194410.b466d0bbf0e976ffbcab2969@mogami.com> <20181024115101.f6049ef61a82a1fdbab1a404@mogami.com> <201811061314.wA6DErDn002299@conssluserg-02.nifty.com> <45FE3A88-FE74-4F73-800B-598A18AE5E6D@gmail.com> <20181107174239.55278a66865a3b406a5ea219@mogami.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
内藤です。
> 2018/11/07 17:42、Kouichi Hirabayashi <kh@mogami.com>のメール:
>
> 例えば、/usr/src/lib/libedit を下記のように書き換えて、EUC-JP
> の 2 バイト文字を連続して読み、文字幅の計算を正しい値にすれば、
> /lib/libedit.so.7 を置き換えるだけで回避できるようです。
なるほど、 ct_enc_width() を直してあげれば良かったんですね。
それならば、添付の libedit.patch で eucJP はいけるようになるはずです。
マルチバイトの処理は wctomb(3) と mbrtowc(3) が locale を見て処理してくれますから、
そちらに任せる方が簡単です。
CHARSET_IS_UTF8 フラグの影響範囲をもう少し良く見る必要がありますので、
UTF-8 の場合は /bin/sh 起動時に locale が設定されている必要がありますけれども、
とりあえず eucJP の場合を試してもらえますでしょうか?
--
内藤 祐一郎
naito.yuichiro@gmail.com
[-- Attachment #2 --]
Index: lib/libedit/chartype.c
===================================================================
--- lib/libedit/chartype.c (revision 340214)
+++ lib/libedit/chartype.c (working copy)
@@ -182,17 +182,11 @@
protected size_t
ct_enc_width(Char c)
{
- /* UTF-8 encoding specific values */
- if (c < 0x80)
- return 1;
- else if (c < 0x0800)
- return 2;
- else if (c < 0x10000)
- return 3;
- else if (c < 0x110000)
- return 4;
- else
- return 0; /* not a valid codepoint */
+ char buf[MB_LEN_MAX];
+ int size;
+ if ((size = wctomb(buf, c)) < 0)
+ return 0;
+ return size;
}
protected ssize_t
Index: lib/libedit/read.c
===================================================================
--- lib/libedit/read.c (revision 340214)
+++ lib/libedit/read.c (working copy)
@@ -363,17 +363,6 @@
goto again;
}
case (size_t)-2:
- /*
- * We don't support other multibyte charsets.
- * The second condition shouldn't happen
- * and is here merely for additional safety.
- */
- if ((el->el_flags & CHARSET_IS_UTF8) == 0 ||
- cbp >= MB_LEN_MAX) {
- errno = EILSEQ;
- *cp = L'\0';
- return -1;
- }
/* Incomplete sequence, read another byte. */
goto again;
default:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?038F6229-6740-48FF-B347-5BF095189C94>
