From owner-freebsd-users-jp@freebsd.org Wed Nov 7 08:42:50 2018 Return-Path: Delivered-To: freebsd-users-jp@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 51CBC111053F for ; Wed, 7 Nov 2018 08:42:50 +0000 (UTC) (envelope-from kh@mogami.com) Received: from mail.mogami.com (mail.mogami.com [122.103.163.237]) by mx1.freebsd.org (Postfix) with ESMTP id AF724882CD for ; Wed, 7 Nov 2018 08:42:48 +0000 (UTC) (envelope-from kh@mogami.com) Received: from ana (ana [192.168.2.130]) by mail.mogami.com (Postfix) with SMTP id 7136C18CC3A for ; Wed, 7 Nov 2018 17:42:39 +0900 (JST) Date: Wed, 7 Nov 2018 17:42:39 +0900 From: Kouichi Hirabayashi To: freebsd-users-jp@freebsd.org Message-Id: <20181107174239.55278a66865a3b406a5ea219@mogami.com> In-Reply-To: <45FE3A88-FE74-4F73-800B-598A18AE5E6D@gmail.com> References: <20181014194410.b466d0bbf0e976ffbcab2969@mogami.com> <20181024115101.f6049ef61a82a1fdbab1a404@mogami.com> <201811061314.wA6DErDn002299@conssluserg-02.nifty.com> <45FE3A88-FE74-4F73-800B-598A18AE5E6D@gmail.com> Organization: MIT Inc. X-Mailer: Sylpheed 3.3.0 (GTK+ 2.24.17; i386-portbld-freebsd8.4) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: AF724882CD X-Spamd-Result: default: False [4.23 / 200.00]; ARC_NA(0.00)[]; FROM_HAS_DN(0.00)[]; MV_CASE(0.50)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; PREVIOUSLY_DELIVERED(0.00)[freebsd-users-jp@freebsd.org]; TO_DN_NONE(0.00)[]; AUTH_NA(1.00)[]; RCPT_COUNT_ONE(0.00)[1]; HAS_ORG_HEADER(0.00)[]; NEURAL_SPAM_MEDIUM(0.96)[0.959,0]; DMARC_NA(0.00)[mogami.com]; NEURAL_SPAM_SHORT(0.84)[0.837,0]; MX_GOOD(-0.01)[ana.mogami.com]; NEURAL_SPAM_LONG(0.95)[0.954,0]; R_SPF_NA(0.00)[]; RCVD_NO_TLS_LAST(0.10)[]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; IP_SCORE(-0.01)[country: JP(-0.03)]; ASN(0.00)[asn:2519, ipnet:122.103.0.0/16, country:JP]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_COUNT_TWO(0.00)[2] X-Rspamd-Server: mx1.freebsd.org Subject: [FreeBSD-users-jp 96346] Re: =?iso-2022-jp?b?RnJlZUJTRC0xMS4yIBskQiROGyhCIGphX0pQLmV1Y0pQ?= =?iso-2022-jp?b?IBskQjRENi0bKEI=?= X-BeenThere: freebsd-users-jp@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion relevant to FreeBSD communities in Japan List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Nov 2018 08:42:50 -0000 > NetBSD のように、sh のコマンドライン編集機能をデフォルトで off > にするだけでもいいかなと思います。 これが最善ではないかと思います。 > 平林さんの /bin/sh の parser.h が問題だという話は全く無関係に > 思いますし これは、NO_HISTORY による回避法を見てわかりました。元の libedit より先に sh のコードを直そうとすると、parser.h の CTLESC などで 問題が起きるのですが、先に libedit を直してみると、sh は元のまま で済むようです。 例えば、/usr/src/lib/libedit を下記のように書き換えて、EUC-JP の 2 バイト文字を連続して読み、文字幅の計算を正しい値にすれば、 /lib/libedit.so.7 を置き換えるだけで回避できるようです。 --- chartype.c.orig 2018-06-22 08:02:22.000000000 +0900 +++ chartype.c 2018-11-07 10:51:04.903723000 +0900 @@ -45,6 +45,8 @@ #define CT_BUFSIZ ((size_t)1024) #ifdef WIDECHAR +int ct_flags; // copy of el_flags + protected int ct_conv_cbuff_resize(ct_buffer_t *conv, size_t csize) { @@ -182,6 +184,13 @@ protected size_t ct_enc_width(Char c) { + if (ct_flags & CHARSET_IS_eucJ) { // EUC-JP + if (c < 0x100) + return 1; + else if (c < 0x10000) + return 2; + } + else if (ct_flags & CHARSET_IS_UTF8) { // UTF-8 /* UTF-8 encoding specific values */ if (c < 0x80) return 1; @@ -191,8 +200,10 @@ return 3; else if (c < 0x110000) return 4; - else - return 0; /* not a valid codepoint */ + } + else if (c < 0x100) + return 1; + return 0; /* not a valid codepoint */ } protected ssize_t --- el.c.orig 2018-06-22 08:02:22.000000000 +0900 +++ el.c 2018-11-07 10:51:04.911493000 +0900 @@ -74,6 +74,7 @@ el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, int fdin, int fdout, int fderr) { + extern int ct_flags; // chartype.c EditLine *el = el_malloc(sizeof(*el)); if (el == NULL) @@ -102,6 +103,9 @@ if (setlocale(LC_CTYPE, NULL) != NULL){ if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) el->el_flags |= CHARSET_IS_UTF8; + else if (strcmp(nl_langinfo(CODESET), "eucJP") == 0) + el->el_flags |= CHARSET_IS_eucJ; + ct_flags = el->el_flags; } if (terminal_init(el) == -1) { --- el.h.orig 2018-06-22 08:02:22.000000000 +0900 +++ el.h 2018-11-07 10:51:04.916863000 +0900 @@ -57,6 +57,7 @@ #define EDIT_DISABLED 0x04 #define UNBUFFERED 0x08 #define CHARSET_IS_UTF8 0x10 +#define CHARSET_IS_eucJ 0x20 #define NARROW_HISTORY 0x40 typedef unsigned char el_action_t; /* Index to command array */ --- read.c.orig 2018-06-22 08:02:22.000000000 +0900 +++ read.c 2018-11-07 10:51:04.926098000 +0900 @@ -343,6 +343,40 @@ *cp = L'\0'; return 0; } + if (el->el_flags & CHARSET_IS_eucJ) { + static int eucst = 0; + int c = cbuf[cbp] & 0xff; + + ++cbp; + if (eucst == 0) { // first byte + if (c & 0x80) { // KANJI, KANA + if (((c < 0xa1) || (0xf4 < c)) && (c != 0x8e)) + --cbp; // non JIS code + else + eucst = 1; + goto again; + } + else // ASCII + ct_mbrtowc(cp, cbuf, cbp); + } + else { // second byte + eucst = 0; + if (!(c & 0x80)) { // ASCII + // ignore first byte + cbuf[cbp - 2] = cbuf[cbp - 1]; + --cbp; + ct_mbrtowc(cp, cbuf, cbp); + } + else if ((c < 0xa1) || (0xfe < c)) { + // ignore non JIS code + cbp = 0; + goto again; + } + else // KANJI second byte + ct_mbrtowc(cp, cbuf, cbp); + } + return 1; + } for (;;) { -- 平林 浩一