Mercurial > kinput2.yaz
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 } |