Mercurial > freewnn
diff Xwnmo/xwnmo/xcvtkey.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/xcvtkey.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,253 @@ +/* + * $Id: xcvtkey.c,v 1.2 2001/06/14 18:16:18 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: + * + */ + +/************************************************************************* + xcvtkey.c +*/ + +#include <stdio.h> +#include "commonhd.h" +#include "sdefine.h" +#ifdef XJUTIL +#include "xjutil.h" +#include "sxheader.h" +#include "xext.h" +#else /* XJUTIL */ +#include "xim.h" +#include "sheader.h" +#include "ext.h" +#endif /* XJUTIL */ + +char *comment_char_str = "#;"; + +int +comment_char (c) + register char c; +{ + return ((index (comment_char_str, c) != NULL) ? 1 : 0); +} + +typedef struct +{ + char *name; + unsigned int state; +} +StateTbl; + +static StateTbl state_tbl[] = { + {"Shift", ShiftMask}, + {"Lock", LockMask}, + {"Ctrl", ControlMask}, + {"Meta", Mod1Mask}, + {"Meta1", Mod1Mask}, + {"Meta2", Mod2Mask}, + {"Meta3", Mod3Mask}, + {"Meta4", Mod4Mask}, + {"Meta5", Mod5Mask}, + {NULL, 0} +}; + +static unsigned int +get_one_entry (p) + char **p; +{ + register char *s; + register int size; + register StateTbl *st = state_tbl; + char buf[512]; + + if (!*p || !**p) + return (-1); + if (s = index (*p, '|')) + { + size = s - *p; + bcopy (*p, buf, size); + buf[size] = '\0'; + for (; st->name; st++) + { + if (!strcmp (st->name, buf)) + { + *p += size + 1; + return (st->state); + } + } + } + return (0); +} + +int +cvt_key_setup (filename) + char *filename; +{ + register int k, cnt = cvt_key_tbl_cnt, line = 0; + register unsigned int state, total_state; + KeySym c; + char ksname[128], code[32], *p; + char buf[BUFSIZ]; + FILE *fp; + register ConvCode *tbl = cvt_key_tbl; + extern long strtol (); + + if ((fp = fopen (filename, "r")) == NULL) + { + return (-1); + } + +CONTI: + while (fgets (buf, BUFSIZ, fp)) + { + line++; + if (comment_char (*buf) || (k = sscanf (buf, "%s %s", ksname, code)) <= 0) + continue; + if (k < 2) + { + print_out2 ("In cvt file \"%s\", too few arguments in line %d.", filename, line); + } + else + { + p = ksname; + total_state = 0; + while (1) + { + state = get_one_entry (&p); + if (state <= 0) + break; + total_state |= state; + } + if (state == -1 || (c = XStringToKeysym (p)) == 0) + { + print_out2 ("In cvt file \"%s\", a illegal string in line %d.", ksname, line); + continue; + } + for (k = 0; k < cnt; k++) + { + if (tbl[k].fromkey.keysym == c && tbl[k].fromkey.state == total_state) + { + print_out2 ("In cvt file \"%s\", duplicate declaration in line %d.", ksname, line); + goto CONTI; + } + } + tbl[cnt].fromkey.keysym = c; + tbl[cnt].fromkey.state = total_state; + tbl[cnt++].tokey = strtol (code, (char **) NULL, 0); + } + if (cnt >= MAX_CVT_ENTRY_CNT) + { + print_out2 ("In cvt file \"%s\", max line is %d.", ksname, MAX_CVT_ENTRY_CNT); + break; + } + } + fclose (fp); + cvt_key_tbl_cnt = cnt; + return (cnt); +} + + +/* Function of convert */ + +int +cvt_key_fun (keysym, state) + KeySym keysym; + int state; +{ + register int cnt; + register ConvCode *tbl = cvt_key_tbl; + + for (cnt = 0; cnt < cvt_key_tbl_cnt; cnt++) + { + if (tbl[cnt].fromkey.keysym == keysym && tbl[cnt].fromkey.state == state) + return (tbl[cnt].tokey); + } + return (-1); +} + +/* Backward compatibility for cvt_meta and cvt_fun. */ +int +cvt_meta_and_fun_setup (filename, tbl, state_name) + char *filename; + ConvCode *tbl; + char *state_name; +{ + register int k, cnt = cvt_key_tbl_cnt, line = 0; + register StateTbl *st = state_tbl; + KeySym c; + unsigned int state = 0; + char ksname[32], code[32]; + char buf[BUFSIZ]; + FILE *fp; + extern long strtol (); + + if ((fp = fopen (filename, "r")) == NULL) + { + return (-1); + } + + if (state_name && *state_name) + { + for (; st->name; st++) + { + if (!strcmp (st->name, state_name)) + { + state = st->state; + break; + } + } + } + while (fgets (buf, BUFSIZ, fp)) + { + line++; + if (comment_char (*buf) || (k = sscanf (buf, "%s %s", ksname, code)) <= 0) + continue; + if (k < 2) + { + print_out2 ("In cvt file \"%s\", too few arguments in line %d.", filename, line); + } + else if ((c = XStringToKeysym (ksname)) == 0) + { + print_out2 ("In cvt file \"%s\", a illegal Keysym in line %d.", ksname, line); + } + else + { + tbl[cnt].fromkey.keysym = c; + tbl[cnt].fromkey.state = state; + tbl[cnt].tokey = strtol (code, (char **) NULL, 0); + cnt++; + } + } + fclose (fp); + return (cnt); +}