Mercurial > kinput2.yaz
diff lib/Xsj3clib/sjrc.c @ 0:92745d501b9a
initial import from kinput2-v3.1
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 08 Mar 2010 04:44:30 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/sjrc.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,1678 @@ +#ifndef lint +static char *rcsid = "$Id: sjrc.c,v 2.3 1993/01/06 10:56:56 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include <stdio.h> +#include <ctype.h> +#include "common.h" +#include "sj3ctype.h" +#include "util.h" +#include "table.h" + +void Xsj3cRCInit(); + +static int _Xsj3cReadRC(); + +extern int _Xsj3cSetKeyTable(); +static int _Xsj3cSetInputMode(); +static int _Xsj3cSetPrintMode(); +static int _Xsj3cSetDefCode(); +static int _Xsj3cSetMuhenkan(); +static int _Xsj3cSetMuEdit(); +static int _Xsj3cSetMToggle(); +int _Xsj3cSetGuide(); +static int _Xsj3cSetBStudy(); +static int _Xsj3cSetRkeBell(); +static int _Xsj3cSetFlushAfterConv(); +static int _Xsj3cSetSj3Serv(); +static int _Xsj3cSetNormal(); +static int _Xsj3cSetThroughNext(); + +static int _Xsj3cSetSj3Serv2(); +static int _Xsj3cSetFlushInConv(); +static int _Xsj3cSetFlushSelectConv(); +static int _Xsj3cSetFlushEndConv(); +static int _Xsj3cSetAlphaConv(); +static int _Xsj3cSetBackDisplay(); +static int _Xsj3cSetSegLast(); +static int _Xsj3cSetExpandMConv(); +static int _Xsj3cSetShrinkMConv(); +static int _Xsj3cSetExpandKConv(); +static int _Xsj3cSetShrinkKConv(); +static int _Xsj3cSetShrinkAll(); +static int _Xsj3cSetConvSeg(); +static int _Xsj3cSetUnconvSeg(); +static int _Xsj3cSetDelChange(); +static int _Xsj3cSetFlushChange(); +static int _Xsj3cSetModeConv(); +static int _Xsj3cSetMoveLoop(); +static int _Xsj3cSetModeBySeg(); +static int _Xsj3cSetJumpBySeg(); +static int _Xsj3cSetDelBySeg(); +static int _Xsj3cSetKillBySeg(); +static int _Xsj3cSetMuhenCursorLast(); +static int _Xsj3cSetEditCursorLast(); +static int _Xsj3cSetFlushCursorLast(); +static int _Xsj3cSetUnderLine(); +static int _Xsj3cSetDispMChange(); +static int _Xsj3cSetDelLastMove(); +static int _Xsj3cSetKanaInput(); +static int _Xsj3cSetInputSame(); +static int _Xsj3cSetCntrlSame(); +static int _Xsj3cSetSelectConv(); +static int _Xsj3cSetBeforeConv(); +static int _Xsj3cSetLastDoubleConv(); +static int _Xsj3cSetSelectCount(); +static int _Xsj3cSetSelectBackMove(); +static int _Xsj3cSetCandidatePad(); +static int _Xsj3cSetNextRCFile(); +static int _Xsj3cSetIncludeRCFile(); + +static struct functable { + char *keyword; + int (*func)(); +} funcs[] = { + "key", _Xsj3cSetKeyTable, + "escape", _Xsj3cSetKeyTable, + "sjxkey", _Xsj3cSetKeyTable, + "ki2key", _Xsj3cSetKeyTable, + "initialmode", _Xsj3cSetInputMode, + "defaultcode", _Xsj3cSetDefCode, + "muhenkanmode", _Xsj3cSetMuhenkan, + "muhenkaninedit", _Xsj3cSetMuEdit, + "muhenkantoggle", _Xsj3cSetMToggle, + "guide", _Xsj3cSetGuide, + "bstudy", _Xsj3cSetBStudy, + "rkerrbell", _Xsj3cSetRkeBell, + "flushafterconversion", _Xsj3cSetFlushAfterConv, + "server", _Xsj3cSetSj3Serv, + "sj3serv", _Xsj3cSetSj3Serv, + "setnormal", _Xsj3cSetNormal, + "throughnext", _Xsj3cSetThroughNext, + "sj3serv2", _Xsj3cSetSj3Serv2, + "flushinconversion", _Xsj3cSetFlushInConv, + "flushselectconversion", _Xsj3cSetFlushSelectConv, + "flushendconversion", _Xsj3cSetFlushEndConv, + "alphabetconversion", _Xsj3cSetAlphaConv, + "backdisplay", _Xsj3cSetBackDisplay, + "beginconversionlast", _Xsj3cSetSegLast, + "expandmodeconversion", _Xsj3cSetExpandMConv, + "shrinkmodeconversion", _Xsj3cSetShrinkMConv, + "expandkanjiconversion", _Xsj3cSetExpandKConv, + "shrinkkanjiconversion", _Xsj3cSetShrinkKConv, + "shrinkall", _Xsj3cSetShrinkAll, + "henkansegment", _Xsj3cSetConvSeg, + "muhenkansegment", _Xsj3cSetUnconvSeg, + "deletechangesegment", _Xsj3cSetDelChange, + "flushchangesegment", _Xsj3cSetFlushChange, + "modeconversion", _Xsj3cSetModeConv, + "moveloop", _Xsj3cSetMoveLoop, + "movebysegment", _Xsj3cSetModeBySeg, + "jumpbysegment", _Xsj3cSetJumpBySeg, + "deletebysegment", _Xsj3cSetDelBySeg, + "killbysegment", _Xsj3cSetKillBySeg, + "muhenkancursorlast", _Xsj3cSetMuhenCursorLast, + "editkancursorlast", _Xsj3cSetEditCursorLast, + "flushkancursorlast", _Xsj3cSetFlushCursorLast, + "convertedunderline", _Xsj3cSetUnderLine, + "displaymodechange", _Xsj3cSetDispMChange, + "deletelastmove", _Xsj3cSetDelLastMove, + "kanainputonly", _Xsj3cSetKanaInput, + "inputsametime", _Xsj3cSetInputSame, + "controlsametime", _Xsj3cSetCntrlSame, + "printmode", _Xsj3cSetPrintMode, + "beforeselectconversion", _Xsj3cSetSelectConv, + "beforeconversion", _Xsj3cSetBeforeConv, + "lastdoubleconversion", _Xsj3cSetLastDoubleConv, + "beforeselectcount", _Xsj3cSetSelectCount, + "selectbackspacemove", _Xsj3cSetSelectBackMove, + "candidatepadding", _Xsj3cSetCandidatePad, + "nextrcfile", _Xsj3cSetNextRCFile, + "include", _Xsj3cSetIncludeRCFile, + NULL, NULL +}; + +static int inc_cnt; + +#define END -1 +#define COMMENT 0 +#define NORMAL 1 +#define BAD 2 +#define OTHERS 3 +#define SERIAL "nwp511" +#define SERIAL2 "nwp517" +#define SERIAL3 "nwp-511" + +/* + * Xsj3cRCInit() + * Decide sjrc file to read, then read it and set resources. + */ +void +Xsj3cRCInit(buf, sjrc, home) + Xsj3cBuf buf; + char *sjrc; + char *home; +{ + extern char *getenv(); + register char *p; + SjrcRec rctable; + struct functable *functp; + FILE *fp; + register int line; + int status; + + if (!buf->rcfile) { + if ((buf->rcfile = (char *)malloc(BUFSIZ)) == NULL) + Xsj3cError("Can't allocate sjrc file"); + *buf->rcfile = '\0'; + + /* Get sjrc file and open */ + if (sjrc) { + if ((fp = fopen(sjrc, "r")) == NULL) + Xsj3cError("can't open sjrc file %s", sjrc); + strcpy(buf->rcfile, sjrc); + } else { + if ((p = getenv("SJRC")) && *p != '\0') { + if (*p != '/') { + if (home) + strcpy(buf->rcfile, home); + strcat(buf->rcfile, "/"); + } + strcat(buf->rcfile, p); + } else if (home) { + strcpy(buf->rcfile, home); + strcat(buf->rcfile, "/.sjrc"); + } else { + strcpy(buf->rcfile, SJ3DEFPATH); + strcat(buf->rcfile, DEF_SJRC_FILE); + } + if ((fp = fopen(buf->rcfile, "r")) == NULL) { + strcpy(buf->rcfile, SJ3DEFPATH); + strcat(buf->rcfile, DEF_SJRC_FILE); + if ((fp = fopen(buf->rcfile, "r")) == NULL) { + Xsj3cError("can't open sjrc file %s", buf->rcfile); + } + } + } + } else { + if ((fp = fopen(buf->rcfile, "r")) == NULL) { + Xsj3cWarning("can't open sjrc file %s", buf->rcfile); + return; + } + } + + /* Read sjrc file and set buffer fields */ + inc_cnt = 0; + for (line = 0; (status = + _Xsj3cReadRC(fp, &rctable)) != END; line++) { + functp = funcs; + if (status == NORMAL) { + while (functp->keyword != NULL) { + if (_Xsj3cCmp(rctable.key[0], functp->keyword)) { + if (!(*(functp->func))(buf, &rctable)) + Xsj3cWarning("wrong format in sjrc file. %s:%d", + buf->rcfile, line + 1); + break; + } + functp++; + } + } else if (status == COMMENT || status == OTHERS) { + continue; + } else { + Xsj3cWarning("bad line in sjrc file. %s:%d", buf->rcfile, line); + continue; + } + } + fclose(fp); +} + +/* + * _Xsj3cReadRC() + * Read sjrc file. (Non memory copy version) + */ +static int +_Xsj3cReadRC(fp, rctable) + FILE *fp; + Sjrctable rctable; +{ + static unsigned char buf[256]; + register int i, j, k, end, byte2 = 0, kana = 0; + + if ((fgets (buf, sizeof(buf), fp)) == NULL) + return END; + + if (buf[0] == '\n' || buf[0] == '#' || buf[0] == '\0' ) + return COMMENT; + + for (i = 0, k = 0, end = 0; buf[i] != ' ' && buf[i] != '\t' && + buf[i] != '#' && buf[i] != '\n';) { + for (j = i; buf[i] != ' ' && buf[i] != '\t' + && buf[i] != '#' && buf[i] != '\n' && buf[i] != '.'; i++); + if (j == i && buf[i] == '.' ) { + i++; + continue; + } + if (buf[i] == '#' || buf[i] == '\n' ) + return BAD; + if (buf[i] == '\t' || buf[i] == ' ' ) + end++; + buf[i++] = '\0'; + if (!strcmp(&buf[j],SERIAL) || !strcmp(&buf[j],SERIAL2) + || !strcmp(&buf[j],SERIAL3)) + return OTHERS; + rctable->key[k++] = &buf[j]; + if (end) + break; + } + if ( k < 1) + return BAD; + for (; k < 2;) + rctable->key[k++] = NULL; + while(buf[i] == ' ' || buf[i] == '\t') i++; + if (in_lang == JP_SJIS || in_lang == JP_EUC) { + for (k = 0, end = 0; buf[i] != '\n';) { + for (j = i; buf[i] != '\n' ; i+=2) { + if (iskan1(buf[i], in_lang)) { + if (iskan2(buf[i + 1], in_lang)) + continue; + else if (buf[i + 1] == '#' || buf[i + 1] == ' ' + || buf[i + 1] == '\t'|| buf[i + 1] == '\n') { + i++; + break; + } else + continue; + } else if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') { + break; + } else if (buf[i] == '.') { + if (i > 0 && buf[i - 1] == '\\') { + continue; + } else + break; + } else if (buf[i + 1] == '#' || buf[i + 1] == ' ' + || buf[i + 1] == '\t' || buf[i + 1] == '\n') { + i++; + break; + } else if (buf[i + 1] == '.') { + if (buf[i] == '\\') { + continue; + } else { + i++; + break; + } + } else + continue; + } + if (buf[i] == '#' || buf[i] == '\n' ) + end++; + buf[i++] = '\0'; + rctable->value[k++] = &buf[j]; + if (end) + break; + while(buf[i] == ' ' || buf[i] == '\t') i++; + } + } else { + for (k = 0, end = 0; buf[i] != '\n';) { + for (j = i; buf[i] != '\n'; i++) { + if (buf[i] == ESC) { + if (buf[i + 1] == '#' || buf[i + 1] == ' ' || + buf[i + 1] == '\t'|| buf[i + 1] == '.' || + buf[i + 1] == '\n') { + i++; + break; + } else if (byte2) + byte2 = 0; + else + byte2++; + i += 2; + continue; + } else if (buf[i] == SO || buf[i] == SI) { + if (buf[i + 1] == '#' || buf[i + 1] == ' ' || + buf[i + 1] == '\t'|| buf[i + 1] == '.' || + buf[i + 1] == '\n') { + i++; + break; + } else if (buf[i] == SI) + kana = 0; + else + kana++; + continue; + } else if (byte2 || kana) + continue; + if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') { + break; + } else if (buf[i] == '.') { + if (i > 0 && buf[i - 1] == '\\') { + continue; + } else + break; + } else + continue; + } + if (buf[i] == '#' || buf[i] == '\n' ) + end++; + buf[i++] = '\0'; + rctable->value[k++] = &buf[j]; + if (end) + break; + while(buf[i] == ' ' || buf[i] == '\t') i++; + } + } + if ( k < 1) + return BAD; + for (; k < 10;) + rctable->value[k++] = NULL; + return NORMAL; +} + +/* + * _Xsj3cSetInputMode() + * Set a parameter by .initialmode entry. + */ +static int +_Xsj3cSetInputMode(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register int i, j; + + for (i = 0, j = 0; i < MODE_INROT_NUM; i++, j++) { + if (table->value[j]) { + if (_Xsj3cCmp(table->value[j], "hiragana")) { + buf->inmoderot[i] = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[j], "zkatakana")) { + buf->inmoderot[i] = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[j], "hkatakana")) { + buf->inmoderot[i] = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[j], "halpha")) { + buf->inmoderot[i] = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[j], "zalpha")) { + buf->inmoderot[i] = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[j], "jis")) { + buf->inmoderot[i] = MODE_JIS; + } else if (_Xsj3cCmp(table->value[j], "sjis")) { + buf->inmoderot[i] = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[j], "kuten")) { + buf->inmoderot[i] = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[j], "euc")) { + buf->inmoderot[i] = MODE_EUC; + } else { + if (!_Xsj3cCmp(table->value[j], "unbuff") + && !_Xsj3cCmp(table->value[j], "buffer") + && !_Xsj3cCmp(table->value[j], "unbuffer") + && !_Xsj3cCmp(table->value[j], "direct")) + Xsj3cWarning("Unknown input mode \"%s\"",table->value[j]); + i--; + continue; + } + } else { + break; + } + } + if ((buf->inmoderotnum = i) > 0) + return 1; + else + return 0; +} + +/* + * _Xsj3cSetPrintMode() + * Set a parameter by .PrintMode entry. + */ +static int +_Xsj3cSetPrintMode(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register int i, j; + + for (i = 0, j = 0; i < MODE_OUTROT_NUM; i++, j++) { + if (table->value[j]) { + if (_Xsj3cCmp(table->value[j], "hiragana")) { + buf->outmoderot[i] = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[j], "zkatakana")) { + buf->outmoderot[i] = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[j], "hkatakana")) { + buf->outmoderot[i] = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[j], "halpha")) { + buf->outmoderot[i] = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[j], "zalpha")) { + buf->outmoderot[i] = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[j], "hankaku")) { + buf->outmoderot[i] = MODE_HANKAKU; + } else if (_Xsj3cCmp(table->value[j], "zenkaku")) { + buf->outmoderot[i] = MODE_ZENKAKU; + } else if (_Xsj3cCmp(table->value[j], "upper")) { + buf->outmoderot[i] = MODE_UPPER; + } else if (_Xsj3cCmp(table->value[j], "lower")) { + buf->outmoderot[i] = MODE_LOWER; + } else { + Xsj3cWarning("Unknown print mode \"%s\"",table->value[j]); + i--; + continue; + } + } else { + break; + } + } + if ((buf->outmoderotnum = i) > 0) + return 1; + else + return 0; +} + +/* + * _Xsj3cSetDefCode() + * Set a parameter by .defaultcode entry. + */ +static int +_Xsj3cSetDefCode(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register int i; + + for (i = 0; i < MODE_CODE_NUM; i++) { + if (table->value[i]) { + if (_Xsj3cCmp(table->value[i], "jis")) { + buf->defcode[i] = MODE_JIS; + } else if (_Xsj3cCmp(table->value[i], "sjis")) { + buf->defcode[i] = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[i], "kuten")) { + buf->defcode[i] = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[i], "euc")) { + buf->defcode[i] = MODE_EUC; + } else { + Xsj3cWarning("Unknown input code"); + break; + } + } else { + break; + } + } + if ((buf->coderotnum = i) > 0) + return 1; + else + return 0; +} + +/* + * _Xsj3cSetMuhenkan() + * Set a parameter by .MuhenkanMode entry. + */ +static int +_Xsj3cSetMuhenkan(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + if (_Xsj3cCmp(table->value[0], "hiragana")) { + buf->muhenmode = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[0], "zkatakana")) { + buf->muhenmode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[0], "hkatakana")) { + buf->muhenmode = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[0], "halpha")) { + buf->muhenmode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[0], "zalpha")) { + buf->muhenmode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[0], "jis")) { + buf->muhenmode = MODE_JIS; + } else if (_Xsj3cCmp(table->value[0], "sjis")) { + buf->muhenmode = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[0], "kuten")) { + buf->muhenmode = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[0], "euc")) { + buf->muhenmode = MODE_EUC; + } else { + Xsj3cWarning("Invalid muhenkan mode \"%s\"",table->value[0]); + } + } + return 1; +} + +/* + * _Xsj3cSetMuEdit() + * Set a parameter by .MuhenkanInEdit entry. + */ +static int +_Xsj3cSetMuEdit(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + if (_Xsj3cCmp(table->value[0], "hiragana")) { + buf->togglemode = MODE_HIRA; + } else if (_Xsj3cCmp(table->value[0], "zkatakana")) { + buf->togglemode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->value[0], "hkatakana")) { + buf->togglemode = MODE_HKATA; + } else if (_Xsj3cCmp(table->value[0], "halpha")) { + buf->togglemode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->value[0], "zalpha")) { + buf->togglemode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->value[0], "jis")) { + buf->togglemode = MODE_JIS; + } else if (_Xsj3cCmp(table->value[0], "sjis")) { + buf->togglemode = MODE_SJIS; + } else if (_Xsj3cCmp(table->value[0], "kuten")) { + buf->togglemode = MODE_KUTEN; + } else if (_Xsj3cCmp(table->value[0], "euc")) { + buf->togglemode = MODE_EUC; + } else { + Xsj3cWarning("Unknown toggle mode"); + } + } + + return 1; +} + +/* + * _Xsj3cSetMToggle() + * Set a parameter by .MuhenkanToggle entry. + */ +static int +_Xsj3cSetMToggle(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->dotoggle = ON; + else + buf->dotoggle = OFF; + return 1; +} + +/* + * _Xsj3cSetGuide() + * Set a parameter by .guide entry. + */ +int +_Xsj3cSetGuide(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3csMode mode; + wchar data[KANABUFSIZ]; + + if (table->key[1] && table->value[0]) { + if (_Xsj3cCmp(table->key[1], "hiragana")) { + mode = MODE_HIRA; + } else if (_Xsj3cCmp(table->key[1], "zkatakana")) { + mode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->key[1], "hkatakana")) { + mode = MODE_HKATA; + } else if (_Xsj3cCmp(table->key[1], "halpha")) { + mode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->key[1], "zalpha")) { + mode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->key[1], "jis")) { + mode = MODE_JIS; + } else if (_Xsj3cCmp(table->key[1], "sjis")) { + mode = MODE_SJIS; + } else if (_Xsj3cCmp(table->key[1], "kuten")) { + mode = MODE_KUTEN; + } else if (_Xsj3cCmp(table->key[1], "euc")) { + mode = MODE_EUC; + } else if (_Xsj3cCmp(table->key[1], "toroku")) { + mode = MODE_TOROKU; + } else if (_Xsj3cCmp(table->key[1], "register")) { + mode = MODE_TOROKU; + } else if (_Xsj3cCmp(table->key[1], "syoukyo")) { + mode = MODE_SYOUKYO; + } else if (_Xsj3cCmp(table->key[1], "eliminate")) { + mode = MODE_SYOUKYO; + } else if (_Xsj3cCmp(table->key[1], "kanji")) { + mode = MODE_KANJI; + } else if (_Xsj3cCmp(table->key[1], "edit")) { + mode = MODE_EDIT; + } else if (_Xsj3cCmp(table->key[1], "candidate")) { + mode = MODE_CAND; + } else if (_Xsj3cCmp(table->key[1], "symbol")) { + mode = MODE_SYMBOL; + } else if (_Xsj3cCmp(table->key[1], "hinsi")) { + mode = MODE_HINSI; + } else if (_Xsj3cCmp(table->key[1], "quote")) { + mode = MODE_QUOTE; + } else { + Xsj3cWarning("Unknown display mode key \"%s\"",table->key[1]); + return 0; + } + _Xsj3cmINtowOUT(buf->rcfile, table->value[0], data, + &buf->modelen[mode]); + if (!buf->modestr[mode]) { + if (!(buf->modestr[mode] + = (wchar *)malloc((buf->modelen[mode] + 1) * sizeof(wchar)))) + Xsj3cError("Cannot allocate for mode string"); + } else { + if (!(buf->modestr[mode] = (wchar *)realloc(buf->modestr[mode], + (buf->modelen[mode] + 1) * sizeof(wchar)))) + Xsj3cError("Cannot reallocate for mode string"); + } + _Xsj3cWcpy(buf->modestr[mode], data); + return 1; + } else { + return 0; + } +} + +/* + * _Xsj3cSetBStudy() + * Set a parameter by .bstudy entry. + */ +static int +_Xsj3cSetBStudy(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->gakusyuu = ON; + else + buf->gakusyuu = OFF; + return 1; +} + +/* + * _Xsj3cSetFlushAfterConv() + * Set a parameter by .flushafterconversion entry. + */ +static int +_Xsj3cSetFlushAfterConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushaconv = ON; + else + buf->flushaconv = OFF; + return 1; +} + +/* + * _Xsj3cSetFlushInConv() + * Set a parameter by .FlushInConversion entry. + */ +static int +_Xsj3cSetFlushInConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushiconv = ON; + else if (_Xsj3cCmp(table->value[0],"off")) + buf->flushiconv = OFF; + else if (_Xsj3cCmp(table->value[0],"edit")) + buf->flushiconv = EDIT; + else + buf->flushiconv = NONE; + return 1; +} + +/* + * _Xsj3cSetFlushSelectConv() + * Set a parameter by .FlushSelectConversion entry. + */ +static int +_Xsj3cSetFlushSelectConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushsconv = ON; + else if (_Xsj3cCmp(table->value[0],"off")) + buf->flushsconv = OFF; + else if (_Xsj3cCmp(table->value[0],"edit")) + buf->flushsconv = EDIT; + else + buf->flushsconv = NONE; + return 1; +} + +/* + * _Xsj3cSetFlushEndConv() + * Set a parameter by .FlushEndConversion entry. + */ +static int +_Xsj3cSetFlushEndConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flusheconv = ON; + else + buf->flusheconv = OFF; + return 1; +} + +/* + * _Xsj3cSetRkeBell() + * Set a parameter by .rkerrbell entry. + */ +static int +_Xsj3cSetRkeBell(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->rkbell = ON; + else + buf->rkbell = OFF; + return 1; +} + +/* + * _Xsj3cSetSj3Serv() + * Set a parameter by .server entry. + */ +static int +_Xsj3cSetSj3Serv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + static char hostname1[32]; + _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname1); + buf->sj3serv = hostname1; + return 1; + } + return 0; +} + +/* + * _Xsj3cSetNormal() + * Set a parameter by .SetNormal entry. + */ +static int +_Xsj3cSetNormal(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0] && iscntrl(*table->value[0])) { + register unsigned char *c; + register int len; + if (buf->setnormal) { + c = buf->setnormal; + while (*c != '\0') { + if (*c == *table->value[0]) + return 1; /* same code */ + c++; + } + len = c - buf->setnormal; + buf->setnormal = (unsigned char *)realloc(buf->setnormal, len + 2); + *(buf->setnormal + len) = *table->value[0]; + *(buf->setnormal + len + 1) = '\0'; + } else { + buf->setnormal = (unsigned char *)malloc(2); + c = buf->setnormal; + *c++ = *table->value[0]; + *c = '\0'; + } + return 1; + } + return 0; +} + +/* + * _Xsj3cSetThroughNext() + * Set a parameter by .ThroughtNext entry. + */ +static int +_Xsj3cSetThroughNext(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0] && iscntrl(*table->value[0])) { + register unsigned char *c; + int len; + if (buf->throughnext) { + c = buf->throughnext; + while (*c != '\0') { + if (*c == *table->value[0]) + return 1; /* same code */ + c++; + } + len = c - buf->throughnext; + buf->throughnext + = (unsigned char *)realloc(buf->throughnext, len + 2); + *(buf->throughnext + len) = *table->value[0]; + *(buf->throughnext + len + 1) = '\0'; + } else { + buf->throughnext = (unsigned char *)malloc(2); + c = buf->throughnext; + *c++ = *table->value[0]; + *c = '\0'; + } + return 1; + } + return 0; +} + +/* + * _Xsj3cSetSj3Serv2() + * Set a parameter by .sj3serv2 entry. + */ +static int +_Xsj3cSetSj3Serv2(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (table->value[0]) { + static char hostname2[32]; + _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname2); + buf->sj3serv2 = hostname2; + return 1; + } + return 0; +} + +/* + * _Xsj3cSetAlphaConv() + * Set a parameter by .AlphabetConversion entry. + */ +static int +_Xsj3cSetAlphaConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->alphaconv = ON; + else + buf->alphaconv = OFF; + return 1; +} + +/* + * _Xsj3cSetBackDisplay() + * Set a parameter by .BackDisplay entry. + */ +static int +_Xsj3cSetBackDisplay(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->backdisplay = ON; + else + buf->backdisplay = OFF; + return 1; +} + +/* + * _Xsj3cSetSegLast() + * Set a parameter by .BeginConversionLast entry. + */ +static int +_Xsj3cSetSegLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->beginlastseg = ON; + else if (_Xsj3cCmp(table->value[0],"off")) + buf->beginlastseg = OFF; + else + buf->beginlastseg = NONE; + return 1; +} + +/* + * _Xsj3cSetShrinkAll() + * Set a parameter by .ShrinkAll entry. + */ +static int +_Xsj3cSetShrinkAll(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->shrinkall = ON; + else + buf->shrinkall = OFF; + return 1; +} + +/* + * _Xsj3cSetDelChange() + * Set a parameter by .DeleteChangeSegment entry. + */ +static int +_Xsj3cSetDelChange(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->delchange = ALL; + else if (_Xsj3cCmp(table->value[0],"after")) + buf->delchange = AFTER; + else + buf->delchange = ONE; + return 1; +} + +/* + * _Xsj3cSetFlushChange() + * Set a parameter by .FlushChangeSegment entry. + */ +static int +_Xsj3cSetFlushChange(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->flushchange = ALL; + else + buf->flushchange = ONE; + return 1; +} + +/* + * _Xsj3cSetExpandKConv() + * Set a parameter by .ExpandKanjiConversion entry. + */ +static int +_Xsj3cSetExpandKConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->expandkconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetShrinkKConv() + * Set a parameter by .ShrinkKanjiConversion entry. + */ +static int +_Xsj3cSetShrinkKConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->shrinkkconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetExpandMConv() + * Set a parameter by .ExpandModeConversion entry. + */ +static int +_Xsj3cSetExpandMConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->expandmconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetShrinkMConv() + * Set a parameter by .ShrinkModeConversion entry. + */ +static int +_Xsj3cSetShrinkMConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->shrinkmconv = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetMoveLoop() + * Set a parameter by .MoveLoop entry. + */ +static int +_Xsj3cSetMoveLoop(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->moveloop = ON; + else + buf->moveloop = OFF; + return 1; +} + +/* + * _Xsj3cSetJumpBySeg() + * Set a parameter by .JumpBySegment entry. + */ +static int +_Xsj3cSetJumpBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->jumpbyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetModeBySeg() + * Set a parameter by .MoveBySegment entry. + */ +static int +_Xsj3cSetModeBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->movebyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetDelBySeg() + * Set a parameter by .DeleteBySegment entry. + */ +static int +_Xsj3cSetDelBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->delbyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetKillBySeg() + * Set a parameter by .KillBySegment entry. + */ +static int +_Xsj3cSetKillBySeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3cFlag input, conved; + + if (!(table->value[0] && table->value[1])) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + buf->killbyseg = (conved << 1) + input; + return 1; +} + +/* + * _Xsj3cSetMuhenCursorLast() + * Set a parameter by .MuhenkanCursorLast entry. + */ +static int +_Xsj3cSetMuhenCursorLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->muhencurlast = ON; + else + buf->muhencurlast = OFF; + return 1; +} + +/* + * _Xsj3cSetEditCursorLast() + * Set a parameter by .EditCursorLast entry. + */ +static int +_Xsj3cSetEditCursorLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->editcurlast = ON; + else + buf->editcurlast = OFF; + return 1; +} + +/* + * _Xsj3cSetFlushCursorLast() + * Set a parameter by .FlushCursorLast entry. + */ +static int +_Xsj3cSetFlushCursorLast(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->flushcurlast = ON; + else + buf->flushcurlast = OFF; + return 1; +} + +/* + * _Xsj3cSetUnconvSeg() + * Set a parameter by .MuhenkanSegment entry. + */ +static int +_Xsj3cSetUnconvSeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->muhenseg = ALL; + else if (_Xsj3cCmp(table->value[0],"after")) + buf->muhenseg = AFTER; + else + buf->muhenseg = ONE; + return 1; +} + +/* + * _Xsj3cSetConvSeg() + * Set a parameter by .HenkanSegment entry. + */ +static int +_Xsj3cSetConvSeg(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"all")) + buf->henkanseg = ALL; + else if (_Xsj3cCmp(table->value[0],"after")) + buf->henkanseg = AFTER; + else + buf->henkanseg = ONE; + return 1; +} + +/* + * _Xsj3cSetModeConv() + * Set a parameter by .ModeConversion entry. + */ +static int +_Xsj3cSetModeConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + Xsj3csMode mode; + Xsj3cFlag input, conved, noinput; + + if (table->key[1] && table->value[0] && table->value[1] && + table->value[2]) { + if (_Xsj3cCmp(table->key[1], "hiragana")) { + mode = MODE_HIRA; + } else if (_Xsj3cCmp(table->key[1], "zkatakana")) { + mode = MODE_ZKATA; + } else if (_Xsj3cCmp(table->key[1], "hkatakana")) { + mode = MODE_HKATA; + } else if (_Xsj3cCmp(table->key[1], "halpha")) { + mode = MODE_HALPHA; + } else if (_Xsj3cCmp(table->key[1], "zalpha")) { + mode = MODE_ZALPHA; + } else if (_Xsj3cCmp(table->key[1], "rollup")) { + mode = MODE_ROLLUP; + } else if (_Xsj3cCmp(table->key[1], "rolldown")) { + mode = MODE_ROLLDOWN; + } else { + Xsj3cWarning("Unknown conversion mode"); + } + if (_Xsj3cCmp(table->value[0],"on")) + input = ON; + else + input = OFF; + if (_Xsj3cCmp(table->value[1],"on")) + conved = ON; + else + conved = OFF; + if (_Xsj3cCmp(table->value[2],"on")) + noinput = ON; + else + noinput = OFF; + buf->modeconv[mode] = (noinput << 2) + (conved << 1) + input; + return 1; + } else { + return 0; + } +} + +/* + * _Xsj3cSetUnderLine() + * Set a parameter by .ConvertedUnderLine entry. + */ +static int +_Xsj3cSetUnderLine(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->convedunderline = ON; + else + buf->convedunderline = OFF; + return 1; +} + +/* + * _Xsj3cSetDispMChange() + * Set a parameter by .DisplayModeChange entry. + */ +static int +_Xsj3cSetDispMChange(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->dispmodechange = ON; + else + buf->dispmodechange = OFF; + return 1; +} + +/* + * _Xsj3cSetDelLastMove() + * Set a parameter by .DeleteLastMove entry. + */ +static int +_Xsj3cSetDelLastMove(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->dellastmove = ON; + else + buf->dellastmove = OFF; + return 1; +} + +/* + * _Xsj3cSetKanaInput() + * Set a parameter by .KanaInputOnly entry. + */ +static int +_Xsj3cSetKanaInput(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->kanaonly = ON; + else + buf->kanaonly = OFF; + return 1; +} + +/* + * _Xsj3cSetInputSame() + * Set a parameter by .InputSameTime entry. + */ +static int +_Xsj3cSetInputSame(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->inputsame = ON; + else + buf->inputsame = OFF; + return 1; +} + +/* + * _Xsj3cSetCntrlSame() + * Set a parameter by .CntrlSameTime entry. + */ +static int +_Xsj3cSetCntrlSame(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->cntrlsame = ON; + else + buf->cntrlsame = OFF; + return 1; +} + +/* + * _Xsj3cSetSelectConv() + * Set a parameter by .BeforeSelectConversion entry. + */ +static int +_Xsj3cSetSelectConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->selectconv = ON; + else + buf->selectconv = OFF; + return 1; +} + +/* + * _Xsj3cSetBeforeConv() + * Set a parameter by .BeforeConversion entry. + */ +static int +_Xsj3cSetBeforeConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->beforeconv = ON; + else + buf->beforeconv = OFF; + return 1; +} + +/* + * _Xsj3cSetLastDoubleConv() + * Set a parameter by .BeforeConversion entry. + */ +static int +_Xsj3cSetLastDoubleConv(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->lastdoubleconv = ON; + else + buf->lastdoubleconv = OFF; + return 1; +} + +/* + * _Xsj3cSetSelectCount() + * Set a parameter by .SelectCount entry. + */ +static int +_Xsj3cSetSelectCount(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + register unsigned char *p; + + if (!table->value[0]) + return 0; + p = table->value[0]; + while (*p != '\0') { + if (!isdigit(*p++)) + return 0; + } + buf->selectcount = atoi(table->value[0]); + return 1; +} + +/* + * _Xsj3cSetSelectBackMove() + * Set a parameter by .SelectBackSpaceMove entry. + */ +static int +_Xsj3cSetSelectBackMove(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->selectback = ON; + else + buf->selectback = OFF; + return 1; +} + +/* + * _Xsj3cSetCandidatePad() + * Set a parameter by .CandidatePadding entry. + */ +static int +_Xsj3cSetCandidatePad(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + if (!table->value[0]) + return 0; + if (_Xsj3cCmp(table->value[0],"on")) + buf->candpadding = ON; + else + buf->candpadding = OFF; + return 1; +} + +/* + * _Xsj3cSetNextRCFile() + * Set a parameter by .NextRCFile entry. + */ +static int +_Xsj3cSetNextRCFile(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + char file[BUFSIZ]; + + if (table->value[0]) { + strcpy (file, buf->rcfile); + _Xsj3cReadAscii(file, table->value[0], buf->rcfile); + return 1; + } + return 0; +} + +/* + * _Xsj3cSetIncludeRCFile() + * Set a parameter by .include entry. + */ +static int +_Xsj3cSetIncludeRCFile(buf, table) + Xsj3cBuf buf; + Sjrctable table; +{ + char file[BUFSIZ], name[BUFSIZ]; + SjrcRec rctable; + struct functable *functp; + FILE *fp; + register int line; + int status; + + inc_cnt++; + if (inc_cnt > SJRC_INCLUDE_MAX) { + Xsj3cWarning("sjrc include nesting too deep"); + return 0; + } + if (table->value[0]) { + /* Get include file and open */ + _Xsj3cReadAscii(table->value[0], table->value[0], name); + strcpy(file, name); + if ((fp = fopen(file, "r")) == NULL) { + strcpy(file, SJ3DEFPATH); + strcat(file, name); + if ((fp = fopen(file, "r")) == NULL) { + Xsj3cWarning("can't open include sjrc file %s", file); + return 0; + } + } + } else { + return 0; + } + + /* Read sjrc file and set buffer fields */ + for (line = 0; (status = + _Xsj3cReadRC(fp, &rctable)) != END; line++) { + functp = funcs; + if (status == NORMAL) { + while (functp->keyword != NULL) { + if (_Xsj3cCmp(rctable.key[0], functp->keyword)) { + if (!(*(functp->func))(buf, &rctable)) + Xsj3cWarning("wrong format in include sjrc file. %s:%d", + file, line + 1); + break; + } + functp++; + } + } else if (status == COMMENT || status == OTHERS) { + continue; + } else { + Xsj3cWarning("bad line in sjrc include file. %s:%d", + file, line + 1); + continue; + } + } + fclose(fp); + return 1; +}