comparison lib/Xsj3clib/buffer.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 = "$Header: /net/sras32/mnt3/home/mgr/ishisone/lib/cvsroot/kinput2/src/lib/Xsj3clib/buffer.c,v 2.7 1998/07/21 09:21:15 ishisone 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 <X11/keysym.h>
29 #include <stdio.h>
30 #include <ctype.h>
31 #include "common.h"
32 #include "util.h"
33 #include "func.h"
34 #include "segment.h"
35 #include "table.h"
36
37 Xsj3cBuf Xsj3cCreateBuffer();
38 void Xsj3cFreeBuffer();
39 void Xsj3cClearBuffer();
40 void Xsj3cFixBuffer();
41 void Xsj3cFlushBuffer();
42
43 int _Xsj3cSetKeyTable();
44 extern int _Xsj3cSetGuide();
45
46 static void _Xsj3cFreeModeStr();
47 static Xsj3cKeyTable *_Xsj3cAllocKeyTable();
48 static Xsj3cKeyTable *_Xsj3cGetFreeKeyTable();
49 static void _Xsj3cAddFreeKeyTable();
50 static void _Xsj3cFreeAllKeyTable();
51 static int _Xsj3cSetKeySym();
52 static long _Xsj3cGetModMask();
53
54 static Xsj3cKeyTable *keynowtp = NULL, *keymaxtp = NULL;
55 static Xsj3cKeyTable *firstkeytp = NULL, *freekeytp = NULL;
56 static int refcount = 0;
57
58 static struct _sjrcdeftable {
59 char *key[2];
60 char *value[10];
61 } def_guide_table[] = {
62 "guide", "hiragana", /* $B$+$J(B */ "\202\251\202\310",
63 "", "", "", "", "", "", "", "", "",
64 "guide", "zkatakana", /* $BA4%+%J(B*/ "\221\123\203\112\203\151",
65 "", "", "", "", "", "", "", "", "",
66 "guide", "hkatakana", /* $BH>%+%J(B*/ "\224\274\203\112\203\151",
67 "", "", "", "", "", "", "", "", "",
68 "guide", "halpha",/* ABC */ "\101\102\103",
69 "", "", "", "", "", "", "", "", "",
70 "guide", "zalpha",/* $B#A#B#C(B */ "\202\140\202\141\202\142",
71 "", "", "", "", "", "", "", "", "",
72 "guide", "sjis", /* Shift-JIS */ "\123\150\151\146\164\55\112\111\123",
73 "", "", "", "", "", "", "", "", "",
74 "guide", "euc", /* $B#E#U#C(B */ "\202\144\202\164\202\142",
75 "", "", "", "", "", "", "", "", "",
76 "guide", "jis", /* $B#J#I#S(B */ "\202\151\202\150\202\162",
77 "", "", "", "", "", "", "", "", "",
78 "guide", "kuten", /* $B6hE@(B */ "\213\346\223\137",
79 "", "", "", "", "", "", "", "", "",
80 "guide", "toroku", /* $BEPO?(B */ "\223\157\230\136",
81 "", "", "", "", "", "", "", "", "",
82 "guide", "syoukyo", /* $B>C5n(B */ "\217\301\213\216",
83 "", "", "", "", "", "", "", "", "",
84 "guide", "kanji", /* $B4A;z(B */ "\212\277\216\232",
85 "", "", "", "", "", "", "", "", "",
86 "guide", "edit", /* $BJT=8(B */ "\225\322\217\127",
87 "", "", "", "", "", "", "", "", "",
88 "guide", "candidate",/* $B0lMw(B */ "\210\352\227\227",
89 "", "", "", "", "", "", "", "", "",
90 "guide", "symbol",/* $B5-9f(B */ "\213\114\215\206",
91 "", "", "", "", "", "", "", "", "",
92 "guide", "hinsi", /* $BIJ;l(B */ "\225\151\216\214",
93 "", "", "", "", "", "", "", "", "",
94 "guide", "quote", /* $B0zMQ(B */ "\210\370\227\160",
95 "", "", "", "", "", "", "", "", "",
96 };
97
98 static Xsj3cKeyTable defkeys[] = {
99 "henkan", XK_Select, FlushModeMask, _Xsj3cConvert, NONE,NULL,NULL,
100 "convert", XK_Select, FlushModeMask, _Xsj3cConvert, NONE,NULL,NULL,
101 "muhen", XK_Cancel, ConvedModeMask|ShiftMask,
102 _Xsj3cUnConvert, NONE,NULL,NULL,
103 "unconvert",XK_Cancel, ConvedModeMask|ShiftMask,
104 _Xsj3cUnConvert, NONE,NULL,NULL,
105 "fix", XK_Execute, FlushModeMask|DictModeMask,
106 _Xsj3cFix, NONE,NULL,NULL,
107 "kettei", XK_KP_Enter,FlushModeMask, _Xsj3cFix, NONE,NULL,NULL,
108 "flush", XK_Escape, FlushModeMask, _Xsj3cFix, NONE,NULL,NULL,
109 "return", XK_Return, AllModeMask, _Xsj3cReturn, NONE,NULL,NULL,
110 "halpha", XK_F6, AllModeMask, _Xsj3cModeHAlpha, NONE,NULL,NULL,
111 "zalpha", XK_F7, AllModeMask, _Xsj3cModeZAlpha, NONE,NULL,NULL,
112 "hkatakana",XK_F8, AllModeMask, _Xsj3cModeHKata, NONE,NULL,NULL,
113 "zkatakana",XK_F9, AllModeMask, _Xsj3cModeZKata, NONE,NULL,NULL,
114 "hiragana", XK_F10, AllModeMask, _Xsj3cModeHira, NONE,NULL,NULL,
115 "tohalpha", XK_F16, FlushModeMask|ShiftMask,
116 _Xsj3cToHAlpha, NONE,NULL,NULL,
117 "tozalpha", XK_F17, FlushModeMask|ShiftMask,
118 _Xsj3cToZAlpha, NONE,NULL,NULL,
119 "tohkatakana",XK_F18, FlushModeMask|ShiftMask,
120 _Xsj3cToHKata, NONE,NULL,NULL,
121 "tozkatakana",XK_F19, FlushModeMask|ShiftMask,
122 _Xsj3cToZKata, NONE,NULL,NULL,
123 "tohiragana",XK_F20, FlushModeMask|ShiftMask,
124 _Xsj3cToHira, NONE,NULL,NULL,
125 "zenkaku", XK_F4, FlushModeMask, _Xsj3cZenkaku, NONE,NULL,NULL,
126 "hankaku", XK_F3, FlushModeMask, _Xsj3cHankaku, NONE,NULL,NULL,
127 "toupper", XK_u, FlushModeMask|ControlMask,
128 _Xsj3cToUpper, NONE,NULL,NULL,
129 "tolower", XK_l, FlushModeMask|ControlMask,
130 _Xsj3cToLower, NONE,NULL,NULL,
131 "sjis", XK_F15, NoInputModeMask|FlushModeMask|ShiftMask,
132 _Xsj3cModeSJIS, NONE,NULL,NULL,
133 "euc", XK_F14, NoInputModeMask|FlushModeMask|ShiftMask,
134 _Xsj3cModeEUC, NONE,NULL,NULL,
135 "jis", XK_F13, NoInputModeMask|FlushModeMask|ShiftMask,
136 _Xsj3cModeJIS, NONE,NULL,NULL,
137 "kuten", XK_F12, NoInputModeMask|FlushModeMask|ShiftMask,
138 _Xsj3cModeKuten, NONE,NULL,NULL,
139 "code", XK_F5, NoInputModeMask|FlushModeMask,
140 _Xsj3cCodeRollDown, NONE,NULL,NULL,
141 "toggle", XK_Tab, AllModeMask, _Xsj3cModeRollDown, NONE,NULL,NULL,
142 "modedown", XK_Tab, AllModeMask, _Xsj3cModeRollDown, NONE,NULL,NULL,
143 "toggleback",XK_Tab, AllModeMask|ShiftMask,
144 _Xsj3cModeRollUp, NONE,NULL,NULL,
145 "modeup", XK_Tab, AllModeMask|ShiftMask,
146 _Xsj3cModeRollUp, NONE,NULL,NULL,
147 "nextmode", XK_Tab, FlushModeMask|ControlMask,
148 _Xsj3cNextMode, NONE,NULL,NULL,
149 "prevmode", XK_Tab, FlushModeMask|ControlMask|ShiftMask,
150 _Xsj3cPrevMode, NONE,NULL,NULL,
151 "muhenkan", XK_Cancel, NoInputModeMask|FlushModeMask,
152 _Xsj3cModeToggle, NONE,NULL,NULL,
153 "right", XK_Right, AllModeMask, _Xsj3cForward, NONE,NULL,NULL,
154 "forward", XK_Right, AllModeMask, _Xsj3cForward, NONE,NULL,NULL,
155 "left", XK_Left, AllModeMask, _Xsj3cBackward, NONE,NULL,NULL,
156 "backward", XK_Left, AllModeMask, _Xsj3cBackward, NONE,NULL,NULL,
157 "top", XK_a, FlushModeMask|DictModeMask|ControlMask,
158 _Xsj3cTop, NONE,NULL,NULL,
159 "end", XK_e, FlushModeMask|DictModeMask|ControlMask,
160 _Xsj3cEnd, NONE,NULL,NULL,
161 "bottom", XK_e, FlushModeMask|DictModeMask|ControlMask,
162 _Xsj3cEnd, NONE,NULL,NULL,
163 "up", XK_Up, SelectModeMask, _Xsj3cUp, NONE,NULL,NULL,
164 "down", XK_Down, SelectModeMask, _Xsj3cDown, NONE,NULL,NULL,
165 "first", XK_Up, OutputModeMask|ControlMask,
166 _Xsj3cFirst, NONE,NULL,NULL,
167 "last", XK_Down, OutputModeMask|ControlMask,
168 _Xsj3cLast, NONE,NULL,NULL,
169 "nextp", XK_Select, SelectModeMask, _Xsj3cNextPage, NONE,NULL,NULL,
170 "prevp", XK_Cancel, SelectModeMask, _Xsj3cPrevPage, NONE,NULL,NULL,
171 "wrap", XK_Down, ConvedModeMask|ShiftMask,
172 _Xsj3cNext, NONE,NULL,NULL,
173 "next", XK_Down, ConvedModeMask|ShiftMask,
174 _Xsj3cNext, NONE,NULL,NULL,
175 "wrapback", XK_Up, ConvedModeMask|ShiftMask,
176 _Xsj3cPrev, NONE,NULL,NULL,
177 "prev", XK_Up, ConvedModeMask|ShiftMask,
178 _Xsj3cPrev, NONE,NULL,NULL,
179 "select", XK_Execute, SelectModeMask, _Xsj3cSelect, NONE,NULL,NULL,
180 "cancel", XK_Escape, SelectModeMask|DictModeMask,
181 _Xsj3cCancel, NONE,NULL,NULL,
182 "cancel", XK_Cancel, FlushModeMask|ShiftMask,
183 _Xsj3cCancel, NONE,NULL,NULL,
184 "kakucyou", XK_Up, FlushModeMask|DictModeMask,
185 _Xsj3cExpand, NONE,NULL,NULL,
186 "expand", XK_Up, FlushModeMask|DictModeMask,
187 _Xsj3cExpand, NONE,NULL,NULL,
188 "syukusyou",XK_Down, FlushModeMask|DictModeMask,
189 _Xsj3cShrink, NONE,NULL,NULL,
190 "shrink", XK_Down, FlushModeMask|DictModeMask,
191 _Xsj3cShrink, NONE,NULL,NULL,
192 "backspace",XK_BackSpace,FlushModeMask|SelectModeMask|DictModeMask,
193 _Xsj3cBackSpace, NONE,NULL,NULL,
194 "delete", XK_Delete, FlushModeMask|SelectModeMask|DictModeMask,
195 _Xsj3cDelete, NONE,NULL,NULL,
196 "delafter", XK_k, FlushModeMask|ControlMask,
197 _Xsj3cDelAfter, NONE,NULL,NULL,
198 "start", XK_Kanji, AllModeMask|ShiftMask,
199 _Xsj3cStart, NONE,NULL,NULL,
200 "reconnect",XK_Kanji, AllModeMask|ShiftMask|Mod1Mask,
201 _Xsj3cReConnect, NONE,NULL,NULL,
202 "saihenkan",XK_Select, NoInputModeMask|ControlMask,
203 _Xsj3cReConvert, NONE,NULL,NULL,
204 "recovert", XK_Select, NoInputModeMask|ControlMask,
205 _Xsj3cReConvert, NONE,NULL,NULL,
206 "edit", XK_Select, ConvedModeMask|Mod1Mask,
207 _Xsj3cEdit, NONE,NULL,NULL,
208 "toroku", XK_F1, ConvedModeMask, _Xsj3cDRegBegin, NONE,NULL,NULL,
209 "register", XK_F1, ConvedModeMask, _Xsj3cDRegBegin, NONE,NULL,NULL,
210 "syoukyo", XK_F2, ConvedModeMask, _Xsj3cDClearBegin, NONE,NULL,NULL,
211 "eliminate",XK_F2, ConvedModeMask, _Xsj3cDClearBegin, NONE,NULL,NULL,
212 "symbol", XK_Escape, NoInputModeMask|FlushModeMask|ShiftMask,
213 _Xsj3cSymbolBegin, NONE,NULL,NULL,
214 "quote", XK_q, NoInputModeMask|FlushModeMask|ControlMask,
215 _Xsj3cQuote, NONE,NULL,NULL,
216 "flushbefore",NoSymbol, NULL, _Xsj3cFlushBefore, NONE,NULL,NULL,
217 "bell", NoSymbol, NULL, _Xsj3cBell, NONE,NULL,NULL,
218 "sjrc", NoSymbol, NULL, _Xsj3cSjrc, NONE,NULL,NULL,
219 "kill", NoSymbol, NULL, _Xsj3cKill, NONE,NULL,NULL,
220 "kana", NoSymbol, NULL, _Xsj3cKana, NONE,NULL,NULL,
221 "null", NoSymbol, NULL, _Xsj3cNull, NONE,NULL,NULL,
222 "ignore", NoSymbol, NULL, _Xsj3cIgnore, NONE,NULL,NULL,
223 NULL, NULL, NULL, NULL, NONE,NULL,NULL
224 };
225
226 #define KEYTBMAX (BUFSIZ/sizeof(Xsj3cKeyTable) - 1)
227
228 /*
229 * _Xsj3cAllocKeyTable()
230 * Allocate memmory for key-function conversion table.
231 */
232 static Xsj3cKeyTable *
233 _Xsj3cAllocKeyTable()
234 {
235 register Xsj3cKeyTable *keytp;
236
237 if (keynowtp == NULL || keynowtp > keymaxtp) {
238 keytp = (Xsj3cKeyTable *)malloc(BUFSIZ);
239 if (keytp == NULL)
240 return (NULL);
241 else
242 bzero((char *)keytp, BUFSIZ);
243 if (!firstkeytp)
244 firstkeytp = keytp;
245 keynowtp = keytp;
246 keymaxtp = keynowtp + KEYTBMAX;
247 keynowtp++;
248 } else {
249 keytp = keynowtp;
250 keynowtp++;
251 }
252 keytp->keyword = NULL;
253 keytp->ksym = NoSymbol;
254 keytp->func = NULL;
255 keytp->inputsame = 0;
256 keytp->prev = NULL;
257 keytp->next = NULL;
258 return (keytp);
259 }
260
261 /*
262 * _Xsj3cAddFreeKeyTable()
263 * Add key-function conversion table to free list.
264 */
265 static void
266 _Xsj3cAddFreeKeyTable(keytp)
267 register Xsj3cKeyTable *keytp;
268 {
269 if (!keytp)
270 return;
271 if (freekeytp)
272 keytp->prev = freekeytp;
273 else
274 keytp->prev = NULL;
275 freekeytp = keytp;
276 keytp->keyword = NULL;
277 keytp->ksym = NoSymbol;
278 keytp->func = NULL;
279 keytp->inputsame = 0;
280 keytp->next = NULL;
281 }
282
283 /*
284 * _Xsj3cGetFreeKeyTable()
285 * Get key-function conversion table from free list.
286 */
287 static Xsj3cKeyTable *
288 _Xsj3cGetFreeKeyTable()
289 {
290 register Xsj3cKeyTable *keytp;
291
292 if (keytp = freekeytp)
293 freekeytp = keytp->prev;
294 return (keytp);
295 }
296
297 static void
298 _Xsj3cFreeAllKeyTable()
299 {
300 register Xsj3cKeyTable *keytp, *keytq;
301
302 keytq = firstkeytp;
303 while (keytq) {
304 keytp = keytq;
305 keytq = keytp + KEYTBMAX;
306 if (keytq);
307 keytq = keytq->next;
308 free(keytp);
309 }
310 firstkeytp = NULL;
311 freekeytp = NULL;
312 }
313
314 /*
315 * _Xsj3cSetKeyTable()
316 * Read sjrc's .key.[function] entry and set key-function conversion table.
317 */
318 int
319 _Xsj3cSetKeyTable(buf, table)
320 Xsj3cBuf buf;
321 Sjrctable table;
322 {
323 register Xsj3cKeyTable *keytp, *keytq, *keytr;
324 Xsj3cKeyTable *keytf, dummy;
325 KeySym ksym;
326 Xsj3ccMode modmask;
327 Xsj3cFlag inputsame;
328
329 if (!_Xsj3cSetKeySym(table->value, &ksym, &modmask, &inputsame))
330 return 0;
331 keytp = &dummy;
332 keytp->next= buf->key;
333 while (keytp->next != NULL) {
334 keytp = keytp->next;
335 if (keytp->ksym == NoSymbol ||(keytp->ksym == ksym &&
336 (keytp->modmask & ~AllModeMask) == (modmask & ~AllModeMask)
337 && ((keytp->modmask & AllModeMask) & modmask))) {
338 keytq = keytp->next;
339 keytf = keytp;
340 if (keytp == buf->key) { /* top of list */
341 buf->key = keytq;
342 keytq->prev = NULL;
343 } else if (!keytq) { /* last of list */
344 keytp = keytp->prev;
345 keytp->next = NULL;
346 } else {
347 keytp = keytp->prev;
348 keytp->next = keytq;
349 keytq->prev = keytp;
350 }
351 _Xsj3cAddFreeKeyTable(keytf);
352 }
353 }
354 if (!table->key[1])
355 return 0;
356 else if (ksym == NoSymbol || _Xsj3cCmp(table->key[1], "ignore"))
357 return 1;
358
359 keytr = keytp;
360 keytq = defkeys;
361 while (keytq->keyword != NULL) {
362 if (_Xsj3cCmp(table->key[1], keytq->keyword)) {
363 if (!(keytp = _Xsj3cGetFreeKeyTable())) {
364 if (!(keytp = _Xsj3cAllocKeyTable())) {
365 Xsj3cWarning("can't allocate keysym to func table");
366 return 0;
367 }
368 }
369 keytr->next = keytp;
370 keytp->prev = keytr;
371 keytp->keyword = keytq->keyword;
372 keytp->ksym = ksym;
373 keytp->modmask = modmask;
374 keytp->func = keytq->func;
375 keytp->inputsame = inputsame;
376 keytr = keytp;
377 keytp->next = NULL;
378 if (keytp->keyword == NULL) {
379 Xsj3cWarning("keyword %s is not supported",table->key[1]);
380 return 0;
381 }
382 }
383 keytq++;
384 }
385 return 1;
386 }
387
388 /*
389 * _Xsj3cSetKeySym()
390 * Read values of the .key.[function] entry and set keysym
391 * and modifier/conversion-mode mask.
392 */
393 static int
394 _Xsj3cSetKeySym(string, ksym, modmask, inputsame)
395 char **string;
396 KeySym *ksym;
397 Xsj3ccMode *modmask;
398 Xsj3cFlag *inputsame;
399 {
400 register char *p;
401 int sub, ret;
402
403 *modmask = 0;
404 *ksym = NoSymbol;
405 p = *string;
406
407 /* ModMask and KeySym field */
408 if (p) {
409 if(*p == '^') { /* sj2/sj3 control keybind compatibility */
410 if (++p) {
411 if (isupper(*p)) {
412 sub = *p - 'A';
413 *ksym = XK_a + sub;
414 } else if (islower(*p)) {
415 sub = *p - 'a';
416 *ksym = XK_a + sub;
417 } else if (*p >= '\\' && *p <= '_') {
418 sub = *p - '\\';
419 *ksym = XK_backslash + sub;
420 } else if (*p >= '!' && *p <= '>') {
421 sub = *p - '!';
422 *ksym = XK_exclam + sub;
423 } else {
424 Xsj3cWarning("wrong keybind in sjrc file");
425 }
426 *modmask = ControlMask|AllModeMask;
427 }
428 } else if(*p == 'X') { /* sjx keybind compatibility */
429 if (!strncmp(p, "XK_", 3)) {
430 p += 3;
431 *modmask = AllModeMask;
432 *ksym = XStringToKeysym(p);
433 } else {
434 *modmask = AllModeMask;
435 Xsj3cWarning("wrong keybind in sjrc file");
436 }
437 } else if(*p == '\033') { /* escape keybind compatibility */
438 *ksym = XK_Escape;
439 *modmask = AllModeMask;
440 } else if(*p == '\177') { /* delete keybind compatibility */
441 *ksym = XK_Delete;
442 *modmask = AllModeMask;
443 } else if ((ret = _Xsj3cGetModMask(*string)) >= 0) {
444 *modmask = ret;
445 if (++string)
446 *ksym = XStringToKeysym(*string);
447 else
448 Xsj3cWarning("wrong keybind in sjrc file");
449 } else {
450 Xsj3cWarning("wrong keybind in sjrc file");
451 }
452 } else {
453 *modmask = AllModeMask;
454 }
455
456 /* Through function field */
457 p = *(++string);
458 if (p) {
459 if (_Xsj3cCmp(p, "off"))
460 *inputsame = OFF;
461 else if (_Xsj3cCmp(p, "on"))
462 *inputsame = ON;
463 else
464 *inputsame = NONE;
465 } else {
466 *inputsame = NONE;
467 }
468 return 1;
469 }
470
471 /*
472 * _Xsj3cGetModMask()
473 * Read strings and convert to modifier/conversion-mode mask.
474 */
475 static long
476 _Xsj3cGetModMask(p)
477 register char *p;
478 {
479 char mode[256];
480 register char *q;
481 int ret = AllModeMask, mask = AllModeMask;
482 Xsj3ccMode conversion = 0;
483
484 while (*p != '\0') {
485 q = mode;
486 while (*p != '\0' && *p != '|') {
487 *q++ = *p++;
488 }
489 if (*p != '\0')
490 p++;
491 *q = '\0';
492 q = mode;
493 if (*q == 'n') {
494 continue;
495 } else if (*q == 's') {
496 ret |= ShiftMask;
497 continue;
498 } else if (*q == 'c') {
499 ret |= ControlMask;
500 continue;
501 } else if (*q == 'm') {
502 if (*(++q) != '\0') {
503 while (*q != '\0')
504 q++;
505 switch(*(--q)) {
506 case '1':
507 ret |= Mod1Mask;
508 break;
509 case '2':
510 ret |= Mod2Mask;
511 break;
512 case '3':
513 ret |= Mod3Mask;
514 break;
515 case '4':
516 ret |= Mod4Mask;
517 break;
518 case '5':
519 ret |= Mod5Mask;
520 break;
521 default:
522 ret |= Mod1Mask;
523 break;
524 }
525 } else
526 ret |= Mod1Mask;
527 continue;
528 } else if (*q == 'l') {
529 ret |= LockMask;
530 continue;
531 } else if (*q == 'k') {
532 ret |= KanaMask;
533 continue;
534 } else if (*q == 'N') {
535 conversion |= NoInputModeMask;
536 continue;
537 } else if (*q == 'I') {
538 conversion |= InputModeMask;
539 continue;
540 } else if (*q == 'i') { /* for compatibility */
541 conversion |= InputModeMask;
542 continue;
543 } else if (*q == 'u') { /* for compatibility */
544 conversion |= ConvedModeMask;
545 continue;
546 } else if (*q == 'U') { /* for compatibility */
547 conversion |= ConvedModeMask;
548 continue;
549 } else if (*q == 'C') {
550 conversion |= ConvedModeMask;
551 continue;
552 } else if (*q == 'v') { /* for compatibility */
553 conversion |= SelectModeMask;
554 continue;
555 } else if (*q == 'V') { /* for compatibility */
556 conversion |= SelectModeMask;
557 continue;
558 } else if (*q == 'S') {
559 conversion |= SelectModeMask;
560 continue;
561 } else if (*q == 'o') { /* for compatibility */
562 conversion |= OutputModeMask;
563 continue;
564 } else if (*q == 'O') {
565 conversion |= OutputModeMask;
566 continue;
567 } else if (*q == 'd') { /* for compatibility */
568 conversion |= DictModeMask;
569 continue;
570 } else if (*q == 'D') {
571 conversion |= DictModeMask;
572 continue;
573 } else if (*q == 'f') { /* for compatibility */
574 conversion |= FlushModeMask;
575 continue;
576 } else if (*q == 'F') {
577 conversion |= FlushModeMask;
578 continue;
579 } else if (*q == 'a') { /* for compatibility */
580 conversion |= AllModeMask;
581 continue;
582 } else if (*q == 'A') {
583 conversion |= AllModeMask;
584 continue;
585 } else {
586 Xsj3cWarning("Ilegal keybind modmask %s in sjrc file",mode);
587 ret = -1;
588 }
589 }
590 if (conversion) {
591 ret &= ~mask;
592 ret |= conversion;
593 }
594 return ret;
595 }
596
597 /*
598 * Xsj3cCreateBuffer()
599 * Allocate Xsj3cBuf type structure and initialize all flags and buffers.
600 */
601 Xsj3cBuf
602 Xsj3cCreateBuffer()
603 {
604 Xsj3cBuf buf;
605 Xsj3cKeyTable *keytp, *keytq, *keytr;
606 register int i, back_lang;
607
608 /* Allocate buffer fields */
609
610 if ((buf = (Xsj3cBuf)malloc(sizeof(Xsj3cBufRec))) == NULL) {
611 return (Xsj3cBuf)NULL;
612 }
613 bzero(buf, sizeof(Xsj3cBufRec));
614
615 /* Default definition for uninitialized field */
616
617 buf->convmode = NoInputModeMask;
618 buf->server = SERVER_SJ3;
619 if ((buf->input = (Xsj3cSeg *)calloc(BUNBUFSIZ, sizeof(Xsj3cSeg)))
620 == NULL) {
621 return (Xsj3cBuf)NULL;
622 }
623 bzero(buf->input, BUNBUFSIZ * sizeof(Xsj3cSeg));
624 buf->backup = NULL;
625 buf->current = NULL;
626 buf->segnum = 0;
627 buf->backsegnum = 0;
628 buf->curseg = 0;
629 buf->convedsegnum = 0;
630
631 buf->inputmode = MODE_HIRA;
632 buf->dispmode = MODE_HIRA;
633
634 buf->dict = NULL;
635
636 buf->candidate = NULL;
637 buf->hinsi = NULL;
638 buf->symbol = NULL;
639
640 buf->candnum = 0;
641 buf->curcand = 0;
642 buf->cursymbol = 0;
643 buf->curhinsi = 0;
644 buf->selectstatus = SELECT_CAND;
645 buf->n_select = 0;
646 buf->candseg = 0;
647
648 buf->rktable = NULL;
649 buf->hktable = NULL;
650 buf->zhtable = NULL;
651 buf->plosive = NULL;
652 buf->rkdouble = NULL;
653
654 /* Initialize common (with sj2/sj3/sjx) flags area */
655 /* Make keysym to function hash table */
656 for (keytp = defkeys, i = 0; keytp->keyword != NULL; keytp++) {
657 if (!(keytq = _Xsj3cGetFreeKeyTable())) {
658 if (!(keytq = _Xsj3cAllocKeyTable())) {
659 Xsj3cWarning("can't allocate keysym to func table");
660 return (Xsj3cBuf)NULL;
661 }
662 }
663 if (!i++) {
664 buf->key = keytq;
665 keytq->prev = NULL;
666 } else {
667 keytr->next = keytq;
668 keytq->prev = keytr;
669 }
670 keytq->keyword = keytp->keyword;
671 keytq->ksym = keytp->ksym;
672 keytq->modmask = keytp->modmask;
673 keytq->func = keytp->func;
674 keytq->inputsame = keytp->inputsame;
675 keytr = keytq;
676 }
677 keytq->next = NULL;
678
679 for (i = 0; i < MODE_INROT_NUM; i++)
680 buf->inmoderot[i]= i;
681 buf->inmoderotnum = MODE_INROT_NUM;
682 for (i = 0; i < MODE_OUTROT_NUM; i++)
683 buf->outmoderot[i]= i;
684 buf->outmoderotnum = MODE_OUTROT_NUM;
685 for (i = 0; i < MODE_CODE_NUM; i++)
686 buf->defcode[i]= MODE_SJIS + i;
687 buf->coderotnum = MODE_CODE_NUM;
688 buf->muhenmode = MODE_HALPHA;
689 buf->togglemode = MODE_HIRA;
690 buf->dotoggle = ON;
691 buf->throughflg = 0;
692
693 buf->rcfile = NULL;
694 back_lang = in_lang;
695 in_lang = JP_SJIS;
696 for (i = 0; i < MODE_STR_NUM; i++) {
697 _Xsj3cSetGuide(buf, &def_guide_table[i]);
698 }
699 in_lang = back_lang;
700
701 buf->gakusyuu = ON;
702 buf->rkbell = OFF;
703 buf->flushaconv = OFF;
704 buf->sj3serv = NULL;
705 buf->setnormal = NULL;
706 buf->throughnext = NULL;
707
708 /* Initialize Xsj3clib original flags area */
709 buf->sj3serv2 = NULL;
710 buf->alphaconv = OFF;
711 buf->backdisplay = OFF;
712 buf->beginlastseg = ON;
713 buf->expandkconv = SEG_CONVED;
714 buf->shrinkkconv = SEG_CONVED;
715 buf->expandmconv = SEG_NOCONV;
716 buf->shrinkmconv = SEG_NOCONV;
717 buf->shrinkall = OFF;
718 buf->flushiconv = ON;
719 buf->flushsconv = NONE;
720 buf->flusheconv = ON;
721 buf->henkanseg = ALL;
722 buf->muhenseg = ONE;
723 buf->delchange = ONE;
724 buf->flushchange = ONE;
725 for ( i = 0; i < MODE_CONV_NUM; i++)
726 buf->modeconv[i] = SEG_CONVED;
727 buf->moveloop = OFF;
728 buf->movebyseg = SEG_CONVED;
729 buf->jumpbyseg = SEG_CONVED;
730 buf->delbyseg = SEG_CONVED;
731 buf->killbyseg = SEG_CONVED;
732 buf->muhencurlast = OFF;
733 buf->editcurlast = OFF;
734 buf->flushcurlast = OFF;
735 buf->convedunderline = ON;
736 buf->dispmodechange = OFF;
737 buf->dellastmove = ON;
738 buf->kanaonly = OFF;
739 buf->inputsame = ON;
740 buf->cntrlsame = OFF;
741 buf->selectconv = ON;
742 buf->beforeconv = OFF;
743 buf->lastdoubleconv = OFF;
744 buf->selectcount = 0;
745 buf->selectback = OFF;
746 buf->candpadding = OFF;
747
748 refcount++;
749 return (buf);
750 }
751
752 /*
753 * _Xsj3cFreeModeStr()
754 * Free memory of mode guide strings.
755 */
756 static void
757 _Xsj3cFreeModeStr(buf)
758 Xsj3cBuf buf;
759 {
760 register int i;
761
762 for (i = 0; i < MODE_STR_NUM; i++) {
763 if (buf->modestr[i])
764 free(buf->modestr[i]);
765 buf->modestr[i] = NULL;
766 }
767 }
768
769 /*
770 * Xsj3cFreeBuffer()
771 * Free all data buffers.
772 */
773 void
774 Xsj3cFreeBuffer(buf)
775 Xsj3cBuf buf;
776 {
777 register int i;
778
779 _Xsj3cFreeModeStr(buf);
780 if (!refcount)
781 _Xsj3cFreeAllKeyTable();
782 if (buf->input) {
783 for (i = 0; i < buf->segnum + 1; i++) {
784 Xsj3cFreeSegment(buf->input[i]);
785 buf->input[i] = NULL;
786 }
787 free(buf->input);
788 buf->input = NULL;
789 }
790 if (buf->backup) {
791 for (i = 0; i < buf->backsegnum + 1; i++) {
792 Xsj3cFreeSegment(buf->backup[i]);
793 buf->backup[i] = NULL;
794 }
795 free(buf->backup);
796 buf->backup = NULL;
797 }
798 free(buf);
799 }
800
801 /*
802 * Xsj3cClearBuffer()
803 * Clear buffers.
804 */
805 void
806 Xsj3cClearBuffer(buf)
807 Xsj3cBuf buf;
808 {
809 register int i;
810
811 for (i = 0; i < buf->segnum + 1; i++) {
812 Xsj3cFreeSegment(buf->input[i]);
813 buf->input[i] = NULL;
814 }
815 buf->convmode = InputModeMask;
816 buf->curseg = 0;
817 buf->segnum = 0;
818 buf->convedsegnum = 0;
819 buf->dispmode = buf->inputmode;
820 }
821
822 /*
823 * Xsj3cFixBuffer()
824 * Fix and backup buffers.
825 */
826 void
827 Xsj3cFixBuffer(buf)
828 Xsj3cBuf buf;
829 {
830 register int i;
831 int j;
832
833 if (buf->backup) {
834 for (i = 0; i < buf->backsegnum + 1; i++) {
835 Xsj3cFreeSegment(buf->backup[i]);
836 buf->backup[i] = NULL;
837 }
838 free(buf->backup);
839 buf->backup = NULL;
840 }
841 if (buf->convmode & InputModeMask) {
842 j = buf->input[buf->curseg]->cur - 1;
843 if (j >= 0 && buf->input[buf->curseg]->yomi[j] < 256 &&
844 iscntrl((unsigned char)buf->input[buf->curseg]->yomi[j])) {
845 unsigned char tmp[RBUFSIZ];
846
847 _Xsj3cExtractChar(buf, buf->input[buf->curseg], tmp, 1);
848 _Xsj3cStoreYomi(buf, buf->input[buf->curseg], j);
849 if (!buf->input[buf->curseg]->num) {
850 buf->segnum--;
851 Xsj3cFreeSegment(buf->input[buf->curseg]);
852 buf->input[buf->curseg] = NULL;
853 for (i = buf->curseg; i < buf->segnum; i++) {
854 buf->input[i] = buf->input[i + 1];
855 }
856 buf->input[buf->segnum] = NULL;
857 }
858 }
859 buf->convmode = NoInputModeMask;
860 } else if (buf->convmode & ~NoInputModeMask) {
861 j = buf->input[buf->curseg]->dnum - 1;
862 if (j >= 0 && buf->input[buf->curseg]->disp[j] < 256 &&
863 iscntrl((unsigned char)buf->input[buf->curseg]->disp[j])) {
864 buf->input[buf->curseg]->dnum--;
865 buf->input[buf->curseg]->disp[j] = '\0';
866 }
867 if (buf->convmode != SelectModeMask) /* For symbol input */
868 buf->convmode = NoInputModeMask;
869 }
870 buf->backup = buf->input;
871 buf->backsegnum = buf->segnum;
872 buf->input = NULL;
873 if ((buf->input = (Xsj3cSeg *)calloc(BUNBUFSIZ,
874 sizeof(Xsj3cSeg))) == NULL) {
875 Xsj3cError("Cannot allocate for input buffers");
876 }
877 buf->curseg = 0;
878 buf->segnum = 0;
879 buf->convedsegnum = 0;
880 buf->dispmode = buf->inputmode;
881 }
882
883 /*
884 * Xsj3cFlushBuffer()
885 * Flush and backup buffers.
886 */
887 void
888 Xsj3cFlushBuffer(buf)
889 Xsj3cBuf buf;
890 {
891 register int tmpsegnum;
892 register Xsj3cSeg *segp;
893
894 segp = buf->backup;
895 buf->backup = buf->input;
896 buf->input = segp;
897 tmpsegnum = buf->backsegnum;
898 buf->backsegnum = buf->segnum;
899 buf->segnum = tmpsegnum;
900 buf->curseg = 0;
901 buf->convmode = InputModeMask;
902 buf->convedsegnum = 0;
903 buf->dispmode = buf->inputmode;
904 }