Mercurial > freewnn
diff Wnn/jserver/hinsi_list.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/jserver/hinsi_list.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,210 @@ +/* + * $Id: hinsi_list.c,v 1.5 2002/05/12 22:51:16 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, 2002 + * + * 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 + */ +#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 "commonhd.h" +#include "wnn_config.h" +#include "de_header.h" +#include "wnnerror.h" +#include "jslib.h" +#include "hinsi_file.h" +#include "jdata.h" + +static int Strtime (), get_a_word (); + +void +make_hinsi_list (jtl) + struct JT *jtl; +{ + int k, state, cnt = 0, wc; + w_char *j, *d, *start; + + if (jtl->maxhinsi_list == 0) + { + jtl->node = (struct wnn_hinsi_node *) malloc (0); + jtl->maxnode = 0; + return; + } + jtl->maxnode = Strtime (jtl->hinsi_list, jtl->maxhinsi_list, NODE_CHAR); + jtl->node = (struct wnn_hinsi_node *) malloc (jtl->maxnode * sizeof (struct wnn_hinsi_node) + jtl->maxhinsi_list * sizeof (w_char)); + d = (w_char *) (jtl->node + jtl->maxnode); + if (jtl->hinsi_list == NULL) + return; + j = jtl->hinsi_list; + k = -1; + for (;;) + { + wc = get_a_word (j, &start, &state); + if (state == 2 && wc == 0) + { + break; + } + Strncpy (d, start, wc); + d[wc] = 0; + if (state == 2) + { + cnt++; + break; + } + if (state == 1) + { + if (k >= 0) + jtl->node[k].kosuu = cnt; + cnt = 0; + k++; + jtl->node[k].name = d; + jtl->node[k].son = d + wc + 1; + } + else + { + cnt++; + } + d += wc + 1; + j = start + wc + 1; + } + if (k >= 0) + jtl->node[k].kosuu = cnt; +} + + +static int +Strtime (w, wc, c) + w_char *w; + int wc; + w_char c; +{ + int ret = 0; + for (; wc; wc--, w++) + { + if (*w == c) + ret++; + } + return (ret); +} + +static int +get_a_word (d, startp, statep) + w_char *d, **startp; + int *statep; +{ + w_char *d0 = d; + int c, wc; + for (;;) + { + if ((c = *d++) == 0) + { + *statep = 2; + *startp = d0; + return (0); + } + if (c == IGNORE_CHAR1 || c == IGNORE_CHAR2 || c == CONTINUE_CHAR || c == '\n' || c == HINSI_SEPARATE_CHAR) + { + continue; + } + if (c == COMMENT_CHAR) + { + for (; (*d++ != '\n');); + continue; + } + break; + } + *startp = d - 1; + wc = 1; + for (;; wc++) + { + if ((c = *d++) == 0) + { + *statep = 2; + return (wc); + } + if (c == IGNORE_CHAR1 || c == IGNORE_CHAR2 || c == CONTINUE_CHAR || c == '\n' || c == HINSI_SEPARATE_CHAR) + { + *statep = 0; + return (wc); + } + else if (c == NODE_CHAR) + { + *statep = 1; + return (wc); + } + } +} + +int +has_dict (n, m, w) + struct wnn_hinsi_node *n; + int m; + w_char *w; +{ + int j; + for (; m; m--) + { + if (Strcmp (n[m].name, w) == 0) + for (j = n[m].kosuu; j; j--) + { + if (Strcmp (n[m].son[j], w) == 0) + return (1); + } + } + return (0); +} + +int +hinsi_table_set (jtl, table) + struct JT *jtl; + w_char *table; +{ + /* + int len; + */ + + free (jtl->node); + free (jtl->hinsi_list); + + jtl->maxhinsi_list = Strlen (table); + + jtl->hinsi_list = (w_char *) malloc (jtl->maxhinsi_list * sizeof (w_char)); + Strcpy (jtl->hinsi_list, table); + make_hinsi_list (jtl); + jtl->dirty = 1; + return (0); +}