Mercurial > freewnn
diff Wnn/jlib/kankana.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/jlib/kankana.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,246 @@ +/* + * $Id: kankana.c,v 1.6 2005/04/10 15:26:37 aonoto 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, 2003 + * + * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef lint +static char *rcs_id = "$Id: kankana.c,v 1.6 2005/04/10 15:26:37 aonoto Exp $"; +#endif /* lint */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#if STDC_HEADERS +# include <stdlib.h> +#else +# if HAVE_MALLOC_H +# include <malloc.h> +# endif +#endif /* STDC_HEADERS */ +#include "jslib.h" + +#define FZK_FILE "pubdic/full.fzk" +#define KIHON_DIC "pubdic/kihon.dic" +#define SETTO_DIC "pubdic/setsuji.dic" + +void err (void); +void henkan (void); +void p_set (struct wnn_env *env1); +void print_kanji (struct wnn_dai_bunsetsu *dlist, int cnt); +void putws (unsigned short *s); +void strtows (w_char *u, unsigned char *e); + +WNN_JSERVER_ID *js; +struct wnn_env *env, *rev_env; +static struct wnn_ret_buf rb = { 0, NULL }; + +int dcnt, scnt; + +char yomi[1024]; +char kanji[5000]; + +int kihon_file, setto_file, rev_file, fzk_file, rev_setto_file; +int kihon_dic_no, setto_dic_no, rev_dic_no, rev_setto_dic_no; + +int +main (int argc, char **argv) +{ + char *mname = ""; + rb.buf = (char *) malloc ((unsigned) (rb.size = 0)); + if (argc > 1) + mname = argv[1]; + + if ((js = js_open (mname, 0)) == NULL) + err (); + + if ((env = js_connect (js, "kana")) == NULL) + err (); + if ((fzk_file = js_file_read (env, FZK_FILE)) == -1) + err (); + if ((kihon_file = js_file_read (env, KIHON_DIC)) == -1) + err (); + if ((setto_file = js_file_read (env, SETTO_DIC)) == -1) + err (); + + if (js_fuzokugo_set (env, fzk_file) == -1) + err (); + if ((kihon_dic_no = js_dic_add (env, kihon_file, -1, WNN_DIC_ADD_NOR, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) + err (); + if ((setto_dic_no = js_dic_add (env, setto_file, -1, WNN_DIC_ADD_NOR, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) + err (); + p_set (env); + + if ((rev_env = js_connect (js, "kanji")) == NULL) + err (); + + if ((fzk_file = js_file_read (rev_env, FZK_FILE)) == -1) + err (); + if ((rev_file = js_file_read (rev_env, KIHON_DIC)) == -1) + err (); + if ((rev_setto_file = js_file_read (rev_env, SETTO_DIC)) == -1) + err (); + if (js_fuzokugo_set (rev_env, fzk_file) == -1) + err (); + + if ((rev_dic_no = js_dic_add (rev_env, kihon_file, -1, WNN_DIC_ADD_REV, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) + err (); + if ((rev_setto_dic_no = js_dic_add (rev_env, setto_file, -1, WNN_DIC_ADD_REV, 1, WNN_DIC_RDONLY, WNN_DIC_RDONLY, NULL, NULL)) == -1) + err (); + p_set (rev_env); + +#ifdef DEBUG + printf ("Now discard file push any key\n"); + getchar (); + js_file_discard (rev_env, rev_file); + printf ("Now discard file\n"); +#endif + + henkan (); + js_close (js); +} + +void +henkan (void) +{ + w_char u[1024]; + struct wnn_env *c_env = env; + struct wnn_dai_bunsetsu *dp; + + for (;;) + { + if (c_env == env) + { + printf ("yomi> "); + fflush (stdout); + } + else + { + printf ("kanji> "); + fflush (stdout); + } + if (gets (yomi) == NULL) + return; + if (yomi[0] == '!') + return; + if (yomi[0] == '@') + { + c_env = (c_env == env) ? rev_env : env; + continue; + } + strtows (u, yomi); + dcnt = js_kanren (c_env, u, WNN_BUN_SENTOU, NULL, WNN_VECT_KANREN, WNN_VECT_NO, WNN_VECT_BUNSETSU, &rb); + dp = (struct wnn_dai_bunsetsu *) rb.buf; + print_kanji (dp, dcnt); + } +} + +void +print_kanji (struct wnn_dai_bunsetsu *dlist, int cnt) +{ + int i; + struct wnn_sho_bunsetsu *sbn; + + if (dlist == 0) + return; + putchar ('\n'); + for (; cnt > 0; dlist++, cnt--) + { + sbn = dlist->sbn; + for (i = dlist->sbncnt; i > 0; i--) + { + putws (sbn->kanji); + printf ("-"); + putws (sbn->fuzoku); + printf (" "); + sbn++; + } + printf ("|"); + } + putchar ('\n'); + fflush (stdout); +} + +void +p_set (struct wnn_env *env1) +{ + struct wnn_param pa; + pa.n = 2; /* n_bun */ + pa.nsho = 10; /* nshobun */ + pa.p1 = 2; /* hindoval */ + pa.p2 = 40; /* lenval */ + pa.p3 = 0; /* jirival */ + pa.p4 = 100; /* flagval */ + pa.p5 = 5; /* jishoval */ + pa.p6 = 1; /* sbn_val */ + pa.p7 = 15; /* dbn_len_val */ + pa.p8 = -20; /* sbn_cnt_val */ + pa.p9 = 0; /* kan_len_val */ + + js_param_set (env1, &pa); +} + +void +putwchar (unsigned short x) +{ + putchar (x >> 8); + putchar (x); +} + +void +putws (unsigned short *s) +{ + while (*s) + putwchar (*s++); +} + +void +strtows (w_char *u, unsigned char *e) +{ + int x; + for (; *e;) + { + x = *e++; + if (x & 0x80) + x = (x << 8) | *e++; + *u++ = x; + } + *u = 0; +} + +void +err (void) +{ + printf (wnn_perror ()); + printf ("\n bye.\n"); + exit (1); +} +