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>