#ifndef lint
static char *rcs_id = "$Id: wddel.c,v 1.5.2.1 1999/02/08 03:15:24 yamasita Exp $";
#endif /* lint */

/*
 * 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
 *
 * 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
 */
/*
  UJIS ファイルを読みとって、単語登録を行なう。
*/

#include <stdio.h>
#include "commonhd.h"
#include "config.h"
#include "jllib.h"
#include "jslib.h"
#include "wnn_string.h"

#define WORD_DELETE 1
#define COMMENT_SET 2
#define HINDO_SET 3

char *def_server;

int dic_no = -1;
char *server_n;
char *env_n = "wddel";
char *fname = NULL;
int fid;
int client = 0;			/* server site dict */
int what = WORD_DELETE;

WNN_JSERVER_ID	*js;
struct wnn_env *env, *rev_env;
static struct wnn_ret_buf rb = {0, NULL};

static void
usage()
{
    fprintf(stderr, "wddel [-D server_name] [-n env_name][-d dic_no][-L][-E][-H][-C] [file_name]  < text dict\n");
    fprintf(stderr, "file_name or -d dic_no must be specified\n");
    fprintf(stderr, "default env_name = wddel\n");
    fprintf(stderr, "default server_name = %s\n", def_server);
    fprintf(stderr, "L is to specify that the file at the client site.\n");
    fprintf(stderr, "-E is word_delete, -C is word_comment_set, -H is hindo_set.\n");
    exit(1);
}

static void
err()
{
    printf((char *)wnn_perror());
    printf("\n bye.\n");
    exit(1);
}

void
main(argc, argv)
int argc;
char **argv;
{
    extern char *getenv();
    extern int optind;
    extern char *optarg;
    struct wnn_dic_info *info;
    int c;
    int k;
    int num;
    int sno;
    char s[256];
    char *cswidth_name;
    extern char *get_cswidth_name();
    extern void set_cswidth();

    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:CHEL")) != EOF) {
	switch(c){
	case 'D':
	    server_n = optarg;
	    break;
	case 'n':
	    env_n = optarg;
	    break;
	case 'd':
	    dic_no = atoi(optarg);
	    break;
	case 'C':
	    what = COMMENT_SET;
	    break;
	case 'H':
	    what = HINDO_SET;
	    break;
	case 'E':
	    what = WORD_DELETE;
	    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));

    if((js = js_open(server_n, WNN_TIMEOUT)) == NULL) err();
    if((env=js_connect(js, env_n)) == NULL) err(); 
    if(fname){
	if(client){
	    if((fid = js_file_send(env, fname)) == -1) err();
	}else{
	    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);
    }
    while(gets(s)){
	char com[LENGTHYOMI];
	char Com[LENGTHYOMI];
	int ima, hindo;
	if(s[0] == '\\') continue;
	switch(what){
	case WORD_DELETE:
	    if(sscanf(s, "%d", &sno) <= 0){
		fprintf(stderr, "Bad line \"%s\"", s);
		continue;
	    }
	    if(js_word_delete(env, dic_no, sno) == -1){
		fprintf(stderr, "serial-no = %d\n", sno);
		err();
	    }
	    break;
	case COMMENT_SET:
	    if(sscanf(s, "%d %s",&sno, com) <= 1){
		fprintf(stderr, "Bad line \"%s\"", s);
		continue;
	    }
	    wnn_Sstrcpy(Com, com);
	    if(js_word_comment_set(env, dic_no, sno, Com) == -1){
		fprintf(stderr, "serial-no = %d\n", sno);
		err();
	    }
	    break;
	case HINDO_SET:
	    if(sscanf(s, "%d %n %n",&sno, &ima, &hindo) <= 2){
		fprintf(stderr, "Bad line \"%s\"", s);
		continue;
	    }
	    if(js_hindo_set(env, dic_no, sno, ima, hindo) == -1){
		fprintf(stderr, "serial-no = %d\n", sno);
		err();
	    }
	    break;
	}
    }
    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);
}
