Mercurial > freewnn
diff Wnn/jutil/wdreg.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children | c966456648ad |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/jutil/wdreg.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,265 @@ +/* + * $Id: wdreg.c,v 1.8 2002/05/12 22:51:17 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 + */ + +/* + * UJIS ファイルを読みとって、単語登録を行なう。 + */ + +#ifndef lint +static char *rcs_id = "$Id: wdreg.c,v 1.8 2002/05/12 22:51:17 hiroo 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 <sys/types.h> +#include <sys/file.h> +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include "commonhd.h" +#include "wnn_config.h" +#include "jllib.h" +#include "jslib.h" +#include "jh.h" +#include "jdata.h" +#include "wnn_os.h" + +extern int init_heap (); +extern void ujis_header (), read_ujis (); +extern struct je **jeary; + +char *def_server; +struct JT jt; +struct wnn_file_head file_head; +int dic_no = -1; +char *server_n; +char *env_n = "wdreg"; +char *fname = NULL; +int fid; +int client = 0; /* server site dict */ + +WNN_JSERVER_ID *js; +struct wnn_env *env, *rev_env; +static struct wnn_ret_buf rb = { 0, NULL }; + +static void +usage () +{ + fprintf (stderr, "wdreg [-D server_name] [-n env_name][-d dic_no][-L] [file_name] < text dict\n"); + fprintf (stderr, "file_name or -d dic_no must be specified\n"); + fprintf (stderr, "default env_name = wdreg\n"); + fprintf (stderr, "default server_name = %s\n", def_server); + fprintf (stderr, "L is to specify that the file at the client site.\n"); + exit (1); +} + +static void +err () +{ + printf ((char *) wnn_perror ()); + printf ("\n bye.\n"); + exit (1); +} + +int +main (argc, argv) + int argc; + char **argv; +{ + extern int optind; + extern char *optarg; + struct wnn_dic_info *info; + int c; + int k; + int num; + char *cswidth_name; + extern char *get_cswidth_name (); + extern void set_cswidth (); + extern char *getenv (); + + if (getenv (WNN_DEF_SERVER_ENV)) + { + def_server = getenv (WNN_DEF_SERVER_ENV); + } + else + { + def_server = ""; + } + server_n = def_server; + + if (cswidth_name = get_cswidth_name (WNN_DEFAULT_LANG)) + set_cswidth (create_cswidth (cswidth_name)); + while ((c = getopt (argc, argv, "D:n:d:L")) != EOF) + { + switch (c) + { + case 'D': + server_n = optarg; + break; + case 'n': + env_n = optarg; + break; + case 'd': + dic_no = atoi (optarg); + break; + case 'L': + client = 1; + break; + default: + usage (); + break; + } + } + if (optind) + { + optind--; + argc -= optind; + argv += optind; + } + if (argc > 1) + { + fname = argv[1]; + } + if (fname && dic_no != -1) + usage (); + if (!fname && dic_no == -1) + usage (); + + rb.buf = (char *) malloc ((unsigned) (rb.size = 0)); + + init_heap (MAX_ENTRIES * HEAP_PER_LINE, MAX_ENTRIES * YOMI_PER_LINE, MAX_ENTRIES, MAX_ENTRIES, stdin); + +#ifdef CHINESE + { + int which_dict; + ujis_header (&which_dict); + } +#else + ujis_header (); +#endif + read_ujis (NORMAL, 0, 0); + + if ((js = js_open (server_n, WNN_TIMEOUT)) == NULL) + err (); + if ((env = js_connect (js, env_n)) == NULL) + err (); + if (fname) + { + if (client) + { + if (access (fname, F_OK) == -1) + { + if (js_dic_file_create_client (env, fname, WNN_REV_DICT, "", "", "") == -1) + { + err (); + } + } + if ((fid = js_file_send (env, fname)) == -1) + { + err (); + } + } + else + { + WNN_FILE_STAT s; + if (js_file_stat (env, fname, &s) == -1) + { + if (js_dic_file_create (env, fname, WNN_REV_DICT, "", "", "") == -1) + { + err (); + } + } + if ((fid = js_file_read (env, fname)) == -1) + err (); + } + if ((dic_no = js_dic_add (env, fid, -1, 0, 0, WNN_DIC_RW, WNN_DIC_RW, "", "")) == -1) + err (); + } + + if ((num = js_dic_list (env, &rb)) == -1) + err (); + + info = (struct wnn_dic_info *) (rb.buf); + for (k = 0; k < num; k++) + { + if (info[k].dic_no == dic_no) + break; + } + if (k == num) + { + /* + fprintf(stderr, "指定された番号の辞書は、環境に存在しません。\n"); + */ + fprintf (stderr, "The specified dictionary isn't exist in current environment\n"); + exit (1); + } + if (info[k].type != WNN_UD_DICT && info[k].type != WNN_REV_DICT) + { + /* + fprintf(stderr, "指定された番号の辞書は、登録可能ではありません。\n"); + */ + fprintf (stderr, "The specified dictionary isn't registable\n"); + exit (1); + } + for (k = 0; k < jt.maxserial; k++) + { + if (js_word_add (env, dic_no, jeary[k]->yomi, jeary[k]->kan, jeary[k]->comm, jeary[k]->hinsi, jeary[k]->hindo) == -1) + { + err (); + } + } + if (fname) + { + if (client) + { + if (js_file_receive (env, fid, "") == -1) + err (); + } + else + { + if (js_file_write (env, fid, "") == -1) + err (); + } + fprintf (stderr, "Wrote the file back.\n"); + } + exit (0); +}