JNetHackのソースをいじくったものを置いておくための場所
Révision | 2acc7d144226efeee88236470a0a04815f41e085 (tree) |
---|---|
l'heure | 2018-01-24 02:46:58 |
Auteur | SHIRAKATA Kentaro <argrath@ub32...> |
Commiter | SHIRAKATA Kentaro |
fix #37913
@@ -3,6 +3,7 @@ | ||
3 | 3 | * 内部コードと表示コードが違う時の問題を修正: |
4 | 4 | * -uオプションで日本語を使うと文字化けする (#37911) |
5 | 5 | * -sオプションで日本語を使うと文字化けする (#37912) |
6 | + * 日本語入力が正しく動作しない (#37913) | |
6 | 7 | |
7 | 8 | Fri Feb 17 2017 Kentaro Shirakata <argrath@ub32.org> |
8 | 9 |
@@ -2794,6 +2794,7 @@ E void FDECL(jputchar,(int)); | ||
2794 | 2794 | E void FDECL(jputs,(const char *)); |
2795 | 2795 | E int FDECL(is_kanji2, (const char *,int)); |
2796 | 2796 | E int FDECL(is_kanji1, (const char *,int)); |
2797 | +E int FDECL(offset_in_kanji, (const unsigned char *, int)); | |
2797 | 2798 | E int FDECL(isspace_8, (int)); |
2798 | 2799 | E void FDECL(split_japanese, (char *,char *,char *,int)); |
2799 | 2800 | E void FDECL(jrndm_replace, (char *)); |
@@ -532,6 +532,54 @@ is_kanji1(s, pos) | ||
532 | 532 | } |
533 | 533 | |
534 | 534 | /* |
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 | +/* | |
535 | 583 | ** 8ビットスルーなisspace() |
536 | 584 | */ |
537 | 585 | int |
@@ -156,8 +156,15 @@ getlin_hook_proc hook; | ||
156 | 156 | } else |
157 | 157 | tty_nhbell(); |
158 | 158 | #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 | + } | |
161 | 168 | #endif |
162 | 169 | #if defined(apollo) |
163 | 170 | } else if (c == '\n' || c == '\r') { |
@@ -231,8 +238,7 @@ getlin_hook_proc hook; | ||
231 | 238 | ttyDisplay->inread--; |
232 | 239 | clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */ |
233 | 240 | #if 1 /*JP*/ |
234 | -/* Strcpy(bfp, str2ic(tmp)); JPTB not need for no convert? */ | |
235 | - Strcpy(bfp, tmp); | |
241 | + Strcpy(bfp, str2ic(tmp)); | |
236 | 242 | #endif |
237 | 243 | } |
238 | 244 |