Skip site navigation (1)Skip section navigation (2)
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>