Mercurial > freewnn
diff Wnn/jserver/do_henkan1.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children | 790205f476c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/jserver/do_henkan1.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,479 @@ +/* + * $Id: do_henkan1.c,v 1.7 2003/05/11 18:41:49 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, 2003 + * + * 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 + */ + +#if defined(HAVE_CONFIG_H) +#include <config.h> +#endif + +#include <stdio.h> +#include <ctype.h> + +#if defined(HAVE_SYS_TYPES_H) +#include <sys/types.h> +#endif + +#include "demcom.h" +#include "commonhd.h" +#include "de_header.h" +#include "jdata.h" +#include "fzk.h" + +#include "kaiseki.h" + +#define FZK_L 256 +#ifdef putwchar +#undef putwchar +#endif + +static int make_buns_par (); + +static int bun_pter_; + +static int +henkan_setup () +{ + register int index; + register w_char c; + + wnn_loadhinsi (hinsi_file_name); +#ifdef CONVERT_from_TOP + index = 1; +#else + index = maxchg - 1; +#endif + while ((c = get2_cur ()) != 0) + { +#ifdef DEBUG + putwchar (c); +#endif + if (make_buns_par (c, index) == -1) + { + while ((c = get2_cur ()) != 0); /* dummy get */ + return (-1); + } +#ifdef CONVERT_from_TOP + index++; +#else + index--; +#endif + } +#ifdef CONVERT_from_TOP + bun_pter_ = index; +#else + bun_pter_ = index + 1; +#endif + init_jmt (); +#ifdef DEBUG + wsputs ("\n"); +#endif + return (0); +} + +static void +get_fzk_vec (hinsi, fzk, fzk_size, vec, vec1) + register int *hinsi; + register w_char *fzk; + register size_t fzk_size; + register int *vec; + register int *vec1; +{ + *hinsi = get4_cur (); + getws_cur (fzk, fzk_size); + *vec = get4_cur (); + *vec1 = get4_cur (); +} + +#ifdef CHINESE +static void +do_question (daip, zenp) + int daip, zenp; +{ + int b_suu_; + + b_suu_ = jishobiki_b (1, bun_pter_, 0); + if (b_suu_ < 0) + { + error_ret (); /* ERROR */ + return; + } + if (zenp == WNN_BUN) + b_suu_ = (b_suu_ == 0) ? 0 : 1; + if (daip == WNN_DAI) + ret_daiB (1, bun_pter_, b_suu_, zenp); + else + ret_B (1, bun_pter_, b_suu_, zenp); + putc_purge (); +} +#endif + +/* RENBUN */ +void +do_kanren () +{ + int end, eid; + int vec; + int vec1; + int vec2; + w_char fzk[FZK_L]; + struct DSD_DBN *d_list; + register int b_suu_; + int hinsi; + int err; + + eid = get4_cur (); + c_env = env[eid]; + end = maxchg - 1; + err = henkan_setup (); + get_fzk_vec (&hinsi, fzk, FZK_L, &vec, &vec1); + vec2 = get4_cur (); + if (err == -1) + { + error_ret (); /* ERROR */ + return; + } + +#ifdef CHINESE + if (is_bwnn_rev_dict ()) + { + do_question (WNN_DAI, WNN_BUN); + return; + } +#endif /* CHINESE */ + + b_suu_ = renbn_kai ( +#ifdef CONVERT_from_TOP + 1, bun_pter_, +#else + bun_pter_, end + 1, +#endif + hinsi, +#ifndef NO_FZK + fzk, +#endif + vec, vec1, vec2, c_env->nbun, c_env->nshobun, &d_list); + if (b_suu_ < 0) + { + error_ret (); /* ERROR */ + return; + } + ret_dai (d_list, b_suu_); + putc_purge (); +#ifdef DEBUG + print_dlist (d_list, b_suu_); +#endif +} + +/* TANBUN (dai)*/ +void +do_kantan_dai () +{ + int end, eid; + int vec; + int vec1; + w_char fzk[FZK_L]; + struct DSD_DBN *d_list; + register int b_suu_; + int hinsi; + int err; + + eid = get4_cur (); + c_env = env[eid]; + end = maxchg - 1; + err = henkan_setup (); + get_fzk_vec (&hinsi, fzk, FZK_L, &vec, &vec1); + if (err == -1) + { + error_ret (); /* ERROR */ + return; + } + +#ifdef CHINESE + if (is_bwnn_rev_dict ()) + { + do_question (WNN_DAI, WNN_BUN); + return; + } +#endif /* CHINESE */ + b_suu_ = tan_dai ( +#ifdef CONVERT_from_TOP + 1, bun_pter_, +#else + bun_pter_, end + 1, +#endif + hinsi, +#ifndef NO_FZK + fzk, +#endif + vec, vec1, c_env->nshobun, &d_list); + if (b_suu_ < 0) + { + error_ret (); /* ERROR */ + return; + } + ret_dai (d_list, b_suu_); + putc_purge (); +#ifdef DEBUG + print_dlist (d_list, b_suu_); +#endif +} + +/* TANBUN (sho)*/ +void +do_kantan_sho () +{ + int end, eid; + int vec; + int vec1; + w_char fzk[FZK_L]; + struct DSD_SBN *d_list1; + register int b_suu_; + int hinsi; + int err; + + eid = get4_cur (); + c_env = env[eid]; + end = maxchg - 1; + err = henkan_setup (); + get_fzk_vec (&hinsi, fzk, FZK_L, &vec, &vec1); + if (err == -1) + { + error_ret (); /* ERROR */ + return; + } + +#ifdef CHINESE + if (is_bwnn_rev_dict ()) + { + do_question (WNN_SHO, WNN_BUN); + return; + } +#endif /* CHINESE */ + b_suu_ = tan_syo ( +#ifdef CONVERT_from_TOP + 1, bun_pter_, +#else + bun_pter_, end + 1, +#endif + hinsi, +#ifndef NO_FZK + fzk, +#endif + vec, vec1, &d_list1); + if (b_suu_ < 0) + { + error_ret (); /* ERROR */ + return; + } + ret_sho (d_list1, b_suu_); + putc_purge (); +#ifdef DEBUG + print_dlist1 (d_list1, b_suu_); +#endif +} + +/* JIKOUHO (dai)*/ +void +do_kanzen_dai () +{ + int end, eid; + int vec; + int vec1; + w_char fzk[FZK_L]; + struct DSD_DBN *d_list; + register int b_suu_; + int hinsi; + int err; + + eid = get4_cur (); + c_env = env[eid]; + end = maxchg - 1; + err = henkan_setup (); + get_fzk_vec (&hinsi, fzk, FZK_L, &vec, &vec1); + if (err == -1) + { + error_ret (); /* ERROR */ + return; + } + +#ifdef CHINESE + if (is_bwnn_rev_dict ()) + { + do_question (WNN_DAI, WNN_ZENKOUHO); + return; + } +#endif /* CHINESE */ + b_suu_ = jkt_get_dai ( +#ifdef CONVERT_from_TOP + 1, bun_pter_, +#else + bun_pter_, end + 1, +#endif + hinsi, +#ifndef NO_FZK + fzk, +#endif + vec, vec1, c_env->nshobun, &d_list); + if (b_suu_ < 0) + { + error_ret (); /* ERROR */ + return; + } + ret_dai (d_list, b_suu_); + putc_purge (); +#ifdef DEBUG + print_dlist (d_list, b_suu_); +#endif +} + +/* JIKOUHO (sho)*/ +void +do_kanzen_sho () +{ + int end, eid; + int vec; + int vec1; + w_char fzk[FZK_L]; + struct DSD_SBN *d_list1; + register int b_suu_; + int hinsi; + int err; + + eid = get4_cur (); + c_env = env[eid]; + end = maxchg - 1; + err = henkan_setup (); + get_fzk_vec (&hinsi, fzk, FZK_L, &vec, &vec1); + if (err == -1) + { + error_ret (); /* ERROR */ + return; + } + +#ifdef CHINESE + if (is_bwnn_rev_dict ()) + { + do_question (WNN_SHO, WNN_ZENKOUHO); + return; + } +#endif /* CHINESE */ + b_suu_ = jkt_get_syo ( +#ifdef CONVERT_from_TOP + 1, bun_pter_, +#else + bun_pter_, end + 1, +#endif + hinsi, +#ifndef NO_FZK + fzk, +#endif + vec, vec1, &d_list1); + if (b_suu_ < 0) + { + error_ret (); /* ERROR */ + return; + } +#ifdef DEBUG + print_dlist1 (d_list1, b_suu_); +#endif + ret_sho (d_list1, b_suu_); + putc_purge (); +} + +static int +make_buns_par (c, at_index) /* make bun and bun */ + register w_char c; + register int at_index; +{ + if ((at_index >= maxchg) || (at_index <= 0)) + { + wnn_errorno = WNN_LONG_MOJIRETSU; + return (-1); + } + bun[at_index] = c; + + jmtp[at_index] = (struct jdata **) -1; /* 辞書をまだ引いていない */ + return (0); +} + +/* get kanji and put it in kouho*/ +void +Get_knj (jentptr, u, kouho, oy, oyl) + int u; + register struct jdata *jentptr; + w_char *kouho, *oy; + int oyl; +{ + UCHAR *kptr; + register struct JT *jtl; + + jtl = (struct JT *) (files[dic_table[jentptr->jishono].body].area); + kptr = jtl->kanji + jentptr->kanji1; + if (jentptr->which == D_YOMI) + { + Get_knj1 (kptr, oy, oyl, jentptr->kanji2 + u, kouho, NULL, NULL); + } + else + { + Get_knj1 (kptr, oy, oyl, jentptr->kanji2 + u, NULL, kouho, NULL); + } +} + +#ifdef no_def +void +get_yomi (jentptr, u, kouho) /* get yomi and put it in kouho */ + int u; + register struct jdata *jentptr; + w_char *kouho; +{ + UCHAR *kptr; + register struct JT *jtl; + + jtl = (struct JT *) (files[dic_table[jentptr->jishono].body].area); + kptr = jtl->kanji + jentptr->kanji1; + Get_knj2 (kptr, jentptr->kanji2 + u, NULL, kouho, NULL); +} +#endif + +/* get comment and put it in kouho*/ +void +get_knj_com (jentptr, u, kouho, com) + int u; + register struct jdata *jentptr; + w_char *kouho; /* kouho must be ended with NULL. */ + w_char *com; +{ + register UCHAR *kptr; + struct JT *jtl; + + jtl = (struct JT *) (files[dic_table[jentptr->jishono].body].area); + kptr = jtl->kanji + jentptr->kanji1; + Get_knj2 (kptr, jentptr->kanji2 + u, kouho, NULL, com); +}