comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:92745d501b9a
1 #ifndef lint
2 static char *rcsid = "$Id: sjrc.c,v 2.3 1993/01/06 10:56:56 nao Exp $";
3 #endif
4 /*
5 * Copyright 1991 Sony Corporation
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and its
8 * documentation for any purpose is hereby granted without fee, provided that
9 * the above copyright notice appear in all copies and that both that
10 * copyright notice and this permission notice appear in supporting
11 * documentation, and that the name of Sony not be used in advertising or
12 * publicity pertaining to distribution of the software without specific,
13 * written prior permission. Sony makes no representations about the
14 * suitability of this software for any purpose. It is provided "as is"
15 * without express or implied warranty.
16 *
17 * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY
19 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
21 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 */
24 /*
25 * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp)
26 */
27
28 #include <stdio.h>
29 #include <ctype.h>
30 #include "common.h"
31 #include "sj3ctype.h"
32 #include "util.h"
33 #include "table.h"
34
35 void Xsj3cRCInit();
36
37 static int _Xsj3cReadRC();
38
39 extern int _Xsj3cSetKeyTable();
40 static int _Xsj3cSetInputMode();
41 static int _Xsj3cSetPrintMode();
42 static int _Xsj3cSetDefCode();
43 static int _Xsj3cSetMuhenkan();
44 static int _Xsj3cSetMuEdit();
45 static int _Xsj3cSetMToggle();
46 int _Xsj3cSetGuide();
47 static int _Xsj3cSetBStudy();
48 static int _Xsj3cSetRkeBell();
49 static int _Xsj3cSetFlushAfterConv();
50 static int _Xsj3cSetSj3Serv();
51 static int _Xsj3cSetNormal();
52 static int _Xsj3cSetThroughNext();
53
54 static int _Xsj3cSetSj3Serv2();
55 static int _Xsj3cSetFlushInConv();
56 static int _Xsj3cSetFlushSelectConv();
57 static int _Xsj3cSetFlushEndConv();
58 static int _Xsj3cSetAlphaConv();
59 static int _Xsj3cSetBackDisplay();
60 static int _Xsj3cSetSegLast();
61 static int _Xsj3cSetExpandMConv();
62 static int _Xsj3cSetShrinkMConv();
63 static int _Xsj3cSetExpandKConv();
64 static int _Xsj3cSetShrinkKConv();
65 static int _Xsj3cSetShrinkAll();
66 static int _Xsj3cSetConvSeg();
67 static int _Xsj3cSetUnconvSeg();
68 static int _Xsj3cSetDelChange();
69 static int _Xsj3cSetFlushChange();
70 static int _Xsj3cSetModeConv();
71 static int _Xsj3cSetMoveLoop();
72 static int _Xsj3cSetModeBySeg();
73 static int _Xsj3cSetJumpBySeg();
74 static int _Xsj3cSetDelBySeg();
75 static int _Xsj3cSetKillBySeg();
76 static int _Xsj3cSetMuhenCursorLast();
77 static int _Xsj3cSetEditCursorLast();
78 static int _Xsj3cSetFlushCursorLast();
79 static int _Xsj3cSetUnderLine();
80 static int _Xsj3cSetDispMChange();
81 static int _Xsj3cSetDelLastMove();
82 static int _Xsj3cSetKanaInput();
83 static int _Xsj3cSetInputSame();
84 static int _Xsj3cSetCntrlSame();
85 static int _Xsj3cSetSelectConv();
86 static int _Xsj3cSetBeforeConv();
87 static int _Xsj3cSetLastDoubleConv();
88 static int _Xsj3cSetSelectCount();
89 static int _Xsj3cSetSelectBackMove();
90 static int _Xsj3cSetCandidatePad();
91 static int _Xsj3cSetNextRCFile();
92 static int _Xsj3cSetIncludeRCFile();
93
94 static struct functable {
95 char *keyword;
96 int (*func)();
97 } funcs[] = {
98 "key", _Xsj3cSetKeyTable,
99 "escape", _Xsj3cSetKeyTable,
100 "sjxkey", _Xsj3cSetKeyTable,
101 "ki2key", _Xsj3cSetKeyTable,
102 "initialmode", _Xsj3cSetInputMode,
103 "defaultcode", _Xsj3cSetDefCode,
104 "muhenkanmode", _Xsj3cSetMuhenkan,
105 "muhenkaninedit", _Xsj3cSetMuEdit,
106 "muhenkantoggle", _Xsj3cSetMToggle,
107 "guide", _Xsj3cSetGuide,
108 "bstudy", _Xsj3cSetBStudy,
109 "rkerrbell", _Xsj3cSetRkeBell,
110 "flushafterconversion", _Xsj3cSetFlushAfterConv,
111 "server", _Xsj3cSetSj3Serv,
112 "sj3serv", _Xsj3cSetSj3Serv,
113 "setnormal", _Xsj3cSetNormal,
114 "throughnext", _Xsj3cSetThroughNext,
115 "sj3serv2", _Xsj3cSetSj3Serv2,
116 "flushinconversion", _Xsj3cSetFlushInConv,
117 "flushselectconversion", _Xsj3cSetFlushSelectConv,
118 "flushendconversion", _Xsj3cSetFlushEndConv,
119 "alphabetconversion", _Xsj3cSetAlphaConv,
120 "backdisplay", _Xsj3cSetBackDisplay,
121 "beginconversionlast", _Xsj3cSetSegLast,
122 "expandmodeconversion", _Xsj3cSetExpandMConv,
123 "shrinkmodeconversion", _Xsj3cSetShrinkMConv,
124 "expandkanjiconversion", _Xsj3cSetExpandKConv,
125 "shrinkkanjiconversion", _Xsj3cSetShrinkKConv,
126 "shrinkall", _Xsj3cSetShrinkAll,
127 "henkansegment", _Xsj3cSetConvSeg,
128 "muhenkansegment", _Xsj3cSetUnconvSeg,
129 "deletechangesegment", _Xsj3cSetDelChange,
130 "flushchangesegment", _Xsj3cSetFlushChange,
131 "modeconversion", _Xsj3cSetModeConv,
132 "moveloop", _Xsj3cSetMoveLoop,
133 "movebysegment", _Xsj3cSetModeBySeg,
134 "jumpbysegment", _Xsj3cSetJumpBySeg,
135 "deletebysegment", _Xsj3cSetDelBySeg,
136 "killbysegment", _Xsj3cSetKillBySeg,
137 "muhenkancursorlast", _Xsj3cSetMuhenCursorLast,
138 "editkancursorlast", _Xsj3cSetEditCursorLast,
139 "flushkancursorlast", _Xsj3cSetFlushCursorLast,
140 "convertedunderline", _Xsj3cSetUnderLine,
141 "displaymodechange", _Xsj3cSetDispMChange,
142 "deletelastmove", _Xsj3cSetDelLastMove,
143 "kanainputonly", _Xsj3cSetKanaInput,
144 "inputsametime", _Xsj3cSetInputSame,
145 "controlsametime", _Xsj3cSetCntrlSame,
146 "printmode", _Xsj3cSetPrintMode,
147 "beforeselectconversion", _Xsj3cSetSelectConv,
148 "beforeconversion", _Xsj3cSetBeforeConv,
149 "lastdoubleconversion", _Xsj3cSetLastDoubleConv,
150 "beforeselectcount", _Xsj3cSetSelectCount,
151 "selectbackspacemove", _Xsj3cSetSelectBackMove,
152 "candidatepadding", _Xsj3cSetCandidatePad,
153 "nextrcfile", _Xsj3cSetNextRCFile,
154 "include", _Xsj3cSetIncludeRCFile,
155 NULL, NULL
156 };
157
158 static int inc_cnt;
159
160 #define END -1
161 #define COMMENT 0
162 #define NORMAL 1
163 #define BAD 2
164 #define OTHERS 3
165 #define SERIAL "nwp511"
166 #define SERIAL2 "nwp517"
167 #define SERIAL3 "nwp-511"
168
169 /*
170 * Xsj3cRCInit()
171 * Decide sjrc file to read, then read it and set resources.
172 */
173 void
174 Xsj3cRCInit(buf, sjrc, home)
175 Xsj3cBuf buf;
176 char *sjrc;
177 char *home;
178 {
179 extern char *getenv();
180 register char *p;
181 SjrcRec rctable;
182 struct functable *functp;
183 FILE *fp;
184 register int line;
185 int status;
186
187 if (!buf->rcfile) {
188 if ((buf->rcfile = (char *)malloc(BUFSIZ)) == NULL)
189 Xsj3cError("Can't allocate sjrc file");
190 *buf->rcfile = '\0';
191
192 /* Get sjrc file and open */
193 if (sjrc) {
194 if ((fp = fopen(sjrc, "r")) == NULL)
195 Xsj3cError("can't open sjrc file %s", sjrc);
196 strcpy(buf->rcfile, sjrc);
197 } else {
198 if ((p = getenv("SJRC")) && *p != '\0') {
199 if (*p != '/') {
200 if (home)
201 strcpy(buf->rcfile, home);
202 strcat(buf->rcfile, "/");
203 }
204 strcat(buf->rcfile, p);
205 } else if (home) {
206 strcpy(buf->rcfile, home);
207 strcat(buf->rcfile, "/.sjrc");
208 } else {
209 strcpy(buf->rcfile, SJ3DEFPATH);
210 strcat(buf->rcfile, DEF_SJRC_FILE);
211 }
212 if ((fp = fopen(buf->rcfile, "r")) == NULL) {
213 strcpy(buf->rcfile, SJ3DEFPATH);
214 strcat(buf->rcfile, DEF_SJRC_FILE);
215 if ((fp = fopen(buf->rcfile, "r")) == NULL) {
216 Xsj3cError("can't open sjrc file %s", buf->rcfile);
217 }
218 }
219 }
220 } else {
221 if ((fp = fopen(buf->rcfile, "r")) == NULL) {
222 Xsj3cWarning("can't open sjrc file %s", buf->rcfile);
223 return;
224 }
225 }
226
227 /* Read sjrc file and set buffer fields */
228 inc_cnt = 0;
229 for (line = 0; (status =
230 _Xsj3cReadRC(fp, &rctable)) != END; line++) {
231 functp = funcs;
232 if (status == NORMAL) {
233 while (functp->keyword != NULL) {
234 if (_Xsj3cCmp(rctable.key[0], functp->keyword)) {
235 if (!(*(functp->func))(buf, &rctable))
236 Xsj3cWarning("wrong format in sjrc file. %s:%d",
237 buf->rcfile, line + 1);
238 break;
239 }
240 functp++;
241 }
242 } else if (status == COMMENT || status == OTHERS) {
243 continue;
244 } else {
245 Xsj3cWarning("bad line in sjrc file. %s:%d", buf->rcfile, line);
246 continue;
247 }
248 }
249 fclose(fp);
250 }
251
252 /*
253 * _Xsj3cReadRC()
254 * Read sjrc file. (Non memory copy version)
255 */
256 static int
257 _Xsj3cReadRC(fp, rctable)
258 FILE *fp;
259 Sjrctable rctable;
260 {
261 static unsigned char buf[256];
262 register int i, j, k, end, byte2 = 0, kana = 0;
263
264 if ((fgets (buf, sizeof(buf), fp)) == NULL)
265 return END;
266
267 if (buf[0] == '\n' || buf[0] == '#' || buf[0] == '\0' )
268 return COMMENT;
269
270 for (i = 0, k = 0, end = 0; buf[i] != ' ' && buf[i] != '\t' &&
271 buf[i] != '#' && buf[i] != '\n';) {
272 for (j = i; buf[i] != ' ' && buf[i] != '\t'
273 && buf[i] != '#' && buf[i] != '\n' && buf[i] != '.'; i++);
274 if (j == i && buf[i] == '.' ) {
275 i++;
276 continue;
277 }
278 if (buf[i] == '#' || buf[i] == '\n' )
279 return BAD;
280 if (buf[i] == '\t' || buf[i] == ' ' )
281 end++;
282 buf[i++] = '\0';
283 if (!strcmp(&buf[j],SERIAL) || !strcmp(&buf[j],SERIAL2)
284 || !strcmp(&buf[j],SERIAL3))
285 return OTHERS;
286 rctable->key[k++] = &buf[j];
287 if (end)
288 break;
289 }
290 if ( k < 1)
291 return BAD;
292 for (; k < 2;)
293 rctable->key[k++] = NULL;
294 while(buf[i] == ' ' || buf[i] == '\t') i++;
295 if (in_lang == JP_SJIS || in_lang == JP_EUC) {
296 for (k = 0, end = 0; buf[i] != '\n';) {
297 for (j = i; buf[i] != '\n' ; i+=2) {
298 if (iskan1(buf[i], in_lang)) {
299 if (iskan2(buf[i + 1], in_lang))
300 continue;
301 else if (buf[i + 1] == '#' || buf[i + 1] == ' '
302 || buf[i + 1] == '\t'|| buf[i + 1] == '\n') {
303 i++;
304 break;
305 } else
306 continue;
307 } else if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') {
308 break;
309 } else if (buf[i] == '.') {
310 if (i > 0 && buf[i - 1] == '\\') {
311 continue;
312 } else
313 break;
314 } else if (buf[i + 1] == '#' || buf[i + 1] == ' '
315 || buf[i + 1] == '\t' || buf[i + 1] == '\n') {
316 i++;
317 break;
318 } else if (buf[i + 1] == '.') {
319 if (buf[i] == '\\') {
320 continue;
321 } else {
322 i++;
323 break;
324 }
325 } else
326 continue;
327 }
328 if (buf[i] == '#' || buf[i] == '\n' )
329 end++;
330 buf[i++] = '\0';
331 rctable->value[k++] = &buf[j];
332 if (end)
333 break;
334 while(buf[i] == ' ' || buf[i] == '\t') i++;
335 }
336 } else {
337 for (k = 0, end = 0; buf[i] != '\n';) {
338 for (j = i; buf[i] != '\n'; i++) {
339 if (buf[i] == ESC) {
340 if (buf[i + 1] == '#' || buf[i + 1] == ' ' ||
341 buf[i + 1] == '\t'|| buf[i + 1] == '.' ||
342 buf[i + 1] == '\n') {
343 i++;
344 break;
345 } else if (byte2)
346 byte2 = 0;
347 else
348 byte2++;
349 i += 2;
350 continue;
351 } else if (buf[i] == SO || buf[i] == SI) {
352 if (buf[i + 1] == '#' || buf[i + 1] == ' ' ||
353 buf[i + 1] == '\t'|| buf[i + 1] == '.' ||
354 buf[i + 1] == '\n') {
355 i++;
356 break;
357 } else if (buf[i] == SI)
358 kana = 0;
359 else
360 kana++;
361 continue;
362 } else if (byte2 || kana)
363 continue;
364 if (buf[i] == '#' || buf[i] == ' ' || buf[i] == '\t') {
365 break;
366 } else if (buf[i] == '.') {
367 if (i > 0 && buf[i - 1] == '\\') {
368 continue;
369 } else
370 break;
371 } else
372 continue;
373 }
374 if (buf[i] == '#' || buf[i] == '\n' )
375 end++;
376 buf[i++] = '\0';
377 rctable->value[k++] = &buf[j];
378 if (end)
379 break;
380 while(buf[i] == ' ' || buf[i] == '\t') i++;
381 }
382 }
383 if ( k < 1)
384 return BAD;
385 for (; k < 10;)
386 rctable->value[k++] = NULL;
387 return NORMAL;
388 }
389
390 /*
391 * _Xsj3cSetInputMode()
392 * Set a parameter by .initialmode entry.
393 */
394 static int
395 _Xsj3cSetInputMode(buf, table)
396 Xsj3cBuf buf;
397 Sjrctable table;
398 {
399 register int i, j;
400
401 for (i = 0, j = 0; i < MODE_INROT_NUM; i++, j++) {
402 if (table->value[j]) {
403 if (_Xsj3cCmp(table->value[j], "hiragana")) {
404 buf->inmoderot[i] = MODE_HIRA;
405 } else if (_Xsj3cCmp(table->value[j], "zkatakana")) {
406 buf->inmoderot[i] = MODE_ZKATA;
407 } else if (_Xsj3cCmp(table->value[j], "hkatakana")) {
408 buf->inmoderot[i] = MODE_HKATA;
409 } else if (_Xsj3cCmp(table->value[j], "halpha")) {
410 buf->inmoderot[i] = MODE_HALPHA;
411 } else if (_Xsj3cCmp(table->value[j], "zalpha")) {
412 buf->inmoderot[i] = MODE_ZALPHA;
413 } else if (_Xsj3cCmp(table->value[j], "jis")) {
414 buf->inmoderot[i] = MODE_JIS;
415 } else if (_Xsj3cCmp(table->value[j], "sjis")) {
416 buf->inmoderot[i] = MODE_SJIS;
417 } else if (_Xsj3cCmp(table->value[j], "kuten")) {
418 buf->inmoderot[i] = MODE_KUTEN;
419 } else if (_Xsj3cCmp(table->value[j], "euc")) {
420 buf->inmoderot[i] = MODE_EUC;
421 } else {
422 if (!_Xsj3cCmp(table->value[j], "unbuff")
423 && !_Xsj3cCmp(table->value[j], "buffer")
424 && !_Xsj3cCmp(table->value[j], "unbuffer")
425 && !_Xsj3cCmp(table->value[j], "direct"))
426 Xsj3cWarning("Unknown input mode \"%s\"",table->value[j]);
427 i--;
428 continue;
429 }
430 } else {
431 break;
432 }
433 }
434 if ((buf->inmoderotnum = i) > 0)
435 return 1;
436 else
437 return 0;
438 }
439
440 /*
441 * _Xsj3cSetPrintMode()
442 * Set a parameter by .PrintMode entry.
443 */
444 static int
445 _Xsj3cSetPrintMode(buf, table)
446 Xsj3cBuf buf;
447 Sjrctable table;
448 {
449 register int i, j;
450
451 for (i = 0, j = 0; i < MODE_OUTROT_NUM; i++, j++) {
452 if (table->value[j]) {
453 if (_Xsj3cCmp(table->value[j], "hiragana")) {
454 buf->outmoderot[i] = MODE_HIRA;
455 } else if (_Xsj3cCmp(table->value[j], "zkatakana")) {
456 buf->outmoderot[i] = MODE_ZKATA;
457 } else if (_Xsj3cCmp(table->value[j], "hkatakana")) {
458 buf->outmoderot[i] = MODE_HKATA;
459 } else if (_Xsj3cCmp(table->value[j], "halpha")) {
460 buf->outmoderot[i] = MODE_HALPHA;
461 } else if (_Xsj3cCmp(table->value[j], "zalpha")) {
462 buf->outmoderot[i] = MODE_ZALPHA;
463 } else if (_Xsj3cCmp(table->value[j], "hankaku")) {
464 buf->outmoderot[i] = MODE_HANKAKU;
465 } else if (_Xsj3cCmp(table->value[j], "zenkaku")) {
466 buf->outmoderot[i] = MODE_ZENKAKU;
467 } else if (_Xsj3cCmp(table->value[j], "upper")) {
468 buf->outmoderot[i] = MODE_UPPER;
469 } else if (_Xsj3cCmp(table->value[j], "lower")) {
470 buf->outmoderot[i] = MODE_LOWER;
471 } else {
472 Xsj3cWarning("Unknown print mode \"%s\"",table->value[j]);
473 i--;
474 continue;
475 }
476 } else {
477 break;
478 }
479 }
480 if ((buf->outmoderotnum = i) > 0)
481 return 1;
482 else
483 return 0;
484 }
485
486 /*
487 * _Xsj3cSetDefCode()
488 * Set a parameter by .defaultcode entry.
489 */
490 static int
491 _Xsj3cSetDefCode(buf, table)
492 Xsj3cBuf buf;
493 Sjrctable table;
494 {
495 register int i;
496
497 for (i = 0; i < MODE_CODE_NUM; i++) {
498 if (table->value[i]) {
499 if (_Xsj3cCmp(table->value[i], "jis")) {
500 buf->defcode[i] = MODE_JIS;
501 } else if (_Xsj3cCmp(table->value[i], "sjis")) {
502 buf->defcode[i] = MODE_SJIS;
503 } else if (_Xsj3cCmp(table->value[i], "kuten")) {
504 buf->defcode[i] = MODE_KUTEN;
505 } else if (_Xsj3cCmp(table->value[i], "euc")) {
506 buf->defcode[i] = MODE_EUC;
507 } else {
508 Xsj3cWarning("Unknown input code");
509 break;
510 }
511 } else {
512 break;
513 }
514 }
515 if ((buf->coderotnum = i) > 0)
516 return 1;
517 else
518 return 0;
519 }
520
521 /*
522 * _Xsj3cSetMuhenkan()
523 * Set a parameter by .MuhenkanMode entry.
524 */
525 static int
526 _Xsj3cSetMuhenkan(buf, table)
527 Xsj3cBuf buf;
528 Sjrctable table;
529 {
530 if (table->value[0]) {
531 if (_Xsj3cCmp(table->value[0], "hiragana")) {
532 buf->muhenmode = MODE_HIRA;
533 } else if (_Xsj3cCmp(table->value[0], "zkatakana")) {
534 buf->muhenmode = MODE_ZKATA;
535 } else if (_Xsj3cCmp(table->value[0], "hkatakana")) {
536 buf->muhenmode = MODE_HKATA;
537 } else if (_Xsj3cCmp(table->value[0], "halpha")) {
538 buf->muhenmode = MODE_HALPHA;
539 } else if (_Xsj3cCmp(table->value[0], "zalpha")) {
540 buf->muhenmode = MODE_ZALPHA;
541 } else if (_Xsj3cCmp(table->value[0], "jis")) {
542 buf->muhenmode = MODE_JIS;
543 } else if (_Xsj3cCmp(table->value[0], "sjis")) {
544 buf->muhenmode = MODE_SJIS;
545 } else if (_Xsj3cCmp(table->value[0], "kuten")) {
546 buf->muhenmode = MODE_KUTEN;
547 } else if (_Xsj3cCmp(table->value[0], "euc")) {
548 buf->muhenmode = MODE_EUC;
549 } else {
550 Xsj3cWarning("Invalid muhenkan mode \"%s\"",table->value[0]);
551 }
552 }
553 return 1;
554 }
555
556 /*
557 * _Xsj3cSetMuEdit()
558 * Set a parameter by .MuhenkanInEdit entry.
559 */
560 static int
561 _Xsj3cSetMuEdit(buf, table)
562 Xsj3cBuf buf;
563 Sjrctable table;
564 {
565 if (table->value[0]) {
566 if (_Xsj3cCmp(table->value[0], "hiragana")) {
567 buf->togglemode = MODE_HIRA;
568 } else if (_Xsj3cCmp(table->value[0], "zkatakana")) {
569 buf->togglemode = MODE_ZKATA;
570 } else if (_Xsj3cCmp(table->value[0], "hkatakana")) {
571 buf->togglemode = MODE_HKATA;
572 } else if (_Xsj3cCmp(table->value[0], "halpha")) {
573 buf->togglemode = MODE_HALPHA;
574 } else if (_Xsj3cCmp(table->value[0], "zalpha")) {
575 buf->togglemode = MODE_ZALPHA;
576 } else if (_Xsj3cCmp(table->value[0], "jis")) {
577 buf->togglemode = MODE_JIS;
578 } else if (_Xsj3cCmp(table->value[0], "sjis")) {
579 buf->togglemode = MODE_SJIS;
580 } else if (_Xsj3cCmp(table->value[0], "kuten")) {
581 buf->togglemode = MODE_KUTEN;
582 } else if (_Xsj3cCmp(table->value[0], "euc")) {
583 buf->togglemode = MODE_EUC;
584 } else {
585 Xsj3cWarning("Unknown toggle mode");
586 }
587 }
588
589 return 1;
590 }
591
592 /*
593 * _Xsj3cSetMToggle()
594 * Set a parameter by .MuhenkanToggle entry.
595 */
596 static int
597 _Xsj3cSetMToggle(buf, table)
598 Xsj3cBuf buf;
599 Sjrctable table;
600 {
601 if (!table->value[0])
602 return 0;
603 if (_Xsj3cCmp(table->value[0],"on"))
604 buf->dotoggle = ON;
605 else
606 buf->dotoggle = OFF;
607 return 1;
608 }
609
610 /*
611 * _Xsj3cSetGuide()
612 * Set a parameter by .guide entry.
613 */
614 int
615 _Xsj3cSetGuide(buf, table)
616 Xsj3cBuf buf;
617 Sjrctable table;
618 {
619 Xsj3csMode mode;
620 wchar data[KANABUFSIZ];
621
622 if (table->key[1] && table->value[0]) {
623 if (_Xsj3cCmp(table->key[1], "hiragana")) {
624 mode = MODE_HIRA;
625 } else if (_Xsj3cCmp(table->key[1], "zkatakana")) {
626 mode = MODE_ZKATA;
627 } else if (_Xsj3cCmp(table->key[1], "hkatakana")) {
628 mode = MODE_HKATA;
629 } else if (_Xsj3cCmp(table->key[1], "halpha")) {
630 mode = MODE_HALPHA;
631 } else if (_Xsj3cCmp(table->key[1], "zalpha")) {
632 mode = MODE_ZALPHA;
633 } else if (_Xsj3cCmp(table->key[1], "jis")) {
634 mode = MODE_JIS;
635 } else if (_Xsj3cCmp(table->key[1], "sjis")) {
636 mode = MODE_SJIS;
637 } else if (_Xsj3cCmp(table->key[1], "kuten")) {
638 mode = MODE_KUTEN;
639 } else if (_Xsj3cCmp(table->key[1], "euc")) {
640 mode = MODE_EUC;
641 } else if (_Xsj3cCmp(table->key[1], "toroku")) {
642 mode = MODE_TOROKU;
643 } else if (_Xsj3cCmp(table->key[1], "register")) {
644 mode = MODE_TOROKU;
645 } else if (_Xsj3cCmp(table->key[1], "syoukyo")) {
646 mode = MODE_SYOUKYO;
647 } else if (_Xsj3cCmp(table->key[1], "eliminate")) {
648 mode = MODE_SYOUKYO;
649 } else if (_Xsj3cCmp(table->key[1], "kanji")) {
650 mode = MODE_KANJI;
651 } else if (_Xsj3cCmp(table->key[1], "edit")) {
652 mode = MODE_EDIT;
653 } else if (_Xsj3cCmp(table->key[1], "candidate")) {
654 mode = MODE_CAND;
655 } else if (_Xsj3cCmp(table->key[1], "symbol")) {
656 mode = MODE_SYMBOL;
657 } else if (_Xsj3cCmp(table->key[1], "hinsi")) {
658 mode = MODE_HINSI;
659 } else if (_Xsj3cCmp(table->key[1], "quote")) {
660 mode = MODE_QUOTE;
661 } else {
662 Xsj3cWarning("Unknown display mode key \"%s\"",table->key[1]);
663 return 0;
664 }
665 _Xsj3cmINtowOUT(buf->rcfile, table->value[0], data,
666 &buf->modelen[mode]);
667 if (!buf->modestr[mode]) {
668 if (!(buf->modestr[mode]
669 = (wchar *)malloc((buf->modelen[mode] + 1) * sizeof(wchar))))
670 Xsj3cError("Cannot allocate for mode string");
671 } else {
672 if (!(buf->modestr[mode] = (wchar *)realloc(buf->modestr[mode],
673 (buf->modelen[mode] + 1) * sizeof(wchar))))
674 Xsj3cError("Cannot reallocate for mode string");
675 }
676 _Xsj3cWcpy(buf->modestr[mode], data);
677 return 1;
678 } else {
679 return 0;
680 }
681 }
682
683 /*
684 * _Xsj3cSetBStudy()
685 * Set a parameter by .bstudy entry.
686 */
687 static int
688 _Xsj3cSetBStudy(buf, table)
689 Xsj3cBuf buf;
690 Sjrctable table;
691 {
692 if (!table->value[0])
693 return 0;
694 if (_Xsj3cCmp(table->value[0],"on"))
695 buf->gakusyuu = ON;
696 else
697 buf->gakusyuu = OFF;
698 return 1;
699 }
700
701 /*
702 * _Xsj3cSetFlushAfterConv()
703 * Set a parameter by .flushafterconversion entry.
704 */
705 static int
706 _Xsj3cSetFlushAfterConv(buf, table)
707 Xsj3cBuf buf;
708 Sjrctable table;
709 {
710 if (!table->value[0])
711 return 0;
712 if (_Xsj3cCmp(table->value[0],"on"))
713 buf->flushaconv = ON;
714 else
715 buf->flushaconv = OFF;
716 return 1;
717 }
718
719 /*
720 * _Xsj3cSetFlushInConv()
721 * Set a parameter by .FlushInConversion entry.
722 */
723 static int
724 _Xsj3cSetFlushInConv(buf, table)
725 Xsj3cBuf buf;
726 Sjrctable table;
727 {
728 if (!table->value[0])
729 return 0;
730 if (_Xsj3cCmp(table->value[0],"on"))
731 buf->flushiconv = ON;
732 else if (_Xsj3cCmp(table->value[0],"off"))
733 buf->flushiconv = OFF;
734 else if (_Xsj3cCmp(table->value[0],"edit"))
735 buf->flushiconv = EDIT;
736 else
737 buf->flushiconv = NONE;
738 return 1;
739 }
740
741 /*
742 * _Xsj3cSetFlushSelectConv()
743 * Set a parameter by .FlushSelectConversion entry.
744 */
745 static int
746 _Xsj3cSetFlushSelectConv(buf, table)
747 Xsj3cBuf buf;
748 Sjrctable table;
749 {
750 if (!table->value[0])
751 return 0;
752 if (_Xsj3cCmp(table->value[0],"on"))
753 buf->flushsconv = ON;
754 else if (_Xsj3cCmp(table->value[0],"off"))
755 buf->flushsconv = OFF;
756 else if (_Xsj3cCmp(table->value[0],"edit"))
757 buf->flushsconv = EDIT;
758 else
759 buf->flushsconv = NONE;
760 return 1;
761 }
762
763 /*
764 * _Xsj3cSetFlushEndConv()
765 * Set a parameter by .FlushEndConversion entry.
766 */
767 static int
768 _Xsj3cSetFlushEndConv(buf, table)
769 Xsj3cBuf buf;
770 Sjrctable table;
771 {
772 if (!table->value[0])
773 return 0;
774 if (_Xsj3cCmp(table->value[0],"on"))
775 buf->flusheconv = ON;
776 else
777 buf->flusheconv = OFF;
778 return 1;
779 }
780
781 /*
782 * _Xsj3cSetRkeBell()
783 * Set a parameter by .rkerrbell entry.
784 */
785 static int
786 _Xsj3cSetRkeBell(buf, table)
787 Xsj3cBuf buf;
788 Sjrctable table;
789 {
790 if (!table->value[0])
791 return 0;
792 if (_Xsj3cCmp(table->value[0],"on"))
793 buf->rkbell = ON;
794 else
795 buf->rkbell = OFF;
796 return 1;
797 }
798
799 /*
800 * _Xsj3cSetSj3Serv()
801 * Set a parameter by .server entry.
802 */
803 static int
804 _Xsj3cSetSj3Serv(buf, table)
805 Xsj3cBuf buf;
806 Sjrctable table;
807 {
808 if (table->value[0]) {
809 static char hostname1[32];
810 _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname1);
811 buf->sj3serv = hostname1;
812 return 1;
813 }
814 return 0;
815 }
816
817 /*
818 * _Xsj3cSetNormal()
819 * Set a parameter by .SetNormal entry.
820 */
821 static int
822 _Xsj3cSetNormal(buf, table)
823 Xsj3cBuf buf;
824 Sjrctable table;
825 {
826 if (table->value[0] && iscntrl(*table->value[0])) {
827 register unsigned char *c;
828 register int len;
829 if (buf->setnormal) {
830 c = buf->setnormal;
831 while (*c != '\0') {
832 if (*c == *table->value[0])
833 return 1; /* same code */
834 c++;
835 }
836 len = c - buf->setnormal;
837 buf->setnormal = (unsigned char *)realloc(buf->setnormal, len + 2);
838 *(buf->setnormal + len) = *table->value[0];
839 *(buf->setnormal + len + 1) = '\0';
840 } else {
841 buf->setnormal = (unsigned char *)malloc(2);
842 c = buf->setnormal;
843 *c++ = *table->value[0];
844 *c = '\0';
845 }
846 return 1;
847 }
848 return 0;
849 }
850
851 /*
852 * _Xsj3cSetThroughNext()
853 * Set a parameter by .ThroughtNext entry.
854 */
855 static int
856 _Xsj3cSetThroughNext(buf, table)
857 Xsj3cBuf buf;
858 Sjrctable table;
859 {
860 if (table->value[0] && iscntrl(*table->value[0])) {
861 register unsigned char *c;
862 int len;
863 if (buf->throughnext) {
864 c = buf->throughnext;
865 while (*c != '\0') {
866 if (*c == *table->value[0])
867 return 1; /* same code */
868 c++;
869 }
870 len = c - buf->throughnext;
871 buf->throughnext
872 = (unsigned char *)realloc(buf->throughnext, len + 2);
873 *(buf->throughnext + len) = *table->value[0];
874 *(buf->throughnext + len + 1) = '\0';
875 } else {
876 buf->throughnext = (unsigned char *)malloc(2);
877 c = buf->throughnext;
878 *c++ = *table->value[0];
879 *c = '\0';
880 }
881 return 1;
882 }
883 return 0;
884 }
885
886 /*
887 * _Xsj3cSetSj3Serv2()
888 * Set a parameter by .sj3serv2 entry.
889 */
890 static int
891 _Xsj3cSetSj3Serv2(buf, table)
892 Xsj3cBuf buf;
893 Sjrctable table;
894 {
895 if (table->value[0]) {
896 static char hostname2[32];
897 _Xsj3cReadAscii(buf->rcfile, table->value[0], hostname2);
898 buf->sj3serv2 = hostname2;
899 return 1;
900 }
901 return 0;
902 }
903
904 /*
905 * _Xsj3cSetAlphaConv()
906 * Set a parameter by .AlphabetConversion entry.
907 */
908 static int
909 _Xsj3cSetAlphaConv(buf, table)
910 Xsj3cBuf buf;
911 Sjrctable table;
912 {
913 if (!table->value[0])
914 return 0;
915 if (_Xsj3cCmp(table->value[0],"on"))
916 buf->alphaconv = ON;
917 else
918 buf->alphaconv = OFF;
919 return 1;
920 }
921
922 /*
923 * _Xsj3cSetBackDisplay()
924 * Set a parameter by .BackDisplay entry.
925 */
926 static int
927 _Xsj3cSetBackDisplay(buf, table)
928 Xsj3cBuf buf;
929 Sjrctable table;
930 {
931 if (!table->value[0])
932 return 0;
933 if (_Xsj3cCmp(table->value[0],"on"))
934 buf->backdisplay = ON;
935 else
936 buf->backdisplay = OFF;
937 return 1;
938 }
939
940 /*
941 * _Xsj3cSetSegLast()
942 * Set a parameter by .BeginConversionLast entry.
943 */
944 static int
945 _Xsj3cSetSegLast(buf, table)
946 Xsj3cBuf buf;
947 Sjrctable table;
948 {
949 if (!table->value[0])
950 return 0;
951 if (_Xsj3cCmp(table->value[0],"on"))
952 buf->beginlastseg = ON;
953 else if (_Xsj3cCmp(table->value[0],"off"))
954 buf->beginlastseg = OFF;
955 else
956 buf->beginlastseg = NONE;
957 return 1;
958 }
959
960 /*
961 * _Xsj3cSetShrinkAll()
962 * Set a parameter by .ShrinkAll entry.
963 */
964 static int
965 _Xsj3cSetShrinkAll(buf, table)
966 Xsj3cBuf buf;
967 Sjrctable table;
968 {
969 if (!table->value[0])
970 return 0;
971 if (_Xsj3cCmp(table->value[0],"on"))
972 buf->shrinkall = ON;
973 else
974 buf->shrinkall = OFF;
975 return 1;
976 }
977
978 /*
979 * _Xsj3cSetDelChange()
980 * Set a parameter by .DeleteChangeSegment entry.
981 */
982 static int
983 _Xsj3cSetDelChange(buf, table)
984 Xsj3cBuf buf;
985 Sjrctable table;
986 {
987 if (!table->value[0])
988 return 0;
989 if (_Xsj3cCmp(table->value[0],"all"))
990 buf->delchange = ALL;
991 else if (_Xsj3cCmp(table->value[0],"after"))
992 buf->delchange = AFTER;
993 else
994 buf->delchange = ONE;
995 return 1;
996 }
997
998 /*
999 * _Xsj3cSetFlushChange()
1000 * Set a parameter by .FlushChangeSegment entry.
1001 */
1002 static int
1003 _Xsj3cSetFlushChange(buf, table)
1004 Xsj3cBuf buf;
1005 Sjrctable table;
1006 {
1007 if (!table->value[0])
1008 return 0;
1009 if (_Xsj3cCmp(table->value[0],"all"))
1010 buf->flushchange = ALL;
1011 else
1012 buf->flushchange = ONE;
1013 return 1;
1014 }
1015
1016 /*
1017 * _Xsj3cSetExpandKConv()
1018 * Set a parameter by .ExpandKanjiConversion entry.
1019 */
1020 static int
1021 _Xsj3cSetExpandKConv(buf, table)
1022 Xsj3cBuf buf;
1023 Sjrctable table;
1024 {
1025 Xsj3cFlag input, conved;
1026
1027 if (!(table->value[0] && table->value[1]))
1028 return 0;
1029 if (_Xsj3cCmp(table->value[0],"on"))
1030 input = ON;
1031 else
1032 input = OFF;
1033 if (_Xsj3cCmp(table->value[1],"on"))
1034 conved = ON;
1035 else
1036 conved = OFF;
1037 buf->expandkconv = (conved << 1) + input;
1038 return 1;
1039 }
1040
1041 /*
1042 * _Xsj3cSetShrinkKConv()
1043 * Set a parameter by .ShrinkKanjiConversion entry.
1044 */
1045 static int
1046 _Xsj3cSetShrinkKConv(buf, table)
1047 Xsj3cBuf buf;
1048 Sjrctable table;
1049 {
1050 Xsj3cFlag input, conved;
1051
1052 if (!(table->value[0] && table->value[1]))
1053 return 0;
1054 if (_Xsj3cCmp(table->value[0],"on"))
1055 input = ON;
1056 else
1057 input = OFF;
1058 if (_Xsj3cCmp(table->value[1],"on"))
1059 conved = ON;
1060 else
1061 conved = OFF;
1062 buf->shrinkkconv = (conved << 1) + input;
1063 return 1;
1064 }
1065
1066 /*
1067 * _Xsj3cSetExpandMConv()
1068 * Set a parameter by .ExpandModeConversion entry.
1069 */
1070 static int
1071 _Xsj3cSetExpandMConv(buf, table)
1072 Xsj3cBuf buf;
1073 Sjrctable table;
1074 {
1075 Xsj3cFlag input, conved;
1076
1077 if (!(table->value[0] && table->value[1]))
1078 return 0;
1079 if (_Xsj3cCmp(table->value[0],"on"))
1080 input = ON;
1081 else
1082 input = OFF;
1083 if (_Xsj3cCmp(table->value[1],"on"))
1084 conved = ON;
1085 else
1086 conved = OFF;
1087 buf->expandmconv = (conved << 1) + input;
1088 return 1;
1089 }
1090
1091 /*
1092 * _Xsj3cSetShrinkMConv()
1093 * Set a parameter by .ShrinkModeConversion entry.
1094 */
1095 static int
1096 _Xsj3cSetShrinkMConv(buf, table)
1097 Xsj3cBuf buf;
1098 Sjrctable table;
1099 {
1100 Xsj3cFlag input, conved;
1101
1102 if (!(table->value[0] && table->value[1]))
1103 return 0;
1104 if (_Xsj3cCmp(table->value[0],"on"))
1105 input = ON;
1106 else
1107 input = OFF;
1108 if (_Xsj3cCmp(table->value[1],"on"))
1109 conved = ON;
1110 else
1111 conved = OFF;
1112 buf->shrinkmconv = (conved << 1) + input;
1113 return 1;
1114 }
1115
1116 /*
1117 * _Xsj3cSetMoveLoop()
1118 * Set a parameter by .MoveLoop entry.
1119 */
1120 static int
1121 _Xsj3cSetMoveLoop(buf, table)
1122 Xsj3cBuf buf;
1123 Sjrctable table;
1124 {
1125 if (!table->value[0])
1126 return 0;
1127 if (_Xsj3cCmp(table->value[0],"on"))
1128 buf->moveloop = ON;
1129 else
1130 buf->moveloop = OFF;
1131 return 1;
1132 }
1133
1134 /*
1135 * _Xsj3cSetJumpBySeg()
1136 * Set a parameter by .JumpBySegment entry.
1137 */
1138 static int
1139 _Xsj3cSetJumpBySeg(buf, table)
1140 Xsj3cBuf buf;
1141 Sjrctable table;
1142 {
1143 Xsj3cFlag input, conved;
1144
1145 if (!(table->value[0] && table->value[1]))
1146 return 0;
1147 if (_Xsj3cCmp(table->value[0],"on"))
1148 input = ON;
1149 else
1150 input = OFF;
1151 if (_Xsj3cCmp(table->value[1],"on"))
1152 conved = ON;
1153 else
1154 conved = OFF;
1155 buf->jumpbyseg = (conved << 1) + input;
1156 return 1;
1157 }
1158
1159 /*
1160 * _Xsj3cSetModeBySeg()
1161 * Set a parameter by .MoveBySegment entry.
1162 */
1163 static int
1164 _Xsj3cSetModeBySeg(buf, table)
1165 Xsj3cBuf buf;
1166 Sjrctable table;
1167 {
1168 Xsj3cFlag input, conved;
1169
1170 if (!(table->value[0] && table->value[1]))
1171 return 0;
1172 if (_Xsj3cCmp(table->value[0],"on"))
1173 input = ON;
1174 else
1175 input = OFF;
1176 if (_Xsj3cCmp(table->value[1],"on"))
1177 conved = ON;
1178 else
1179 conved = OFF;
1180 buf->movebyseg = (conved << 1) + input;
1181 return 1;
1182 }
1183
1184 /*
1185 * _Xsj3cSetDelBySeg()
1186 * Set a parameter by .DeleteBySegment entry.
1187 */
1188 static int
1189 _Xsj3cSetDelBySeg(buf, table)
1190 Xsj3cBuf buf;
1191 Sjrctable table;
1192 {
1193 Xsj3cFlag input, conved;
1194
1195 if (!(table->value[0] && table->value[1]))
1196 return 0;
1197 if (_Xsj3cCmp(table->value[0],"on"))
1198 input = ON;
1199 else
1200 input = OFF;
1201 if (_Xsj3cCmp(table->value[1],"on"))
1202 conved = ON;
1203 else
1204 conved = OFF;
1205 buf->delbyseg = (conved << 1) + input;
1206 return 1;
1207 }
1208
1209 /*
1210 * _Xsj3cSetKillBySeg()
1211 * Set a parameter by .KillBySegment entry.
1212 */
1213 static int
1214 _Xsj3cSetKillBySeg(buf, table)
1215 Xsj3cBuf buf;
1216 Sjrctable table;
1217 {
1218 Xsj3cFlag input, conved;
1219
1220 if (!(table->value[0] && table->value[1]))
1221 return 0;
1222 if (_Xsj3cCmp(table->value[0],"on"))
1223 input = ON;
1224 else
1225 input = OFF;
1226 if (_Xsj3cCmp(table->value[1],"on"))
1227 conved = ON;
1228 else
1229 conved = OFF;
1230 buf->killbyseg = (conved << 1) + input;
1231 return 1;
1232 }
1233
1234 /*
1235 * _Xsj3cSetMuhenCursorLast()
1236 * Set a parameter by .MuhenkanCursorLast entry.
1237 */
1238 static int
1239 _Xsj3cSetMuhenCursorLast(buf, table)
1240 Xsj3cBuf buf;
1241 Sjrctable table;
1242 {
1243 if (!table->value[0])
1244 return 0;
1245 if (_Xsj3cCmp(table->value[0],"on"))
1246 buf->muhencurlast = ON;
1247 else
1248 buf->muhencurlast = OFF;
1249 return 1;
1250 }
1251
1252 /*
1253 * _Xsj3cSetEditCursorLast()
1254 * Set a parameter by .EditCursorLast entry.
1255 */
1256 static int
1257 _Xsj3cSetEditCursorLast(buf, table)
1258 Xsj3cBuf buf;
1259 Sjrctable table;
1260 {
1261 if (!table->value[0])
1262 return 0;
1263 if (_Xsj3cCmp(table->value[0],"on"))
1264 buf->editcurlast = ON;
1265 else
1266 buf->editcurlast = OFF;
1267 return 1;
1268 }
1269
1270 /*
1271 * _Xsj3cSetFlushCursorLast()
1272 * Set a parameter by .FlushCursorLast entry.
1273 */
1274 static int
1275 _Xsj3cSetFlushCursorLast(buf, table)
1276 Xsj3cBuf buf;
1277 Sjrctable table;
1278 {
1279 if (!table->value[0])
1280 return 0;
1281 if (_Xsj3cCmp(table->value[0],"on"))
1282 buf->flushcurlast = ON;
1283 else
1284 buf->flushcurlast = OFF;
1285 return 1;
1286 }
1287
1288 /*
1289 * _Xsj3cSetUnconvSeg()
1290 * Set a parameter by .MuhenkanSegment entry.
1291 */
1292 static int
1293 _Xsj3cSetUnconvSeg(buf, table)
1294 Xsj3cBuf buf;
1295 Sjrctable table;
1296 {
1297 if (!table->value[0])
1298 return 0;
1299 if (_Xsj3cCmp(table->value[0],"all"))
1300 buf->muhenseg = ALL;
1301 else if (_Xsj3cCmp(table->value[0],"after"))
1302 buf->muhenseg = AFTER;
1303 else
1304 buf->muhenseg = ONE;
1305 return 1;
1306 }
1307
1308 /*
1309 * _Xsj3cSetConvSeg()
1310 * Set a parameter by .HenkanSegment entry.
1311 */
1312 static int
1313 _Xsj3cSetConvSeg(buf, table)
1314 Xsj3cBuf buf;
1315 Sjrctable table;
1316 {
1317 if (!table->value[0])
1318 return 0;
1319 if (_Xsj3cCmp(table->value[0],"all"))
1320 buf->henkanseg = ALL;
1321 else if (_Xsj3cCmp(table->value[0],"after"))
1322 buf->henkanseg = AFTER;
1323 else
1324 buf->henkanseg = ONE;
1325 return 1;
1326 }
1327
1328 /*
1329 * _Xsj3cSetModeConv()
1330 * Set a parameter by .ModeConversion entry.
1331 */
1332 static int
1333 _Xsj3cSetModeConv(buf, table)
1334 Xsj3cBuf buf;
1335 Sjrctable table;
1336 {
1337 Xsj3csMode mode;
1338 Xsj3cFlag input, conved, noinput;
1339
1340 if (table->key[1] && table->value[0] && table->value[1] &&
1341 table->value[2]) {
1342 if (_Xsj3cCmp(table->key[1], "hiragana")) {
1343 mode = MODE_HIRA;
1344 } else if (_Xsj3cCmp(table->key[1], "zkatakana")) {
1345 mode = MODE_ZKATA;
1346 } else if (_Xsj3cCmp(table->key[1], "hkatakana")) {
1347 mode = MODE_HKATA;
1348 } else if (_Xsj3cCmp(table->key[1], "halpha")) {
1349 mode = MODE_HALPHA;
1350 } else if (_Xsj3cCmp(table->key[1], "zalpha")) {
1351 mode = MODE_ZALPHA;
1352 } else if (_Xsj3cCmp(table->key[1], "rollup")) {
1353 mode = MODE_ROLLUP;
1354 } else if (_Xsj3cCmp(table->key[1], "rolldown")) {
1355 mode = MODE_ROLLDOWN;
1356 } else {
1357 Xsj3cWarning("Unknown conversion mode");
1358 }
1359 if (_Xsj3cCmp(table->value[0],"on"))
1360 input = ON;
1361 else
1362 input = OFF;
1363 if (_Xsj3cCmp(table->value[1],"on"))
1364 conved = ON;
1365 else
1366 conved = OFF;
1367 if (_Xsj3cCmp(table->value[2],"on"))
1368 noinput = ON;
1369 else
1370 noinput = OFF;
1371 buf->modeconv[mode] = (noinput << 2) + (conved << 1) + input;
1372 return 1;
1373 } else {
1374 return 0;
1375 }
1376 }
1377
1378 /*
1379 * _Xsj3cSetUnderLine()
1380 * Set a parameter by .ConvertedUnderLine entry.
1381 */
1382 static int
1383 _Xsj3cSetUnderLine(buf, table)
1384 Xsj3cBuf buf;
1385 Sjrctable table;
1386 {
1387 if (!table->value[0])
1388 return 0;
1389 if (_Xsj3cCmp(table->value[0],"on"))
1390 buf->convedunderline = ON;
1391 else
1392 buf->convedunderline = OFF;
1393 return 1;
1394 }
1395
1396 /*
1397 * _Xsj3cSetDispMChange()
1398 * Set a parameter by .DisplayModeChange entry.
1399 */
1400 static int
1401 _Xsj3cSetDispMChange(buf, table)
1402 Xsj3cBuf buf;
1403 Sjrctable table;
1404 {
1405 if (!table->value[0])
1406 return 0;
1407 if (_Xsj3cCmp(table->value[0],"on"))
1408 buf->dispmodechange = ON;
1409 else
1410 buf->dispmodechange = OFF;
1411 return 1;
1412 }
1413
1414 /*
1415 * _Xsj3cSetDelLastMove()
1416 * Set a parameter by .DeleteLastMove entry.
1417 */
1418 static int
1419 _Xsj3cSetDelLastMove(buf, table)
1420 Xsj3cBuf buf;
1421 Sjrctable table;
1422 {
1423 if (!table->value[0])
1424 return 0;
1425 if (_Xsj3cCmp(table->value[0],"on"))
1426 buf->dellastmove = ON;
1427 else
1428 buf->dellastmove = OFF;
1429 return 1;
1430 }
1431
1432 /*
1433 * _Xsj3cSetKanaInput()
1434 * Set a parameter by .KanaInputOnly entry.
1435 */
1436 static int
1437 _Xsj3cSetKanaInput(buf, table)
1438 Xsj3cBuf buf;
1439 Sjrctable table;
1440 {
1441 if (!table->value[0])
1442 return 0;
1443 if (_Xsj3cCmp(table->value[0],"on"))
1444 buf->kanaonly = ON;
1445 else
1446 buf->kanaonly = OFF;
1447 return 1;
1448 }
1449
1450 /*
1451 * _Xsj3cSetInputSame()
1452 * Set a parameter by .InputSameTime entry.
1453 */
1454 static int
1455 _Xsj3cSetInputSame(buf, table)
1456 Xsj3cBuf buf;
1457 Sjrctable table;
1458 {
1459 if (!table->value[0])
1460 return 0;
1461 if (_Xsj3cCmp(table->value[0],"on"))
1462 buf->inputsame = ON;
1463 else
1464 buf->inputsame = OFF;
1465 return 1;
1466 }
1467
1468 /*
1469 * _Xsj3cSetCntrlSame()
1470 * Set a parameter by .CntrlSameTime entry.
1471 */
1472 static int
1473 _Xsj3cSetCntrlSame(buf, table)
1474 Xsj3cBuf buf;
1475 Sjrctable table;
1476 {
1477 if (!table->value[0])
1478 return 0;
1479 if (_Xsj3cCmp(table->value[0],"on"))
1480 buf->cntrlsame = ON;
1481 else
1482 buf->cntrlsame = OFF;
1483 return 1;
1484 }
1485
1486 /*
1487 * _Xsj3cSetSelectConv()
1488 * Set a parameter by .BeforeSelectConversion entry.
1489 */
1490 static int
1491 _Xsj3cSetSelectConv(buf, table)
1492 Xsj3cBuf buf;
1493 Sjrctable table;
1494 {
1495 if (!table->value[0])
1496 return 0;
1497 if (_Xsj3cCmp(table->value[0],"on"))
1498 buf->selectconv = ON;
1499 else
1500 buf->selectconv = OFF;
1501 return 1;
1502 }
1503
1504 /*
1505 * _Xsj3cSetBeforeConv()
1506 * Set a parameter by .BeforeConversion entry.
1507 */
1508 static int
1509 _Xsj3cSetBeforeConv(buf, table)
1510 Xsj3cBuf buf;
1511 Sjrctable table;
1512 {
1513 if (!table->value[0])
1514 return 0;
1515 if (_Xsj3cCmp(table->value[0],"on"))
1516 buf->beforeconv = ON;
1517 else
1518 buf->beforeconv = OFF;
1519 return 1;
1520 }
1521
1522 /*
1523 * _Xsj3cSetLastDoubleConv()
1524 * Set a parameter by .BeforeConversion entry.
1525 */
1526 static int
1527 _Xsj3cSetLastDoubleConv(buf, table)
1528 Xsj3cBuf buf;
1529 Sjrctable table;
1530 {
1531 if (!table->value[0])
1532 return 0;
1533 if (_Xsj3cCmp(table->value[0],"on"))
1534 buf->lastdoubleconv = ON;
1535 else
1536 buf->lastdoubleconv = OFF;
1537 return 1;
1538 }
1539
1540 /*
1541 * _Xsj3cSetSelectCount()
1542 * Set a parameter by .SelectCount entry.
1543 */
1544 static int
1545 _Xsj3cSetSelectCount(buf, table)
1546 Xsj3cBuf buf;
1547 Sjrctable table;
1548 {
1549 register unsigned char *p;
1550
1551 if (!table->value[0])
1552 return 0;
1553 p = table->value[0];
1554 while (*p != '\0') {
1555 if (!isdigit(*p++))
1556 return 0;
1557 }
1558 buf->selectcount = atoi(table->value[0]);
1559 return 1;
1560 }
1561
1562 /*
1563 * _Xsj3cSetSelectBackMove()
1564 * Set a parameter by .SelectBackSpaceMove entry.
1565 */
1566 static int
1567 _Xsj3cSetSelectBackMove(buf, table)
1568 Xsj3cBuf buf;
1569 Sjrctable table;
1570 {
1571 if (!table->value[0])
1572 return 0;
1573 if (_Xsj3cCmp(table->value[0],"on"))
1574 buf->selectback = ON;
1575 else
1576 buf->selectback = OFF;
1577 return 1;
1578 }
1579
1580 /*
1581 * _Xsj3cSetCandidatePad()
1582 * Set a parameter by .CandidatePadding entry.
1583 */
1584 static int
1585 _Xsj3cSetCandidatePad(buf, table)
1586 Xsj3cBuf buf;
1587 Sjrctable table;
1588 {
1589 if (!table->value[0])
1590 return 0;
1591 if (_Xsj3cCmp(table->value[0],"on"))
1592 buf->candpadding = ON;
1593 else
1594 buf->candpadding = OFF;
1595 return 1;
1596 }
1597
1598 /*
1599 * _Xsj3cSetNextRCFile()
1600 * Set a parameter by .NextRCFile entry.
1601 */
1602 static int
1603 _Xsj3cSetNextRCFile(buf, table)
1604 Xsj3cBuf buf;
1605 Sjrctable table;
1606 {
1607 char file[BUFSIZ];
1608
1609 if (table->value[0]) {
1610 strcpy (file, buf->rcfile);
1611 _Xsj3cReadAscii(file, table->value[0], buf->rcfile);
1612 return 1;
1613 }
1614 return 0;
1615 }
1616
1617 /*
1618 * _Xsj3cSetIncludeRCFile()
1619 * Set a parameter by .include entry.
1620 */
1621 static int
1622 _Xsj3cSetIncludeRCFile(buf, table)
1623 Xsj3cBuf buf;
1624 Sjrctable table;
1625 {
1626 char file[BUFSIZ], name[BUFSIZ];
1627 SjrcRec rctable;
1628 struct functable *functp;
1629 FILE *fp;
1630 register int line;
1631 int status;
1632
1633 inc_cnt++;
1634 if (inc_cnt > SJRC_INCLUDE_MAX) {
1635 Xsj3cWarning("sjrc include nesting too deep");
1636 return 0;
1637 }
1638 if (table->value[0]) {
1639 /* Get include file and open */
1640 _Xsj3cReadAscii(table->value[0], table->value[0], name);
1641 strcpy(file, name);
1642 if ((fp = fopen(file, "r")) == NULL) {
1643 strcpy(file, SJ3DEFPATH);
1644 strcat(file, name);
1645 if ((fp = fopen(file, "r")) == NULL) {
1646 Xsj3cWarning("can't open include sjrc file %s", file);
1647 return 0;
1648 }
1649 }
1650 } else {
1651 return 0;
1652 }
1653
1654 /* Read sjrc file and set buffer fields */
1655 for (line = 0; (status =
1656 _Xsj3cReadRC(fp, &rctable)) != END; line++) {
1657 functp = funcs;
1658 if (status == NORMAL) {
1659 while (functp->keyword != NULL) {
1660 if (_Xsj3cCmp(rctable.key[0], functp->keyword)) {
1661 if (!(*(functp->func))(buf, &rctable))
1662 Xsj3cWarning("wrong format in include sjrc file. %s:%d",
1663 file, line + 1);
1664 break;
1665 }
1666 functp++;
1667 }
1668 } else if (status == COMMENT || status == OTHERS) {
1669 continue;
1670 } else {
1671 Xsj3cWarning("bad line in sjrc include file. %s:%d",
1672 file, line + 1);
1673 continue;
1674 }
1675 }
1676 fclose(fp);
1677 return 1;
1678 }