Mercurial > freewnn
diff Wnn/uum/key_bind.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/uum/key_bind.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,533 @@ +/* + * $Id: key_bind.c,v 1.5 2002/03/30 01:45:41 hiroo Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright Kyoto University Research Institute for Mathematical Sciences + * 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright FreeWnn Project 1999, 2000, 2002 + * + * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + 0: 変換後、変換結果を修正しているモード + 1: 変換前の文字列を入力しているモード + 2: 変換後、文節の区切りを伸ばしたり縮めたりしているモード + 3: バッファに文字が何も入っていないモード + 4: カーソルを動かしながら、何か候補を選択する時のモード + 5: 単語登録時に、漢字の範囲を設定している時のモード + 6: 単語登録時の読み入力などの文字列を入力している時 + 7: 単語検索のモード + 8: 辞書検索のモード + 9:インスペクトのモード +*/ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# if HAVE_STRINGS_H +# include <strings.h> +# endif +#endif /* STDC_HEADERS */ + +#include "commonhd.h" +#include "wnn_config.h" +#include "sdefine.h" +#include "sheader.h" +#define MADA NULL + +extern int insert_it_as_yomi (); +extern int select_jikouho (); +extern int select_jikouho_dai (); +extern int jikouho_c (); +extern int zenkouho_c (); +extern int jikouho_dai_c (); +extern int zenkouho_dai_c (); +extern int enlarge_bunsetsu (); +extern int smallen_bunsetsu (); +extern int top_bunsetsu (); +extern int end_bunsetsu (); +extern int ren_henkan (); +extern int tan_henkan (); +extern int tan_henkan_dai (); +extern int nobi_henkan (); +extern int nobi_henkan_dai (); +extern int send_string (); +extern int t_yank (); +extern int yank_c (); +extern int kakutei (); +extern int remember_me (); +extern int reset_line (); +extern int touroku_c (); +extern int forward_char (); +extern int backward_char (); +extern int forward (); +extern int backward (); +extern int c_top (); +extern int c_end (); +extern int c_end_nobi (); +extern int t_quit (); +extern int t_delete_char (); +extern int delete_c (); +extern int t_rubout (); +extern int rubout_c (); +extern int t_markset (); +extern int kuten (); +extern int t_kill (); +extern int kill_c (); +extern int kaijo (); +extern int t_jmp_forward (); +extern int t_jmp_backward (); +extern int t_ret (); +extern int previous_history (); +extern int next_history (); +extern int forward_bunsetsu (); +extern int backward_bunsetsu (); +extern int jutil_c (); +extern int jis (); +extern int tijime (); +extern int jmptijime (); +extern int henkan_forward (); +extern int henkan_backward (); +extern int backward_c (); +extern int quote (); +extern int send_ascii (); +extern int not_send_ascii (); +extern int toggle_send_ascii (); +extern int send_ascii_e (); +extern int not_send_ascii_e (); +extern int toggle_send_ascii_e (); +extern int pop_send_ascii (); +extern int pop_send_ascii_e (); +extern int quote_send_ascii_e (); +extern int reconnect_jserver (); + +extern int select_select (); +extern int quit_select (); +extern int lineend_select (); +extern int linestart_select (); +extern int redraw_select (); +extern int previous_select (); +extern int next_select (); +extern int backward_select (); +extern int forward_select (); + +extern int select_select_line (); +extern int quit_select_line (); +extern int lineend_select_line (); +extern int linestart_select_line (); +extern int redraw_select_line (); +extern int previous_select_line (); +extern int next_select_line (); +extern int backward_select_line (); +extern int forward_select_line (); +extern int inspect_kouho (); +extern int sakujo_kouho (); + +extern int henkan_off (); + +extern int kdicdel (); +extern int kdicuse (); +extern int kdiccom (); +extern int kworddel (); +extern int kworduse (); +extern int kwordcom (); +extern int kwordima (); +extern int kwordhindo (); + +extern int inspectdel (); +extern int inspectuse (); +extern int previous_inspect (); +extern int next_inspect (); + +extern int kankana_ren_henkan (); + +static struct kansuu kansuu_hyo[] = { + {"send_string", "send what is in the buffer to pty.", 0, send_string, send_string, send_string, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"forward_char", "cursor wo hitotu maeni susumeru.", 1, forward_bunsetsu, forward_char, henkan_forward, NULL, NULL, forward_char, forward_char, NULL, NULL, NULL}, + {"backward_char", "cursor wo hitotu usironi susumeru.", 1, backward_bunsetsu, backward_c, henkan_backward, NULL, NULL, backward_char, backward_char, NULL, NULL, NULL}, + {"goto_top_of_line", "", 1, top_bunsetsu, c_top, jmptijime, NULL, NULL, c_top, c_top, NULL, NULL, NULL}, + {"goto_end_of_line", "", 1, end_bunsetsu, c_end, c_end_nobi, NULL, NULL, c_end, c_end, NULL, NULL, NULL}, + {"delete_char_at_cursor", "", 1, NULL, delete_c, NULL, NULL, NULL, t_delete_char, t_delete_char, NULL, NULL, NULL}, + {"kaijo", "", 0, kaijo, NULL, kaijo, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"henkan", "", 1, NULL, ren_henkan, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"tan_henkan", "", 1, NULL, tan_henkan, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"tan_henkan_dai", "", 1, NULL, tan_henkan_dai, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"jikouho", "", 0, jikouho_c, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"zenkouho", "", 0, zenkouho_c, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"jikouho_dai", "", 0, jikouho_dai_c, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"zenkouho_dai", "", 0, zenkouho_dai_c, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"select_jikouho", "", 0, select_jikouho, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"select_jikouho_dai", "", 0, select_jikouho_dai, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"kill", "", 1, NULL, kill_c, NULL, NULL, NULL, t_kill, t_kill, NULL, NULL, NULL}, + {"yank", "", 1, NULL, yank_c, NULL, NULL, NULL, t_yank, t_yank, NULL, NULL, NULL}, + {"yank_e", "", 1, NULL, yank_c, NULL, yank_c, NULL, t_yank, t_yank, NULL, NULL, NULL}, + {"bunsetu_nobasi", "", 0, enlarge_bunsetsu, NULL, forward, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"bunsetu_chijime", "", 0, smallen_bunsetsu, NULL, tijime, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"jisho_utility", "", 0, jutil_c, jutil_c, jutil_c, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"jisho_utility_e", "", 0, jutil_c, jutil_c, jutil_c, jutil_c, NULL, NULL, NULL, NULL, NULL, NULL}, + {"touroku", "", 1, touroku_c, touroku_c, touroku_c, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"touroku_e", "", 1, touroku_c, touroku_c, touroku_c, touroku_c, NULL, NULL, NULL, NULL, NULL, NULL}, + {"kakutei", "", 1, kakutei, kakutei, kakutei, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"sainyuuryoku", "", 1, NULL, remember_me, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"sainyuuryoku_e", "", 1, NULL, remember_me, NULL, remember_me, NULL, NULL, NULL, NULL, NULL, NULL}, + {"kuten", "", 0, NULL, kuten, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"kuten_e", "", 0, NULL, kuten, NULL, kuten, NULL, NULL, NULL, NULL, NULL, NULL}, + {"jis", "", 0, NULL, jis, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"jis_e", "", 0, NULL, jis, NULL, jis, NULL, NULL, NULL, NULL, NULL, NULL}, + {"redraw_line", "", 1, reset_line, reset_line, reset_line, NULL, redraw_select, reset_line, reset_line, redraw_select_line, redraw_select_line, redraw_select_line}, + {"redraw_line_e", "", 1, reset_line, reset_line, reset_line, reset_line, redraw_select, reset_line, reset_line, redraw_select_line, redraw_select_line, redraw_select_line}, + {"previous_history_e", "", 1, NULL, previous_history, NULL, previous_history, NULL, NULL, NULL, NULL, NULL, NULL}, + {"previous_history", "", 1, NULL, previous_history, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"next_history_e", "", 1, NULL, next_history, NULL, next_history, NULL, NULL, NULL, NULL, NULL, NULL}, + {"next_history", "", 1, NULL, next_history, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"touroku_mark_set", "", 0, NULL, NULL, NULL, NULL, NULL, t_markset, NULL, NULL, NULL, NULL}, + {"touroku_return", "", 0, NULL, NULL, NULL, NULL, NULL, NULL, t_ret, NULL, NULL, NULL}, + {"quit", "", 0, NULL, NULL, NULL, NULL, quit_select, t_quit, t_quit, quit_select_line, quit_select_line, quit_select_line}, + {"touroku_jump_forward", "", 0, NULL, NULL, NULL, NULL, NULL, t_jmp_forward, NULL, NULL, NULL, NULL}, + {"touroku_jump_backward", "", 0, NULL, NULL, NULL, NULL, NULL, t_jmp_backward, NULL, NULL, NULL, NULL}, + {"change_to_insert_mode", "", 0, insert_it_as_yomi, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"quote_e", "", 0, NULL, quote, NULL, quote, NULL, NULL, NULL, NULL, NULL, NULL}, + {"quote", "", 0, NULL, quote, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"send_ascii_char", "", 0, send_ascii, send_ascii, send_ascii, send_ascii_e, send_ascii, send_ascii, send_ascii, send_ascii, send_ascii, send_ascii}, + + {"toggle_send_ascii_char", "", 0, toggle_send_ascii, toggle_send_ascii, toggle_send_ascii, toggle_send_ascii_e, toggle_send_ascii, toggle_send_ascii, toggle_send_ascii, toggle_send_ascii, + toggle_send_ascii, toggle_send_ascii}, + {"not_send_ascii_char", "", 0, not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii_e, not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii, not_send_ascii}, + {"pop_send_ascii_char", "", 0, pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii_e, pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii, pop_send_ascii}, + {"quote_send_ascii_char", "", 0, NULL, NULL, NULL, quote_send_ascii_e, NULL, NULL, NULL, NULL, NULL, NULL}, + {"select_select", "", 0, NULL, NULL, NULL, NULL, select_select, NULL, NULL, select_select_line, select_select_line, select_select_line}, + {"lineend_select", "", 0, NULL, NULL, NULL, NULL, lineend_select, NULL, NULL, lineend_select_line, lineend_select_line, lineend_select_line}, + {"linestart_select", "", 0, NULL, NULL, NULL, NULL, linestart_select, NULL, NULL, linestart_select_line, linestart_select_line, linestart_select_line}, + {"previous_select", "", 0, NULL, NULL, NULL, NULL, previous_select, NULL, NULL, previous_select_line, previous_select_line, previous_inspect}, + {"next_select", "", 0, NULL, NULL, NULL, NULL, next_select, NULL, NULL, next_select_line, next_select_line, next_inspect}, + {"backward_select", "", 0, NULL, NULL, NULL, NULL, backward_select, NULL, NULL, backward_select_line, backward_select_line, backward_select_line}, + {"forward_select", "", 0, NULL, NULL, NULL, NULL, forward_select, NULL, NULL, forward_select_line, forward_select_line, forward_select_line}, + + {"reconnect_jserver", "", 0, reconnect_jserver, reconnect_jserver, reconnect_jserver, NULL, reconnect_jserver, reconnect_jserver, reconnect_jserver, reconnect_jserver, reconnect_jserver, + reconnect_jserver}, + {"henkan_on", "", 0, henkan_off, henkan_off, henkan_off, henkan_off, henkan_off, henkan_off, henkan_off, henkan_off, henkan_off, henkan_off}, + {"inspect", "", 0, inspect_kouho, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"sakujo_kouho", "", 0, sakujo_kouho, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"nobi_henkan_dai", "", 0, NULL, NULL, nobi_henkan_dai, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"nobi_henkan", "", 0, NULL, NULL, nobi_henkan, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"del_entry", "", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, kworddel, kdicdel, inspectdel}, + {"use_entry", "", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, kworduse, kdicuse, inspectuse}, + {"com_entry", "", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, kwordcom, kdiccom, NULL}, + {"kana_henkan", "", 1, NULL, kankana_ren_henkan, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {"hindo_set", "", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, kwordhindo, NULL, NULL}, + {"ima_bit", "", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, kwordima, NULL, NULL} +}; + +int kansuu_hyo_entry_suu = sizeof (kansuu_hyo) / sizeof (struct kansuu); + +static char key_binded[sizeof (kansuu_hyo) / sizeof (struct kansuu) + 1]; + +int key_binding (); + +int +init_key_table () +{ + FILE *fp, *fopen (); + char file_name[PATHNAMELEN]; + int j, k; + + for (k = 0; k < sizeof (kansuu_hyo) / sizeof (struct kansuu); k++) + { + key_binded[k] = 0; + } + + /* uumrcファイルから。 */ + if (uumkey_name_in_uumrc[0] != '\0') + { + strcpy (file_name, uumkey_name_in_uumrc); + } + else if (strcpy (file_name, LIBDIR), strcat (file_name, "/"), strcat (file_name, lang_dir), strcat (file_name, CPFILE), (fp = fopen (file_name, "r")) != NULL) + { + /* default */ + fclose (fp); + } + else + { +/* fprintf(stderr, "Can't open default key bind file.%s\n" , CPFILE); */ +/* fprintf(stderr,"デフォルトのキーバインドが異常です。 %s\n",CPFILE); */ + fprintf (stderr, MSG_GET (29), CPFILE); + return (-1); + } + + for (j = 0; j < 3; j++) + { +/* + for(k = 0; k < 32;k++){ + main_table[j][k] = null_fun; + } +*/ + for (k = 0; k < TBL_SIZE; k++) + { + main_table[j][k] = NULL; + } + main_table[j][NEWLINE] = (int (*)()) 0; + main_table[j][CR] = (int (*)()) 0; + } + for (j = 3; j < TBL_CNT; j++) + { + for (k = 0; k < TBL_SIZE; k++) + { + main_table[j][k] = NULL; + } + } + if (key_binding (file_name) == -1) + return (-1); + return (0); +} + + +int +key_binding (file_name) + char file_name[64]; +{ + register int k, kk; + FILE *fp, *fopen (); + char func_name[64]; + int com_cnt; + int com_num; + char buf[256]; + char com_name[16][EXPAND_PATH_LENGTH]; + int lc = 0; + int tbl; + + if (verbose_option) + fprintf (stderr, "keybind: using keybind-file %s\r\n", file_name); + if ((fp = fopen (file_name, "r")) == NULL) + { + printf ("Key_binding file \"%s\" doesn't exist.\r\n", file_name); + return (-1); + } + + for (tbl = 0; tbl < TBL_CNT; tbl++) + { + romkan_clear_tbl[tbl][rubout_code] = 0; /* Not clear romkan when rubout */ + } + main_table[1][rubout_code] = rubout_c; + main_table[5][rubout_code] = t_rubout; + main_table[6][rubout_code] = t_rubout; + + lc = 0; + while (fgets (buf, 256, fp)) + { + lc += 1; + if ((*buf == ';') || (*buf == ':') || (*buf == '\n')) + continue; /* for comment lines */ + if ((com_cnt = sscanf (buf, "%s %s %s %s %s %s %s %s %s %s %s", 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) + { /* able to get at most 9 arguments. */ + printf ("uumkey:file %s. Line %d is illegal.\r\n", file_name, lc); + continue; /* every command needs at least 1 argument. */ + } + +/* henkan_on is treated as like others. so REMOVE below if possible. + if (strcmp(func_name, "henkan_on")== 0){ + if ((com_num = expand_argument(com_name[0])) < 0) { + fprintf(stderr,"uumkey: %s に対する %s は不適切なコードです。\r\n", + func_name, com_name[0]); + fflush(stderr); + } else kk_on = com_num; + } else +*/ + if (strcmp (func_name, "include") == 0) + { + if (0 != expand_expr (com_name[0])) + { + /* + fprintf(stderr,"uumkey: %s を展開できません。\r\n", com_name[0]); + */ + fprintf (stderr, MSG_GET (29), com_name[0]); + } + key_binding (com_name[0]); + } + else if (strcmp (func_name, "unset") == 0) + { + if ((k = find_entry (com_name[0])) != -1) + { + key_binded[k] = 0; + remove_key_bind (k); + } + else if (strcmp (com_name[0], "quote_keyin") == 0) + { + quote_code = -1; + } + } + else if (strcmp (func_name, "quote_keyin") == 0) + { + if ((com_num = expand_argument (com_name[0])) < 0) + { + fprintf (stderr, "uumkey: %s is an inappropriate code for %s.\r\n", com_name[0], func_name); + fflush (stderr); + } + else + quote_code = com_num; + } + else + { + for (k = 0; k < kansuu_hyo_entry_suu; k++) + { + if (strcmp (func_name, kansuu_hyo[k].kansuumei) == 0) + { /* found ! */ + if (key_binded[k]) + { + remove_key_bind (k); + } + key_binded[k] = 1; + for (kk = 0; kk < com_cnt - 1; kk++) + { + com_num = expand_argument (com_name[kk]); + if (com_num < 0) + { + fprintf (stderr, "uumkey: %s is an inappropriate code for %s.\r\n", com_name[kk], func_name); + fflush (stderr); + } + else + { + for (tbl = 0; tbl < TBL_CNT; tbl++) + { + if ((main_table[tbl][com_num] != NULL) && (kansuu_hyo[k].func[tbl] != NULL)) + { + /* fprintf(stderr, "uumkey: Duplicate Definition at key: %s.\n",com_name[kk]); */ + /* + fprintf(stderr, "uumkey: %s(0x%x)のキーが二重定義です。at line %d (%s)(table No. %d).\r\n", + */ + fprintf (stderr, MSG_GET (30), com_name[kk], com_num, lc, kansuu_hyo[k].kansuumei, tbl); +/* fprintf(stderr, "lc = %d,kansuu_hyo %d(%s) ,%d , \ + %s(0x%x)のキーが二重定義です。\n",lc,k,kansuu_hyo[k].kansuumei,tbl ,com_name[kk], + com_num); +*/ + main_table[tbl][com_num] = kansuu_hyo[k].func[tbl]; + romkan_clear_tbl[tbl][com_num] = kansuu_hyo[k].romkan_flag; + } + else if (kansuu_hyo[k].func[tbl] != NULL) + { + main_table[tbl][com_num] = kansuu_hyo[k].func[tbl]; + romkan_clear_tbl[tbl][com_num] = kansuu_hyo[k].romkan_flag; + } + } + } + } + break; + } /* end of routine when command is founded. */ + + /* loop while command is founded */ + } + if (k == kansuu_hyo_entry_suu) + { + fprintf (stderr, "uumkey: unknown entry name %s.\r\n", func_name); + } + } + } + fclose (fp); + return (0); +} + +/** argument expansion. */ +int +expand_argument (st) + char *st; +{ + int num; + + if (*st == '^') + { + num = (*(st + 1)) & 0x1f; + } + else if (*st == '0' || *st == '\\') + { + if (*(st + 1) == 'x' || *(st + 1) == 'X') + { + sscanf (st + 2, "%x", &num); + } + else + { + sscanf (st, "%o", &num); + } + } + else if (!('0' <= *st && *st <= '9')) + { + return (-1); + } + else + { + num = atoi (st); + } + if (num >= TBL_SIZE) + { + printf ("uumkey: You can only bind a function to code less than %d.\r\n", TBL_SIZE); + return (-1); + } + return (num); +} + +void +remove_key_bind (key) + int key; +{ + int tbl; + int com; + + for (com = 0; com < TBL_SIZE; com++) + { + for (tbl = 0; tbl < TBL_CNT; tbl++) + { + if (kansuu_hyo[key].func[tbl] != NULL) + { + if (main_table[tbl][com] == kansuu_hyo[key].func[tbl]) + { + main_table[tbl][com] = NULL; + } + } + } + } +} + + +int +find_entry (com_name) + char *com_name; +{ + int k; + + for (k = 0; k < kansuu_hyo_entry_suu; k++) + { + if (strcmp (com_name, kansuu_hyo[k].kansuumei) == 0) + { + if (key_binded[k]) + { + return (k); + } + } + } + return (-1); +}