Mercurial > freewnn
diff Wnn/jserver/initjserv.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children | ed4bb01eb317 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/jserver/initjserv.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,430 @@ +/* + * 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 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 + */ + +static char rcs_id[] = "$Id: initjserv.c,v 1.16 2003/05/11 18:43:15 hiroo Exp $"; + +#if defined(HAVE_CONFIG_H) +#include <config.h> +#endif + +#include <stdio.h> +#include <ctype.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# if HAVE_MALLOC_H +# include <malloc.h> +# endif +# if HAVE_STRINGS_H +# include <strings.h> +# endif /* HAVE_STRINGS_H */ +#endif /* STDC_HEADERS */ +#include <sys/types.h> + +#include "commonhd.h" +#include "de_header.h" +#include "wnn_config.h" +#include "wnn_os.h" +#include "kaiseki.h" + +struct wnn_param default_para = { + 2, 10, +/* N 小文節数 */ + 2, 34, 5, 80, 5, 1, 20, 0, +/* 頻度 小文節長 幹語長 今使ったよ 辞書 小文節評価 大文節長 小文節数 */ + 400, -100, 400, 80, 200, 2, 200 +/* 数字 カナ 英数 記号 閉括弧 付属語 開括弧 */ +}; + +static int expand_expr (char *s); +static int read_default_file (char *buffer, size_t buffer_size); +#ifndef CHINESE +static int expand_argument (unsigned char *st); +static int get_bcksla (char *st); +#endif /* !CHINESE */ + +static int +expand_expr (char *s) + /** @LIBDIRの展開(但し、文字列の先頭のみ)。できない時は-1が + 返り、その場合sの中身は着々とそのまんま。sの長さ<256と仮定してる。*/ + /** @USR (env名、logname), @LANG の展開 */ +{ + char tmp[1+EXPAND_PATH_LENGTH]; + register char *p, *s1; + int noerr, expandsuc; + + if (*s != '@') + { + strcpy (tmp, s); + *s = '\0'; + noerr = 1; + } + else + { + if ((int) strlen (s) >= EXPAND_PATH_LENGTH) + return (-1); + + s1 = s; + if (NULL != (p = strchr (++s1, '/'))) + { + strcpy (tmp, p); + *p = '\0'; + } + else + *tmp = '\0'; + /* ここまでは準備。s…先頭、s1…2文字目、p…最初の'/'のあったところ + (ここで一旦切る)、tmp…それ以後のコピー。 */ + + if (!strcmp (s1, "LIBDIR")) + { + noerr = expandsuc = ((int) (strlen (p = LIBDIR) + strlen (tmp)) < EXPAND_PATH_LENGTH); + } + else + { /* @LIBDIR igai ha kaenai */ + noerr = 1; + expandsuc = 0; + } + if (expandsuc) + strcpy (s, p); + } + + if (noerr) + { + int len1 = strlen ("@LANG"); + p = tmp; + for (; *p; p++) + { + if (!strncmp (p, "@LANG", len1)) + { + if ((int) (strlen (lang_dir) + strlen (p) + strlen (s) - len1) < EXPAND_PATH_LENGTH) + { + strcat (s, lang_dir); + p += len1 - 1; + } + else + { + return (-1); + } + } + else + { + strncat (s, p, 1); + } + } + } + return (noerr ? 0 : -1); +} + +/* daemon initialize routine */ + +/* Read [cjkt]server configuration file and set the parameters. */ +/* RETURN VALUE: 0: success; -1: failure */ +int +read_default (void) +{ + static const char sep[] = " \t"; + FILE *fp; + char data[EXPAND_PATH_LENGTH +1]; + char code[EXPAND_PATH_LENGTH +1]; + char param[EXPAND_PATH_LENGTH +1]; + char *word; + int i, num, *v[17]; + + strcpy (jserver_dir, JSERVER_DIR); + + if ((fp = fopen (jserverrcfile, "r")) == NULL) + { + log_err ("can't open %s\n", jserverrcfile); + return (-1); + } + + /* copy the pointer for looping */ + v[0] = &default_para.n; + v[1] = &default_para.nsho; + v[2] = &default_para.p1; + v[3] = &default_para.p2; + v[4] = &default_para.p3; + v[5] = &default_para.p4; + v[6] = &default_para.p5; + v[7] = &default_para.p6; + v[8] = &default_para.p7; + v[9] = &default_para.p8; + v[10] = &default_para.p9; + v[11] = &default_para.p10; + v[12] = &default_para.p11; + v[13] = &default_para.p12; + v[14] = &default_para.p13; + v[15] = &default_para.p14; + v[16] = &default_para.p15; + + while (fgets (data, EXPAND_PATH_LENGTH, fp) != NULL) + { + num = sscanf (data, "%s", code); + if (num <= 0) + { + /* no command on the line */ + continue; + } + code[EXPAND_PATH_LENGTH] = '\0'; + if (code[0] == ';') + { + /* the line is commented out */ + continue; + } + +/* + if(strcmp(code, "jt_len") == 0){ + jt_len = atoi(s[0]); + }else if(strcmp(code, "hjt_len") == 0){ + hjt_len = atoi(s[0]); + } +*/ + + if (strcmp (code, "max_client") == 0) + { + num = sscanf (data, "%s %d ", code, &max_client); + if (num != 2) + { + log_err ("command %s invalid.", code); + continue; + } + log_debug ("max_client=%d", max_client); + } + else if (strcmp (code, "max_sticky_env") == 0) + { + num = sscanf (data, "%s %d ", code, &max_sticky_env); + if (num != 2) + { + log_err ("command %s invalid.", code); + continue; + } + log_debug ("max_sticky_env=%d", max_sticky_env); + } + else if (strcmp ((code + 1), "server_dir") == 0) + { + num = sscanf (data , "%s %s", code, param); + if (num != 2) + { + log_err ("command %s invalid.", code); + continue; + } + if (expand_expr (param) != 0) + { + log_err ("command %s: can't expand %s\n", code, param); + } + strcpy (jserver_dir, param); + log_debug ("jserver_dir=%s", jserver_dir); + } + else if (strcmp (code, "def_param") == 0) + { + word = strtok (data, sep); /* discard first word "def_param" */ + for (i = 0; (i <= 16); i++) { + word = strtok (NULL, sep); + if (word == NULL) + { + log_err ("command %s has only %d parameters.", code, i); + return (-1); + } + *v[i] = atoi (word); /* XXX: default to 0 if error */ + } + log_debug ("command %s has %d parameters", code, i); + } +#ifndef CHINESE + /* else if (strcmp (code, "set_giji_eisuu") == 0 && num >= 2) */ + else if (strcmp (code, "set_giji_eisuu") == 0) + { + word = strtok (data, sep); /* discard first word "set_giji_eisuu" */ + for (i = 0; (word || i < 20); i++) + { + word = strtok (NULL, sep); + if (word == NULL) + { + break; + } + giji_eisuu[i] = expand_argument (word); + } + log_debug ("command %s has %d parameters.", code, i); + for (; i < 20; i++) + { + giji_eisuu[i] = 0xffff; + } + } +#endif + } + fclose (fp); + return (0); +} + +int +read_default_files (void) +{ + FILE *fp; + char data[EXPAND_PATH_LENGTH+1]; + int num; + char code[EXPAND_PATH_LENGTH+1]; + char file[EXPAND_PATH_LENGTH+1]; + + if ((fp = fopen (jserverrcfile, "r")) == NULL) + { + perror (""); + printf ("Error can't open %s\n", jserverrcfile); + return (-1); + } + while (fgets (data, 256, fp) != NULL) + { + num = sscanf (data, "%s %s", code, file); + if (strcmp (code, "readfile") == 0 && num == 2) + { + read_default_file (file, EXPAND_PATH_LENGTH+1); + } + } + fclose (fp); + + printf ("Finished Reading Files\n"); + + return (0); +} + +static int +read_default_file (char* buffer, size_t buffer_size) +{ + int fid; + + buffer = expand_file_name (buffer, buffer_size); + if (!buffer) + { + log_err ("read_default_file: filename too long. %s", buffer); + return (-1); + } + + fid = file_loaded (buffer); + if (fid == -1) + { /* Not correct file */ + printf ("Error reading %s\n", buffer); + return (-1); + } + if (FILE_NOT_READ != fid) + { /* already read */ + return (-1); + } + if ((fid = get_new_fid ()) == -1) + { /* no more file */ + printf ("Error reading %s\n", buffer); + return (-1); + } + + files[fid].localf = LOCAL; + strcpy (files[fid].name, buffer); + printf ("Reading %s\t Fid = %d\n", buffer, fid); + if (read_file (&files[fid]) == -1) + { + printf ("Error reading %s\n", buffer); + files[fid].ref_count = -1; /* fail */ + return (-1); + } + files[fid].ref_count = 1; + return (fid); +} + +#ifndef CHINESE +static int +expand_argument (unsigned char *st) +{ + int num; + + if (*st == '^') + { + return ((*(st + 1)) & 0x1f); + } + else if (*st == '\\') + { + return (get_bcksla (st + 1)); + } + else if (*st == '0') + { + if (*(st + 1) == 'x' || *(st + 1) == 'X') + { + sscanf ((char *) (st + 2), "%x", &num); + return (num); + } + else + { + sscanf ((char *) st, "%o", &num); + return (num); + } + } + else if (*st == '\'') + { + if (*(st + 1) < 0x80) + return (*(st + 1)); + else + return (*(st + 1) * 0x100 + *(st + 2)); + } + else if (!('0' <= *st && *st <= '9')) + { + return (-1); + } + else + { + return (atoi (st)); + } +} + +static int +get_bcksla (char *st) +{ + int num; + + switch (*st) + { + case 'n': + return ('\n'); + case 't': + return ('\t'); + case 'b': + return ('\b'); + case 'r': + return ('\r'); + case 'f': + return ('\f'); + case 'x': + case 'X': + sscanf (st + 1, "%x", &num); + return (num); + case 'd': + case 'D': + return (atoi (st + 1)); + case 'o': + case 'O': + sscanf (st + 1, "%o", &num); + return (num); + } + return (-1); +} +#endif /* !CHINESE */ +