Commit MetaInfo

Revision2acc7d144226efeee88236470a0a04815f41e085 (tree)
Time2018-01-24 02:46:58
AuthorSHIRAKATA Kentaro <argrath@ub32...>
CommiterSHIRAKATA Kentaro

Log Message

fix #37913

Change Summary

Incremental Difference

--- a/ChangeLog.j
+++ b/ChangeLog.j
@@ -3,6 +3,7 @@
33 * 内部コードと表示コードが違う時の問題を修正:
44 * -uオプションで日本語を使うと文字化けする (#37911)
55 * -sオプションで日本語を使うと文字化けする (#37912)
6+ * 日本語入力が正しく動作しない (#37913)
67
78 Fri Feb 17 2017 Kentaro Shirakata <argrath@ub32.org>
89
--- a/include/extern.h
+++ b/include/extern.h
@@ -2794,6 +2794,7 @@ E void FDECL(jputchar,(int));
27942794 E void FDECL(jputs,(const char *));
27952795 E int FDECL(is_kanji2, (const char *,int));
27962796 E int FDECL(is_kanji1, (const char *,int));
2797+E int FDECL(offset_in_kanji, (const unsigned char *, int));
27972798 E int FDECL(isspace_8, (int));
27982799 E void FDECL(split_japanese, (char *,char *,char *,int));
27992800 E void FDECL(jrndm_replace, (char *));
--- a/japanese/jlib.c
+++ b/japanese/jlib.c
@@ -532,6 +532,54 @@ is_kanji1(s, pos)
532532 }
533533
534534 /*
535+ * 漢字の先頭位置まで何バイト戻る必要があるかを計算する
536+ */
537+int
538+offset_in_kanji(s, pos)
539+ const unsigned char *s;
540+ int pos;
541+{
542+ static int mask[7] = {
543+ 0,
544+ 0xc0,
545+ 0xe0,
546+ 0xf0,
547+ 0xf8,
548+ 0xfc,
549+ 0xfe,
550+ };
551+ if (output_kcode == UTF8) {
552+ int c = 1;
553+ int i;
554+
555+ /* 先頭なら常に0 */
556+ if (pos == 0) {
557+ return 0;
558+ }
559+
560+ pos--;
561+ /* 直前の文字はASCII */
562+ if ((s[pos] & 0x80) == 0x00) {
563+ return 0;
564+ }
565+
566+ for (i = pos; i >= 0; i--) {
567+ if ((s[i] & 0xc0) == 0xc0)
568+ break;
569+ c++;
570+ }
571+
572+ if (s[i] < mask[c]) {
573+ return 0;
574+ } else {
575+ return c;
576+ }
577+ } else {
578+ return is_kanji2(s, pos);
579+ }
580+}
581+
582+/*
535583 ** 8ビットスルーなisspace()
536584 */
537585 int
--- a/win/tty/getline.c
+++ b/win/tty/getline.c
@@ -156,8 +156,15 @@ getlin_hook_proc hook;
156156 } else
157157 tty_nhbell();
158158 #if 1 /*JP*/
159- if(is_kanji2(tmp, bufp-tmp))
160- goto moreback;
159+ {
160+ int n;
161+ n = offset_in_kanji(tmp, bufp - tmp);
162+ if (n > 0) {
163+ /* 後で1バイト引かれるのでその分はここでは引かない */
164+ bufp = bufp - (n - 1);
165+ goto moreback;
166+ }
167+ }
161168 #endif
162169 #if defined(apollo)
163170 } else if (c == '\n' || c == '\r') {
@@ -231,8 +238,7 @@ getlin_hook_proc hook;
231238 ttyDisplay->inread--;
232239 clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */
233240 #if 1 /*JP*/
234-/* Strcpy(bfp, str2ic(tmp)); JPTB not need for no convert? */
235- Strcpy(bfp, tmp);
241+ Strcpy(bfp, str2ic(tmp));
236242 #endif
237243 }
238244
Show on old repository browser