Mercurial > freewnn
diff Xwnmo/xwnmo/readximrc.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/Xwnmo/xwnmo/readximrc.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,425 @@ +/* + * $Id: readximrc.c,v 1.2 2001/06/14 18:16:17 ura Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright 1991, 1992 by Massachusetts Institute of Technology + * + * 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 + */ +#include <stdio.h> +#include "commonhd.h" +#include "sdefine.h" +#include "xim.h" +#include "sheader.h" +#include "config.h" +#include "ext.h" + +/** Set parameter by reading ximrc file */ +static int +read_xim_rcfile (filenm, expand_filenm) + char *filenm; + int (*expand_filenm) (); +{ + char buf[BUFSIZ]; + char entrynm[64]; + char s[2][MAXPATHLEN + 1]; + int n; + int error; + FILE *fp; + XIMLangDataBase *ld; + extern int fclose (); + + if ((fp = fopen (filenm, "r")) == NULL) + { + return (-1); + } + + while (fgets (buf, BUFSIZ, fp)) + { + if (comment_char (*buf) || (n = sscanf (buf, "%s %s %s", entrynm, s[0], s[1])) < 1) + { + continue; + } + error = 0; + switch (*(entrynm + 3)) + { + case 'l': + if (!strcmp (entrynm, "preloadrkfile")) + { + if (n > 1) + { + register ReadRkfileRec *rr, *p, *prev; + if (!(rr = (ReadRkfileList) Malloc (sizeof (ReadRkfileRec)))) + goto CLOSE_RET; + if (read_rkfile_list == NULL) + { + read_rkfile_list = rr; + } + else + { + for (p = read_rkfile_list, prev = NULL; p != NULL; prev = p, p = p->next); + prev->next = rr; + } + if (!(rr->name = alloc_and_copy (s[0]))) + goto CLOSE_RET; + rr->next = NULL; + } + else + error = 1; + } + else + error = 2; + break; + case 'u': + if (!strcmp (entrynm, "setuumrc")) + { + if (n > 2) + { + for (ld = language_db; ld; ld = ld->next) + { + if (!strcmp (ld->lang, s[0])) + break; + } + if (!ld) + { + print_out2 ("In ximrc \"%s\", I don't support the lang \"%s\".", filenm, s[0]); + } + if ((*expand_filenm) (s[1]) != 0) + { + print_out1 ("In ximrc \"%s\", I could not expand %s.", s[1]); + } + if (!(ld->uumrc_name = alloc_and_copy (s[1]))) + goto CLOSE_RET; + if (rkfile_defined_by_option && cur_lang == ld) + { + if (!(ld->rkfile_name = alloc_and_copy (root_rkfilename))) + goto CLOSE_RET; + } + } + else + error = 1; + } + else + error = 2; + break; + case 'b': + if (!strcmp (entrynm, "setbackspacechar")) + { + if (n > 1) + { + rubout_code = s[0][0]; + } + else + error = 1; + } + else + error = 2; + break; + default: + error = 2; + break; + } + if (error == 1) + { + print_out2 ("In ximrc file \"%s\", I found a unknown entry name \"%s\".", filenm, entrynm); + } + else if (error == 2) + { + print_out2 ("In ximrc file \"%s\", I found a Illegal line %d.", filenm, entrynm); + } + } + fclose (fp); + return (0); +CLOSE_RET: + fclose (fp); + return (-2); +} + +int +read_ximrc () +{ + register char *n; + char tmp_xim_rc_file[MAXPATHLEN + 1]; + register int ret; + extern char *getenv (); + + if (ximrc_file) + { + n = ximrc_file; + } + else + { + n = getenv (XIM_RCENV); + } + if (n && *n) + { + strcpy (tmp_xim_rc_file, n); + if ((*expand_expr) (tmp_xim_rc_file) != 0) + { + print_out1 ("I could not expand %s.", tmp_xim_rc_file); + } + if ((ret = read_xim_rcfile (tmp_xim_rc_file, expand_expr)) == 0) + { + goto OK_RET; + } + else if (ret == -2) + return (-1); + print_out1 ("Can't open a specified ximrc \"%s\".", tmp_xim_rc_file); + ximrc_file = NULL; + } + if ((n = getenv ("HOME")) && *n) + { + strcat (strcpy (tmp_xim_rc_file, n), USR_XIMRC); + if ((ret = read_xim_rcfile (tmp_xim_rc_file, expand_expr)) == 0) + { + goto OK_RET; + } + else if (ret == -2) + return (-1); + ximrc_file = NULL; + } + strcat (strcpy (tmp_xim_rc_file, LIBDIR), XIMRCFILE); + if (read_xim_rcfile (tmp_xim_rc_file, expand_expr) >= 0) + { + goto OK_RET; + } + print_out1 ("Can't open a default ximrc file \"%s\".", tmp_xim_rc_file); + ximrc_file = NULL; + return (-1); +OK_RET: + if (!(ximrc_file = alloc_and_copy (tmp_xim_rc_file))) + return (-1); + return (0); +} + +static void +default_set_of_ld (ld) + register XIMLangDataBase *ld; +{ + ld->read = 0; + ld->uumkey_name = NULL; + ld->host_name = NULL; + ld->rev_host_name = NULL; + ld->rk_table = NULL; + ld->jishopath = NULL; + ld->hindopath = NULL; + ld->fuzokugopath = NULL; + ld->h_off_def = 0; + ld->e_delete = 1; + ld->s_ascii_char_def = 0; + ld->m_chg = 0; + ld->m_bunsetsu = 0; + ld->m_history = 0; + ld->t_comment = 0; + ld->h_on_kuten = 0; +#ifdef USING_XJUTIL + ld->xjutil_act = 0; + ld->xjutil_id = (Window) 0; + ld->xjutil_pid = 0; + ld->xjutil_use = NULL; +#endif /* USING_XJUTIL */ +} + +int +read_ximconf () +{ + char buf[BUFSIZ]; + char filenm[MAXPATHLEN + 1]; + char s[6][128]; + register int n, i, lc_cnt = 0, all_size; + FILE *fp; + register char *p, *ptr, *ret; + FunctionTable *f; + XIMLangDataBase *ld; + XIMLcNameRec *lnl, *lnl_p; + + strcpy (filenm, LIBDIR); + strcat (filenm, XIM_CONFIG_FILE); + if ((fp = fopen (filenm, "r")) == NULL) + { + print_out1 ("Can't open xim.conf \"%s\".", filenm); + return (-1); + } + + while (1) + { + ptr = buf; + while (1) + { + if (!(ret = fgets (ptr, BUFSIZ, fp))) + { + break; + } + if (*ptr == '\n') + continue; + if ((i = strlen (ptr)) > 1 && ptr[i - 2] == '\\') + { + ptr += i - 2; + continue; + } + break; + } + if (!ret) + break; + if (comment_char (*buf) || (n = sscanf (buf, "%s %s %s %s %s %s", s[0], s[1], s[2], s[3], s[4], s[5])) < 1) + { + continue; + } + if (!strcmp (s[0], "setdefaultlocale")) + { + if (n < 2) + goto ARG_ERR; + if (!(def_locale = alloc_and_copy (s[1]))) + goto CLOSE_RET; + + } + else if (!strcmp (s[0], "setworldlocale")) + { + if (n < 2) + goto ARG_ERR; + if (!(world_locale = alloc_and_copy (s[1]))) + goto CLOSE_RET; + } + else + { + if (n < 6) + goto ARG_ERR; + all_size = sizeof (XIMLangDataBase) + strlen (s[0]) + strlen (s[1]) + strlen (s[2]) + 3; + if (!(p = (char *) Malloc (all_size))) + { + malloc_error ("allocation of the initial area"); + goto CLOSE_RET; + } + bzero (p, all_size); + ld = (XIMLangDataBase *) p; + p += sizeof (XIMLangDataBase); + strcpy (p, s[0]); + ptr = p; + lc_cnt = 0; + do + { + if (lc_cnt) + { + *ptr++ = '\0'; + } + lc_cnt++; + } + while (*ptr && (ptr = index (ptr, '|'))); + if (!(lnl_p = (XIMLcNameRec *) Malloc (sizeof (XIMLcNameRec) * lc_cnt))) + { + malloc_error ("allocation of the initial area"); + goto CLOSE_RET; + } + ptr = p; + for (i = 0; i < lc_cnt; i++) + { + for (lnl = lc_name_list; lnl; lnl = lnl->next) + { + if (!strcmp (lnl->lc_name, ptr)) + { + print_out2 ("In xim.conf file \"%s\", locale \"%s\" is redeclared.", filenm, ptr); + goto CLOSE_RET; + } + } + lnl_p[i].lc_name = ptr; + ptr += strlen (ptr) + 1; + lnl_p[i].lang_db = ld; + if (i != 0) + { + lnl_p[i].next = &lnl_p[i - 1]; + } + } + lnl_p[0].next = lc_name_list; + lc_name_list = &lnl_p[lc_cnt - 1]; + + p += strlen (s[0]) + 1; + ld->lang = (char *) p; + strcpy (ld->lang, s[1]); + + p += strlen (s[1]) + 1; + ld->lc_name = (char *) p; + strcpy (ld->lc_name, s[2]); + + if ((ld->cswidth_id = create_cswidth (s[3])) == 0) + { + print_out2 ("In xim.conf file \"%s\", \"%s\" is a bad string for CSWIDTH.", filenm, s[3]); + goto CLOSE_RET; + } + if (!strcmp (s[4], "True") || !strcmp (s[4], "TRUE")) + { + ld->connect_serv = True; + } + else + { + ld->connect_serv = False; + } + ld->f_table = (FunctionTable *) NULL; + for (f = function_db, i = 0; f[i].name; i++) + { + if (!strcmp (s[5], f[i].name)) + { + ld->f_table = &(f[i]); + break; + } + } + if (!ld->f_table) + { + print_out2 ("In xim.conf file \"%s\", \"%s\" is a bad string for functions.", filenm, s[5]); + goto CLOSE_RET; + } + if (language_db) + { + ld->next = language_db; + } + else + { + ld->next = NULL; + } + language_db = ld; + default_set_of_ld (ld); + } + } + fclose (fp); + if (!def_locale) + if (!(def_locale = alloc_and_copy (DEFAULT_LANG))) + return (-1); + if (!world_locale) + if (!(world_locale = alloc_and_copy (DEFAULT_WORLD_LOCALE))) + return (-1); + return (0); +ARG_ERR: + print_out2 ("In xim.conf file \"%s\", too few arguments at line \"%s\".", filenm, buf); +CLOSE_RET: + fclose (fp); + return (-1); +}