Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Nov 2018 17:42:39 +0900
From:      Kouichi Hirabayashi <kh@mogami.com>
To:        freebsd-users-jp@freebsd.org
Subject:   [FreeBSD-users-jp 96346] Re:  =?iso-2022-jp?b?RnJlZUJTRC0xMS4yIBskQiROGyhCIGphX0pQLmV1Y0pQ?= =?iso-2022-jp?b?IBskQjRENi0bKEI=?=
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>

next in thread | previous in thread | raw e-mail | index | archive | help
> NetBSD $B$N$h$&$K!"(Bsh $B$N%3%^%s%I%i%$%sJT=85!G=$r%G%U%)%k%H$G(B off
> $B$K$9$k$@$1$G$b$$$$$+$J$H;W$$$^$9!#(B

$B$3$l$,:GA1$G$O$J$$$+$H;W$$$^$9!#(B

> $BJ?NS$5$s$N(B /bin/sh $B$N(B parser.h $B$,LdBj$@$H$$$&OC$OA4$/L54X78$K(B
> $B;W$$$^$9$7(B

$B$3$l$O!"(BNO_HISTORY $B$K$h$k2sHrK!$r8+$F$o$+$j$^$7$?!#85$N(B libedit
$B$h$j@h$K(B sh $B$N%3!<%I$rD>$=$&$H$9$k$H!"(Bparser.h $B$N(B CTLESC $B$J$I$G(B
$BLdBj$,5/$-$k$N$G$9$,!"@h$K(B libedit $B$rD>$7$F$_$k$H!"(Bsh $B$O85$N$^$^(B
$B$G:Q$`$h$&$G$9!#(B

$BNc$($P!"(B/usr/src/lib/libedit $B$r2<5-$N$h$&$K=q$-49$($F!"(BEUC-JP
$B$N(B 2 $B%P%$%HJ8;z$rO"B3$7$FFI$_!"J8;zI}$N7W;;$r@5$7$$CM$K$9$l$P!"(B
/lib/libedit.so.7 $B$rCV$-49$($k$@$1$G2sHr$G$-$k$h$&$G$9!#(B

--- 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 (;;) {
--

$BJ?NS(B $B9@0l(B



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20181107174239.55278a66865a3b406a5ea219>