1 /*
2  * $Id: key_bind.c,v 1.2 2001/06/14 18:16:16 ura 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 1991, 1992 by Massachusetts Institute of Technology
14  *
15  * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.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, or (at your option)
20  * 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 GNU Emacs; see the file COPYING.  If not, write to the
29  * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30  *
31  * Commentary:
32  *
33  * Change log:
34  *
35  * Last modified date: 8,Feb.1999
36  *
37  * Code:
38  *
39  */
40 /*      Version 4.0
41  */
42 #include <stdio.h>
43 #include <pwd.h>
44 #include "commonhd.h"
45 #include "config.h"
46 #include "sdefine.h"
47 #ifdef  XJUTIL
48 #include "xjutil.h"
49 #include "sxheader.h"
50 #include "xext.h"
51 #else /* XJUTIL */
52 #include "xim.h"
53 #include "sheader.h"
54 #include "ext.h"
55 #endif /* XJUTIL */
56 
57 extern char *getenv ();
58 #ifdef  XJUTIL
59 static struct kansuu kansuu_hyo[] = {
60   {"send_string", "send what is in the buffer to pty.", 0,
61    NULL, NULL, NULL, NULL, NULL,
62    NULL, NULL, NULL, NULL, NULL,
63    '\0'},
64   {"forward_char", "cursor wo hitotu maeni susumeru.", 1,
65    NULL, forward_char, NULL, NULL, NULL,
66    forward_char, forward_char, NULL, NULL, NULL,
67    '\0'},
68   {"backward_char", "cursor wo hitotu usironi susumeru.", 1,
69    NULL, backward_c, NULL, NULL, NULL,
70    backward_char, backward_char, NULL, NULL, NULL,
71    '\0'},
72   {"goto_top_of_line", "", 1,
73    NULL, c_top, NULL, NULL, NULL,
74    c_top, c_top, NULL, NULL, NULL,
75    '\0'},
76   {"goto_end_of_line", "", 1,
77    NULL, c_end, c_end_nobi, NULL, NULL,
78    c_end, c_end, NULL, NULL, NULL,
79    '\0'},
80   {"delete_char_at_cursor", "", 1,
81    NULL, delete_c, NULL, NULL, NULL,
82    t_delete_char, t_delete_char, NULL, NULL, NULL,
83    '\0'},
84   {"kaijo", "", 0,
85    NULL, NULL, NULL, NULL, NULL,
86    NULL, NULL, NULL, NULL, NULL,
87    '\0'},
88   {"henkan", "", 1,
89    NULL, NULL, NULL, NULL, NULL,
90    NULL, NULL, NULL, NULL, NULL,
91    '\0'},
92   {"tan_henkan", "", 1,
93    NULL, NULL, NULL, NULL, NULL,
94    NULL, NULL, NULL, NULL, NULL,
95    '\0'},
96   {"tan_henkan_dai", "", 1,
97    NULL, NULL, NULL, NULL, NULL,
98    NULL, NULL, NULL, NULL, NULL,
99    '\0'},
100   {"jikouho", "", 0,
101    NULL, NULL, NULL, NULL, NULL,
102    NULL, NULL, NULL, NULL, NULL,
103    '\0'},
104   {"zenkouho", "", 0,
105    NULL, NULL, NULL, NULL, NULL,
106    NULL, NULL, NULL, NULL, NULL,
107    '\0'},
108   {"jikouho_dai", "", 0,
109    NULL, NULL, NULL, NULL, NULL,
110    NULL, NULL, NULL, NULL, NULL,
111    '\0'},
112   {"zenkouho_dai", "", 0,
113    NULL, NULL, NULL, NULL, NULL,
114    NULL, NULL, NULL, NULL, NULL,
115    '\0'},
116   {"select_jikouho", "", 0,
117    NULL, NULL, NULL, NULL, NULL,
118    NULL, NULL, NULL, NULL, NULL,
119    '\0'},
120   {"select_jikouho_dai", "", 0,
121    NULL, NULL, NULL, NULL, NULL,
122    NULL, NULL, NULL, NULL, NULL,
123    '\0'},
124   {"kill", "", 1,
125    NULL, kill_c, NULL, NULL, NULL,
126    t_kill, t_kill, NULL, NULL, NULL,
127    '\0'},
128   {"yank", "", 1,
129    NULL, NULL, NULL, NULL, NULL,
130    NULL, NULL, NULL, NULL, NULL,
131    '\0'},
132   {"yank_e", "", 1,
133    NULL, NULL, NULL, NULL, NULL,
134    NULL, NULL, NULL, NULL, NULL,
135    '\0'},
136   {"bunsetu_nobasi", "", 0,
137    NULL, NULL, NULL, NULL, NULL,
138    NULL, NULL, NULL, NULL, NULL,
139    '\0'},
140   {"bunsetu_chijime", "", 0,
141    NULL, NULL, NULL, NULL, NULL,
142    NULL, NULL, NULL, NULL, NULL,
143    '\0'},
144   {"jisho_utility", "", 0,
145    NULL, NULL, NULL, NULL, NULL,
146    NULL, NULL, NULL, NULL, NULL,
147    '\0'},
148   {"jisho_utility_e", "", 0,
149    NULL, NULL, NULL, NULL, NULL,
150    NULL, NULL, NULL, NULL, NULL,
151    '\0'},
152   {"touroku", "", 1,
153    NULL, NULL, NULL, NULL, NULL,
154    NULL, NULL, NULL, NULL, NULL,
155    '\0'},
156   {"touroku_e", "", 1,
157    NULL, NULL, NULL, NULL, NULL,
158    NULL, NULL, NULL, NULL, NULL,
159    '\0'},
160   {"kakutei", "", 1,
161    NULL, NULL, NULL, NULL, NULL,
162    NULL, NULL, NULL, NULL, NULL,
163    '\0'},
164   {"sainyuuryoku", "", 1,
165    NULL, NULL, NULL, NULL, NULL,
166    NULL, NULL, NULL, NULL, NULL,
167    '\0'},
168   {"sainyuuryoku_e", "", 1,
169    NULL, NULL, NULL, NULL, NULL,
170    NULL, NULL, NULL, NULL, NULL,
171    '\0'},
172   {"kuten", "", 0,
173    NULL, kuten, NULL, NULL, NULL,
174    kuten, kuten, NULL, NULL, NULL,
175    '\0'},
176   {"kuten_e", "", 0,
177    NULL, kuten, NULL, kuten, NULL,
178    kuten, kuten, NULL, NULL, NULL,
179    '\0'},
180   {"jis", "", 0,
181    NULL, jis, NULL, NULL, NULL,
182    jis, jis, NULL, NULL, NULL,
183    '\0'},
184   {"jis_e", "", 0,
185    NULL, jis, NULL, jis, NULL,
186    jis, jis, NULL, NULL, NULL,
187    '\0'},
188   {"redraw_line", "", 1,
189    NULL, NULL, NULL, NULL, NULL,
190    NULL, NULL, NULL, NULL, NULL,
191    '\0'},
192   {"redraw_line_e", "", 1,
193    NULL, NULL, NULL, NULL, NULL,
194    NULL, NULL, NULL, NULL, NULL,
195    '\0'},
196   {"previous_history_e", "", 1,
197    NULL, NULL, NULL, NULL, NULL,
198    NULL, NULL, NULL, NULL, NULL,
199    '\0'},
200   {"previous_history", "", 1,
201    NULL, NULL, NULL, NULL, NULL,
202    NULL, NULL, NULL, NULL, NULL,
203    '\0'},
204   {"next_history_e", "", 1,
205    NULL, NULL, NULL, NULL, NULL,
206    NULL, NULL, NULL, NULL, NULL,
207    '\0'},
208   {"next_history", "", 1,
209    NULL, NULL, NULL, NULL, NULL,
210    NULL, NULL, NULL, NULL, NULL,
211    '\0'},
212   {"touroku_mark_set", "", 0,
213    NULL, NULL, NULL, NULL, NULL,
214    t_markset, NULL, NULL, NULL, NULL,
215    '\0'},
216   {"touroku_return", "", 0,
217    NULL, NULL, NULL, NULL, NULL,
218    NULL, t_ret, NULL, NULL, NULL,
219    '\0'},
220   {"quit", "", 0,
221    NULL, NULL, NULL, NULL, quit_select,
222    t_quit, t_quit, quit_select, quit_select, quit_select,
223    '\0'},
224   {"touroku_jump_forward", "", 0,
225    NULL, NULL, NULL, NULL, NULL,
226    NULL, t_jmp_forward, NULL, NULL, NULL,
227    '\0'},
228   {"touroku_jump_backward", "", 0,
229    NULL, NULL, NULL, NULL, NULL,
230    NULL, t_jmp_backward, NULL, NULL, NULL,
231    '\0'},
232   {"change_to_insert_mode", "", 0,
233    NULL, NULL, NULL, NULL, NULL,
234    NULL, NULL, NULL, NULL, NULL,
235    '\0'},
236   {"quote_e", "", 0,
237    NULL, quote, NULL, quote, NULL,
238    NULL, NULL, NULL, NULL, NULL,
239    '\0'},
240   {"quote", "", 0,
241    NULL, quote, NULL, NULL, NULL,
242    NULL, NULL, NULL, NULL, NULL,
243    '\0'},
244   {"send_ascii_char", "", 0,
245    NULL, NULL, NULL, NULL, NULL,
246    NULL, NULL, NULL, NULL, NULL,
247    '\0'},
248   {"toggle_send_ascii_char", "", 0,
249    NULL, NULL, NULL, NULL, NULL,
250    NULL, NULL, NULL, NULL, NULL,
251    '\0'},
252   {"not_send_ascii_char", "", 0,
253    NULL, NULL, NULL, NULL, NULL,
254    NULL, NULL, NULL, NULL, NULL,
255    '\0'},
256   {"pop_send_ascii_char", "", 0,
257    NULL, NULL, NULL, NULL, NULL,
258    NULL, NULL, NULL, NULL, NULL,
259    '\0'},
260   {"quote_send_ascii_char", "", 0,
261    NULL, NULL, NULL, NULL, NULL,
262    NULL, NULL, NULL, NULL, NULL,
263    '\0'},
264   {"select_select", "", 0,
265    NULL, NULL, NULL, NULL, select_select,
266    NULL, NULL, kworddel_op, select_select, select_select,
267    '\0'},
268   {"lineend_select", "", 0,
269    NULL, NULL, NULL, NULL, lineend_select,
270    NULL, NULL, NULL, NULL, NULL,
271    '\0'},
272   {"linestart_select", "", 0,
273    NULL, NULL, NULL, NULL, linestart_select,
274    NULL, NULL, NULL, NULL, NULL,
275    '\0'},
276   {"previous_select", "", 0,
277    NULL, NULL, NULL, NULL, xw_previous_select,
278    NULL, NULL, xw_previous_select, xw_previous_select,
279    xw_previous_message,
280    '\0'},
281   {"next_select", "", 0,
282    NULL, NULL, NULL, NULL, xw_next_select,
283    NULL, NULL, xw_next_select, xw_next_select, xw_next_message,
284    '\0'},
285   {"backward_select", "", 0,
286    NULL, NULL, NULL, NULL, backward_select,
287    NULL, NULL, NULL, NULL, NULL,
288    '\0'},
289   {"forward_select", "", 0,
290    NULL, NULL, NULL, NULL, forward_select,
291    NULL, NULL, NULL, NULL, NULL,
292    '\0'},
293   {"reconnect_jserver", "", 0,
294    reconnect_server, reconnect_server, reconnect_server, reconnect_server,
295    reconnect_server,
296    reconnect_server, reconnect_server, reconnect_server, reconnect_server,
297    reconnect_server,
298    '\0'},
299   {"henkan_on", "", 0,
300    NULL, NULL, NULL, NULL, NULL,
301    NULL, NULL, NULL, NULL, NULL,
302    '\0'},
303   {"inspect", "", 0,
304    NULL, NULL, NULL, NULL, NULL,
305    NULL, NULL, NULL, NULL, NULL,
306    '\0'},
307   {"sakujo_kouho", "", 0,
308    NULL, NULL, NULL, NULL, NULL,
309    NULL, NULL, NULL, NULL, NULL,
310    '\0'},
311   {"nobi_henkan_dai", "", 0,
312    NULL, NULL, NULL, NULL, NULL,
313    NULL, NULL, NULL, NULL, NULL,
314    '\0'},
315   {"nobi_henkan", "", 0,
316    NULL, NULL, NULL, NULL, NULL,
317    NULL, NULL, NULL, NULL, NULL,
318    '\0'},
319   {"del_entry", "", 0,
320    NULL, NULL, NULL, NULL, NULL,
321    NULL, NULL, kworddel, kdicdel, NULL,
322    '\0'},
323   {"use_entry", "", 0,
324    NULL, NULL, NULL, NULL, NULL,
325    NULL, NULL, kworduse, kdicuse, NULL,
326    '\0'},
327   {"com_entry", "", 0,
328    NULL, NULL, NULL, NULL, NULL,
329    NULL, NULL, kwordcom, kdiccom, NULL,
330    '\0'},
331   {"kana_henkan", "", 1,
332    NULL, NULL, NULL, NULL, NULL,
333    NULL, NULL, NULL, NULL, NULL,
334    '\0'},
335   {"hindo_set", "", 0,
336    NULL, NULL, NULL, NULL, NULL,
337    NULL, NULL, kwordhindo, NULL, NULL,
338    '\0'},
339   {"ima_bit", "", 0,
340    NULL, NULL, NULL, NULL, NULL,
341    NULL, NULL, kwordima, NULL, NULL,
342    '\0'},
343   {"change_locale", "", 0,
344    NULL, NULL, NULL, NULL, NULL,
345    NULL, NULL, NULL, NULL, NULL,
346    '\0'},
347   {"change_locale_ct", "", 0,
348    NULL, NULL, NULL, NULL, NULL,
349    NULL, NULL, NULL, NULL, NULL,
350    '\0'}
351 };
352 #else /* XJUTIL */
353 extern int lang_c ();
354 extern int lang_ct ();
355 static struct kansuu kansuu_hyo[] = {
356   {"send_string", "send what is in the buffer to pty.", 0,
357    send_string, send_string, send_string, NULL, NULL,
358    NULL, NULL, NULL, NULL, NULL,
359    '\0'},
360   {"forward_char", "cursor wo hitotu maeni susumeru.", 1,
361    forward_bunsetsu, forward_char, henkan_forward, NULL, NULL,
362    forward_char, forward_char, NULL, NULL, NULL,
363    '\0'},
364   {"backward_char", "cursor wo hitotu usironi susumeru.", 1,
365    backward_bunsetsu, backward_c, henkan_backward, NULL, NULL,
366    backward_char, backward_char, NULL, NULL, NULL,
367    '\0'},
368   {"goto_top_of_line", "", 1,
369    top_bunsetsu, c_top, jmptijime, NULL, NULL,
370    c_top, c_top, NULL, NULL, NULL,
371    '\0'},
372   {"goto_end_of_line", "", 1,
373    end_bunsetsu, c_end, c_end_nobi, NULL, NULL,
374    c_end, c_end, NULL, NULL, NULL,
375    '\0'},
376   {"delete_char_at_cursor", "", 1,
377    NULL, delete_c, NULL, NULL, NULL,
378    t_delete_char, t_delete_char, NULL, NULL, NULL,
379    '\0'},
380   {"kaijo", "", 0,
381    kaijo, NULL, kaijo, NULL, NULL,
382    NULL, NULL, NULL, NULL, NULL,
383    '\0'},
384   {"henkan", "", 1,
385    NULL, ren_henkan, NULL, NULL, NULL,
386    NULL, NULL, NULL, NULL, NULL,
387    '\0'},
388   {"tan_henkan", "", 1,
389    NULL, tan_henkan, NULL, NULL, NULL,
390    NULL, NULL, NULL, NULL, NULL,
391    '\0'},
392   {"tan_henkan_dai", "", 1,
393    NULL, tan_henkan_dai, NULL, NULL, NULL,
394    NULL, NULL, NULL, NULL, NULL,
395    '\0'},
396   {"jikouho", "", 0,
397    jikouho_c, NULL, NULL, NULL, NULL,
398    NULL, NULL, NULL, NULL, NULL,
399    '\0'},
400   {"zenkouho", "", 0,
401    zenkouho_c, NULL, NULL, NULL, NULL,
402    NULL, NULL, NULL, NULL, NULL,
403    '\0'},
404   {"jikouho_dai", "", 0,
405    jikouho_dai_c, NULL, NULL, NULL, NULL,
406    NULL, NULL, NULL, NULL, NULL,
407    '\0'},
408   {"zenkouho_dai", "", 0,
409    zenkouho_dai_c, NULL, NULL, NULL, NULL,
410    NULL, NULL, NULL, NULL, NULL,
411    '\0'},
412   {"select_jikouho", "", 0,
413    select_jikouho, NULL, NULL, NULL, NULL,
414    NULL, NULL, NULL, NULL, NULL,
415    '\0'},
416   {"select_jikouho_dai", "", 0,
417    select_jikouho_dai, NULL, NULL, NULL, NULL,
418    NULL, NULL, NULL, NULL, NULL,
419    '\0'},
420   {"kill", "", 1,
421    NULL, kill_c, NULL, NULL, NULL,
422    t_kill, t_kill, NULL, NULL, NULL,
423    '\0'},
424   {"yank", "", 1,
425    NULL, yank_c, NULL, NULL, NULL,
426    t_yank, t_yank, NULL, NULL, NULL,
427    '\0'},
428   {"yank_e", "", 1,
429    NULL, yank_c, NULL, yank_c, NULL,
430    t_yank, t_yank, NULL, NULL, NULL,
431    '\0'},
432   {"bunsetu_nobasi", "", 0,
433    enlarge_bunsetsu, NULL, forward, NULL, NULL,
434    NULL, NULL, NULL, NULL, NULL,
435    '\0'},
436   {"bunsetu_chijime", "", 0,
437    smallen_bunsetsu, NULL, tijime, NULL, NULL,
438    NULL, NULL, NULL, NULL, NULL,
439    '\0'},
440   {"jisho_utility", "", 0,
441    jutil_c, jutil_c, jutil_c, NULL, NULL,
442    NULL, NULL, NULL, NULL, NULL,
443    '\0'},
444   {"jisho_utility_e", "", 0,
445    jutil_c, jutil_c, jutil_c, jutil_c, NULL,
446    NULL, NULL, NULL, NULL, NULL,
447    '\0'},
448   {"touroku", "", 1,
449    touroku_c, touroku_c, touroku_c, NULL, NULL,
450    NULL, NULL, NULL, NULL, NULL,
451    '\0'},
452   {"touroku_e", "", 1,
453    touroku_c, touroku_c, touroku_c, touroku_c, NULL,
454    NULL, NULL, NULL, NULL, NULL,
455    '\0'},
456   {"kakutei", "", 1,
457    kakutei, kakutei, kakutei, NULL, NULL,
458    NULL, NULL, NULL, NULL, NULL,
459    '\0'},
460   {"sainyuuryoku", "", 1,
461    NULL, remember_me, NULL, NULL, NULL,
462    NULL, NULL, NULL, NULL, NULL,
463    '\0'},
464   {"sainyuuryoku_e", "", 1,
465    NULL, remember_me, NULL, remember_me, NULL,
466    NULL, NULL, NULL, NULL, NULL,
467    '\0'},
468   {"kuten", "", 0,
469    NULL, kuten, NULL, NULL, NULL,
470    kuten, kuten, NULL, NULL, NULL,
471    '\0'},
472   {"kuten_e", "", 0,
473    NULL, kuten, NULL, kuten, NULL,
474    kuten, kuten, NULL, NULL, NULL,
475    '\0'},
476   {"jis", "", 0,
477    NULL, jis, NULL, NULL, NULL,
478    jis, jis, NULL, NULL, NULL,
479    '\0'},
480   {"jis_e", "", 0,
481    NULL, jis, NULL, jis, NULL,
482    jis, jis, NULL, NULL, NULL,
483    '\0'},
484   {"redraw_line", "", 1,
485    reset_line, reset_line, reset_line, NULL, reset_line,
486    reset_line, reset_line, NULL, NULL, NULL,
487    '\0'},
488   {"redraw_line_e", "", 1,
489    reset_line, reset_line, reset_line, reset_line, reset_line,
490    reset_line, reset_line, NULL, NULL, NULL,
491    '\0'},
492   {"previous_history_e", "", 1,
493    NULL, previous_history, NULL, previous_history, NULL,
494    NULL, NULL, NULL, NULL, NULL,
495    '\0'},
496   {"previous_history", "", 1,
497    NULL, previous_history, NULL, NULL, NULL,
498    NULL, NULL, NULL, NULL, NULL,
499    '\0'},
500   {"next_history_e", "", 1,
501    NULL, next_history, NULL, next_history, NULL,
502    NULL, NULL, NULL, NULL, NULL,
503    '\0'},
504   {"next_history", "", 1,
505    NULL, next_history, NULL, NULL, NULL,
506    NULL, NULL, NULL, NULL, NULL,
507    '\0'},
508 /*{ "touroku_mark_set",         "",                                     0,
509   NULL,         NULL,           NULL,           NULL,           NULL,
510   t_markset,    NULL,           NULL,           NULL,           NULL,
511   '\0'}, */
512   {"touroku_mark_set", "", 0,
513    NULL, NULL, NULL, NULL, NULL,
514    NULL, NULL, NULL, NULL, NULL,
515    '\0'},
516   {"touroku_return", "", 0,
517    NULL, NULL, NULL, NULL, NULL,
518    NULL, t_ret, NULL, NULL, NULL,
519    '\0'},
520   {"quit", "", 0,
521    NULL, NULL, NULL, NULL, quit_select,
522    t_quit, t_quit, NULL, NULL, quit_select,
523    '\0'},
524   {"touroku_jump_forward", "", 0,
525    NULL, NULL, NULL, NULL, NULL,
526    NULL, t_jmp_forward, NULL, NULL, NULL,
527    '\0'},
528   {"touroku_jump_backward", "", 0,
529    NULL, NULL, NULL, NULL, NULL,
530    NULL, t_jmp_backward, NULL, NULL, NULL,
531    '\0'},
532   {"change_to_insert_mode", "", 0,
533    insert_it_as_yomi, NULL, NULL, NULL, NULL,
534    NULL, NULL, NULL, NULL, NULL,
535    '\0'},
536   {"quote_e", "", 0,
537    NULL, quote, NULL, quote, NULL,
538    NULL, NULL, NULL, NULL, NULL,
539    '\0'},
540   {"quote", "", 0,
541    NULL, quote, NULL, NULL, NULL,
542    NULL, NULL, NULL, NULL, NULL,
543    '\0'},
544   {"send_ascii_char", "", 0,
545    send_ascii, send_ascii, send_ascii, send_ascii, send_ascii,
546    send_ascii, send_ascii, send_ascii, send_ascii, send_ascii,
547    '\0'},
548   {"toggle_send_ascii_char", "", 0,
549    toggle_send_ascii, toggle_send_ascii, toggle_send_ascii, toggle_send_ascii,
550    toggle_send_ascii,
551    toggle_send_ascii, toggle_send_ascii, toggle_send_ascii, toggle_send_ascii,
552    toggle_send_ascii,
553    '\0'},
554   {"not_send_ascii_char", "", 0,
555    not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii,
556    not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii,
557    '\0'},
558   {"pop_send_ascii_char", "", 0,
559    pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii,
560    pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii,
561    '\0'},
562   {"quote_send_ascii_char", "", 0,
563    NULL, NULL, NULL, quote_send_ascii_e, NULL,
564    NULL, NULL, NULL, NULL, NULL,
565    '\0'},
566   {"select_select", "", 0,
567    NULL, NULL, NULL, NULL, select_select,
568    NULL, NULL, NULL, NULL, select_select,
569    '\0'},
570   {"lineend_select", "", 0,
571    NULL, NULL, NULL, NULL, lineend_select,
572    NULL, NULL, NULL, NULL, NULL,
573    '\0'},
574   {"linestart_select", "", 0,
575    NULL, NULL, NULL, NULL, linestart_select,
576    NULL, NULL, NULL, NULL, NULL,
577    '\0'},
578 /*{ "previous_select",          "",                                     0,
579   NULL,         NULL,           NULL,           NULL,           previous_select,
580   NULL,         NULL,           NULL,           NULL,           previous_select,
581   '\0'},*/
582   {"previous_select", "", 0,
583    NULL, NULL, NULL, NULL, previous_select,
584    NULL, NULL, NULL, NULL, xw_back_inspect,
585    '\0'},
586 /*{ "next_select",              "",                                     0,
587   NULL,         NULL,           NULL,           NULL,           next_select,
588   NULL,         NULL,           NULL,           NULL,           NULL,
589   '\0'},*/
590   {"next_select", "", 0,
591    NULL, NULL, NULL, NULL, next_select,
592    NULL, NULL, NULL, NULL, xw_next_inspect,
593    '\0'},
594   {"backward_select", "", 0,
595    NULL, NULL, NULL, NULL, backward_select,
596    NULL, NULL, NULL, NULL, NULL,
597    '\0'},
598   {"forward_select", "", 0,
599    NULL, NULL, NULL, NULL, forward_select,
600    NULL, NULL, NULL, NULL, NULL,
601    '\0'},
602   {"reconnect_jserver", "", 0,
603    reconnect_server, reconnect_server, reconnect_server, reconnect_server,
604    reconnect_server,
605    reconnect_server, reconnect_server, reconnect_server, reconnect_server,
606    reconnect_server,
607    '\0'},
608   {"henkan_on", "", 0,
609    henkan_off, henkan_off, henkan_off, henkan_off, henkan_off,
610    henkan_off, henkan_off, henkan_off, henkan_off, henkan_off,
611    '\0'},
612   {"inspect", "", 0,
613    inspect_kouho, NULL, NULL, NULL, NULL,
614    NULL, NULL, NULL, NULL, NULL,
615    '\0'},
616   {"sakujo_kouho", "", 0,
617    sakujo_kouho, NULL, NULL, NULL, NULL,
618    NULL, NULL, NULL, NULL, NULL,
619    '\0'},
620   {"nobi_henkan_dai", "", 0,
621    NULL, NULL, nobi_henkan_dai, NULL, NULL,
622    NULL, NULL, NULL, NULL, NULL,
623    '\0'},
624   {"nobi_henkan", "", 0,
625    NULL, NULL, nobi_henkan, NULL, NULL,
626    NULL, NULL, NULL, NULL, NULL,
627    '\0'},
628   {"del_entry", "", 0,
629    NULL, NULL, NULL, NULL, NULL,
630    NULL, NULL, NULL, NULL, inspectdel,
631    '\0'},
632   {"use_entry", "", 0,
633    NULL, NULL, NULL, NULL, NULL,
634    NULL, NULL, NULL, NULL, inspectuse,
635    '\0'},
636   {"com_entry", "", 0,
637    NULL, NULL, NULL, NULL, NULL,
638    NULL, NULL, NULL, NULL, NULL,
639    '\0'},
640   {"kana_henkan", "", 1,
641    NULL, kankana_ren_henkan, NULL, NULL, NULL,
642    NULL, NULL, NULL, NULL, NULL,
643    '\0'},
644   {"hindo_set", "", 0,
645    NULL, NULL, NULL, NULL, NULL,
646    NULL, NULL, NULL, NULL, NULL,
647    '\0'},
648   {"ima_bit", "", 0,
649    NULL, NULL, NULL, NULL, NULL,
650    NULL, NULL, NULL, NULL, NULL,
651    '\0'},
652   {"change_locale", "", 0,
653    lang_c, lang_c, lang_c, lang_c, lang_c,
654    lang_c, lang_c, lang_c, lang_c, lang_c,
655    '\0'},
656   {"change_locale_ct", "", 0,
657    lang_ct, lang_ct, lang_ct, lang_ct, lang_ct,
658    lang_ct, lang_ct, lang_ct, lang_ct, lang_ct,
659    '\0'}
660 };
661 #endif /* XJUTIL */
662 
663 int kansuu_hyo_entry_suu = sizeof (kansuu_hyo) / sizeof (struct kansuu);
664 
665 /** argument expansion. */
666 static int
expand_argument(st)667 expand_argument (st)
668      char *st;
669 {
670   int num;
671 
672   if (*st == '^')
673     {
674       num = (*(st + 1)) & 0x1f;
675     }
676   else if (*st == '0' || *st == '\\')
677     {
678       if (*(st + 1) == 'x' || *(st + 1) == 'X')
679         {
680           sscanf (st + 2, "%x", &num);
681         }
682       else
683         {
684           sscanf (st, "%o", &num);
685         }
686     }
687   else if (!('0' <= *st && *st <= '9'))
688     {
689       return (-1);
690     }
691   else
692     {
693       num = atoi (st);
694     }
695   if (num >= TBL_SIZE)
696     {
697       print_out1 ("In uumkey file, you can only bind a function to code less than %d.", (char *) TBL_SIZE);
698       return (-1);
699     }
700   return (num);
701 }
702 
703 static void
remove_key_bind(p)704 remove_key_bind (p)
705      register struct kansuu *p;
706 {
707   register int tbl;
708   register int com;
709 #ifdef XJUTIL
710 #define MTABLE main_table
711 #else
712 #define MTABLE (m_table->m_table)
713   register MainTable *m_table;
714 
715   m_table = c_c->m_table;
716 #endif
717 
718   for (tbl = 0; tbl < TBL_CNT; tbl++)
719     {
720       if (p->func[tbl] != NULL)
721         {
722           for (com = 0; com < TBL_SIZE; com++)
723             {
724               if (MTABLE[tbl][com] == p->func[tbl])
725                 {
726                   MTABLE[tbl][com] = (int (*)()) 0;
727                   MTABLE[tbl][com] = 0;
728                 }
729             }
730         }
731     }
732 }
733 
734 static struct kansuu *
find_entry(com_name,tbl)735 find_entry (com_name, tbl)
736      char *com_name;
737      struct kansuu **tbl;
738 {
739   register int k;
740   register struct kansuu **p;
741 
742   p = tbl + ((com_name[0] - 'a') * ONE_CHAR_TBL);
743   for (k = 0; k < ONE_CHAR_TBL && *p; k++, p++)
744     {
745       if (strcmp (com_name, (*p)->kansuumei) == 0)
746         {
747           if ((*p)->key_binded)
748             {
749               return (*p);
750             }
751         }
752     }
753   return (NULL);
754 }
755 
756 int
expand_expr(s,lang)757 expand_expr (s, lang)
758      char *s, *lang;
759 {
760   char tmp[EXPAND_PATH_LENGTH];
761   register char *p, *s1;
762   int noerr, expandsuc;
763   struct passwd *u;
764   extern struct passwd *getpwnam ();
765 
766   if (*s != '~' && *s != '@')
767     {
768       strcpy (tmp, s);
769       *s = '\0';
770       noerr = 1;
771     }
772   else
773     {
774       if ((int) strlen (s) >= EXPAND_PATH_LENGTH)
775         return (-1);
776 
777       s1 = s;
778       if (NULL != (p = index (++s1, '/')))
779         {
780           strcpy (tmp, p);
781           *p = '\0';
782         }
783       else
784         *tmp = '\0';
785       if (*s == '~')
786         {
787           if (*s1)
788             {
789               noerr = expandsuc = (NULL != (u = getpwnam (s1)) && (int) (strlen (p = u->pw_dir) + strlen (tmp)) < EXPAND_PATH_LENGTH);
790             }
791           else
792             {
793               noerr = expandsuc = (NULL != (p = getenv ("HOME")) && (int) (strlen (p) + strlen (tmp)) < EXPAND_PATH_LENGTH);
794             }
795         }
796       else
797         {                       /* then, *s must be '@' */
798           if (!strcmp (s1, "HOME"))
799             {
800               noerr = expandsuc = (NULL != (p = getenv ("HOME")) && (int) (strlen (p) + strlen (tmp)) < EXPAND_PATH_LENGTH);
801             }
802           else if (!strcmp (s1, "LIBDIR"))
803             {
804               noerr = expandsuc = ((int) (strlen (p = LIBDIR) + strlen (tmp)) < EXPAND_PATH_LENGTH);
805             }
806           else if (!strcmp (s1, "LANG"))
807             {
808               noerr = expandsuc = ((int) (strlen (p = lang) + strlen (tmp)) < EXPAND_PATH_LENGTH);
809             }
810           else
811             {                   /* @HOME, @LIBDIR igai ha kaenai */
812               noerr = 1;
813               expandsuc = 0;
814             }
815         }
816       if (expandsuc)
817         strcpy (s, p);
818     }
819 
820   if (noerr)
821     {
822       int len = strlen ("@USR");
823       int len1 = strlen ("@LANG");
824       p = tmp;
825       for (; *p; p++)
826         {
827           if (!strncmp (p, "@USR", len))
828             {
829               if ((int) (strlen (username) + strlen (p) + strlen (s) - len) < EXPAND_PATH_LENGTH)
830                 {
831                   strcat (s, username);
832                   p += len - 1;
833                 }
834               else
835                 {
836                   return (-1);
837                 }
838             }
839           else if (!strncmp (p, "@LANG", len1))
840             {
841               if ((int) (strlen (lang) + strlen (p) + strlen (s) - len) < EXPAND_PATH_LENGTH)
842                 {
843                   strcat (s, lang);
844                   p += len1 - 1;
845                 }
846               else
847                 {
848                   return (-1);
849                 }
850             }
851           else
852             {
853               strncat (s, p, 1);
854             }
855         }
856     }
857   return (noerr ? 0 : -1);
858 }
859 
860 static int
key_binding(file_name,lang)861 key_binding (file_name, lang)
862      char *file_name;
863      char *lang;
864 {
865   register int k, kk;
866   FILE *fp, *fopen ();
867   char func_name[64];
868   int com_cnt;
869   int com_num;
870   char buf[256];
871   char com_name[16][EXPAND_PATH_LENGTH];
872   int lc = 0;
873   int tbl;
874   register struct kansuu **one_char_tbl, **p, *pp;
875 
876   if ((fp = fopen (file_name, "r")) == NULL)
877     {
878       print_out1 ("Key_binding file \"%s\" doesn't exist.", file_name);
879       return (-1);
880     }
881   if (!(p = (struct kansuu **) Calloc (ONE_CHAR_TBL * ('z' - 'a' + 1), sizeof (struct kansuu *))))
882     {
883       malloc_error ("allocation of work area for key binding");
884       fclose (fp);
885       return (-1);
886     }
887   one_char_tbl = p;
888   for (k = 0; k < kansuu_hyo_entry_suu; k++)
889     {
890       p = one_char_tbl + ((kansuu_hyo[k].kansuumei[0] - 'a') * ONE_CHAR_TBL);
891       for (kk = 0; *p && kk < ONE_CHAR_TBL; kk++, p++);
892       if (kk == ONE_CHAR_TBL)
893         {
894           print_out ("work area for key binding overflowed");
895           Free (one_char_tbl);
896           fclose (fp);
897           return (-1);
898         }
899       *p = &kansuu_hyo[k];
900     }
901 
902   for (tbl = 0; tbl < TBL_CNT; tbl++)
903     {
904       romkan_clear_tbl[tbl][rubout_code] = 0;
905     }
906   main_table[1][rubout_code] = rubout_c;
907   main_table[5][rubout_code] = t_rubout;
908   main_table[6][rubout_code] = t_rubout;
909 
910   lc = 0;
911   while (fgets (buf, 256, fp))
912     {
913       lc += 1;
914       if ((*buf == ';') || (*buf == ':') || (*buf == '\n'))
915         continue;
916       if ((com_cnt = sscanf (buf, "%s %s %s %s %s %s %s %s %s %s %s",
917                              func_name, com_name[0], com_name[1], com_name[2], com_name[3], com_name[4], com_name[5], com_name[6], com_name[7], com_name[8], com_name[9])) < 2)
918         {
919           print_out2 ("In uumkey file \"%s\", Line %d is illegal.", file_name, (char *) lc);
920           continue;             /* every command needs at least 1 argument. */
921         }
922 
923       if (strcmp (func_name, "include") == 0)
924         {
925           if (0 != expand_expr (com_name[0], lang))
926             {
927               print_out3 ("In uumkey file \"%s\", %s %s.", file_name, com_name[0], msg_get (cd, 22, default_message[22], lang));
928             }
929           key_binding (com_name[0], lang);
930         }
931       else if (strcmp (func_name, "unset") == 0)
932         {
933           if ((pp = find_entry (com_name[0], one_char_tbl)) != NULL)
934             {
935               pp->key_binded = 0;
936               remove_key_bind (pp);
937             }
938           else if (strcmp (com_name[0], "quote_keyin") == 0)
939             {
940 #ifndef XJUTIL
941               quote_code = -1;
942 #endif /* !XJUTIL */
943             }
944         }
945       else if (strcmp (func_name, "quote_keyin") == 0)
946         {
947 #ifndef XJUTIL
948           if ((com_num = expand_argument (com_name[0])) < 0)
949             {
950               print_out3 ("In uumkey file \"%s\",%s is an inappropriate code for %s.", file_name, com_name[0], func_name);
951               fflush (stderr);
952             }
953           else
954             quote_code = com_num;
955 #endif /* !XJUTIL */
956         }
957       else
958         {
959           p = one_char_tbl + ((func_name[0] - 'a') * ONE_CHAR_TBL);
960           for (k = 0; k < ONE_CHAR_TBL && *p; k++, p++)
961             {
962               if (strcmp (func_name, (*p)->kansuumei) == 0)
963                 {               /*found! */
964                   if ((*p)->key_binded)
965                     remove_key_bind (*p);
966                   (*p)->key_binded = (char) 1;
967                   for (kk = 0; kk < com_cnt - 1; kk++)
968                     {
969                       com_num = expand_argument (com_name[kk]);
970                       if (com_num < 0)
971                         {
972                           print_out3 ("In uumkey file \"%s\",%s is an inappropriate code for %s.", file_name, com_name[kk], func_name);
973                           fflush (stderr);
974                         }
975                       else
976                         {
977                           for (tbl = 0; tbl < TBL_CNT; tbl++)
978                             {
979                               if ((main_table[tbl][com_num] != NULL) && ((*p)->func[tbl] != NULL))
980                                 {
981                                   print_out7 ("In uumkey file \"%s\", %s(0x%x)%s at line %d (%s)(table No. %d).",
982                                               file_name, (char *) com_name[kk], (char *) com_num, (char *) msg_get (cd, 23, default_message[23], lang), (char *) lc, (*p)->kansuumei, (char *) tbl);
983                                   main_table[tbl][com_num] = (*p)->func[tbl];
984                                   romkan_clear_tbl[tbl][com_num] = (*p)->romkan_flag;
985                                 }
986                               else if ((*p)->func[tbl] != NULL)
987                                 {
988                                   main_table[tbl][com_num] = (*p)->func[tbl];
989                                   romkan_clear_tbl[tbl][com_num] = (*p)->romkan_flag;
990                                 }
991                             }
992                         }
993                     }
994                   break;
995                 }               /* end of routine when command is founded. */
996             }                   /* loop while command is founded */
997           if (k == ONE_CHAR_TBL || !*p)
998             {
999               print_out2 ("In uumkey file \"%s\", unknown entry name %s.", file_name, func_name);
1000             }
1001         }
1002     }
1003   fclose (fp);
1004   Free (one_char_tbl);
1005   return (0);
1006 }
1007 
1008 int
init_key_table(lang)1009 init_key_table (lang)
1010      char *lang;
1011 {
1012   FILE *fp = NULL, *fopen ();
1013   char file_name[PATHNAMELEN];
1014   int j, k;
1015   extern int fclose ();
1016 
1017 #ifdef  XJUTIL
1018   if (uumkey_name && *uumkey_name)
1019     strcpy (file_name, uumkey_name);
1020   if ((fp = fopen (file_name, "r")) != NULL)
1021     {
1022       fclose (fp);
1023     }
1024   else
1025     {
1026       print_out2 ("%s %s", msg_get (cd, 72, default_message[72], lang), CPFILE);
1027       return (-1);
1028     }
1029 #else /* XJUTIL */
1030   /* from uumrc */
1031   if (uumkeyname != NULL && uumkeyname[0] != '\0')
1032     {
1033       strcpy (file_name, uumkeyname);
1034       if (fp = fopen (file_name, "r"))
1035         fclose (fp);
1036     }
1037   if (!fp)
1038     {
1039       if (strcpy (file_name, LIBDIR), strcat (file_name, "/"), strcat (file_name, lang), strcat (file_name, CPFILE), (fp = fopen (file_name, "r")) != NULL)
1040         {
1041           /* default */
1042           if (!(uumkeyname = alloc_and_copy (file_name)))
1043             {
1044               return (-1);
1045             }
1046           fclose (fp);
1047         }
1048     }
1049   if (!fp)
1050     {
1051       print_out2 ("%s %s", msg_get (cd, 21, default_message[21], lang), CPFILE);
1052       return (-1);
1053     }
1054 
1055   if (!(c_c->m_table = (MainTable *) Malloc (sizeof (MainTable))))
1056     {
1057       malloc_error ("allocation of buffer for key binding");
1058       return (-1);
1059     }
1060   c_c->m_table->re_count = 1;
1061 #endif /* XJUTIL */
1062   for (j = 0; j < TBL_CNT; j++)
1063     {
1064       for (k = 0; k < TBL_SIZE; k++)
1065         {
1066           main_table[j][k] = (int (*)()) 0;
1067         }
1068       if (j < 3)
1069         {
1070           main_table[j][NEWLINE] = (int (*)()) 0;
1071           main_table[j][CR] = (int (*)()) 0;
1072         }
1073     }
1074   if (key_binding (file_name, lang) == -1)
1075     return (-1);
1076   return (0);
1077 }
1078 
1079 /*
1080   Local Variables:
1081   eval: (setq kanji-flag t)
1082   eval: (setq kanji-fileio-code 0)
1083   eval: (mode-line-kanji-code-update)
1084   End:
1085 */
1086