Mercurial > freewnn
diff Xwnmo/xwnmo/jikouho.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/Xwnmo/xwnmo/jikouho.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,459 @@ +/* + * $Id: jikouho.c,v 1.2 2001/06/14 18:16:16 ura 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 1991, 1992 by Massachusetts Institute of Technology + * + * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.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, 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 GNU Emacs; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Commentary: + * + * Change log: + * + * Last modified date: 8,Feb.1999 + * + * Code: + * + */ +/* Version 4.0 + */ +#include <stdio.h> +#include "commonhd.h" +#include "sdefine.h" +#include "xim.h" +#include "sheader.h" +#include "ext.h" + + +/* add by KUWA */ +int +dai_top (buf, bnst) + struct wnn_buf *buf; + int bnst; +{ + if (bnst >= jl_bun_suu (buf)) + return (jl_bun_suu (buf)); + for (; bnst >= 0 && !jl_dai_top (buf, bnst); bnst--); + return (bnst); +} + +int +dai_end (buf, bnst) + struct wnn_buf *buf; + int bnst; +{ + for (bnst++; bnst < jl_bun_suu (buf) && !jl_dai_top (buf, bnst); bnst++); + return (bnst); +} + +void +set_escape_code (x) + char *x; +{ + int m; + char buf[512]; + char *tmp; + + for (m = 0, tmp = x; *tmp; tmp++) + { + if (ESCAPE_CHAR ((*tmp & 0xff))) + { + buf[m++] = '^'; + if (*tmp == 0x7f) + buf[m++] = '?'; + else + buf[m++] = (*tmp + 'A' - 1); + } + else + { + buf[m++] = *tmp; + } + } + buf[m] = '\0'; + strcpy (x, buf); +} + +/* 次候補を一つずつ表示する関数 +num = 1 のとき次候補を、num = -1 のとき前候補を表示する */ +static int +jikouho (num) + int num; +{ + int tmp; + int mae_p; + /* 注目している文節の次候補がまだ用意されていない時は + まずそれを用意する。 */ + jl_env_set (bun_data_, bunsetsu_env[cur_bnst_]); + if (bunsetsu_env[cur_bnst_] == bunsetsu_env[cur_bnst_ + 1]) + mae_p = WNN_USE_ZENGO; + else + mae_p = WNN_USE_MAE; + if (jl_zenkouho_bun (bun_data_) != cur_bnst_ || jl_zenkouho_daip (bun_data_)) + { + if (jl_zenkouho (bun_data_, cur_bnst_, mae_p, WNN_UNIQ) < 0) + { + errorkeyin (); + return (-1); + } + } + + if (num == 1) + jl_next (bun_data_); + else if (num == -1) + jl_previous (bun_data_); + else + return (-1); + make_kanji_buffer (cur_bnst_); + + tmp = c_b->t_b_st; + c_b->t_m_start = bunsetsuend[cur_bnst_]; + c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)]; + c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1]; + t_redraw_move (bunsetsu[cur_bnst_], MIN_VAL (tmp, c_b->t_b_st), c_b->maxlen, 1); + check_scroll (); + return (0); +} + +/* 次候補を一つずつ表示する関数 +num = 1 のとき次候補を、num = -1 のとき前候補を表示する */ +static int +jikouho_dai (num) + int num; +{ + int tmp; + int mae_p; + /* 注目している文節の次候補がまだ用意されていない時は + まずそれを用意する。 */ + jl_env_set (bun_data_, bunsetsu_env[cur_bnst_]); + if (bunsetsu_env[cur_bnst_] == bunsetsu_env[dai_end (bun_data_, cur_bnst_)]) + mae_p = WNN_USE_ZENGO; + else + mae_p = WNN_USE_MAE; + if (jl_zenkouho_bun (bun_data_) != cur_bnst_ || !jl_zenkouho_daip (bun_data_)) + { + if (jl_zenkouho_dai (bun_data_, cur_bnst_, dai_end (bun_data_, cur_bnst_), mae_p, WNN_UNIQ) < 0) + { + errorkeyin (); + return (-1); + } + } + + if (num == 1) + jl_next_dai (bun_data_); + else if (num == -1) + jl_previous_dai (bun_data_); + else + return (-1); + make_kanji_buffer (cur_bnst_); + for (tmp = cur_bnst_ + 1; tmp < jl_bun_suu (bun_data_); tmp++) + bunsetsu_env[tmp] = jl_env_get (bun_data_); + tmp = c_b->t_b_st; + c_b->t_m_start = bunsetsuend[cur_bnst_]; + c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)]; + c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1]; + t_redraw_move (bunsetsu[cur_bnst_], MIN_VAL (tmp, c_b->t_b_st), c_b->maxlen, 1); + check_scroll (); + return (0); +} + + + +int +jikouho_c () +{ + jikouho (1); + return (0); +} + +int +zenkouho_c () +{ + jikouho (-1); + return (0); +} + +int +jikouho_dai_c () +{ + jikouho_dai (1); + return (0); +} + +int +zenkouho_dai_c () +{ + jikouho_dai (-1); + return (0); +} + +static int +make_jikouho_retu (h, h_m, r, r_m) + char *h; + int h_m; + int r_m; + char *r[]; +{ + int k; + char *c = h; + w_char tmp[512]; + char tmp1[512]; + + if (r_m <= jl_zenkouho_suu (bun_data_)) + return (-1); + + for (k = 0; k < jl_zenkouho_suu (bun_data_); k++) + { + r[k] = c; + tmp[0] = 0; + jl_get_zenkouho_kanji (bun_data_, k, tmp); + if (print_out_func) + (*print_out_func) (tmp, tmp, Strlen (tmp)); + delete_w_ss2 (tmp, Strlen (tmp)); + sStrcpy (tmp1, tmp); + if (c + strlen (tmp1) + 1 >= h_m + h) + { + return (-1); + } + set_escape_code (tmp1); /* add by KUWA */ + strcpy (c, tmp1); + c += strlen (tmp1) + 1; + } + return (0); +} + +static int +select_jikouho1 (daip, in) + int daip; + int in; +{ + static char *j_retu[MAXJIKOUHO]; + static char jikouho_heap[MAXJIKOUHO * 10]; + int c; + int tmp; + static int jikouho_step = 0; + static WnnClientRec *c_c_sv = 0; + static char *lang; + + if (c_c_sv != 0 && c_c != c_c_sv) + { + ring_bell (); + return (-1); + } + if (jikouho_step == 0) + { + jl_env_set (bun_data_, bunsetsu_env[cur_bnst_]); + if (jl_zenkouho_bun (bun_data_) != cur_bnst_ || jl_zenkouho_daip (bun_data_) != daip) + { + if (daip) + { + if (jl_zenkouho_dai (bun_data_, cur_bnst_, dai_end (bun_data_, cur_bnst_), WNN_USE_ZENGO, WNN_UNIQ) == -1) + { + errorkeyin (); + return (-1); + } + } + else + { + if (jl_zenkouho (bun_data_, cur_bnst_, WNN_USE_ZENGO, WNN_UNIQ) == -1) + { + errorkeyin (); + return (-1); + } + } + } + lang = cur_lang->lang; + if (make_jikouho_retu (jikouho_heap, MAXJIKOUHO * 10, j_retu, MAXJIKOUHO) == -1) + { + print_msg_getc ("%s", msg_get (cd, 3, default_message[3], lang), NULL, NULL); + return (-1); + } + c_c_sv = c_c; + jikouho_step++; + } + + if ((c = xw_select_one_element (j_retu, jl_zenkouho_suu (bun_data_), + jl_c_zenkouho (bun_data_), (daip ? msg_get (cd, 2, default_message[2], lang) : msg_get (cd, 1, default_message[1], lang)), JIKOUHO, main_table[4], in)) == -1) + { + jikouho_step = 0; + c_c_sv = 0; + return (-1); + } + else if (c == BUFFER_IN_CONT) + { + return (BUFFER_IN_CONT); + } + if (daip == WNN_SHO) + { + jl_set_jikouho (bun_data_, c); + } + else + { + jl_set_jikouho_dai (bun_data_, c); + } + make_kanji_buffer (cur_bnst_); + for (tmp = cur_bnst_ + 1; tmp < jl_bun_suu (bun_data_); tmp++) + bunsetsu_env[tmp] = jl_env_get (bun_data_); + c_b->t_m_start = bunsetsuend[cur_bnst_]; + c_b->t_c_p = bunsetsu[cur_bnst_]; + c_b->t_b_st = bunsetsu[dai_top (bun_data_, cur_bnst_)]; + c_b->t_b_end = bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1]; + jikouho_step = 0; + c_c_sv = 0; + return (0); +} + +int +select_jikouho (in) + int in; +{ + int ret; + static WnnClientRec *c_c_sv = 0; + +#ifdef CALLBACKS + if (IsPreeditCallbacks (cur_x) && cur_x->cb_redraw_needed) + { + redraw_line (); + c_c_sv = 0; + pop_func (c_c); + cur_x->cb_redraw_needed = 0; + return (0); + } +#endif /* CALLBACKS */ + if (c_c_sv != 0 && c_c != c_c_sv) + { + ring_bell (); + return (0); + } + if (c_c_sv == 0) + { + c_c_sv = c_c; + push_func (c_c, select_jikouho); + } + if ((ret = select_jikouho1 (WNN_SHO, in)) == BUFFER_IN_CONT) + { + return (BUFFER_IN_CONT); + } + else if (ret == -1) + { + if (cur_p->cur_xl->visible == 3) + { + t_print_l (); + } + } + else + { +#ifdef CALLBACKS + if (IsPreeditCallbacks (cur_x)) + { + cur_x->cb_redraw_needed = 1; + SendCBRedraw (); + return (BUFFER_IN_CONT); + } + else + { +#endif /* CALLBACKS */ + kk_cursor_invisible (); + redraw_line (); + kk_cursor_normal (); +#ifdef CALLBACKS + } +#endif /* CALLBACKS */ + } + c_c_sv = 0; + pop_func (c_c); + check_scroll (); + return (0); +} + +int +select_jikouho_dai (in) + int in; +{ + int ret; + static WnnClientRec *c_c_sv = 0; + +#ifdef CALLBACKS + if (IsPreeditCallbacks (cur_x) && cur_x->cb_redraw_needed) + { + redraw_line (); + c_c_sv = 0; + pop_func (c_c); + cur_x->cb_redraw_needed = 0; + return (0); + } +#endif /* CALLBACKS */ + if (c_c_sv != 0 && c_c != c_c_sv) + { + ring_bell (); + return (0); + } + if (c_c_sv == 0) + { + c_c_sv = c_c; + push_func (c_c, select_jikouho_dai); + } + if ((ret = select_jikouho1 (WNN_DAI, in)) == BUFFER_IN_CONT) + { + return (BUFFER_IN_CONT); + } + else if (ret == -1) + { + if (cur_p->cur_xl->visible == 3) + { + t_print_l (); + } + } + else + { +#ifdef CALLBACKS + if (IsPreeditCallbacks (cur_x)) + { + cur_x->cb_redraw_needed = 1; + SendCBRedraw (); + return (BUFFER_IN_CONT); + } + else + { +#endif /* CALLBACKS */ + kk_cursor_invisible (); + redraw_line (); + kk_cursor_normal (); +#ifdef CALLBACKS + } +#endif /* CALLBACKS */ + } + c_c_sv = 0; + pop_func (c_c); + check_scroll (); + return (0); +} + +/* + Local Variables: + eval: (setq kanji-flag t) + eval: (setq kanji-fileio-code 0) + eval: (mode-line-kanji-code-update) + End: +*/