1 /*
2   Copyright (c) 2005-2013 uim Project https://github.com/uim/uim
3 
4   All rights reserved.
5 
6   Redistribution and use in source and binary forms, with or
7   without modification, are permitted provided that the
8   following conditions are met:
9 
10   1. Redistributions of source code must retain the above
11      copyright notice, this list of conditions and the
12      following disclaimer.
13   2. Redistributions in binary form must reproduce the above
14      copyright notice, this list of conditions and the
15      following disclaimer in the documentation and/or other
16      materials provided with the distribution.
17   3. Neither the name of authors nor the names of its
18      contributors may be used to endorse or promote products
19      derived from this software without specific prior written
20      permission.
21 
22   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
23   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
24   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
33   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36 
37 #include "key.h"
38 
39 /*
40   convert abbreviated key description to generic Emacs-style key description
41   (for XEmacs)
42 */
43 void
convert_keyname_a2e(char * keyname,const char * name,size_t keyname_len)44 convert_keyname_a2e(char *keyname, const char *name, size_t keyname_len)
45 {
46   if (strcmp(name, "BS") == 0)
47 	strlcpy(keyname, "backspace", keyname_len);
48   else if (strcmp(name, "TAB") == 0)
49 	strlcpy(keyname, "tab", keyname_len);
50   else if (strcmp(name, "RET") == 0)
51 	strlcpy(keyname, "return", keyname_len);
52   else if (strcmp(name, "ESC") == 0)
53 	strlcpy(keyname, "escape", keyname_len);
54   else if (strcmp(name, "DEL") == 0)
55 	strlcpy(keyname, "delete", keyname_len);
56   else if (strcmp(name, "DEL") == 0)
57 	strlcpy(keyname, "delete", keyname_len);
58   else if (strcmp(name, "SPC") == 0)
59 	strlcpy(keyname, "space", keyname_len);
60   else
61 	strlcpy(keyname, name, keyname_len);
62 }
63 
64 
65 /*
66   convert generic Emacs-style key description to Uim-style key description
67 */
68 enum UKey
convert_keyname_e2u(const char * keyname)69 convert_keyname_e2u(const char *keyname)
70 {
71   if (strcmp("space", keyname) == 0)
72 	return ' ';  /* "space" has no Uim-style key description */
73   else if (strcmp("backspace", keyname) == 0)
74 	return UKey_Backspace;
75   else if (strcmp("tab", keyname) == 0)
76 	return UKey_Tab;
77   else if (strcmp("return", keyname) == 0)
78 	return UKey_Return;
79   else if (strcmp("escape", keyname) == 0)
80 	return UKey_Escape;
81   else if (strcmp("prior", keyname) == 0)
82 	return UKey_Prior;
83   else if (strcmp("next", keyname) == 0)
84 	return UKey_Next;
85   else if (strcmp("end", keyname) == 0)
86 	return UKey_End;
87   else if (strcmp("home", keyname) == 0)
88 	return UKey_Home;
89   else if (strcmp("left", keyname) == 0)
90 	return UKey_Left;
91   else if (strcmp("up", keyname) == 0)
92 	return UKey_Up;
93   else if (strcmp("right", keyname) == 0)
94 	return UKey_Right;
95   else if (strcmp("down", keyname) == 0)
96 	return UKey_Down;
97   else if (strcmp("insert", keyname) == 0)
98 	return UKey_Insert;
99   else if (strcmp("delete", keyname) == 0)
100 	return UKey_Delete;
101   else if (strcmp("kanji", keyname) == 0)
102 	return UKey_Kanji;
103   else if (strcmp("muhenkan", keyname) == 0)
104 	return UKey_Muhenkan;
105   else if (strcmp("henkan", keyname) == 0)
106 	return UKey_Henkan_Mode;
107   else if (strcmp("romaji", keyname) == 0)
108 	return UKey_Romaji;
109   else if (strcmp("hiragana", keyname) == 0)
110 	return UKey_Hiragana;
111   else if (strcmp("katakana", keyname) == 0)
112 	return UKey_Katakana;
113   else if (strcmp("hiragana-katakana", keyname) == 0)
114 	return UKey_Hiragana_Katakana;
115   else if (strcmp("zenkaku", keyname) == 0)
116 	return UKey_Zenkaku;
117   else if (strcmp("hankaku", keyname) == 0)
118 	return UKey_Hankaku;
119   else if (strcmp("zenkaku-hankaku", keyname) == 0)
120 	return UKey_Zenkaku_Hankaku;
121   else if (strcmp("touroku", keyname) == 0)
122 	return UKey_Touroku;
123   else if (strcmp("massyo", keyname) == 0)
124 	return UKey_Massyo;
125   else if (strcmp("kana-lock", keyname) == 0)
126 	return UKey_Kana_Lock;
127   else if (strcmp("kana-shift", keyname) == 0)
128 	return UKey_Kana_Shift;
129   else if (strcmp("eisu-shift", keyname) == 0)
130 	return UKey_Eisu_Shift;
131   else if (strcmp("eisu-toggle", keyname) == 0)
132 	return UKey_Eisu_toggle;
133   else if (strcmp("Caps_Lock", keyname) == 0
134            || strcmp("caps-lock", keyname) == 0)
135     return UKey_Caps_Lock;
136   else if (strcmp("Num_Lock", keyname) == 0
137            || strcmp("num-lock", keyname) == 0)
138     return UKey_Num_Lock;
139   else if (strcmp("Scroll_Lock", keyname) == 0
140            || strcmp("scroll-lock", keyname) == 0)
141     return UKey_Scroll_Lock;
142   else if (strcmp("yen", keyname) == 0)
143     return UKey_Yen;
144   else if (strcmp("Multi_key", keyname) == 0
145            || strcmp("multi-key", keyname) == 0)
146     return UKey_Multi_key;
147   else if (strcmp("Codeinput", keyname) == 0
148            || strcmp("codeinput", keyname) == 0)
149     return UKey_Codeinput;
150   else if (strcmp("SingleCandidate", keyname) == 0
151            || strcmp("singlecandidate", keyname) == 0)
152     return UKey_SingleCandidate;
153   else if (strcmp("MultipleCandidate", keyname) == 0
154            || strcmp("multiplecandidate", keyname) == 0)
155     return UKey_MultipleCandidate;
156   else if (strcmp("PreviousCandidate", keyname) == 0
157            || strcmp("previouscandidate", keyname) == 0)
158     return UKey_PreviousCandidate;
159   else if (strcmp("Mode_switch", keyname) == 0
160            || strcmp("mode-switch", keyname) == 0)
161 	return UKey_Mode_switch;
162   else if (strncmp("f", keyname, strlen("f")) == 0) {
163 	keyname += strlen("f");
164 	if (strcmp("1", keyname) == 0)
165 	  return UKey_F1;
166 	else if (strcmp("2", keyname) == 0)
167 	  return UKey_F2;
168 	else if (strcmp("3", keyname) == 0)
169 	  return UKey_F3;
170 	else if (strcmp("4", keyname) == 0)
171 	  return UKey_F4;
172 	else if (strcmp("5", keyname) == 0)
173 	  return UKey_F5;
174 	else if (strcmp("6", keyname) == 0)
175 	  return UKey_F6;
176 	else if (strcmp("7", keyname) == 0)
177 	  return UKey_F7;
178 	else if (strcmp("8", keyname) == 0)
179 	  return UKey_F8;
180 	else if (strcmp("9", keyname) == 0)
181 	  return UKey_F9;
182 	else if (strcmp("10", keyname) == 0)
183 	  return UKey_F10;
184 	else if (strcmp("11", keyname) == 0)
185 	  return UKey_F11;
186 	else if (strcmp("12", keyname) == 0)
187 	  return UKey_F12;
188 	else if (strcmp("13", keyname) == 0)
189 	  return UKey_F13;
190 	else if (strcmp("14", keyname) == 0)
191 	  return UKey_F14;
192 	else if (strcmp("15", keyname) == 0)
193 	  return UKey_F15;
194 	else if (strcmp("16", keyname) == 0)
195 	  return UKey_F16;
196 	else if (strcmp("17", keyname) == 0)
197 	  return UKey_F17;
198 	else if (strcmp("18", keyname) == 0)
199 	  return UKey_F18;
200 	else if (strcmp("19", keyname) == 0)
201 	  return UKey_F19;
202 	else if (strcmp("20", keyname) == 0)
203 	  return UKey_F20;
204 	else if (strcmp("21", keyname) == 0)
205 	  return UKey_F21;
206 	else if (strcmp("22", keyname) == 0)
207 	  return UKey_F22;
208 	else if (strcmp("23", keyname) == 0)
209 	  return UKey_F23;
210 	else if (strcmp("24", keyname) == 0)
211 	  return UKey_F24;
212 	else if (strcmp("25", keyname) == 0)
213 	  return UKey_F25;
214 	else if (strcmp("26", keyname) == 0)
215 	  return UKey_F26;
216 	else if (strcmp("27", keyname) == 0)
217 	  return UKey_F27;
218 	else if (strcmp("28", keyname) == 0)
219 	  return UKey_F28;
220 	else if (strcmp("29", keyname) == 0)
221 	  return UKey_F29;
222 	else if (strcmp("30", keyname) == 0)
223 	  return UKey_F30;
224 	else if (strcmp("31", keyname) == 0)
225 	  return UKey_F31;
226 	else if (strcmp("32", keyname) == 0)
227 	  return UKey_F32;
228 	else if (strcmp("33", keyname) == 0)
229 	  return UKey_F33;
230 	else if (strcmp("34", keyname) == 0)
231 	  return UKey_F34;
232 	else if (strcmp("35", keyname) == 0)
233 	  return UKey_F35;
234   } else if (strcmp("Hangul", keyname) == 0)
235 	  return UKey_Hangul;
236   else if (strncmp("Hangul_", keyname, strlen("Hangul_")) == 0) {
237 	keyname += strlen("Hangul_");
238 	if (strcmp("Start", keyname) == 0)
239 	  return UKey_Hangul_Start;
240 	else if (strcmp("End", keyname) == 0)
241 	  return UKey_Hangul_End;
242 	else if (strcmp("Hanja", keyname) == 0)
243 	  return UKey_Hangul_Hanja;
244 	else if (strcmp("Jamo", keyname) == 0)
245 	  return UKey_Hangul_Jamo;
246 	else if (strcmp("Romaja", keyname) == 0)
247 	  return UKey_Hangul_Romaja;
248 	else if (strcmp("Codeinput", keyname) == 0)
249 	  return UKey_Hangul_Codeinput;
250 	else if (strcmp("Jeonja", keyname) == 0)
251 	  return UKey_Hangul_Jeonja;
252 	else if (strcmp("Banja", keyname) == 0)
253 	  return UKey_Hangul_Banja;
254 	else if (strcmp("PreHanja", keyname) == 0)
255 	  return UKey_Hangul_PreHanja;
256 	else if (strcmp("PostHanja", keyname) == 0)
257 	  return UKey_Hangul_PostHanja;
258 	else if (strcmp("SingleCandidate", keyname) == 0)
259 	  return UKey_Hangul_SingleCandidate;
260 	else if (strcmp("MultipleCandidate", keyname) == 0)
261 	  return UKey_Hangul_MultipleCandidate;
262 	else if (strcmp("PreviousCandidate", keyname) == 0)
263 	  return UKey_Hangul_PreviousCandidate;
264 	else if (strcmp("Special", keyname) == 0)
265 	  return UKey_Hangul_Special;
266   } else if (strncmp("hangul-", keyname, strlen("hangul-")) == 0) {
267     keyname += strlen("hangul-");
268 	if (strcmp("start", keyname) == 0)
269 	  return UKey_Hangul_Start;
270 	else if (strcmp("end", keyname) == 0)
271 	  return UKey_Hangul_End;
272 	else if (strcmp("hanja", keyname) == 0)
273 	  return UKey_Hangul_Hanja;
274 	else if (strcmp("jamo", keyname) == 0)
275 	  return UKey_Hangul_Jamo;
276 	else if (strcmp("romaja", keyname) == 0)
277 	  return UKey_Hangul_Romaja;
278 	else if (strcmp("codeinput", keyname) == 0)
279 	  return UKey_Hangul_Codeinput;
280 	else if (strcmp("jeonja", keyname) == 0)
281 	  return UKey_Hangul_Jeonja;
282 	else if (strcmp("banja", keyname) == 0)
283 	  return UKey_Hangul_Banja;
284 	else if (strcmp("prehanja", keyname) == 0)
285 	  return UKey_Hangul_PreHanja;
286 	else if (strcmp("posthanja", keyname) == 0)
287 	  return UKey_Hangul_PostHanja;
288 	else if (strcmp("singlecandidate", keyname) == 0)
289 	  return UKey_Hangul_SingleCandidate;
290 	else if (strcmp("multiplecandidate", keyname) == 0)
291 	  return UKey_Hangul_MultipleCandidate;
292 	else if (strcmp("previouscandidate", keyname) == 0)
293 	  return UKey_Hangul_PreviousCandidate;
294 	else if (strcmp("special", keyname) == 0)
295 	  return UKey_Hangul_Special;
296   } else if (strncmp("dead-", keyname, strlen("dead-")) == 0) {
297 	keyname += strlen("dead-");
298 	if (strcmp("grave", keyname) == 0)
299 	  return UKey_Dead_Grave;
300 	else if (strcmp("acute", keyname) == 0)
301 	  return UKey_Dead_Acute;
302 	else if (strcmp("circumflex", keyname) == 0)
303 	  return UKey_Dead_Circumflex;
304 	else if (strcmp("tilde", keyname) == 0)
305 	  return UKey_Dead_Tilde;
306 	else if (strcmp("macron", keyname) == 0)
307 	  return UKey_Dead_Macron;
308 	else if (strcmp("breve", keyname) == 0)
309 	  return UKey_Dead_Breve;
310 	else if (strcmp("abovedot", keyname) == 0)
311 	  return UKey_Dead_Abovedot;
312 	else if (strcmp("diaeresis", keyname) == 0)
313 	  return UKey_Dead_Diaeresis;
314 	else if (strcmp("abovering", keyname) == 0)
315 	  return UKey_Dead_Abovering;
316 	else if (strcmp("doubleacute", keyname) == 0)
317 	  return UKey_Dead_Doubleacute;
318 	else if (strcmp("caron", keyname) == 0)
319 	  return UKey_Dead_Caron;
320 	else if (strcmp("cedilla", keyname) == 0)
321 	  return UKey_Dead_Cedilla;
322 	else if (strcmp("ogonek", keyname) == 0)
323 	  return UKey_Dead_Ogonek;
324 	else if (strcmp("iota", keyname) == 0)
325 	  return UKey_Dead_Iota;
326 	else if (strcmp("voicedsound", keyname) == 0)
327 	  return UKey_Dead_VoicedSound;
328 	else if (strcmp("semivoicedsound", keyname) == 0)
329 	  return UKey_Dead_SemivoicedSound;
330 	else if (strcmp("belowdot", keyname) == 0)
331 	  return UKey_Dead_Belowdot;
332 	else if (strcmp("hook", keyname) == 0)
333 	  return UKey_Dead_Hook;
334 	else if (strcmp("horn", keyname) == 0)
335 	  return UKey_Dead_Horn;
336   } else if (strncmp("kana_", keyname, strlen("kana_")) == 0) {
337 	keyname += strlen("kana_");
338     if (strcmp("fullstop", keyname) == 0)
339 	  return UKey_Kana_Fullstop;
340 	else if (strcmp("openingbracket", keyname) == 0)
341 	  return UKey_Kana_OpeningBracket;
342 	else if (strcmp("closingbracket", keyname) == 0)
343 	  return UKey_Kana_ClosingBracket;
344 	else if (strcmp("comma", keyname) == 0)
345 	  return UKey_Kana_Comma;
346 	else if (strcmp("conjunctive", keyname) == 0)
347 	  return UKey_Kana_Conjunctive;
348 	else if (strcmp("WO", keyname) == 0)
349 	  return UKey_Kana_WO;
350 	else if (strcmp("a", keyname) == 0)
351 	  return UKey_Kana_a;
352 	else if (strcmp("i", keyname) == 0)
353 	  return UKey_Kana_i;
354 	else if (strcmp("u", keyname) == 0)
355 	  return UKey_Kana_u;
356 	else if (strcmp("e", keyname) == 0)
357 	  return UKey_Kana_e;
358 	else if (strcmp("o", keyname) == 0)
359 	  return UKey_Kana_o;
360 	else if (strcmp("ya", keyname) == 0)
361 	  return UKey_Kana_ya;
362 	else if (strcmp("yu", keyname) == 0)
363 	  return UKey_Kana_yu;
364 	else if (strcmp("yo", keyname) == 0)
365 	  return UKey_Kana_yo;
366 	else if (strcmp("tsu", keyname) == 0)
367 	  return UKey_Kana_tsu;
368 	else if (strcmp("A", keyname) == 0)
369 	  return UKey_Kana_A;
370 	else if (strcmp("I", keyname) == 0)
371 	  return UKey_Kana_I;
372 	else if (strcmp("U", keyname) == 0)
373 	  return UKey_Kana_U;
374 	else if (strcmp("E", keyname) == 0)
375 	  return UKey_Kana_E;
376 	else if (strcmp("O", keyname) == 0)
377 	  return UKey_Kana_O;
378 	else if (strcmp("KA", keyname) == 0)
379 	  return UKey_Kana_KA;
380 	else if (strcmp("KI", keyname) == 0)
381 	  return UKey_Kana_KI;
382 	else if (strcmp("KU", keyname) == 0)
383 	  return UKey_Kana_KU;
384 	else if (strcmp("KE", keyname) == 0)
385 	  return UKey_Kana_KE;
386 	else if (strcmp("KO", keyname) == 0)
387 	  return UKey_Kana_KO;
388 	else if (strcmp("SA", keyname) == 0)
389 	  return UKey_Kana_SA;
390 	else if (strcmp("SHI", keyname) == 0)
391 	  return UKey_Kana_SHI;
392 	else if (strcmp("SU", keyname) == 0)
393 	  return UKey_Kana_SU;
394 	else if (strcmp("SE", keyname) == 0)
395 	  return UKey_Kana_SE;
396 	else if (strcmp("SO", keyname) == 0)
397 	  return UKey_Kana_SO;
398 	else if (strcmp("TA", keyname) == 0)
399 	  return UKey_Kana_TA;
400 	else if (strcmp("CHI", keyname) == 0)
401 	  return UKey_Kana_CHI;
402 	else if (strcmp("TSU", keyname) == 0)
403 	  return UKey_Kana_TSU;
404 	else if (strcmp("TE", keyname) == 0)
405 	  return UKey_Kana_TE;
406 	else if (strcmp("TO", keyname) == 0)
407 	  return UKey_Kana_TO;
408 	else if (strcmp("NA", keyname) == 0)
409 	  return UKey_Kana_NA;
410 	else if (strcmp("NI", keyname) == 0)
411 	  return UKey_Kana_NI;
412 	else if (strcmp("NU", keyname) == 0)
413 	  return UKey_Kana_NU;
414 	else if (strcmp("NE", keyname) == 0)
415 	  return UKey_Kana_NE;
416 	else if (strcmp("NO", keyname) == 0)
417 	  return UKey_Kana_NO;
418 	else if (strcmp("HA", keyname) == 0)
419 	  return UKey_Kana_HA;
420 	else if (strcmp("HI", keyname) == 0)
421 	  return UKey_Kana_HI;
422 	else if (strcmp("FU", keyname) == 0)
423 	  return UKey_Kana_FU;
424 	else if (strcmp("HE", keyname) == 0)
425 	  return UKey_Kana_HE;
426 	else if (strcmp("HO", keyname) == 0)
427 	  return UKey_Kana_HO;
428 	else if (strcmp("MA", keyname) == 0)
429 	  return UKey_Kana_MA;
430 	else if (strcmp("MI", keyname) == 0)
431 	  return UKey_Kana_MI;
432 	else if (strcmp("MU", keyname) == 0)
433 	  return UKey_Kana_MU;
434 	else if (strcmp("ME", keyname) == 0)
435 	  return UKey_Kana_ME;
436 	else if (strcmp("MO", keyname) == 0)
437 	  return UKey_Kana_MO;
438 	else if (strcmp("YA", keyname) == 0)
439 	  return UKey_Kana_YA;
440 	else if (strcmp("YU", keyname) == 0)
441 	  return UKey_Kana_YU;
442 	else if (strcmp("YO", keyname) == 0)
443 	  return UKey_Kana_YO;
444 	else if (strcmp("RA", keyname) == 0)
445 	  return UKey_Kana_RA;
446 	else if (strcmp("RI", keyname) == 0)
447 	  return UKey_Kana_RI;
448 	else if (strcmp("RU", keyname) == 0)
449 	  return UKey_Kana_RU;
450 	else if (strcmp("RE", keyname) == 0)
451 	  return UKey_Kana_RE;
452 	else if (strcmp("RO", keyname) == 0)
453 	  return UKey_Kana_RO;
454 	else if (strcmp("WA", keyname) == 0)
455 	  return UKey_Kana_WA;
456 	else if (strcmp("N", keyname) == 0)
457 	  return UKey_Kana_N;
458   } else if (strcmp("prolongedsound", keyname) == 0)
459 	  return UKey_Kana_ProlongedSound;
460   else if (strcmp("voicedsound", keyname) == 0)
461 	return UKey_Kana_VoicedSound;
462   else if (strcmp("semivoicedsound", keyname) == 0)
463 	return UKey_Kana_SemivoicedSound;
464   else
465 	return UKey_Other;
466 
467   return UKey_Other;
468 }
469