Mercurial > freewnn
diff Xwnmo/xwnmo/uif.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/uif.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,1277 @@ +/* + * $Id: uif.c,v 1.2 2001/06/14 18:16:17 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 "config.h" +#include "sdefine.h" +#include "xim.h" +#include "sheader.h" +#include "ext.h" +#include "rk_spclval.h" +#include "rk_fundecl.h" + +/* +static int henkan_mode; +*/ +/* 0: select + 1: yomi_nyuuryoku + 2: bunsetu_nobasi + 3: kara +*/ + +static void +not_to_han_or_hira () +{ + cur_bnst_sv = -1; + save_yomi[0] = 0; +} + +static void +recover_to_han_or_hira (yomi) + register w_char *yomi; +{ + int i; + if (cur_bnst_sv == cur_bnst_) + { + Strcpy (yomi, save_yomi); + } + else if (cur_bnst_sv >= 0 && cur_bnst_sv < cur_bnst_) + { + i = jl_yomi_len (bun_data_, cur_bnst_sv, cur_bnst_); + Strcpy (yomi, save_yomi + i); + } + else + { + jl_get_yomi (bun_data_, cur_bnst_, cur_bnst_sv, yomi); + yomi[jl_yomi_len (bun_data_, cur_bnst_, cur_bnst_sv)] = 0; + Strcat (yomi, save_yomi); + } +} + +void +push_func (w_c, func) + WnnClientRec *w_c; + int (*func) (); +{ + if (w_c->func_stack_count >= (MAX_FUNC_STACK - 1)) + return; + w_c->func_stack_count++; + w_c->command_func_stack[w_c->func_stack_count] = func; +} + +void +pop_func (w_c) + WnnClientRec *w_c; +{ + if (w_c->func_stack_count < 0) + return; + w_c->command_func_stack[w_c->func_stack_count] = (int (*)()) 0; + w_c->func_stack_count--; +} + +static int +push_char_return (c, romkan) + int c, romkan; +{ + kakutei (); + if (send_ascii_char && (NORMAL_CHAR (c) || c == 0x09) && is_HON (romkan)) + { + if (c_b->maxlen < c_b->buflen) + { + c_b->maxlen += 1; + c_b->buffer[Strlen (c_b->buffer)] = (w_char) (c & 0xffff); + } + } + else + { + push_unget_buf (romkan); + } + return (1); +} + +static void +change_to_henkango_mode () +{ + c_b->key_table = main_table[0]; + c_b->rk_clear_tbl = romkan_clear_tbl[0]; + c_b->key_in_fun = push_char_return; + c_b->ctrl_code_fun = (int (*)()) 0; + c_b->hanten = 0x04 | 0x40; + henkan_mode = 0; + kk_cursor_invisible (); +} + +static void +change_to_insert_mode () +{ + c_b->key_table = main_table[1]; + c_b->rk_clear_tbl = romkan_clear_tbl[1]; + c_b->key_in_fun = (int (*)()) 0; + c_b->ctrl_code_fun = (int (*)()) 0; + c_b->hanten = 0x08 | 0x20; + henkan_mode = 1; + kk_cursor_normal (); +} + +static int +ignore_it_and_clear_romkan () +{ + romkan_clear (); + return (0); +} + +static void +change_to_nobasi_tijimi_mode () +{ + c_b->key_table = main_table[2]; + c_b->rk_clear_tbl = romkan_clear_tbl[2]; + c_b->key_in_fun = ignore_it_and_clear_romkan; + c_b->ctrl_code_fun = (int (*)()) 0; + c_b->hanten = 0x04; + henkan_mode = 2; + kk_cursor_invisible (); +} + +int +insert_char_and_change_to_insert_mode (c) + int c; +{ + insert_char (c); + t_redraw_move (c_b->t_c_p + 1, c_b->t_c_p, c_b->maxlen, 0); + change_to_insert_mode (); + if (send_ascii_char_quote == 1 && send_ascii_char == 0) + { + send_ascii_char = 1; + send_ascii_char_quote = 0; + } + check_scroll (); + return (0); +} + +int +insert_modep () +{ + return (henkan_mode == 1); +} + +int +empty_modep () +{ + return (henkan_mode == 3); +} + +static int +nobasi_tijimi_mode () +{ + return (henkan_mode == 2); +} + +int +kakutei () +{ + int moji_suu = 0; + w_char *w = 0; + w_char yomi[512]; + /* conversion nashi de kakutei surubaai wo kouryo seyo. */ + + remember_buf[0] = 0; + if (jl_bun_suu (bun_data_) != 0) + { + jl_get_yomi (bun_data_, 0, -1, remember_buf); + } + if (insert_modep ()) + { + moji_suu = c_b->maxlen - c_b->t_m_start; + if (moji_suu > 0) + { + w = remember_buf + Strlen (remember_buf); + Strncat (w, c_b->buffer + c_b->t_m_start, moji_suu); + } + } + else if (nobasi_tijimi_mode ()) + { + moji_suu = jl_get_yomi (bun_data_, cur_bnst_, -1, yomi); + Strcpy (c_b->buffer + c_b->t_c_p, yomi); + c_b->maxlen = Strlen (c_b->buffer); + jl_kill (bun_data_, cur_bnst_, -1); + } + c_b->buffer[0] = 0; + if (jl_bun_suu (bun_data_) != 0) + { + jl_get_kanji (bun_data_, 0, -1, c_b->buffer); + if (jl_update_hindo (bun_data_, 0, -1) == -1) + { + errorkeyin (); + redraw_line (); + } + } + if (insert_modep () && moji_suu > 0 && w) + { + Strcat (c_b->buffer, w); + } + else if (nobasi_tijimi_mode () && moji_suu > 0) + { + Strcat (c_b->buffer, yomi); + } + c_b->maxlen = Strlen (c_b->buffer); + + throw_col (-1); + clr_line_all (); + return (1); +} + +int +return_it (c, romkan) + int c, romkan; +{ + return_cl_it (); + return (0); +} + +int +return_it_if_ascii (c, nisemono) + int c; + int nisemono; /* it means that what romkan returned is a nisemono character. */ +{ + if ((NORMAL_CHAR (c) || c == 0x09) && is_HON (nisemono)) + { +#ifdef nodef /* use return_cl_it() instead of xw_write(). */ + c_b->maxlen = 1; + c_b->buffer[0] = c; + return (1); +#endif + return_cl_it (); + return (0); + } + else + { + insert_char_and_change_to_insert_mode (c); + return (0); + } +} + +static void +change_to_empty_mode () +{ + c_b->key_table = main_table[3]; + c_b->rk_clear_tbl = romkan_clear_tbl[3]; + if (send_ascii_char) + { + c_b->key_in_fun = return_it_if_ascii; + } + else + { + c_b->key_in_fun = insert_char_and_change_to_insert_mode; + } + c_b->ctrl_code_fun = return_it; + c_b->hanten = 0x08 | 0x20; + henkan_mode = 3; + throw_col (0); + kk_cursor_normal (); +} + +int +redraw_nisemono_c () +{ + redraw_nisemono (); + if (c_b->maxlen == 0) + { + change_to_empty_mode (); + } + return (0); +} + +int +kk (c) + int c; +{ + int len; + + if (buffer_in (c) == -1) + return (-1); + pop_func (c_c); + if (print_out_func) + { + len = (*print_out_func) (return_buf, c_b->buffer, c_b->maxlen); + } + else + { + Strncpy (return_buf, c_b->buffer, c_b->maxlen); + len = c_b->maxlen; + } + delete_w_ss2 (return_buf, len); + clear_c_b (); + /*** + romkan_clear(); + ***/ + return (len); +} + +static void +initialize_vars () +{ + cur_bnst_ = 0; +} + +void +clear_c_b () +{ + initialize_vars (); + if (bun_data_) + jl_kill (bun_data_, 0, -1); + c_b->buffer = input_buffer; + c_b->t_c_p = 0; + c_b->maxlen = 0; + c_b->buflen = maxchg; + c_b->redraw_fun = redraw_nisemono_c; + c_b->t_m_start = 0; + c_b->t_b_st = 0; + c_b->t_b_end = 0; + change_to_empty_mode (); + init_screen (); +} + +void +make_kanji_buffer (bnst) + int bnst; +{ + int k, l; + w_char *bp; + w_char *buffer_end; + + buffer_end = c_b->buffer + c_b->buflen - 1; + if (bnst) + bp = c_b->buffer + bunsetsuend[bnst - 1]; + else + bp = c_b->buffer; + for (k = bnst; k < jl_bun_suu (bun_data_); k++) + { + if (k < maxbunsetsu) + bunsetsu[k] = bp - c_b->buffer; + l = jl_get_kanji (bun_data_, k, k + 1, bp); + bp += l; + if (k < maxbunsetsu) + bunsetsuend[k] = bp - c_b->buffer; + if (bp > buffer_end) + { + c_b->maxlen = bp - c_b->buffer; + } + } + if (k < maxbunsetsu) + { + bunsetsu[k++] = bp - c_b->buffer; + bunsetsuend[k++] = bp - c_b->buffer; + } + else + { + bunsetsu[maxbunsetsu - 1] = bp - c_b->buffer; + bunsetsuend[maxbunsetsu - 1] = bp - c_b->buffer; + } + c_b->maxlen = bp - c_b->buffer; +} + + +int +isconect_jserver () +{ + if (c_c->use_server == 0) + return (0); + if (!jl_isconnect (bun_data_)) + { +#ifdef USING_XJUTIL + kill_xjutil (cur_lang); +#endif /* USING_XJUTIL */ + if (connect_server (cur_lang) < 0) + return (0); + } + if (c_c->use_server && !jl_isconnect (bun_data_)) + { + print_msg_getc (" %s", msg_get (cd, 27, default_message[27], cur_lang->lang), NULL, NULL); + return (0); + } + return (1); +} + +static int +ren_henkan0 () +{ + w_char yomi[256]; + int moji_suu; + register int i; + + if (!isconect_jserver ()) + { + return (0); + } + + c_b->buflen = maxchg; + moji_suu = c_b->maxlen - c_b->t_m_start; + if (moji_suu > 0) + { + int ret; + Strncpy (yomi, c_b->buffer + c_b->t_m_start, moji_suu); + yomi[moji_suu] = 0; + ret = jl_ren_conv (bun_data_, yomi, cur_bnst_, -1, WNN_USE_MAE); + for (i = cur_bnst_; i < jl_bun_suu (bun_data_); i++) + bunsetsu_env[i] = jl_env_get (bun_data_); + if (ret == -1) + { + errorkeyin (); + t_print_l (); + return (0); + } + make_kanji_buffer (0); + change_to_henkango_mode (); + 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_], bunsetsu[dai_top (bun_data_, cur_bnst_)], c_b->maxlen, 1); + check_scroll (); + } + return (0); +} + +int +ren_henkan () +{ + jl_env_set (bun_data_, env_normal); + return (ren_henkan0 ()); +} + +int +kankana_ren_henkan () +{ + if (c_c->cur_reverse_env && reverse_envrcname && *reverse_envrcname != '\0') + { + not_to_han_or_hira (); + jl_env_set (bun_data_, env_reverse); + return (ren_henkan0 ()); + } + else + { + ring_bell (); + return (0); + } +} + +static void +print_mes_dicconect_js () +{ + print_msg_getc (" %s", msg_get (cd, 27, default_message[27], cur_lang->lang), NULL, NULL); +} + + +static int +tan_conv (daip) + int daip; +{ + w_char yomi[512]; + int moji_suu; + register int i; + + jl_env_set (bun_data_, env_normal); + if (!isconect_jserver ()) + { + return (0); + } + + c_b->buflen = maxchg; + moji_suu = c_b->maxlen - c_b->t_m_start; + if (moji_suu > 0) + { + int ret; + Strncpy (yomi, c_b->buffer + c_b->t_m_start, moji_suu); + yomi[moji_suu] = 0; + ret = jl_tan_conv (bun_data_, yomi, cur_bnst_, -1, WNN_USE_MAE, daip); + if (ret == -1) + { + (*errorkeyin_func) (); + t_print_l (); + return (0); + } + for (i = cur_bnst_; i < dai_end (bun_data_, cur_bnst_); i++) + bunsetsu_env[i] = jl_env_get (bun_data_); + make_kanji_buffer (0); + change_to_henkango_mode (); + 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_], bunsetsu[dai_top (bun_data_, cur_bnst_)], c_b->maxlen, 1); + } + return (0); +} + +int +tan_henkan () +{ + jl_env_set (bun_data_, env_normal); + return (tan_conv (WNN_SHO)); +} + +int +tan_henkan_dai () +{ + if (!c_c->cur_reverse_env) + return (0); + jl_env_set (bun_data_, env_reverse); + return (tan_conv (WNN_DAI)); +} + +static int +tan_henkan1 (daip, env) + struct wnn_env *env; + int daip; +{ + int ret; + int moji_suu = c_b->t_c_p - c_b->t_m_start; + register int i; + + if (c_c->use_server == 0) + return (-1); + if (!jl_isconnect (bun_data_)) + { + print_mes_dicconect_js (); + return (-1); + } + + if (moji_suu == 0) + { + return (-1); + } + bunsetsu_env[cur_bnst_] = jl_env_get (bun_data_); + if (env == NULL) + { + ret = jl_nobi_conv (bun_data_, cur_bnst_, moji_suu, -1, WNN_USE_MAE, daip); + } + else + { + ret = jl_nobi_conv_e2 (bun_data_, env, cur_bnst_, moji_suu, -1, WNN_USE_MAE, daip); + } + + if (ret == -1) + { + errorkeyin (); + return (-1); + } + make_kanji_buffer (0); + for (i = cur_bnst_ + 1; i < jl_bun_suu (bun_data_); i++) + bunsetsu_env[i] = jl_env_get (bun_data_); + change_to_henkango_mode (); + 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]; + return (0); +} + +/* nobi_conv(daip) */ +static int +nobi_conv (daip, env) + int daip; + struct wnn_env *env; +{ + int tmp; + if (c_c->use_server == 0) + return (0); + if (!jl_isconnect (bun_data_)) + { + if (connect_server (cur_lang) < 0) + return (0); + } + tmp = c_b->t_b_st; + if (tan_henkan1 (daip, env) == 0) + { + c_b->t_m_start = bunsetsuend[cur_bnst_]; + t_redraw_move (bunsetsu[cur_bnst_], MIN_VAL (tmp, c_b->t_b_st), c_b->maxlen, 1); + check_scroll (); + } + return (0); +} + +int +nobi_henkan () +{ + return (nobi_conv (WNN_SHO, (struct wnn_env *) NULL)); +} + +int +nobi_henkan_dai () +{ + return (nobi_conv (WNN_DAI, (struct wnn_env *) NULL)); +} + +void +henkan_if_maru (c) + int c; +{ + if (ISKUTENCODE (c) && c_b->key_table == main_table[1]) + ren_henkan (); +} + +/*yank*/ +int +yank_c () +{ + if (empty_modep ()) + { + change_to_insert_mode (); + } + t_yank (); + return (0); +} + +int +remember_me () +{ + if (jl_bun_suu (bun_data_) == 0) + { + if (c_b->key_in_fun) + { + (*c_b->key_in_fun) (-1); + c_b->key_in_fun = (int (*)()) 0; + } + Strcpy (c_b->buffer, remember_buf); + c_b->maxlen = Strlen (remember_buf); + call_t_redraw_move (0, 0, c_b->maxlen, 1, 1); + check_scroll (); + } + return (0); +} + +int +kill_c () +{ + t_kill (); + if (c_b->maxlen == 0) + { + change_to_empty_mode (); + } + return (0); +} + +int +delete_c (c, romkan) + int c, romkan; +{ + t_delete_char (); + if ((c_b->maxlen == 0) && is_HON (romkan)) + { + change_to_empty_mode (); + } + return (0); +} + +int +rubout_c (c, romkan) + int c, romkan; +{ + t_rubout (c, romkan); + if ((c_b->maxlen == 0) && is_HON (romkan)) + { + change_to_empty_mode (); + } + return (0); +} + +int +end_bunsetsu () +{ + int tmp = cur_bnst_; + cur_bnst_ = jl_bun_suu (bun_data_) - 1; + 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_], bunsetsu[dai_top (bun_data_, tmp)], bunsetsuend[cur_bnst_], 0); + check_scroll (); + return (0); +} + +int +top_bunsetsu () +{ + int tmp = cur_bnst_; + cur_bnst_ = 0; + c_b->t_m_start = bunsetsuend[0]; + 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[0], 0, bunsetsuend[dai_end (bun_data_, tmp) - 1], 0); + check_scroll (); + return (0); +} + +int +forward_bunsetsu () +{ + if (cur_bnst_ < jl_bun_suu (bun_data_) - 1) + { + cur_bnst_ += 1; + 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_], bunsetsu[dai_top (bun_data_, cur_bnst_ - 1)], bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1], 0); + check_scroll (); + } + return (0); +} + +int +backward_bunsetsu () +{ + if (cur_bnst_ > 0) + { + cur_bnst_ -= 1; + 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_], bunsetsu[dai_top (bun_data_, cur_bnst_)], bunsetsuend[dai_end (bun_data_, cur_bnst_ + 1) - 1], 0); + check_scroll (); + } + return (0); +} + +int +kaijo () +{ + w_char yomi[512]; + + c_b->t_b_end = c_b->t_b_st; + t_redraw_move (bunsetsu[cur_bnst_], bunsetsu[dai_top (bun_data_, cur_bnst_)], bunsetsuend[dai_end (bun_data_, cur_bnst_) - 1], 0); + change_to_insert_mode (); + c_b->t_c_p = bunsetsu[cur_bnst_]; + c_b->t_m_start = c_b->t_c_p; + if (jl_env (bun_data_) == env_normal) + jl_get_yomi (bun_data_, cur_bnst_, -1, yomi); + else if (c_c->cur_reverse_env && jl_env (bun_data_) == env_reverse) + jl_get_yomi (bun_data_, cur_bnst_, -1, yomi); /* kankana_ren_henkan() */ + else + recover_to_han_or_hira (yomi); + Strcpy (c_b->buffer + c_b->t_c_p, yomi); + c_b->buflen = maxchg; + c_b->maxlen = Strlen (c_b->buffer); + jl_kill (bun_data_, cur_bnst_, -1); + call_t_redraw_move (c_b->t_c_p, c_b->t_c_p, c_b->maxlen, 1, 1); + check_scroll (); + return (0); +} + +int +enlarge_bunsetsu () +{ + w_char yomi[512]; + int area_len, len1; + + area_len = (*call_jl_yomi_len_func) (); + len1 = jl_get_yomi (bun_data_, cur_bnst_, -1, yomi); + + if (area_len < len1) + area_len++; + + change_to_nobasi_tijimi_mode (); + c_b->t_m_start = c_b->t_c_p; + c_b->t_b_end = c_b->t_c_p; + Strcpy (c_b->buffer + c_b->t_m_start, yomi); + c_b->maxlen = Strlen (c_b->buffer); + t_redraw_move (c_b->t_m_start + area_len, c_b->t_m_start, c_b->maxlen, 1); + check_scroll (); + return (0); +} + +int +smallen_bunsetsu () +{ + w_char yomi[512]; + int area_len; + + area_len = (*call_jl_yomi_len_func) (); + jl_get_yomi (bun_data_, cur_bnst_, -1, yomi); + + if (area_len > 1) + area_len--; + + change_to_nobasi_tijimi_mode (); + c_b->t_m_start = c_b->t_c_p; + c_b->t_b_end = c_b->t_c_p; + Strcpy (c_b->buffer + c_b->t_m_start, yomi); + c_b->maxlen = Strlen (c_b->buffer); + t_redraw_move (c_b->t_m_start + area_len, c_b->t_m_start, c_b->maxlen, 1); + check_scroll (); + return (0); +} + + +int +send_string (c) + int c; +{ + kakutei (); + c_b->buffer[c_b->maxlen] = c; + c_b->maxlen += 1; + c_b->t_c_p = c_b->maxlen; + return (1); +} + +int +tijime () +{ + if (c_b->t_c_p > c_b->t_m_start + 1) + { + backward (); + } + return (0); +} + +int +jmptijime () +{ + 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)); + return (0); +} + + +int +henkan_forward () +{ + if (c_c->use_server == 0) + return (0); + if (!jl_isconnect (bun_data_)) + { + return (0); + } + + if (tan_henkan1 (WNN_DAI, (struct wnn_env *) NULL) == -1) + { + return (0); + } + zenkouho_dai_c (); + forward_bunsetsu (); + return (0); +} + +int +henkan_backward () +{ + if (c_c->use_server == 0) + return (0); + if (!jl_isconnect (bun_data_)) + { + return (0); + } + + if (cur_bnst_ <= 0) + { + nobi_henkan_dai (); + } + else + { + if (tan_henkan1 (WNN_DAI, (struct wnn_env *) NULL) == -1) + { + return (0); + } + zenkouho_dai_c (); + backward_bunsetsu (); + } + return (0); +} + +int +backward_c () +{ + if (c_b->t_c_p == c_b->t_m_start) + { + if (c_b->t_c_p != 0) + { + if (!isconect_jserver ()) + { + return (0); + } + ren_henkan0 (); + change_to_henkango_mode (); + backward_bunsetsu (); + } + } + else + { + backward_char (); + } + return (0); +} + +int +insert_it_as_yomi () +{ + kakutei (); + change_to_insert_mode (); + c_b->t_m_start = 0; + cur_bnst_ = 0; + call_t_print_l (c_b->t_c_p, 1); + if (bun_data_) + jl_kill (bun_data_, 0, -1); + return (0); +} + +/****history *******/ +int +previous_history () +{ + int k; + if (jl_bun_suu (bun_data_) == 0) + { + k = previous_history1 (c_b->buffer); + if (k > 0) + { + change_to_insert_mode (); + c_b->maxlen = k; + c_b->t_c_p = 0; + call_t_print_l (c_b->t_c_p, 1); + } + } + return (0); +} + +int +next_history () +{ + int k; + if (jl_bun_suu (bun_data_) == 0) + { + k = next_history1 (c_b->buffer); + if (k > 0) + { + change_to_insert_mode (); + c_b->maxlen = k; + c_b->t_c_p = 0; + call_t_print_l (c_b->t_c_p, 1); + } + } + return (0); +} + +/* +static int send_ascii_stack = 0; +*/ + +int +send_ascii () +{ + send_ascii_stack = send_ascii_char; + send_ascii_char = 1; + return (0); +} + +int +not_send_ascii () +{ + send_ascii_stack = send_ascii_char; + send_ascii_char = 0; + return (0); +} + +int +toggle_send_ascii () +{ + send_ascii_stack = send_ascii_char; + if (send_ascii_char == 0) + { + send_ascii_char = 1; + } + else + { + send_ascii_char = 0; + } + return (0); +} + +int +pop_send_ascii () +{ + send_ascii_char = send_ascii_stack; + return (0); +} + +/* +int send_ascii_char_quote = 0; +*/ +static void +quote_send_ascii () +{ + if (send_ascii_char == 1) + { + send_ascii_char = 0; + send_ascii_char_quote = 1; + } +} + +static void +check_empty_mode_keyin_fun () +{ + if (send_ascii_char) + { + c_b->key_in_fun = return_it_if_ascii; + } + else + { + c_b->key_in_fun = insert_char_and_change_to_insert_mode; + } +} + +int +send_ascii_e () +{ + send_ascii (); + check_empty_mode_keyin_fun (); + return (0); +} + +int +not_send_ascii_e () +{ + not_send_ascii (); + check_empty_mode_keyin_fun (); + return (0); +} + +int +toggle_send_ascii_e () +{ + toggle_send_ascii (); + check_empty_mode_keyin_fun (); + return (0); +} + +int +pop_send_ascii_e () +{ + pop_send_ascii (); + check_empty_mode_keyin_fun (); + return (0); +} + +int +quote_send_ascii_e () +{ + quote_send_ascii (); + check_empty_mode_keyin_fun (); + return (0); +} + +int +reconnect_server (in) + int in; +{ + static WnnClientRec *c_c_sv = 0; + + if (c_c->use_server == 0) + return (0); + if (!jl_isconnect_e (env_normal) || c_c->cur_reverse_env && env_reverse && !jl_isconnect_e (env_reverse)) + { + + 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, reconnect_server); + } + + if (reconnect_jserver_body (in) == BUFFER_IN_CONT) + { + return (BUFFER_IN_CONT); + } + c_c_sv = 0; + pop_func (c_c); + } + return (0); +} + +int +disconnect_rev_server () +{ + if (c_c->use_server == 0) + return (0); + return (1); +} + +int +disconnect_server (rev) + int rev; +{ + if (c_c->use_server == 0) + return (0); + if (rev) + { + if (jl_isconnect_e (env_reverse)) + { + jl_dic_save_all_e (env_reverse); + } + if (jl_isconnect_e (env_reverse)) + { + jl_disconnect (env_reverse); + env_reverse = 0; + } + } + else + { + if (jl_isconnect_e (env_normal)) + { + jl_dic_save_all_e (env_normal); + } + if (jl_isconnect_e (env_normal)) + { + jl_disconnect (env_normal); + env_normal = 0; + } + } + return (1); +} + +int +henkan_off (in) + int in; +{ + unsigned int c; + static w_char wc[1]; + static int two_byte_first = 0; + + if (in == -99) + { + two_byte_first = 0; + quote_flag = 0; + return (0); + } + if (c_c->command_func_stack[c_c->func_stack_count] == (int (*)()) 0) + { + if (IsStatusArea (cur_p) +#ifdef CALLBACKS + || IsStatusCallbacks (cur_x) +#endif /* CALLBACKS */ + ) + { + display_henkan_off_mode (); + } + invisual_window (); + henkan_off_flag = 1; + push_func (c_c, henkan_off); + return (BUFFER_IN_CONT); + } + else if (c_c->command_func_stack[c_c->func_stack_count] != henkan_off) + { + ring_bell (); + return (0); + } + + + for (;;) + { + c = (in & 0x0000ffff); + if ((!quote_flag) && (c == quote_code)) + { + quote_flag = 1; + return (BUFFER_IN_CONT); + } + if ((c < TBL_SIZE) && (quote_flag == 0) && (c_b->key_table[c] == henkan_off)) + { + break; + } + if (c == 0x8e || (c >= 0xa0 && c <= 0xfe)) + { + if (two_byte_first == 1) + { + wc[0] += c; + xw_write (wc, 1); + two_byte_first = 0; + quote_flag = 0; + } + else + { + wc[0] = c * 0x100; + two_byte_first = 1; + } + } + else + { + wc[0] = c; + xw_write (wc, 1); + two_byte_first = 0; + } + quote_flag = 0; + return (BUFFER_IN_CONT); + } + henkan_off_flag = 0; + pop_func (c_c); + disp_mode (); + if (!empty_modep ()) + { + visual_window (); + } + return (BUFFER_IN_CONT); +} + +int +reset_c_b () +{ + if (c_c->func_stack_count >= 0) + { + ring_bell (); + return (-1); + } + clear_c_b (); + romkan_clear (); + return (0); +} + +#ifdef CHINESE +void +errorkeyin_q () +{ + ring_bell (); + c_b->t_b_end = c_b->t_b_st; + c_b->t_c_p = bunsetsu[cur_bnst_]; + c_b->t_m_start = c_b->t_c_p; + c_b->maxlen = c_b->t_c_p; + if (c_b->maxlen == 0) + { + change_to_empty_mode (); + } +} +#endif /* CHINESE */