1 /*
2 * $Id: uif.c,v 1.9 2003/05/11 18:27:42 hiroo Exp $
3 */
4
5 /*
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
7 * This file is part of FreeWnn.
8 *
9 * Copyright Kyoto University Research Institute for Mathematical Sciences
10 * 1987, 1988, 1989, 1990, 1991, 1992
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
13 * Copyright FreeWnn Project 1999, 2000, 2002
14 *
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp>
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 */
31
32 /*
33 ���Υե�����ϡ�ɸ��桼���������ե������δؿ���������ޤ���
34 buffer_in���Ѥ��Ƥ���Τǡ�����������⻲�Ȥ��Ʋ�������
35 ���줾��δؿ���ư��ϡ�key_bind.c����Ǥɤ��˥Х���ɤ���Ƥ��뤫
36 �ߤ���ˤ�ꡢʬ����Ȼפ��ޤ���
37 �⡼�ɤ�¸�ߤ��ޤ�(henkan_mode)�������ޤ����Ѥ��ʤ��褦��̳��Ƥ��ޤ���
38 */
39 #ifdef HAVE_CONFIG_H
40 # include <config.h>
41 #endif
42
43 #include <stdio.h>
44 #if STDC_HEADERS
45 # include <stdlib.h>
46 # include <string.h>
47 #else
48 # if HAVE_MALLOC_H
49 # include <malloc.h>
50 # endif
51 # if HAVE_STRINGS_H
52 # include <strings.h>
53 # endif
54 #endif /* STDC_HEADERS */
55 #include <sys/types.h>
56 #if HAVE_UNISTD_H
57 # include <unistd.h>
58 #endif
59
60 #include "commonhd.h"
61 #include "wnn_config.h"
62 #include "jllib.h"
63 #include "sdefine.h"
64 #include "sheader.h"
65 #include "wnn_os.h"
66 #include "rk_spclval.h" /* defines of CHMSIG, NISEBP */
67 #include "buffer.h"
68 #include "rk_fundecl.h"
69
70 static int henkan_mode;
71 /* 0: select
72 1: yomi_nyuuryoku
73 2: bunsetu_nobasi
74 3: kara
75 */
76 static int send_ascii_char_quote = 0;
77
78
79 int
redraw_nisemono_c()80 redraw_nisemono_c ()
81 {
82 redraw_nisemono ();
83 if (c_b->maxlen == 0)
84 {
85 change_to_empty_mode ();
86 }
87 return (0);
88 }
89
90 /** ɸ�।���ե������Υȥå״ؿ��Ǥ���
91 ���δؿ��ϡ�mojiretsu������Ѵ���̤�����ơ�ʸ�����Ĺ�����֤��ޤ���
92 */
93 int
kk()94 kk ()
95 {
96 static struct buf c_b1;
97 int len;
98
99 initialize_vars ();
100 if (bun_data_)
101 jl_kill (bun_data_, 0, -1);
102 c_b = &c_b1;
103 c_b->buffer = input_buffer;
104 c_b->buf_msg = "";
105 c_b->start_col = 0;
106 c_b->t_c_p = 0;
107 c_b->t_b_st = 0;
108 c_b->t_b_end = 0;
109 c_b->maxlen = 0;
110 c_b->buflen = maxchg;
111 c_b->redraw_fun = redraw_nisemono_c;
112 c_b->t_m_start = 0;
113 set_screen_vars_default ();
114 change_to_empty_mode ();
115 init_screen ();
116 if (henkan_off_flag)
117 {
118 henkan_off ();
119 }
120 /* end of addition */
121 buffer_in ();
122 if (print_out_func)
123 {
124 len = (*print_out_func) (return_buf, c_b->buffer, c_b->maxlen);
125 }
126 else
127 {
128 Strncpy (return_buf, c_b->buffer, c_b->maxlen);
129 len = c_b->maxlen;
130 }
131 wnn_delete_w_ss2 (return_buf, len);
132 return (len);
133 }
134
135 /** ��������δؿ��ϡ� c_b->key_in_fun, c_b->ctrl_code_fun ��
136 �⡼�ɤ˱��������ꤹ���ΤǤ�������λ����ϡ����β��Υ⡼���ѹ��δؿ�����
137 �ߤƲ�������
138 */
139
140 int
return_it(c)141 return_it (c)
142 int c;
143 {
144 c_b->maxlen = 1;
145 c_b->buffer[0] = c;
146 return (1);
147 }
148
149 int
return_it_if_ascii(c,nisemono)150 return_it_if_ascii (c, nisemono)
151 int c;
152 int nisemono; /* it means that what romkan returned is a nisemono character. */
153 {
154 if ((NORMAL_CHAR (c) || c == 0x09) && is_HON (nisemono))
155 { /* TAB is not ESCAPE char */
156 c_b->maxlen = 1;
157 c_b->buffer[0] = c;
158 return (1);
159 }
160 else
161 {
162 insert_char_and_change_to_insert_mode (c);
163 return (0);
164 }
165 }
166
167 int
push_char_return(c,romkan)168 push_char_return (c, romkan)
169 int c, romkan;
170 {
171 push_unget_buf (romkan);
172 kakutei (c);
173 return (1);
174 }
175
176 int
ignore_it_and_clear_romkan()177 ignore_it_and_clear_romkan ()
178 {
179 romkan_clear ();
180 return (0);
181 }
182
183
184 int
insert_char_and_change_to_insert_mode(c)185 insert_char_and_change_to_insert_mode (c)
186 int c;
187 {
188 if (c != -1)
189 {
190 insert_char (c);
191 t_redraw_move (c_b->t_c_p + 1, c_b->t_c_p, c_b->maxlen, 0);
192 }
193 change_to_insert_mode ();
194 if (send_ascii_char_quote == 1 && send_ascii_char == 0)
195 {
196 send_ascii_char = 1;
197 send_ascii_char_quote = 0;
198 }
199 return (0);
200 }
201
202 /** ��������δؿ��ϡ��⡼���ѹ��λ��˸ƤФ���ΤǤ���
203 ���ꤹ��Τϡ�key_table,key_in_fun,ctrl_code_fun,hanten�Ǥ���
204 */
205
206 void
change_to_insert_mode()207 change_to_insert_mode ()
208 {
209 c_b->key_table = main_table[1];
210 c_b->rk_clear_tbl = romkan_clear_tbl[1];
211 c_b->key_in_fun = 0;
212 c_b->ctrl_code_fun = (int (*)()) 0;
213 c_b->hanten = 0x08 | 0x20;
214 henkan_mode = 1;
215 kk_cursor_normal ();
216 }
217
218 void
change_to_nobasi_tijimi_mode()219 change_to_nobasi_tijimi_mode ()
220 {
221 c_b->key_table = main_table[2];
222 c_b->rk_clear_tbl = romkan_clear_tbl[2];
223 c_b->key_in_fun = ignore_it_and_clear_romkan;
224 c_b->ctrl_code_fun = (int (*)()) 0;
225 c_b->hanten = 0x04;
226 henkan_mode = 2;
227 kk_cursor_invisible ();
228 }
229
230
231 void
change_to_empty_mode()232 change_to_empty_mode ()
233 {
234 c_b->key_table = main_table[3];
235 c_b->rk_clear_tbl = romkan_clear_tbl[3];
236 if (send_ascii_char)
237 {
238 c_b->key_in_fun = return_it_if_ascii;
239 }
240 else
241 {
242 c_b->key_in_fun = insert_char_and_change_to_insert_mode;
243 }
244 c_b->ctrl_code_fun = return_it;
245 c_b->hanten = 0x08 | 0x20;
246 henkan_mode = 3;
247 kk_restore_cursor ();
248 kk_cursor_normal ();
249 flush ();
250 }
251
252 void
change_to_henkango_mode()253 change_to_henkango_mode ()
254 {
255 c_b->key_table = main_table[0];
256 c_b->rk_clear_tbl = romkan_clear_tbl[0];
257 c_b->key_in_fun = push_char_return;
258 c_b->ctrl_code_fun = (int (*)()) 0;
259 c_b->hanten = 0x04 | 0x40;
260 henkan_mode = 0;
261 kk_cursor_invisible ();
262 }
263
264
265 /** �Ѵ����ʸ�����bnst���ܤ�ʸ�ᤫ�����c_b->buffer������ޤ���
266 Ʊ���ˡ�bunsetsu�����ꤷ�ޤ���
267 */
268 void
make_kanji_buffer(bnst)269 make_kanji_buffer (bnst)
270 int bnst;
271 {
272 int k, l;
273 w_char *bp;
274 w_char *buffer_end; /** ��̾�����ѤΥХåե����κǸ� */
275
276 buffer_end = c_b->buffer + c_b->buflen - 1;
277 if (bnst)
278 bp = c_b->buffer + bunsetsuend[bnst - 1];
279 else
280 bp = c_b->buffer;
281 for (k = bnst; k < jl_bun_suu (bun_data_); k++)
282 {
283 if (k < maxbunsetsu)
284 bunsetsu[k] = bp - c_b->buffer;
285 l = jl_get_kanji (bun_data_, k, k + 1, bp);
286 bp += l;
287 if (k < maxbunsetsu)
288 bunsetsuend[k] = bp - c_b->buffer;
289 if (bp > buffer_end)
290 {
291 c_b->maxlen = bp - c_b->buffer;
292 }
293 }
294 if (k < maxbunsetsu)
295 {
296 bunsetsu[k++] = bp - c_b->buffer;
297 bunsetsuend[k++] = bp - c_b->buffer;
298 }
299 else
300 {
301 bunsetsu[maxbunsetsu - 1] = bp - c_b->buffer;
302 bunsetsuend[maxbunsetsu - 1] = bp - c_b->buffer;
303 }
304 c_b->maxlen = bp - c_b->buffer;
305 }
306
307 /** Ϣʸ���Ѵ� */
308 int
ren_henkan()309 ren_henkan ()
310 {
311 int ret;
312
313 jl_env_set (bun_data_, env_normal);
314 ret = ren_henkan0 ();
315 return (ret);
316 }
317
318 /** Ϣʸ����������Ѵ� */
319 int
kankana_ren_henkan()320 kankana_ren_henkan ()
321 {
322 int ret;
323
324 if (*reverse_envrcname != '\0')
325 {
326 jl_env_set (bun_data_, env_reverse);
327 ret = ren_henkan0 ();
328 return (ret);
329 }
330 else
331 {
332 ring_bell ();
333 return (0);
334 }
335 }
336
337
338 int
isconect_jserver()339 isconect_jserver ()
340 {
341 if (!jl_isconnect (bun_data_))
342 {
343 connect_jserver (1);
344 }
345 if (!jl_isconnect (bun_data_))
346 {
347 push_cursor ();
348 print_msg_getc (MSG_GET (9));
349 /*
350 print_msg_getc(" jserver�Ȥ���³���ڤ�Ƥ��ޤ���(ǡ��?)");
351 */
352 pop_cursor ();
353 t_print_l ();
354 return (0);
355 }
356 return (1);
357 }
358
359
360 int
ren_henkan0()361 ren_henkan0 ()
362 {
363 w_char yomi[512];
364 int moji_suu;
365 register int i;
366
367 if (!isconect_jserver ())
368 {
369 return (0);
370 }
371
372 c_b->buflen = maxchg;
373 moji_suu = c_b->maxlen - c_b->t_m_start;
374 if (moji_suu > 0)
375 {
376 int ret;
377 Strncpy (yomi, c_b->buffer + c_b->t_m_start, moji_suu);
378 yomi[moji_suu] = 0;
379 ret = jl_ren_conv (bun_data_, yomi, cur_bnst_, -1, WNN_USE_MAE);
380 if (ret == -1)
381 {
382 errorkeyin ();
383 t_print_l ();
384 return (0);
385 }
386 for (i = cur_bnst_; i < jl_bun_suu (bun_data_); i++)
387 bunsetsu_env[i] = jl_env_get (bun_data_);
388 make_kanji_buffer (0);
389 change_to_henkango_mode ();
390 c_b->t_m_start = bunsetsuend[cur_bnst_];
391 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
392 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
393 t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, cur_bnst_)], c_b->maxlen, 1);
394 }
395 return (0);
396 }
397
398 int
tan_henkan()399 tan_henkan ()
400 {
401 int tmp;
402
403 jl_env_set (bun_data_, env_normal);
404 tmp = tan_conv (WNN_SHO);
405 return (tmp);
406 }
407
408 int
tan_henkan_dai()409 tan_henkan_dai ()
410 {
411 int tmp;
412
413 jl_env_set (bun_data_, env_normal);
414 tmp = tan_conv (WNN_DAI);
415 return (tmp);
416 }
417
418 int
tan_conv(daip)419 tan_conv (daip)
420 int daip;
421 {
422 w_char yomi[512];
423 int moji_suu;
424 register int i;
425
426 if (!isconect_jserver ())
427 {
428 return (0);
429 }
430
431 c_b->buflen = maxchg;
432 moji_suu = c_b->maxlen - c_b->t_m_start;
433 if (moji_suu > 0)
434 {
435 int ret;
436 Strncpy (yomi, c_b->buffer + c_b->t_m_start, moji_suu);
437 yomi[moji_suu] = 0;
438 ret = jl_tan_conv (bun_data_, yomi, cur_bnst_, -1, WNN_USE_MAE, daip);
439 if (ret == -1)
440 {
441 (*errorkeyin_func) ();
442 t_print_l ();
443 romkan_clear ();
444 return (0);
445 }
446 for (i = cur_bnst_; i < dai_end (bun_data_, cur_bnst_); i++)
447 bunsetsu_env[i] = jl_env_get (bun_data_);
448 make_kanji_buffer (0);
449 change_to_henkango_mode ();
450 c_b->t_m_start = bunsetsuend[cur_bnst_];
451 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
452 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
453 t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, cur_bnst_)], c_b->maxlen, 1);
454 }
455 return (0);
456 }
457
458
459 /** ñʸ���Ѵ�*/
460 int
nobi_henkan()461 nobi_henkan ()
462 {
463 int tmp;
464
465 tmp = nobi_conv (WNN_SHO, NULL);
466 return (tmp);
467 }
468
469 int
nobi_henkan_dai()470 nobi_henkan_dai ()
471 {
472 int tmp;
473
474 tmp = nobi_conv (WNN_DAI, NULL);
475 return (tmp);
476 }
477
478
479 int
nobi_conv(daip,env)480 nobi_conv (daip, env)
481 struct wnn_env *env;
482 int daip;
483 {
484 int tmp;
485 if (!isconect_jserver ())
486 {
487 return (0);
488 }
489 tmp = c_b->t_b_st;
490 if (tan_henkan1 (daip, env) == 0)
491 {
492 c_b->t_m_start = bunsetsuend[cur_bnst_];
493 t_redraw_move (bunsetsu[cur_bnst_], min (tmp, c_b->t_b_st), c_b->maxlen, 1);
494 }
495 return (0);
496 }
497
498 /*ñʸ���Ѵ����뤬�����̤�ɽ�����ʤ�*/
499 int
tan_henkan1(daip,env)500 tan_henkan1 (daip, env)
501 struct wnn_env *env;
502 int daip;
503 {
504 int ret;
505 register int i;
506 int moji_suu = c_b->t_c_p - c_b->t_m_start;
507
508 if (!isconect_jserver ())
509 {
510 return (-1);
511 }
512
513 if (moji_suu == 0)
514 {
515 return (-1);
516 }
517 bunsetsu_env[cur_bnst_] = jl_env_get (bun_data_);
518 if (env == NULL)
519 {
520 ret = jl_nobi_conv (bun_data_, cur_bnst_, moji_suu, -1, WNN_USE_MAE, daip);
521 }
522 else
523 {
524 ret = jl_nobi_conv_e2 (bun_data_, env, cur_bnst_, moji_suu, -1, WNN_USE_MAE, daip);
525 }
526
527 if (ret == -1)
528 {
529 errorkeyin ();
530 t_print_l ();
531 return (-1);
532 }
533 make_kanji_buffer (0);
534
535 for (i = cur_bnst_ + 1; i < jl_bun_suu (bun_data_); i++)
536 bunsetsu_env[i] = jl_env_get (bun_data_);
537 /**/ change_to_henkango_mode ();
538 c_b->t_c_p = bunsetsu[cur_bnst_];
539 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
540 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
541 return (0);
542 }
543
544
545 /* c_b->buffer�Υޡ����ΰ��֤��顢kana_buf��cur_bnst_�ʹߤ�
546 ʸ����ԡ����� */
547 /* make_yomi() : DELETED */
548
549 /* �������Ϥ��Ѵ����� */
550 void
henkan_if_maru(c)551 henkan_if_maru (c)
552 w_char c;
553 {
554 if (ISKUTENCODE (c) && c_b->key_table == main_table[1])
555 ren_henkan ();
556 }
557
558
559 /* ���� */
560 int
kakutei()561 kakutei ()
562 {
563 int moji_suu = 0;
564 w_char *w = (w_char *) 0;
565 w_char yomi[512];
566 /* conversion nashi de kakutei surubaai wo kouryo seyo. */
567
568 /* ��������ɤߤ�Ф��Ƥ��� remember_me() �Τ��� */
569 remember_buf[0] = 0;
570 if (jl_bun_suu (bun_data_) != 0)
571 {
572 jl_get_yomi (bun_data_, 0, -1, remember_buf);
573 }
574 /* �������ʸ��������гФ��Ƥ��� */
575 if (insert_modep ())
576 {
577 moji_suu = c_b->maxlen - c_b->t_m_start;
578 if (moji_suu > 0)
579 {
580 w = remember_buf + Strlen (remember_buf);
581 Strncat (w, c_b->buffer + c_b->t_m_start, moji_suu);
582 }
583 }
584 else if (nobasi_tijimi_mode ())
585 {
586 /* �ΤФ��������ߥ⡼�ɤ��ä��顢�Ҥ餬�ʤ��᤹����˲������ */
587 /* ��� si te iino ?? */
588 moji_suu = jl_get_yomi (bun_data_, cur_bnst_, -1, yomi);
589 Strcpy (c_b->buffer + c_b->t_c_p, yomi);
590 c_b->maxlen = Strlen (c_b->buffer);
591 jl_kill (bun_data_, cur_bnst_, -1);
592 }
593 c_b->buffer[0] = 0;
594 if (jl_bun_suu (bun_data_) != 0)
595 {
596 jl_get_kanji (bun_data_, 0, -1, c_b->buffer);
597 if (jl_update_hindo (bun_data_, 0, -1) == -1)
598 {
599 errorkeyin ();
600 redraw_line ();
601 }
602 }
603 if (insert_modep () && moji_suu > 0)
604 { /* �������ʸ�������� */
605 Strcat (c_b->buffer, w);
606 }
607 else if (nobasi_tijimi_mode () && moji_suu > 0)
608 { /* �ΤФ��������ߥ⡼�� */
609 Strcat (c_b->buffer, yomi);
610 }
611 c_b->maxlen = Strlen (c_b->buffer);
612
613 throw_c (0);
614 clr_line_all ();
615 flush ();
616 return (1);
617 }
618
619 /*yank*/
620 int
yank_c()621 yank_c ()
622 {
623
624 if (empty_modep ())
625 {
626 change_to_insert_mode ();
627 }
628 t_yank ();
629 return (0);
630 }
631
632 /** �ɤߤκ�����*/
633 int
remember_me()634 remember_me ()
635 {
636 if (jl_bun_suu (bun_data_) == 0)
637 {
638 if (c_b->key_in_fun)
639 {
640 (*c_b->key_in_fun) (-1);
641 c_b->key_in_fun = NULL;
642 }
643 Strcpy (c_b->buffer, remember_buf);
644 c_b->maxlen = Strlen (remember_buf);
645 call_t_redraw_move (0, 0, c_b->maxlen, 1, 1);
646 }
647 return (0);
648 }
649
650
651 void
initialize_vars()652 initialize_vars ()
653 {
654 cur_bnst_ = 0;
655 }
656
657 int
kill_c()658 kill_c ()
659 {
660 t_kill ();
661 if (c_b->maxlen == 0)
662 {
663 change_to_empty_mode ();
664 }
665 return (0);
666 }
667
668
669 int
delete_c(c,romkan)670 delete_c (c, romkan)
671 int c, romkan;
672 {
673 t_delete_char (c, romkan);
674 if ((c_b->maxlen == 0) && is_HON (romkan))
675 {
676 change_to_empty_mode ();
677 }
678 return (0);
679 }
680
681 int
rubout_c(c,romkan)682 rubout_c (c, romkan)
683 w_char c;
684 int romkan;
685 {
686 t_rubout (c, romkan);
687 if ((c_b->maxlen == 0) && is_HON (romkan))
688 {
689 change_to_empty_mode ();
690 }
691 return (0);
692 }
693
694 int
end_bunsetsu()695 end_bunsetsu ()
696 {
697 int tmp = cur_bnst_;
698 cur_bnst_ = jl_bun_suu (bun_data_) - 1;
699 c_b->t_m_start = bunsetsuend[cur_bnst_];
700 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
701 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
702 t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, tmp)], bunsetsuend[cur_bnst_], 0);
703 return (0);
704 }
705
706 int
top_bunsetsu()707 top_bunsetsu ()
708 {
709 int tmp = cur_bnst_;
710 cur_bnst_ = 0;
711 c_b->t_m_start = bunsetsuend[0];
712 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
713 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
714 t_redraw_move (bunsetsu[0], 0, bunsetsuend[dai_end (bun_data_, tmp) - 1], 0);
715 return (0);
716 }
717
718 int
forward_bunsetsu()719 forward_bunsetsu ()
720 {
721 if (cur_bnst_ < jl_bun_suu (bun_data_) - 1)
722 {
723 cur_bnst_ += 1;
724 c_b->t_m_start = bunsetsuend[cur_bnst_];
725 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
726 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
727 t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, cur_bnst_ - 1)], bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1], 0);
728 }
729 return (0);
730 }
731
732 int
backward_bunsetsu()733 backward_bunsetsu ()
734 {
735 if (cur_bnst_ > 0)
736 {
737 cur_bnst_ -= 1;
738 c_b->t_m_start = bunsetsuend[cur_bnst_];
739 c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)];
740 c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1];
741 t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, cur_bnst_)], bunsetsuend[dai_end (bun_data_, cur_bnst_ + 1) - 1], 0);
742 }
743 return (0);
744 }
745
746 int
kaijo()747 kaijo ()
748 {
749 w_char yomi[512];
750
751 c_b->t_b_end = c_b->t_b_st;
752 t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, cur_bnst_)], bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1], 0);
753 change_to_insert_mode ();
754 c_b->t_c_p = bunsetsu[cur_bnst_];
755 c_b->t_m_start = c_b->t_c_p;
756 if (jl_env (bun_data_) == env_normal)
757 jl_get_yomi (bun_data_, cur_bnst_, -1, yomi);
758 else if (jl_env (bun_data_) == env_reverse)
759 jl_get_yomi (bun_data_, cur_bnst_, -1, yomi); /* kankana_ren_henkan() */
760 Strcpy (c_b->buffer + c_b->t_c_p, yomi);
761
762 c_b->buflen = maxchg;
763 c_b->maxlen = Strlen (c_b->buffer);
764 jl_kill (bun_data_, cur_bnst_, -1);
765 call_t_redraw_move (c_b->t_c_p, c_b->t_c_p, c_b->maxlen, 1, 1);
766 return (0);
767 }
768
769 int
jutil_c()770 jutil_c ()
771 {
772
773 if (!isconect_jserver ())
774 {
775 return (0);
776 }
777 push_cursor ();
778 jutil ();
779 pop_cursor ();
780 t_print_l ();
781 if (empty_modep ())
782 {
783 kk_restore_cursor ();
784 }
785 return (0);
786 }
787
788 int
touroku_c()789 touroku_c ()
790 {
791 if (!isconect_jserver ())
792 {
793 return (0);
794 }
795 push_cursor ();
796 touroku ();
797 pop_cursor ();
798 t_print_l ();
799 return (0);
800 }
801
802 int
enlarge_bunsetsu()803 enlarge_bunsetsu ()
804 {
805 w_char yomi[512];
806 int area_len, len1;
807
808 area_len = (*call_jl_yomi_len_func) ();
809 len1 = jl_get_yomi (bun_data_, cur_bnst_, -1, yomi);
810
811 if (area_len < len1)
812 area_len++;
813
814 change_to_nobasi_tijimi_mode ();
815 c_b->t_m_start = c_b->t_c_p;
816 c_b->t_b_end = c_b->t_c_p;
817 Strcpy (c_b->buffer + c_b->t_m_start, yomi);
818 c_b->maxlen = Strlen (c_b->buffer);
819 t_redraw_move (c_b->t_m_start + area_len, c_b->t_m_start, c_b->maxlen, 1);
820 return (0);
821 }
822
823 int
smallen_bunsetsu()824 smallen_bunsetsu ()
825 {
826 w_char yomi[512];
827 int area_len;
828
829 area_len = (*call_jl_yomi_len_func) ();
830 jl_get_yomi (bun_data_, cur_bnst_, -1, yomi);
831
832 if (area_len > 1)
833 area_len--;
834
835 change_to_nobasi_tijimi_mode ();
836 c_b->t_m_start = c_b->t_c_p;
837 c_b->t_b_end = c_b->t_c_p;
838 Strcpy (c_b->buffer + c_b->t_m_start, yomi);
839 c_b->maxlen = Strlen (c_b->buffer);
840 t_redraw_move (c_b->t_m_start + area_len, c_b->t_m_start, c_b->maxlen, 1);
841 return (0);
842 }
843
844
845 int
send_string(c)846 send_string (c)
847 int c;
848 {
849 kakutei ();
850 c_b->buffer[c_b->maxlen] = c;
851 c_b->maxlen += 1;
852 c_b->t_c_p = c_b->maxlen;
853 return (1);
854 }
855
856 int
tijime()857 tijime ()
858 {
859 if (c_b->t_c_p > c_b->t_m_start + 1)
860 {
861 backward ();
862 }
863 return (0);
864 }
865
866 int
jmptijime()867 jmptijime ()
868 {
869 call_t_redraw_move_1 (c_b->t_m_start, c_b->t_m_start, c_b->maxlen, 1, 1, 1, (insert_modep ()? 1 : 0));
870 return (0);
871 }
872
873
874 int
henkan_forward()875 henkan_forward ()
876 {
877 if (!isconect_jserver ())
878 {
879 return (0);
880 }
881
882 if (tan_henkan1 (WNN_DAI, NULL) == -1)
883 {
884 return (0);
885 }
886 zenkouho_dai_c ();
887 forward_bunsetsu ();
888 return (0);
889 }
890
891 int
henkan_backward()892 henkan_backward ()
893 {
894 if (!isconect_jserver ())
895 {
896 return (0);
897 }
898
899 if (cur_bnst_ <= 0)
900 { /* ��ü�ʤ��Ѵ��Τ� */
901 nobi_henkan_dai ();
902 }
903 else
904 {
905 if (tan_henkan1 (WNN_DAI, NULL) == -1)
906 {
907 return (0);
908 }
909 zenkouho_dai_c ();
910 backward_bunsetsu ();
911 }
912 return (0);
913 }
914
915 int
backward_c()916 backward_c ()
917 {
918 if (c_b->t_c_p == c_b->t_m_start)
919 {
920 if (c_b->t_c_p != 0)
921 {
922 if (!isconect_jserver ())
923 {
924 return (0);
925 }
926 ren_henkan0 ();
927 change_to_henkango_mode ();
928 backward_bunsetsu ();
929 }
930 }
931 else
932 {
933 backward_char ();
934 }
935 return (0);
936 }
937
938
939 int
insert_it_as_yomi()940 insert_it_as_yomi ()
941 {
942 kakutei ();
943 change_to_insert_mode ();
944 c_b->t_m_start = 0;
945 cur_bnst_ = 0;
946 call_t_print_l (c_b->t_c_p, 1);
947 if (bun_data_)
948 jl_kill (bun_data_, 0, -1);
949 return (0);
950 }
951
952 /****history *******/
953 int
previous_history()954 previous_history ()
955 {
956 int k;
957 if (jl_bun_suu (bun_data_) == 0)
958 {
959 k = previous_history1 (c_b->buffer);
960 if (k > 0)
961 {
962 change_to_insert_mode ();
963 c_b->vst = 0;
964 c_b->maxlen = k;
965 c_b->t_c_p = 0;
966 call_t_print_l (c_b->t_c_p, 1);
967 }
968 }
969 return (0);
970 }
971
972 int
next_history()973 next_history ()
974 {
975 int k;
976 if (jl_bun_suu (bun_data_) == 0)
977 {
978 k = next_history1 (c_b->buffer);
979 if (k > 0)
980 {
981 change_to_insert_mode ();
982 c_b->vst = 0;
983 c_b->maxlen = k;
984 c_b->t_c_p = 0;
985 call_t_print_l (c_b->t_c_p, 1);
986 }
987 }
988 return (0);
989 }
990
991 int
empty_modep()992 empty_modep ()
993 {
994 return (henkan_mode == 3);
995 }
996
997 int
nobasi_tijimi_mode()998 nobasi_tijimi_mode ()
999 {
1000 return (henkan_mode == 2);
1001 }
1002
1003 int
insert_modep()1004 insert_modep ()
1005 {
1006 return (henkan_mode == 1);
1007 }
1008
1009 int
henkan_gop()1010 henkan_gop ()
1011 {
1012 return (henkan_mode == 0);
1013 }
1014
1015
1016 static int send_ascii_stack = 0;
1017
1018 int
send_ascii()1019 send_ascii ()
1020 {
1021 send_ascii_stack = send_ascii_char;
1022 send_ascii_char = 1;
1023 return (0);
1024 }
1025
1026 int
not_send_ascii()1027 not_send_ascii ()
1028 {
1029 send_ascii_stack = send_ascii_char;
1030 send_ascii_char = 0;
1031 return (0);
1032 }
1033
1034 int
toggle_send_ascii()1035 toggle_send_ascii ()
1036 {
1037 send_ascii_stack = send_ascii_char;
1038 if (send_ascii_char == 0)
1039 {
1040 send_ascii_char = 1;
1041 }
1042 else
1043 {
1044 send_ascii_char = 0;
1045 }
1046 return (0);
1047 }
1048
1049 int
pop_send_ascii()1050 pop_send_ascii ()
1051 {
1052 send_ascii_char = send_ascii_stack;
1053 return (0);
1054 }
1055
1056 static void
quote_send_ascii()1057 quote_send_ascii ()
1058 {
1059 if (send_ascii_char == 1)
1060 {
1061 send_ascii_char = 0;
1062 send_ascii_char_quote = 1;
1063 }
1064 }
1065
1066 static void
check_empty_mode_keyin_fun()1067 check_empty_mode_keyin_fun ()
1068 {
1069 if (send_ascii_char)
1070 {
1071 c_b->key_in_fun = return_it_if_ascii;
1072 }
1073 else
1074 {
1075 c_b->key_in_fun = insert_char_and_change_to_insert_mode;
1076 }
1077 }
1078
1079 int
send_ascii_e()1080 send_ascii_e ()
1081 {
1082 send_ascii ();
1083 check_empty_mode_keyin_fun ();
1084 return (0);
1085 }
1086
1087 int
not_send_ascii_e()1088 not_send_ascii_e ()
1089 {
1090 not_send_ascii ();
1091 check_empty_mode_keyin_fun ();
1092 return (0);
1093 }
1094
1095 int
toggle_send_ascii_e()1096 toggle_send_ascii_e ()
1097 {
1098 toggle_send_ascii ();
1099 check_empty_mode_keyin_fun ();
1100 return (0);
1101 }
1102
1103 int
pop_send_ascii_e()1104 pop_send_ascii_e ()
1105 {
1106 pop_send_ascii ();
1107 check_empty_mode_keyin_fun ();
1108 return (0);
1109 }
1110
1111 int
quote_send_ascii_e()1112 quote_send_ascii_e ()
1113 {
1114 quote_send_ascii ();
1115 check_empty_mode_keyin_fun ();
1116 return (0);
1117 }
1118
1119 /** jserver�ȤΥ��ͥ�������Ƴ�Ω���롣*/
1120 int
reconnect_jserver()1121 reconnect_jserver ()
1122 {
1123 if (!jl_isconnect_e (env_normal) || (env_reverse != 0 && !jl_isconnect_e (env_reverse)))
1124 {
1125 push_cursor ();
1126 reconnect_jserver_body ();
1127 pop_cursor ();
1128 t_print_l ();
1129 }
1130 return (0);
1131 }
1132
1133 int
reconnect_jserver_body()1134 reconnect_jserver_body ()
1135 {
1136 /*
1137 char *message = " ��³�ۥ���̾ > ";
1138 */
1139 w_char *kana_buf[1024];
1140 char hostname[128];
1141
1142 Sstrcpy (kana_buf, servername);
1143 if (kana_in (MSG_GET (11),
1144 /*
1145 if (kana_in(" ��³�ۥ���̾ > ",
1146 */
1147 UNDER_LINE_MODE, kana_buf, 1024) == -1)
1148 return (0);
1149 wchartochar (kana_buf, hostname);
1150 if (strlen (hostname) == 0)
1151 return (0);
1152 strcpy (servername, hostname);
1153
1154 print_msg (MSG_GET (10));
1155 /*
1156 print_msg(" ��³�桦����");
1157 */
1158 if (connect_jserver (1) < 0)
1159 {
1160 print_msg_getc (MSG_GET (12));
1161 /*
1162 print_msg_getc(" ��³�����ޤ������ޤ���(ǡ��?)");
1163 */
1164 }
1165 else if (!jl_isconnect (bun_data_))
1166 {
1167 print_msg_getc (MSG_GET (13));
1168 /*
1169 print_msg_getc(" ��³�˼��Ԥ��ޤ�����(ǡ��?)");
1170 */
1171 }
1172 return (0);
1173 }
1174
1175
1176 /** jserver �Ȥ� connection ���ڤ롣*/
1177 int
disconnect_jserver()1178 disconnect_jserver ()
1179 {
1180 WnnEnv *p;
1181
1182 for (p = normal_env; p; p = p->next)
1183 {
1184 cur_normal_env = p;
1185 if (jl_isconnect_e (env_normal))
1186 {
1187 jl_dic_save_all_e (env_normal);
1188 jl_disconnect (env_normal);
1189 env_normal = 0;
1190 }
1191 }
1192 for (p = reverse_env; p; p = p->next)
1193 {
1194 cur_reverse_env = p;
1195 if (jl_isconnect_e (env_reverse))
1196 {
1197 jl_dic_save_all_e (env_reverse);
1198 jl_disconnect (env_reverse);
1199 env_reverse = 0;
1200 }
1201 }
1202 if (bun_data_)
1203 {
1204 jl_env_set (bun_data_, 0);
1205 jl_close (bun_data_);
1206 }
1207 return (1);
1208 }
1209
1210 /* MOVED from jhlp.c */
1211
1212 /** �Ѵ����ջ��Υ롼�� */
1213
1214 int
henkan_off()1215 henkan_off ()
1216 {
1217 unsigned char c, c_buf[3];
1218 int i, len;
1219 extern int ptyfd;
1220 static char outbuf[16];
1221 char inkey[16];
1222 extern int henkan_off_flag;
1223
1224 push_cursor ();
1225 display_henkan_off_mode ();
1226 flush ();
1227
1228 henkan_off_flag = 1;
1229
1230 for (;;)
1231 {
1232 inkey[0] = '\0';
1233 if ((i = conv_keyin (inkey)) == -1)
1234 continue;
1235 if ((c_buf[0] = ((i & 0xff00) >> 8)))
1236 {
1237 c_buf[1] = (unsigned char) (i & 0xff);
1238 len = 2;
1239 }
1240 else
1241 {
1242 c = c_buf[0] = (unsigned char) (i & 0xff);
1243 len = 1;
1244 if ((!quote_flag) && (c == quote_code))
1245 {
1246 quote_flag = 1;
1247 continue;
1248 }
1249 if ((quote_flag == 0) && (c_b->key_table[c] == henkan_off))
1250 {
1251 break;
1252 }
1253 }
1254 /* �������Ѵ� */
1255 if (!convkey_on && *inkey)
1256 { /* convkey_always_on */
1257 if (pty_c_flag == tty_c_flag)
1258 i = through (outbuf, inkey, strlen (inkey));
1259 else
1260 i = (*code_trans[(file_code << 2) | pty_c_flag]) (outbuf, inkey, strlen (inkey));
1261 }
1262 else
1263 {
1264 if (pty_c_flag == tty_c_flag)
1265 i = through (outbuf, c_buf, len);
1266 else
1267 i = (*code_trans[(file_code << 2) | pty_c_flag]) (outbuf, c_buf, len);
1268 }
1269 if (i <= 0)
1270 continue;
1271 write (ptyfd, outbuf, i);
1272 quote_flag = 0;
1273 }
1274 henkan_off_flag = 0;
1275 pop_cursor ();
1276 call_redraw_line (c_b->t_c_p, 1);
1277 flush ();
1278 return (0);
1279 }
1280
1281 char
env_state()1282 env_state ()
1283 {
1284 char *p;
1285 char ret = '\0';
1286
1287 if ((p = romkan_dispmode ()) == NULL)
1288 return (ret);
1289 if ((p = (char *) strchr (p, ':')) == NULL)
1290 return (ret);
1291 return (*(p + 1));
1292 }
1293
1294 int
set_cur_env(s)1295 set_cur_env (s)
1296 char s;
1297 {
1298 register WnnEnv *p;
1299 register int i;
1300
1301 for (p = normal_env; p; p = p->next)
1302 {
1303 for (i = 0; p->env_name_str[i]; i++)
1304 {
1305 if (s == p->env_name_str[i])
1306 {
1307 cur_normal_env = p;
1308 jl_env_set (bun_data_, env_normal);
1309 break;
1310 }
1311 }
1312 }
1313 for (p = reverse_env; p; p = p->next)
1314 {
1315 for (i = 0; p->env_name_str[i]; i++)
1316 {
1317 if (s == p->env_name_str[i])
1318 {
1319 cur_reverse_env = p;
1320 break;
1321 }
1322 }
1323 }
1324 return (0);
1325 }
1326
1327 void
get_new_env(rev)1328 get_new_env (rev)
1329 int rev;
1330 {
1331 register WnnEnv *p;
1332
1333 p = (WnnEnv *) malloc (sizeof (WnnEnv));
1334 p->host_name = NULL;
1335 p->env = NULL;
1336 p->sticky = 0;
1337 p->envrc_name = NULL;
1338 p->env_name_str[0] = '\0';
1339 if (rev)
1340 {
1341 p->next = reverse_env;
1342 reverse_env = cur_reverse_env = p;
1343 }
1344 else
1345 {
1346 p->next = normal_env;
1347 normal_env = cur_normal_env = p;
1348 }
1349 }
1350
1351 #define UNGETBUFSIZE 32
1352 static unsigned int unget_buf[UNGETBUFSIZE];
1353 static int count = 0;
1354
1355 int
push_unget_buf(c)1356 push_unget_buf (c)
1357 int c;
1358 {
1359 if ((count + 1) >= UNGETBUFSIZE)
1360 return (-1);
1361 unget_buf[count++] = c;
1362 unget_buf[count] = EOLTTR;
1363 return (0);
1364 }
1365
1366 unsigned int *
get_unget_buf()1367 get_unget_buf ()
1368 {
1369 if (count <= 0)
1370 unget_buf[0] = EOLTTR;
1371 count = 0;
1372 return (unget_buf);
1373 }
1374
1375 int
if_unget_buf()1376 if_unget_buf ()
1377 {
1378 if (count > 0)
1379 return (1);
1380 return (0);
1381 }
1382
1383 #ifdef CHINESE
1384 void
errorkeyin_q()1385 errorkeyin_q ()
1386 {
1387 ring_bell ();
1388 c_b->t_b_end = c_b->t_b_st;
1389 c_b->t_c_p = bunsetsu[cur_bnst_];
1390 c_b->t_m_start = c_b->t_c_p;
1391 c_b->buflen = maxchg;
1392 c_b->maxlen = c_b->t_c_p;
1393 if (c_b->maxlen == 0)
1394 {
1395 change_to_empty_mode ();
1396 }
1397 }
1398 #endif /* CHINESE */
1399