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;
+}