2 * ¥í¡¼¥Þ»ú¤«¤éÊ¿²¾Ì¾¡ÊÀµ³Î¤Ë¤Ï¥¡¼¤ÎÎ󤫤éʸ»ú¡Ë¤Îɽ(rk_map)¤Î
3 * ¥«¥¹¥¿¥Þ¥¤¥º¤ò´ÉÍý¤¹¤ë
5 * Copyright (C) 2001-2002 UGAWA Tomoharu
6 * Copyright (C) 2002 Tabata Yusuke
8 * Funded by IPA̤Ƨ¥½¥Õ¥È¥¦¥§¥¢ÁϤ»ö¶È 2001
16 static const char* rk_default_symbol[128] = {
17 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
18 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
19 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
20 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
21 "¡¡", "¡ª", "¡É", "¡ô", "¡ð", "¡ó", "¡õ", "¡Ç",
22 "¡Ê", "¡Ë", "¡ö", "¡Ü", "¡¢", "¡¼", "¡£", "¡¿",
23 "£°", "£±", "£²", "£³", "£´", "£µ", "£¶", "£·",
24 "£¸", "£¹", "¡§", "¡¨", "¡ã", "¡á", "¡ä", "¡©",
26 "¡÷", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
27 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
28 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
29 NULL, NULL, NULL, "¡Ö", "¡À", "¡×", "¡°", "¡²",
30 "¡Æ", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
31 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
32 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
33 NULL, NULL, NULL, "¡Ð", "¡Ã", "¡Ñ", "¡Á", NULL
39 struct rk_conf_ent *next;
44 char toggle; /* ±Ñ¿ô¤È¤Î°ì»þŪ¤ÊÀÚÂؤ¨¤Ë»È¤¦¥·¥ó¥Ü¥ë */
46 * ÇÛÎó¤Ï¤½¤ì¤¾¤ì¥ê¥¹¥È¤ÎÀèƬ¤Ë¤Ê¤ë
47 * ¥ê¥¹¥È¤ÎÀèƬ¤Ï°ìʸ»ú¤Î¥¨¥ó¥È¥ê¤¬Æþ¤ë
49 struct rk_conf_ent hiragana_symbol[128]; /* ¤Ò¤é¤¬¤Ê¤È¤ÎÂбþ */
50 struct rk_conf_ent katakana_symbol[128]; /* ¥«¥¿¥«¥Ê¤È¤ÎÂбþ */
51 struct rk_conf_ent hankaku_kana_symbol[128]; /* ¥«¥¿¥«¥Ê¤È¤ÎÂбþ */
57 anthy_input_create_rk_option()
59 struct rk_option *opt;
62 opt = malloc(sizeof(struct rk_option));
63 opt->enable_default = 1;
65 for (i = 0; i < 128; i++) {
66 opt->hiragana_symbol[i].rhs = NULL;
67 opt->hiragana_symbol[i].lhs = NULL;
68 opt->hiragana_symbol[i].next = NULL;
69 opt->katakana_symbol[i].rhs = NULL;
70 opt->katakana_symbol[i].lhs = NULL;
71 opt->katakana_symbol[i].next = NULL;
72 opt->hankaku_kana_symbol[i].rhs = NULL;
73 opt->hankaku_kana_symbol[i].lhs = NULL;
74 opt->hankaku_kana_symbol[i].next = NULL;
80 anthy_input_free_rk_option(struct rk_option *opt)
84 err = anthy_input_do_clear_rk_option(opt, 1);
90 static struct rk_conf_ent *
91 find_rk_conf_ent(struct rk_option *opt, int map,
92 const char *key, int force)
95 struct rk_conf_ent *tab = NULL;
96 struct rk_conf_ent *sym = NULL;
102 if (map == RKMAP_HIRAGANA) {
103 tab = opt->hiragana_symbol;
105 if (map == RKMAP_KATAKANA) {
106 tab = opt->katakana_symbol;
108 if (map == RKMAP_HANKAKU_KANA) {
109 tab = opt->hankaku_kana_symbol;
114 if (strlen(key) == 1) {
118 for (sym = tab[c].next; sym; sym = sym->next) {
119 if (!strcmp(sym->lhs, key)) {
125 /* ¥á¥â¥ê³ÎÊݤ·¤Æ¤Ä¤Ê¤° */
126 sym = malloc(sizeof(struct rk_conf_ent));
129 sym->next = tab[c].next;
132 if (sym && !sym->lhs) {
133 sym->lhs = strdup(key);
139 * opt Êѹ¹ÂоݤÎoption
141 * from ÊÑ´¹¤â¤È¤Îʸ»ú
146 anthy_input_do_edit_rk_option(struct rk_option* opt, int map,
147 const char* from, const char* to, const char *follow)
149 struct rk_conf_ent *tab;
152 tab = find_rk_conf_ent(opt, map, from, 1);
163 tab->rhs = strdup(to);
169 free_rk_conf_ent(struct rk_conf_ent *e)
183 anthy_input_do_clear_rk_option(struct rk_option* opt,
188 opt->enable_default = use_default;
189 for (i = 0; i < 128; i++) {
191 struct rk_conf_ent *tab, *tmp;
192 /* ¤Ò¤é¤¬¤Ê¤Î¥ê¥¹¥È¤ò²òÊü */
193 for (tab = opt->hiragana_symbol[i].next; tab;) {
196 free_rk_conf_ent(tmp);
199 /* ¥«¥¿¥«¥Ê¤Î¥ê¥¹¥È¤ò²òÊü */
200 for (tab = opt->katakana_symbol[i].next; tab;) {
203 free_rk_conf_ent(tmp);
206 /* ÀèƬ¤Î°ìʸ»ú¤Î¥¨¥ó¥È¥ê¤â˺¤ì¤º¤Ë²òÊü */
207 free_rk_conf_ent(&opt->katakana_symbol[i]);
208 free_rk_conf_ent(&opt->hiragana_symbol[i]);
214 anthy_input_do_edit_toggle_option(struct rk_option* opt,
217 opt->toggle = toggle;
222 rkrule_set(struct rk_rule* r,
223 const char* lhs, const char* rhs, const char* follow)
231 make_rkmap_ascii(struct rk_option* opt)
233 struct rk_rule var_part[130];
234 struct rk_rule* complete_rules;
244 for (c = 0; c < 128; c++) {
245 if (rk_default_symbol[c]) {
248 rkrule_set(p++, w, w, NULL);
254 complete_rules = rk_merge_rules(rk_rule_alphabet, var_part);
255 map = rk_map_create(complete_rules);
256 rk_rules_free(complete_rules);
262 make_rkmap_wascii(struct rk_option* opt)
265 return rk_map_create(rk_rule_walphabet);
269 make_rkmap_shiftascii(struct rk_option* opt)
271 struct rk_rule var_part[130];
272 struct rk_rule* complete_rules;
275 char work[2*128 + 3];
278 int toggle_char = opt->toggle;
282 for (c = 0; c < 128; c++) {
283 if (rk_default_symbol[c]) {
284 if (c == toggle_char) {
285 /* ¥È¥°¥ë¤¹¤ëʸ»ú¤Î¾ì¹ç */
288 rkrule_set(p++, w, "\xff" "o", NULL);
292 rkrule_set(p++, w + 2, w, NULL);
295 /* ÉáÄ̤Îʸ»ú¤Î¾ì¹ç */
298 rkrule_set(p++, w, w, NULL);
305 complete_rules = rk_merge_rules(rk_rule_alphabet, var_part);
306 map = rk_map_create(complete_rules);
307 rk_rules_free(complete_rules);
313 count_rk_rule_ent(struct rk_option *opt, int map_no)
316 struct rk_conf_ent *head;
317 struct rk_conf_ent *ent;
319 if (map_no == RKMAP_HIRAGANA) {
320 head = opt->hiragana_symbol;
321 } else if (map_no == RKMAP_HANKAKU_KANA) {
322 head = opt->katakana_symbol;
324 head = opt->hankaku_kana_symbol;
328 for (i = 0; i < 128; i++) {
329 for (ent = head[i].next; ent; ent = ent->next) {
339 * ¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤È¥«¥¹¥¿¥Þ¥¤¥º¤µ¤ì¤¿¥ë¡¼¥ë¤ò¥Þ¡¼¥¸¤·¤Æ
342 static struct rk_map*
343 make_rkmap_hirakata(const struct rk_rule* rule,
344 struct rk_option *opt, int map_no)
346 struct rk_conf_ent *tab;
347 struct rk_rule* rk_var_part;
348 struct rk_rule* complete_rules;
351 int toggle = opt->toggle;
358 nr_rule = count_rk_rule_ent(opt, map_no);
360 rk_var_part = alloca(sizeof(struct rk_rule) *(nr_rule + 2));
361 work = alloca(2*128 + 8);
365 /* °ìʸ»ú¤Î¤â¤Î¤òrk_var_part¤Ë½ñ¤¹þ¤ó¤Ç¤¤¤¯ */
372 w[3] = '0' + RKMAP_SHIFT_ASCII;
374 rkrule_set(p++, w, w + 2, NULL);
378 tab = find_rk_conf_ent(opt, map_no, buf, 0);
379 if (tab && tab->rhs) {
380 rkrule_set(p++, w + 5, tab->rhs, NULL);
382 rkrule_set(p++, w + 5, rk_default_symbol[toggle], NULL);
386 for (c = 0; c < 128; c++) {
393 tab = find_rk_conf_ent(opt, map_no, buf, 0);
394 if (tab && tab->rhs) {
395 /* ¥«¥¹¥¿¥Þ¥¤¥ººÑ¤Î¤¬¤¢¤ë */
396 rkrule_set(p++, w, tab->rhs, NULL);
397 } else if (rk_default_symbol[c]) {
399 rkrule_set(p++, w, rk_default_symbol[c], NULL);
402 /* Æóʸ»ú°Ê¾å¤Î¤â¤Î */
404 for (tab = tab->next; tab; tab = tab->next) {
405 rkrule_set(p++, tab->lhs, tab->rhs, NULL);
412 if (opt->enable_default) {
413 complete_rules = rk_merge_rules(rule, rk_var_part);
414 map = rk_map_create(complete_rules);
415 rk_rules_free(complete_rules);
417 map = rk_map_create(rk_var_part);
424 make_rkmap_hiragana(struct rk_option* opt)
426 return make_rkmap_hirakata(rk_rule_hiragana,
427 opt, RKMAP_HIRAGANA);
431 make_rkmap_katakana(struct rk_option* opt)
433 return make_rkmap_hirakata(rk_rule_katakana,
434 opt, RKMAP_KATAKANA);
438 make_rkmap_hankaku_kana(struct rk_option *opt)
440 return make_rkmap_hirakata(rk_rule_hankaku_kana,
441 opt, RKMAP_HANKAKU_KANA);