1/* vi:set ts=8 sts=4 sw=4:
2 *
3 * VIM - Vi IMproved	by Bram Moolenaar
4 *
5 * Do ":help uganda"  in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
9
10#include "vim.h"
11
12#ifndef HANGUL_DEFAULT_KEYBOARD
13# define HANGUL_DEFAULT_KEYBOARD 3
14#endif
15
16#define AUTOMATA_NEW		0
17#define AUTOMATA_CORRECT	1
18#define AUTOMATA_SPECIAL	2
19#define AUTOMATA_CORRECT_NEW	3
20#define AUTOMATA_ERROR		4
21#define AUTOMATA_NULL		5
22
23#define F_F	0x1	/* �ʼ� (initial sound) */
24#define F_M	0x2	/* �߼� (medial vowel) */
25#define F_L	0x4	/* ���� (final consonant) */
26#define F_A	0x8	/* ASCII */
27#define F_NULL 1
28#define M_NULL 2
29#define L_NULL 1
30
31static int hangul_input_state = 0;
32static int f=F_NULL, m=M_NULL, l=L_NULL;
33static int sp=0;
34static char_u stack[20] = {0};
35static int last_l = -1, last_ll = -1;
36static int hangul_keyboard_type = HANGUL_DEFAULT_KEYBOARD;
37
38static void convert_ks_to_3 __ARGS((const char_u *src, int *fp, int *mp, int *lp));
39static int convert_3_to_ks __ARGS((int fv, int mv, int lv, char_u *des));
40static int hangul_automata2 __ARGS((char_u *buf, unsigned int *c));
41static int hangul_automata3 __ARGS((char_u *buf, unsigned int *c));
42
43#define push(x)	 {stack[ sp++ ] = *(x); stack[sp++] = *((x)+1);}
44#define pop(x)	 {*((x) + 1) = stack[--sp]; *(x) = stack[--sp];}
45#define query(x) {*((x) + 1) = stack[sp - 1]; *(x) = stack[sp - 2];}
46
47#define convert_3_to_code convert_3_to_ks
48
49
50/**********************************************************************/
51/****** 3 ��������� ���� ��ƾ  (Routines for 3 bulsik keyboard) ******/
52/**********************************************************************/
53
54/* 3 ��Ŀ��� ���� ��ȯ (3 bulsik keyboard conversion) */
55
56static char_u value_table_for_3[] =
57{
58    24  , '"' , '#' , '$' , '%' , '&' ,	/* ! " # $ % & */
59    18  , '(' , ')' , '*' , '+' , ',' ,	/* ' ( ) * + , */
60    '-' , '.' , 13  , 17  , 29  , 22  ,	/* - . / 0 1 2 */
61    19  , 19  , 26  , 5   , 12  , 28  ,	/* 3 4 5 6 7 8 */
62    20  , ':' , 9   , '2' , '=' , '3' ,	/* 9 : ; < = > */
63    '?' , '@' , 8   , '!' , 11  , 10  ,	/* ? @ A B C D */
64    26  , 3   , '/' , 39  , '8' , '4' ,	/* E F G H I J */
65    '5' , '6' , '1' , '0' , '9' , '>' ,	/* K L M N O P */
66    28  , 6   , 7   , ';' , '7' , 16  ,	/* Q R S T U V */
67    27  , 20  , '<' , 25  , '[' , 92  ,	/* W X Y Z [ \ */
68    ']' , '^' , '_' , '`' , 23  , 20  ,	/* ] ^ _ ` a b */
69    10  , 29  , 11  , 3   , 27  , 4   ,	/* c d e f g h */
70    8   , 13  , 2   , 14  , 20  , 11  ,	/* i j k l m n */
71    16  , 19  , 21  , 4   , 5   , 7   ,	/* o p q r s t */
72    5   , 13  , 9   , 2   , 7   , 17  ,	/* u v w x y z */
73};
74
75static short_u kind_table_for_3[] =
76{
77    F_L, F_A, F_A, F_A, F_A, F_A,	/* ! " # $ % & */
78    F_F, F_A, F_A, F_A, F_A, F_A,	/* ' ( ) * + , */
79    F_A, F_A, F_M, F_F, F_L, F_L,	/* - . / 0 1 2 */
80    F_L, F_M, F_M, F_M, F_M, F_M,	/* 3 4 5 6 7 8 */
81    F_M, F_A, F_F, F_A, F_A, F_A,	/* 9 : ; < = > */
82    F_A, F_A, F_L, F_A, F_L, F_L,	/* ? @ A B C D */
83    F_L, F_L, F_A, F_A, F_A, F_A,	/* E F G H I J */
84    F_A, F_A, F_A, F_A, F_A, F_A,	/* K L M N O P */
85    F_L, F_M, F_L, F_A, F_A, F_L,	/* Q R S T U V */
86    F_L, F_L, F_A, F_L, F_A, F_A,	/* W X Y Z [ \ */
87    F_A, F_A, F_A, F_A, F_L, F_M,	/* ] ^ _ ` a b */
88    F_M, F_M, F_M, F_M, F_M, F_F,	/* c d e f g h */
89    F_F, F_F, F_F, F_F, F_F, F_F,	/* i j k l m n */
90    F_F, F_F, F_L, F_M, F_L, F_M,	/* o p q r s t */
91    F_F, F_M, F_L, F_L, F_F, F_L,	/* u v w x y z */
92};
93
94/* 3 ��Ŀ��� (�����ʼ�, �Է¿���) -> �����ʼ� ó��
95 * 3 bulsik: (current initial sound, input english) -> compound initial sound.
96 */
97
98    static int
99comfcon3(v, c)
100    int	v;
101    int c;
102{
103    if (v == 2 && c == 2)
104	return 3;
105    if (v == 5 && c == 5)
106	return 6;
107    if (v == 9 && c == 9)
108	return 10;
109    if (v == 11 && c == 11)
110	return 12;
111    if (v == 14 && c == 14)
112	return 15;
113    return 0;
114}
115
116/* 3 ��Ŀ��� (�������, �Է� ����) -> ���� ���� ó��
117 * 3 bulsik: (current vowel, input english) -> compound vowel.
118 */
119
120    static int
121comvow3(v, c)
122    int v;
123    int c;
124{
125    switch (v)
126    {
127	case 13:					/* �� */
128	    switch (c) {
129		case 3:					/* �Ǥ� */
130		    return 14;
131		case 4:					/* �Ǥ� */
132		    return 15;
133		case 29:				/* �Ǥ� */
134		    return 18;
135	    }
136	    break;
137
138	case 20:					/* �� */
139	    switch (c) {
140		case 7:					/* �̤� */
141		    return 21;
142		case 10:				/* �̤� */
143		    return 22;
144		case 29:				/* �̤� */
145		    return 23;
146	    }
147	    break;
148
149	    /* 3 ��� ������ �Ѥ� �� �����Ƿ� ... */
150    }
151    return 0;
152}
153
154/* 3 ��Ŀ��� (���� ��ħ, ������ �Է�) -> ��ħ
155 * 3 bulsik: (current prop(?), input english) -> prop(?).
156 * I want to say, the 'prop' is similar to 'final consonant', but not vowel.
157 * (I cannot find the real english from my dictionary. Sorry!)
158 * VIM: V = initial sound, I = medial vowel, M = final consonant.
159 */
160
161    static int
162comcon3(k, c)
163    int k;
164    int c;
165{
166    switch (k)
167    {
168	case 2:						/* �� */
169	    switch (c) {
170		case 2:
171		    return 3;				/* ���� */
172		case 21:
173		    return 4;				/* ���� */
174	    }
175	    break;
176
177	case 5:						/* �� */
178	    switch (c) {
179		case 24:				/* ���� */
180		    return 6;
181		case 29:
182		    return 7;				/* ���� */
183	    }
184	    break;
185
186	case 9:						/* �� */
187	    switch (c) {
188		case 2:					/* ���� */
189		    return 10;
190		case 17:				/* ���� */
191		    return 11;
192		case 19:				/* ���� */
193		    return 12;
194		case 21:				/* ���� */
195		    return 13;
196		case 27:				/* ���� */
197		    return 14;
198		case 28:				/* ���� */
199		    return 15;
200		case 29:				/* ���� */
201		    return 16;
202	    }
203	    break;
204
205	case 19:
206	    switch (c) {
207		case 21:				/* ���� */
208		    return 20;
209	    }
210	    break;
211    }
212    return 0;
213}
214
215/**********************************************************************/
216/****** 2 ��������� ���� ��ƾ  (Routines for 2 bulsik keyboard) ******/
217/**********************************************************************/
218
219    static int
220kind_table_for_2(c)
221    int c;
222{
223    static char_u table[] =
224    {
225     /* a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s */
226	0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
227     /* t, u, v, w, x, y, z */
228	0, 1, 0, 0, 0, 1, 0
229    };
230
231    if (c <= 'Z')
232	c -= 'A';
233    else
234	c -= 'a';
235
236    return table[c];
237}
238
239/* 2 ��Ŀ��� ������ -> ������ �ʼ� ��ȯ
240 * (2 bulsik: conversion english char. to initial sound of compound type)
241 * ���: �ʼ��� �ƴϸ� 0 (If it is not initial sound, return 0).
242 */
243    static int
244fcon(c)
245    int c;
246{
247    static char_u table[] =
248    {
249	/*E */ 6 , /*F */ 0 , /*G */ 0 , /*H */ 0 , /*I */ 0 , /*J */ 0 , /*K */ 0 ,
250	/*L */ 0 , /*M */ 0 , /*N */ 0 , /*O */ 0 , /*P */ 0 , /*Q */ 10, /*R */ 3 ,
251	/*S */ 0 , /*T */ 12, /*U */ 0 , /*V */ 0 , /*W */ 15, /*X */ 0 , /*Y */ 0 ,
252	/*Z */ 0 , /*[ */ 0 , /*\ */ 0 , /*] */ 0 , /*^ */ 0 , /*_ */ 0 , /*` */ 0 ,
253	/*a */ 8 , /*b */ 0 , /*c */ 16, /*d */ 13, /*e */ 5 , /*f */ 7 , /*g */ 20,
254	/*h */ 0 , /*i */ 0 , /*j */ 0 , /*k */ 0 , /*l */ 0 , /*m */ 0 , /*n */ 0 ,
255	/*o */ 0 , /*p */ 0 , /*q */ 9 , /*r */ 2 , /*s */ 4 , /*t */ 11, /*u */ 0 ,
256	/*v */ 19, /*w */ 14, /*x */ 18, /*y */ 0 , /*z */ 17
257    };
258
259    if (c < 'E' || c > 'z')
260	return 0;
261    return table[c - 'E'];
262}
263
264/* 2 ��Ŀ��� ������ -> �߼� ��ȯ
265 * (2 bulsik: conversion english char. to medial vowel)
266 * ���: �߼��� �ƴϸ� 0 (If it is not medial vowel, return 0).
267 */
268    static int
269vow(c)
270    int c;
271{
272    static char_u table[] =
273    {
274	/*O */ 6 , /*P */ 12, /*Q */ 0 , /*R */ 0 , /*S */ 0 , /*T */ 0 , /*U */ 0 ,
275	/*V */ 0 , /*W */ 0 , /*X */ 0 , /*Y */ 0 , /*Z */ 0 , /*[ */ 0 , /*\ */ 0 ,
276	/*] */ 0 , /*^ */ 0 , /*_ */ 0 , /*` */ 0 , /*a */ 0 , /*b */ 26, /*c */ 0 ,
277	/*d */ 0 , /*e */ 0 , /*f */ 0 , /*g */ 0 , /*h */ 13, /*i */ 5 , /*j */ 7 ,
278	/*k */ 3 , /*l */ 29, /*m */ 27, /*n */ 20, /*o */ 4 , /*p */ 10, /*q */ 0 ,
279	/*r */ 0 , /*s */ 0 , /*t */ 0 , /*u */ 11, /*v */ 0 , /*w */ 0 , /*x */ 0 ,
280	/*y */ 19};
281
282    if (c < 'O' || c > 'y')
283	return 0;
284    return table[c - 'O'];
285}
286
287/* 2��Ŀ��� ������ -> ��ħ ��ȯ
288 * (2 bulsik: conversion english char. to prop)
289 * ���: ��ħ�� �ƴϸ� 0 (If not prop, return 0)
290 */
291    static int
292lcon(c)
293    int c;
294{
295    static char_u table[] =
296    {
297	/*R */ 3 , /*S */ 0 , /*T */ 22, /*U */ 0 , /*V */ 0 , /*W */ 0 , /*X */ 0 ,
298	/*Y */ 0 , /*Z */ 0 , /*[ */ 0 , /*\ */ 0 , /*] */ 0 , /*^ */ 0 , /*_ */ 0 ,
299	/*` */ 0 , /*a */ 17, /*b */ 0 , /*c */ 25, /*d */ 23, /*e */ 8 , /*f */ 9 ,
300	/*g */ 29, /*h */ 0 , /*i */ 0 , /*j */ 0 , /*k */ 0 , /*l */ 0 , /*m */ 0 ,
301	/*n */ 0 , /*o */ 0 , /*p */ 0 , /*q */ 19, /*r */ 2 , /*s */ 5 , /*t */ 21,
302	/*u */ 0 , /*v */ 28, /*w */ 24, /*x */ 27, /*y */ 0 , /*z */ 26
303    };
304
305    if (c < 'R' || c > 'z')
306	return 0;
307    return table[c - 'R'];
308}
309
310/* 2 ��Ŀ��� (���� ��ħ, ������ �Է�) -> ��ħ ��ȯ
311 * (2 bulsik: conversion (curr. prop, input english) to prop)
312 */
313
314    static int
315comcon2(k, c)
316    int k;
317    int c;
318{
319    switch (k)
320    {
321	case 2:					/* �� */
322	    switch (c) {
323		case 't':
324		    return 4;			/* ���� */
325	    }
326	    break;
327
328	case 5:					/* �� */
329	    switch (c) {
330		case 'w':			/* ���� */
331		    return 6;
332		case 'g':			/* ���� */
333		    return 7;
334	    }
335	    break;
336
337	case 9:					/* �� */
338	    switch (c) {
339		case 'r':			/* ���� */
340		    return 10;
341		case 'a':			/* ���� */
342		    return 11;
343		case 'q':			/* ���� */
344		    return 12;
345		case 't':			/* ���� */
346		    return 13;
347		case 'x':			/* ���� */
348		    return 14;
349		case 'v':			/* ���� */
350		    return 15;
351		case 'g':			/* ���� */
352		    return 16;
353	    }
354	    break;
355
356	case 19:				/* �� */
357	    switch (c) {
358		case 't':			/* ���� */
359		    return 20;
360	    }
361	    break;
362    }
363    return 0;
364}
365
366/* 2��Ŀ��� (���� �߼�, ���� �Է�) -> �߼� ��ȯ
367 * (2 bulsik: conversion (curr. medial vowel, input english) to medial
368 * vowel)
369 */
370
371    static int
372comvow2(v, c)
373    int v;
374    int c;
375{
376    switch (v)
377    {
378	case 13:					/* �� */
379	    switch (c) {
380		case 'k':				/* �Ǥ� */
381		    return 14;
382		case 'o':				/* �Ǥ� */
383		    return 15;
384		case 'l':				/* �Ǥ� */
385		    return 18;
386	    }
387	    break;
388
389	case 20:					/* �� */
390	    switch (c) {
391		case 'j':				/* �̤� */
392		    return 21;
393		case 'p':				/* �̤� */
394		    return 22;
395		case 'l':				/* �̤� */
396		    return 23;
397	    }
398	    break;
399
400	case 27:					/* �� */
401	    switch (c) {
402		case 'l':				/* �Ѥ� */
403		    return 28;
404	    }
405	    break;
406    }
407    return 0;
408}
409
410    int
411hangul_input_state_get()
412{
413    return hangul_input_state;
414}
415
416    void
417hangul_input_state_set(state)
418    int state;
419{
420    hangul_input_state = state;
421    hangul_input_clear();
422}
423
424    int
425im_get_status()
426{
427    return hangul_input_state_get();
428}
429
430    void
431hangul_input_state_toggle()
432{
433    if (hangul_input_state_get())
434    {
435	hangul_input_state_set(0);
436	if (composing_hangul)
437	{
438	    push_raw_key(composing_hangul_buffer, 2);
439	    composing_hangul = 0;
440	}
441    }
442    else
443	hangul_input_state_set(1);
444
445    if (showmode())
446    {
447	setcursor();
448	out_flush();
449    }
450
451    gui_update_cursor(TRUE, FALSE);
452}
453
454    static int
455hangul_automata2(buf, c)
456    char_u  *buf;
457    int_u   *c;
458{
459    int t,t2;
460
461    if (*c == BS)
462    {
463	if (sp == 0)
464	    return AUTOMATA_SPECIAL;
465	else if (sp < 4)
466	{
467	    hangul_input_clear();
468	    return AUTOMATA_NULL;
469	}
470	pop(buf);
471	query(buf);
472	convert_ks_to_3(buf, &f, &m, &l);
473	last_l = last_ll;
474	last_ll = -1;
475	return AUTOMATA_CORRECT;
476    }
477    if ((!(*c >= 'A' && *c <= 'Z')) && (!(*c >= 'a' && *c <= 'z')))
478    {
479	hangul_input_clear();
480	return AUTOMATA_SPECIAL;
481    }
482    t = *c;
483    switch (kind_table_for_2(t))
484    {
485	case 0: /* ���� (consonant) */
486	    if (f == F_NULL)
487	    {
488		if (m != M_NULL)
489		    hangul_input_clear();
490		f = fcon(t);
491		convert_3_to_code(f, M_NULL, L_NULL, buf);
492		push(buf);
493		last_ll = last_l = -1;
494		return AUTOMATA_NEW;
495	    }
496	    if (m == M_NULL)
497		return AUTOMATA_ERROR;
498	    if (l == L_NULL)
499	    {
500		t2 = lcon(t);
501		if (!t2)    /* ��ħ���� ���������ʴ� (cannot use it as a prop) */
502		{
503		    hangul_input_clear();
504		    last_ll = last_l = -1;
505		    f = fcon(t);
506		    convert_3_to_code(f, m, l, buf);
507		    push(buf);
508		    return AUTOMATA_NEW;
509		}
510		if (2 == convert_3_to_code(f, m, t2, buf))
511		{
512		    last_ll = -1;
513		    last_l = t;
514		    l = t2;
515		    push(buf);
516		    return AUTOMATA_CORRECT;
517		}
518		else	/* ��ħ���� �����Ͽ����� code�� ��� �����̴� */
519		{	/* cannot find such a prop in the code table */
520		    last_ll = last_l = -1;
521		    hangul_input_clear();
522		    f = fcon(t);
523		    convert_3_to_code(f, m, l, buf);
524		    push(buf);
525		    return AUTOMATA_NEW;
526		}
527	    }
528	    /* �� �� ������ ��� ���߾��� �ִ�
529	     * I have all the 'initial sound' and 'medial vowel' and 'final
530	     * consonant'.
531	     */
532	    t2 = comcon2(l, t);
533	    if (t2)
534	    {
535		if (2 == convert_3_to_code(f, m, t2, buf))
536		{
537		    l = t2;
538		    last_ll = last_l;
539		    last_l = t;
540		    push(buf);
541		    return AUTOMATA_CORRECT;
542		}
543	    }
544	    last_ll = last_l = -1;
545	    hangul_input_clear();
546	    f = fcon(t);
547	    convert_3_to_code(f, m, l, buf);
548	    push(buf);
549	    return AUTOMATA_NEW;
550
551	case 1:
552	    if (f == F_NULL)
553	    {
554		hangul_input_clear();
555		m = vow(t);
556		convert_3_to_code (f, m, L_NULL, buf);
557		push (buf);
558		last_ll = last_l = -1;
559		return AUTOMATA_NEW;
560	    }
561	    if (m == M_NULL)
562	    {
563		m = vow(t);
564		if (2 == convert_3_to_code(f, m, L_NULL, buf))
565		{
566		    last_ll = last_l = -1;
567		    push(buf);
568		    return AUTOMATA_CORRECT;
569		}
570		m = M_NULL;
571		return AUTOMATA_ERROR;
572	    }
573	    if (l == L_NULL)
574	    {
575		t2 = comvow2(m, t);
576		if (t2)
577		{
578		    if (2 != convert_3_to_code(f, t2, L_NULL, buf))
579			return AUTOMATA_ERROR;
580
581		    m = t2;
582		    push(buf);
583		    last_ll = last_l = -1;
584		    return AUTOMATA_CORRECT;
585		}
586		return AUTOMATA_ERROR;
587	    }
588	    pop(buf);
589	    pop(buf);
590	    sp = 0;
591	    if (last_l == -1)
592	    {
593		/* ��... �̰� �ʿ��ϳ�?? (Hmm... Is it needed?) */
594		convert_ks_to_3(buf, &f, &m, &l);
595	    }
596	    else
597	    {
598		char_u tmp[3];
599		f = fcon(last_l);
600		convert_3_to_code (f, M_NULL, L_NULL, tmp);
601		push (tmp);
602	    }
603	    m = vow(t);
604	    l = L_NULL;
605	    convert_3_to_code(f, m, l, buf + 2);
606	    push(buf + 2);
607	    return AUTOMATA_CORRECT_NEW;
608
609	default:
610	    EMSG(_("E256: Hangul automata ERROR"));
611	    break;
612    }
613    return AUTOMATA_ERROR; /* RrEeAaLlLlYy EeRrRrOoRr */
614}
615
616    static int
617hangul_automata3(buf, c)
618    char_u  *buf;
619    int_u   *c;
620{
621    int t, t2;
622
623    if (*c >= '!' && *c <= 'z')
624    {
625	*c -= '!';
626	t = value_table_for_3[*c];
627	switch (kind_table_for_3[*c])
628	{
629	    case F_F: /* �ʼ����� (char. of an initial sound) */
630		if (m != M_NULL || sp == 0)
631		{
632		    /* �ʼ��� ���ų� ���� ���� ������ ����
633		     * Empty 'initial sound', so starting automata.
634		     */
635		    hangul_input_clear();
636		    f = t;
637		    convert_3_to_code(f, M_NULL, L_NULL, buf);
638		    push(buf);
639		    return AUTOMATA_NEW;
640		}
641		if ((t2 = comfcon3(f,t)) != 0)	/* ������ (double? consonant) */
642		{
643		    f=t2;
644		    convert_3_to_code(f, M_NULL, L_NULL, buf);
645		    push(buf);
646		    return AUTOMATA_CORRECT;
647		}
648		return AUTOMATA_ERROR;
649
650	    case F_M:	/* ���� (vowel) */
651		if (m == M_NULL)
652		{
653		    if (2 != convert_3_to_code(f, t, L_NULL,buf))
654			return AUTOMATA_ERROR;
655
656		    m = t;
657		    push(buf);
658		    if (f == F_NULL)
659			return AUTOMATA_NEW;
660		    else
661			return AUTOMATA_CORRECT;
662		}
663		if ((t2 = comvow3(m,t)))    /* ������ (a diphthong) */
664		{
665		    m = t2;
666		    convert_3_to_code(f, m, L_NULL, buf);
667		    push(buf);
668		    return AUTOMATA_CORRECT;
669		}
670		return AUTOMATA_ERROR;
671
672	    case F_L:	/* ��ħ (prop?) */
673		if (m == M_NULL)
674		    return AUTOMATA_ERROR; /* �߼���� ���� */
675		if (l == L_NULL)
676		{
677		    if (2 != convert_3_to_code(f, m, t, buf))
678		    {
679			l = L_NULL;
680			return AUTOMATA_ERROR;
681		    }
682		    push(buf);
683		    l = t;
684		    return AUTOMATA_CORRECT;
685		}
686		if ((t2 = comcon3(l,t)) != 0)	/* �� ��ħ ?? (double prop?) */
687		{
688		    if (2 != convert_3_to_code(f, m, t2, buf))
689			return AUTOMATA_ERROR;
690
691		    push(buf);
692		    l = t2;
693		    return AUTOMATA_CORRECT;
694		}
695		return AUTOMATA_ERROR;
696
697	    case F_A: /* Ư�����ڳ� ���� (special char. or number) */
698		hangul_input_clear();
699		*c = t;
700		return AUTOMATA_SPECIAL;
701	}
702    }
703    if (*c == BS)
704    {
705	if (sp >= 4)
706	{
707	    pop(buf);
708	    pop(buf);
709	    convert_ks_to_3(buf, &f, &m, &l);
710	    push(buf);
711	    return AUTOMATA_CORRECT;
712	}
713	else if (sp == 0)
714	{
715	    return AUTOMATA_SPECIAL;
716	}
717	else
718	{
719	    hangul_input_clear();
720	    return AUTOMATA_NULL;
721	}
722    }
723    hangul_input_clear();
724    return AUTOMATA_SPECIAL;
725}
726
727    void
728hangul_keyboard_set()
729{
730    int	    keyboard;
731    char    *s;
732
733    hangul_input_clear();
734
735    if ((s = getenv("VIM_KEYBOARD")) == NULL)
736	s = getenv("HANGUL_KEYBOARD_TYPE");
737
738    if (s)
739    {
740	if (*s == '2')
741	    keyboard = 2;
742	else
743	    keyboard = 3;
744	hangul_keyboard_type = keyboard;
745    }
746}
747
748    int
749hangul_input_process(s, len)
750    char_u  *s;
751    int	    len;
752{
753    int n;
754    unsigned int c;
755    char_u hanbuf[20];
756
757    if (len == 1)
758	/* normal key press */
759	c = *s;
760    else if (len == 3 && s[0] == CSI && s[1] == 'k' && s[2] == 'b')
761    {
762	/* backspace */
763	if (composing_hangul)
764	    c = Ctrl_H;
765	else
766	    return len;
767    }
768    else
769    {
770	if (composing_hangul)
771	    push_raw_key(composing_hangul_buffer, 2);
772	hangul_input_clear();
773	composing_hangul = 0;
774	return len;
775    }
776
777    if (hangul_keyboard_type == 2)
778	n = hangul_automata2(hanbuf, &c);
779    else
780	n = hangul_automata3(hanbuf, &c);
781
782    if (n == AUTOMATA_CORRECT)
783    {
784	STRNCPY(composing_hangul_buffer, hanbuf, 2);
785	gui_update_cursor(TRUE, FALSE);
786	return 0;
787    }
788    else if (n == AUTOMATA_NEW)
789    {
790	if (composing_hangul)
791	    push_raw_key(composing_hangul_buffer, 2);
792	STRNCPY(composing_hangul_buffer, hanbuf, 2);
793	composing_hangul = 1;
794	gui_update_cursor(TRUE, FALSE);
795	return 0;
796    }
797    else if (n == AUTOMATA_CORRECT_NEW)
798    {
799	if (composing_hangul)
800	    push_raw_key(hanbuf, 2);
801	STRNCPY(composing_hangul_buffer, hanbuf+2, 2);
802	composing_hangul = 1;
803	gui_update_cursor(TRUE, FALSE);
804	return 0;
805    }
806    else if (n == AUTOMATA_NULL)
807    {
808	composing_hangul = 0;
809	gui_redraw_block(gui.cursor_row, gui.cursor_col,
810			 gui.cursor_row, gui.cursor_col + 1,
811			 GUI_MON_NOCLEAR);
812	gui_update_cursor(TRUE, FALSE);
813	return 0;
814    }
815    else if (n == AUTOMATA_SPECIAL)
816    {
817	if (composing_hangul)
818	{
819	    push_raw_key(composing_hangul_buffer, 2);
820	    composing_hangul = 0;
821	}
822	*s = c;
823	return 1;
824    }
825    else if (n == AUTOMATA_ERROR)
826    {
827	vim_beep();
828	return 0;
829    }
830    return len;
831}
832
833    void
834hangul_input_clear()
835{
836    sp = 0;
837    f = F_NULL;
838    m = M_NULL;
839    l = L_NULL;
840}
841
842#define han_index(h, l)	(((h)-0xb0)*(0xff-0xa1)+((l)-0xa1))
843
844static const char_u ks_table1[][3] =
845{
846    {  2,  3,  1}, {  2,  3,  2}, {  2,  3,  5}, {  2,  3,  8},
847    {  2,  3,  9}, {  2,  3, 10}, {  2,  3, 11}, {  2,  3, 17},
848    {  2,  3, 19}, {  2,  3, 20}, {  2,  3, 21}, {  2,  3, 22},
849    {  2,  3, 23}, {  2,  3, 24}, {  2,  3, 25}, {  2,  3, 27},
850    {  2,  3, 28}, {  2,  3, 29}, {  2,  4,  1}, {  2,  4,  2},
851    {  2,  4,  5}, {  2,  4,  9}, {  2,  4, 17}, {  2,  4, 19},
852    {  2,  4, 21}, {  2,  4, 22}, {  2,  4, 23}, {  2,  5,  1},
853    {  2,  5,  2}, {  2,  5,  5}, {  2,  5,  9}, {  2,  5, 21},
854    {  2,  5, 23}, {  2,  6,  1}, {  2,  6,  5}, {  2,  6,  9},
855    {  2,  7,  1}, {  2,  7,  2}, {  2,  7,  5}, {  2,  7,  8},
856    {  2,  7,  9}, {  2,  7, 11}, {  2,  7, 17}, {  2,  7, 19},
857    {  2,  7, 21}, {  2,  7, 22}, {  2,  7, 23}, {  2,  7, 24},
858    {  2,  7, 27}, {  2,  7, 28}, {  2,  7, 29}, {  2, 10,  1},
859    {  2, 10,  5}, {  2, 10,  9}, {  2, 10, 17}, {  2, 10, 19},
860    {  2, 10, 21}, {  2, 10, 22}, {  2, 10, 23}, {  2, 11,  1},
861    {  2, 11,  2}, {  2, 11,  3}, {  2, 11,  5}, {  2, 11,  8},
862    {  2, 11,  9}, {  2, 11, 17}, {  2, 11, 19}, {  2, 11, 21},
863    {  2, 11, 22}, {  2, 11, 23}, {  2, 11, 27}, {  2, 12,  1},
864    {  2, 12,  5}, {  2, 12,  9}, {  2, 12, 19}, {  2, 12, 21},
865    {  2, 13,  1}, {  2, 13,  2}, {  2, 13,  5}, {  2, 13,  8},
866    {  2, 13,  9}, {  2, 13, 11}, {  2, 13, 13}, {  2, 13, 16},
867    {  2, 13, 17}, {  2, 13, 19}, {  2, 13, 21}, {  2, 13, 23},
868    {  2, 13, 24}, {  2, 14,  1}, {  2, 14,  2}, {  2, 14,  5},
869    {  2, 14,  9}, {  2, 14, 11}, {  2, 14, 17}, {  2, 14, 19},
870    {  2, 14, 21}, {  2, 14, 23}, {  2, 15,  1}, {  2, 15,  5},
871    {  2, 15,  9}, {  2, 15, 19}, {  2, 15, 22}, {  2, 15, 23},
872    {  2, 18,  1}, {  2, 18,  2}, {  2, 18,  5}, {  2, 18,  9},
873    {  2, 18, 17}, {  2, 18, 19}, {  2, 18, 21}, {  2, 18, 23},
874    {  2, 19,  1}, {  2, 19,  5}, {  2, 19,  9}, {  2, 19, 19},
875    {  2, 19, 21}, {  2, 20,  1}, {  2, 20,  2}, {  2, 20,  5},
876    {  2, 20,  8}, {  2, 20,  9}, {  2, 20, 10}, {  2, 20, 11},
877    {  2, 20, 16}, {  2, 20, 17}, {  2, 20, 19}, {  2, 20, 21},
878    {  2, 20, 23}, {  2, 20, 24}, {  2, 21,  1}, {  2, 21,  2},
879    {  2, 21,  5}, {  2, 21,  9}, {  2, 21, 22}, {  2, 21, 23},
880    {  2, 22,  1}, {  2, 22, 21}, {  2, 23,  1}, {  2, 23,  2},
881    {  2, 23,  5}, {  2, 23,  9}, {  2, 23, 17}, {  2, 23, 19},
882    {  2, 23, 21}, {  2, 26,  1}, {  2, 26,  5}, {  2, 26,  9},
883    {  2, 27,  1}, {  2, 27,  2}, {  2, 27,  5}, {  2, 27,  8},
884    {  2, 27,  9}, {  2, 27, 10}, {  2, 27, 17}, {  2, 27, 19},
885    {  2, 27, 21}, {  2, 27, 23}, {  2, 28,  1}, {  2, 29,  1},
886    {  2, 29,  2}, {  2, 29,  5}, {  2, 29,  8}, {  2, 29,  9},
887    {  2, 29, 11}, {  2, 29, 17}, {  2, 29, 19}, {  2, 29, 21},
888    {  2, 29, 23}, {  2, 29, 24}, {  2, 29, 28}, {  3,  3,  1},
889    {  3,  3,  2}, {  3,  3,  3}, {  3,  3,  5}, {  3,  3,  9},
890    {  3,  3, 11}, {  3,  3, 17}, {  3,  3, 19}, {  3,  3, 21},
891    {  3,  3, 22}, {  3,  3, 23}, {  3,  3, 27}, {  3,  4,  1},
892    {  3,  4,  2}, {  3,  4,  5}, {  3,  4,  9}, {  3,  4, 17},
893    {  3,  4, 19}, {  3,  4, 21}, {  3,  4, 22}, {  3,  4, 23},
894    {  3,  5,  1}, {  3,  5,  2}, {  3,  5,  9}, {  3,  7,  1},
895    {  3,  7,  2}, {  3,  7,  3}, {  3,  7,  5}, {  3,  7,  9},
896    {  3,  7, 17}, {  3,  7, 19}, {  3,  7, 21}, {  3,  7, 22},
897    {  3,  7, 23}, {  3, 10,  1}, {  3, 10,  2}, {  3, 10,  5},
898    {  3, 10, 17}, {  3, 10, 21}, {  3, 10, 23}, {  3, 11,  1},
899    {  3, 11,  5}, {  3, 11,  9}, {  3, 11, 21}, {  3, 11, 22},
900    {  3, 11, 27}, {  3, 12,  1}, {  3, 13,  1}, {  3, 13,  2},
901    {  3, 13,  5}, {  3, 13,  7}, {  3, 13,  9}, {  3, 13, 17},
902    {  3, 13, 19}, {  3, 13, 21}, {  3, 13, 23}, {  3, 13, 24},
903    {  3, 13, 25}, {  3, 14,  1}, {  3, 14,  2}, {  3, 14,  9},
904    {  3, 14, 22}, {  3, 14, 23}, {  3, 15,  1}, {  3, 15,  2},
905    {  3, 15, 23}, {  3, 18,  1}, {  3, 18,  5}, {  3, 18,  9},
906    {  3, 18, 17}, {  3, 18, 19}, {  3, 18, 23}, {  3, 19,  1},
907    {  3, 20,  1}, {  3, 20,  2}, {  3, 20,  5}, {  3, 20,  9},
908    {  3, 20, 16}, {  3, 20, 17}, {  3, 20, 19}, {  3, 20, 21},
909    {  3, 20, 23}, {  3, 20, 24}, {  3, 21,  1}, {  3, 21,  9},
910    {  3, 21, 22}, {  3, 21, 23}, {  3, 22,  1}, {  3, 22,  2},
911    {  3, 22,  5}, {  3, 22,  9}, {  3, 22, 17}, {  3, 22, 19},
912    {  3, 22, 22}, {  3, 23,  1}, {  3, 23,  5}, {  3, 23,  9},
913    {  3, 23, 17}, {  3, 23, 19}, {  3, 26,  1}, {  3, 27,  1},
914    {  3, 27,  2}, {  3, 27,  5}, {  3, 27,  7}, {  3, 27,  9},
915    {  3, 27, 11}, {  3, 27, 16}, {  3, 27, 17}, {  3, 27, 19},
916    {  3, 27, 21}, {  3, 27, 23}, {  3, 27, 27}, {  3, 29,  1},
917    {  3, 29,  2}, {  3, 29,  5}, {  3, 29,  9}, {  3, 29, 17},
918    {  3, 29, 19}, {  3, 29, 21}, {  3, 29, 23}, {  4,  3,  1},
919    {  4,  3,  2}, {  4,  3,  3}, {  4,  3,  5}, {  4,  3,  8},
920    {  4,  3,  9}, {  4,  3, 10}, {  4,  3, 11}, {  4,  3, 17},
921    {  4,  3, 19}, {  4,  3, 21}, {  4,  3, 22}, {  4,  3, 23},
922    {  4,  3, 24}, {  4,  3, 25}, {  4,  3, 27}, {  4,  3, 29},
923    {  4,  4,  1}, {  4,  4,  2}, {  4,  4,  5}, {  4,  4,  9},
924    {  4,  4, 17}, {  4,  4, 19}, {  4,  4, 21}, {  4,  4, 22},
925    {  4,  4, 23}, {  4,  5,  1}, {  4,  5,  2}, {  4,  5,  5},
926    {  4,  5,  9}, {  4,  5, 17}, {  4,  5, 23}, {  4,  7,  1},
927    {  4,  7,  2}, {  4,  7,  4}, {  4,  7,  5}, {  4,  7,  9},
928    {  4,  7, 11}, {  4,  7, 12}, {  4,  7, 17}, {  4,  7, 19},
929    {  4,  7, 21}, {  4,  7, 22}, {  4,  7, 23}, {  4,  7, 29},
930    {  4, 10,  1}, {  4, 10,  2}, {  4, 10,  5}, {  4, 10,  9},
931    {  4, 10, 17}, {  4, 10, 19}, {  4, 10, 21}, {  4, 10, 22},
932    {  4, 10, 23}, {  4, 11,  1}, {  4, 11,  2}, {  4, 11,  5},
933    {  4, 11,  9}, {  4, 11, 17}, {  4, 11, 19}, {  4, 11, 22},
934    {  4, 11, 23}, {  4, 11, 26}, {  4, 12,  1}, {  4, 12,  5},
935    {  4, 13,  1}, {  4, 13,  2}, {  4, 13,  5}, {  4, 13,  9},
936    {  4, 13, 11}, {  4, 13, 17}, {  4, 13, 19}, {  4, 13, 21},
937    {  4, 13, 23}, {  4, 13, 28}, {  4, 13, 29}, {  4, 14,  1},
938    {  4, 14,  5}, {  4, 14,  9}, {  4, 14, 22}, {  4, 18,  1},
939    {  4, 18,  5}, {  4, 18,  9}, {  4, 18, 17}, {  4, 18, 19},
940    {  4, 18, 21}, {  4, 19,  1}, {  4, 19,  2}, {  4, 19,  5},
941    {  4, 19,  9}, {  4, 19, 19}, {  4, 19, 21}, {  4, 19, 23},
942    {  4, 20,  1}, {  4, 20,  2}, {  4, 20,  5}, {  4, 20,  8},
943    {  4, 20,  9}, {  4, 20, 17}, {  4, 20, 19}, {  4, 20, 21},
944    {  4, 20, 23}, {  4, 21,  1}, {  4, 21, 22}, {  4, 22,  1},
945    {  4, 23,  1}, {  4, 23,  5}, {  4, 23,  9}, {  4, 23, 17},
946    {  4, 23, 19}, {  4, 26,  1}, {  4, 26,  2}, {  4, 26,  9},
947    {  4, 26, 17}, {  4, 26, 19}, {  4, 26, 23}, {  4, 27,  1},
948    {  4, 27,  2}, {  4, 27,  5}, {  4, 27,  9}, {  4, 27, 10},
949    {  4, 27, 11}, {  4, 27, 17}, {  4, 27, 19}, {  4, 27, 21},
950    {  4, 27, 23}, {  4, 27, 24}, {  4, 27, 28}, {  4, 28,  1},
951    {  4, 28,  5}, {  4, 28,  9}, {  4, 29,  1}, {  4, 29,  2},
952    {  4, 29,  5}, {  4, 29,  9}, {  4, 29, 11}, {  4, 29, 17},
953    {  4, 29, 19}, {  4, 29, 21}, {  4, 29, 23}, {  4, 29, 28},
954    {  5,  3,  1}, {  5,  3,  2}, {  5,  3,  3}, {  5,  3,  5},
955    {  5,  3,  8}, {  5,  3,  9}, {  5,  3, 10}, {  5,  3, 11},
956    {  5,  3, 12}, {  5,  3, 16}, {  5,  3, 17}, {  5,  3, 19},
957    {  5,  3, 21}, {  5,  3, 22}, {  5,  3, 23}, {  5,  3, 24},
958    {  5,  3, 25}, {  5,  3, 29}, {  5,  4,  1}, {  5,  4,  2},
959    {  5,  4,  5}, {  5,  4,  9}, {  5,  4, 17}, {  5,  4, 19},
960    {  5,  4, 21}, {  5,  4, 22}, {  5,  4, 23}, {  5,  5,  1},
961    {  5,  7,  1}, {  5,  7,  2}, {  5,  7,  3}, {  5,  7,  5},
962    {  5,  7,  8}, {  5,  7,  9}, {  5,  7, 11}, {  5,  7, 12},
963    {  5,  7, 17}, {  5,  7, 19}, {  5,  7, 21}, {  5,  7, 23},
964    {  5,  7, 25}, {  5,  7, 28}, {  5, 10,  1}, {  5, 10,  2},
965    {  5, 10,  5}, {  5, 10,  9}, {  5, 10, 17}, {  5, 10, 19},
966    {  5, 10, 21}, {  5, 10, 22}, {  5, 10, 23}, {  5, 11,  1},
967    {  5, 11,  5}, {  5, 11,  9}, {  5, 11, 22}, {  5, 11, 23},
968    {  5, 12,  1}, {  5, 12,  5}, {  5, 13,  1}, {  5, 13,  2},
969    {  5, 13,  5}, {  5, 13,  8}, {  5, 13,  9}, {  5, 13, 11},
970    {  5, 13, 13}, {  5, 13, 17}, {  5, 13, 19}, {  5, 13, 21},
971    {  5, 13, 23}, {  5, 13, 25}, {  5, 13, 27}, {  5, 14,  1},
972    {  5, 14,  5}, {  5, 14,  9}, {  5, 15,  1}, {  5, 15, 22},
973    {  5, 18,  1}, {  5, 18,  5}, {  5, 18,  9}, {  5, 18, 17},
974    {  5, 18, 19}, {  5, 18, 21}, {  5, 19,  1}, {  5, 20,  1},
975    {  5, 20,  2}, {  5, 20,  5}, {  5, 20,  9}, {  5, 20, 17},
976    {  5, 20, 19}, {  5, 20, 21}, {  5, 20, 23}, {  5, 21,  1},
977    {  5, 21, 22}, {  5, 22,  1}, {  5, 22, 23}, {  5, 23,  1},
978    {  5, 23,  5}, {  5, 23,  9}, {  5, 23, 19}, {  5, 23, 21},
979    {  5, 23, 23}, {  5, 26,  1}, {  5, 26,  5}, {  5, 26,  9},
980    {  5, 26, 17}, {  5, 26, 23}, {  5, 27,  1}, {  5, 27,  2},
981    {  5, 27,  5}, {  5, 27,  8}, {  5, 27,  9}, {  5, 27, 11},
982    {  5, 27, 17}, {  5, 27, 19}, {  5, 27, 21}, {  5, 27, 23},
983    {  5, 28,  1}, {  5, 29,  1}, {  5, 29,  2}, {  5, 29,  5},
984    {  5, 29,  8}, {  5, 29,  9}, {  5, 29, 17}, {  5, 29, 19},
985    {  5, 29, 21}, {  5, 29, 22}, {  5, 29, 23}, {  5, 29, 24},
986    {  6,  3,  1}, {  6,  3,  2}, {  6,  3,  5}, {  6,  3,  9},
987    {  6,  3, 17}, {  6,  3, 19}, {  6,  3, 21}, {  6,  3, 22},
988    {  6,  3, 23}, {  6,  3, 29}, {  6,  4,  1}, {  6,  4,  2},
989    {  6,  4,  5}, {  6,  4,  9}, {  6,  4, 17}, {  6,  4, 19},
990    {  6,  4, 21}, {  6,  4, 22}, {  6,  4, 23}, {  6,  7,  1},
991    {  6,  7,  2}, {  6,  7,  5}, {  6,  7,  9}, {  6,  7, 11},
992    {  6,  7, 12}, {  6,  7, 17}, {  6,  7, 19}, {  6,  7, 21},
993    {  6,  7, 22}, {  6,  7, 23}, {  6,  7, 29}, {  6, 10,  1},
994    {  6, 10,  2}, {  6, 10,  5}, {  6, 10,  9}, {  6, 10, 17},
995    {  6, 10, 19}, {  6, 10, 21}, {  6, 10, 22}, {  6, 10, 23},
996    {  6, 11,  1}, {  6, 11, 22}, {  6, 13,  1}, {  6, 13,  2},
997    {  6, 13,  5}, {  6, 13,  9}, {  6, 13, 23}, {  6, 14,  1},
998    {  6, 14,  9}, {  6, 15,  1}, {  6, 18,  1}, {  6, 18,  5},
999    {  6, 20,  1}, {  6, 20,  2}, {  6, 20,  5}, {  6, 20,  9},
1000    {  6, 20, 16}, {  6, 20, 17}, {  6, 20, 23}, {  6, 22,  1},
1001    {  6, 23,  1}, {  6, 23,  5}, {  6, 23,  9}, {  6, 23, 17},
1002    {  6, 23, 19}, {  6, 23, 23}, {  6, 27,  1}, {  6, 27,  2},
1003    {  6, 27,  5}, {  6, 27,  8}, {  6, 27,  9}, {  6, 27, 17},
1004    {  6, 27, 19}, {  6, 27, 21}, {  6, 28,  1}, {  6, 28,  5},
1005    {  6, 28,  9}, {  6, 28, 17}, {  6, 28, 19}, {  6, 29,  1},
1006    {  6, 29,  5}, {  6, 29,  9}, {  6, 29, 17}, {  6, 29, 19},
1007    {  6, 29, 21}, {  6, 29, 23}, {  7,  3,  1}, {  7,  3,  2},
1008    {  7,  3,  5}, {  7,  3,  9}, {  7,  3, 17}, {  7,  3, 19},
1009    {  7,  3, 21}, {  7,  3, 22}, {  7,  3, 23}, {  7,  3, 24},
1010    {  7,  3, 28}, {  7,  3, 29}, {  7,  4,  1}, {  7,  4,  2},
1011    {  7,  4,  5}, {  7,  4,  9}, {  7,  4, 17}, {  7,  4, 19},
1012    {  7,  4, 21}, {  7,  4, 22}, {  7,  4, 23}, {  7,  5,  1},
1013    {  7,  5,  2}, {  7,  5,  5}, {  7,  5, 21}, {  7,  5, 23},
1014    {  7,  7,  1}, {  7,  7,  2}, {  7,  7,  5}, {  7,  7,  9},
1015    {  7,  7, 17}, {  7,  7, 19}, {  7,  7, 21}, {  7,  7, 22},
1016    {  7,  7, 23}, {  7,  7, 29}, {  7, 10,  1}, {  7, 10,  2},
1017    {  7, 10,  5}, {  7, 10,  9}, {  7, 10, 17}, {  7, 10, 19},
1018    {  7, 10, 21}, {  7, 10, 23}, {  7, 11,  1}, {  7, 11,  2},
1019    {  7, 11,  5}, {  7, 11,  9}, {  7, 11, 17}, {  7, 11, 19},
1020    {  7, 11, 21}, {  7, 11, 22}, {  7, 11, 23}, {  7, 12,  1},
1021    {  7, 12,  5}, {  7, 12, 19}, {  7, 12, 21}, {  7, 13,  1},
1022    {  7, 13,  2}, {  7, 13,  5}, {  7, 13,  9}, {  7, 13, 17},
1023    {  7, 13, 19}, {  7, 13, 21}, {  7, 13, 23}, {  7, 14,  1},
1024    {  7, 14,  5}, {  7, 14, 23}, {  7, 15, 22}, {  7, 18,  1},
1025    {  7, 18,  5}, {  7, 18,  9}, {  7, 18, 17}, {  7, 18, 19},
1026    {  7, 18, 21}, {  7, 18, 23}, {  7, 19,  1}, {  7, 19,  5},
1027    {  7, 19,  9}, {  7, 19, 19}, {  7, 19, 21}, {  7, 19, 23},
1028    {  7, 20,  1}, {  7, 20,  2}, {  7, 20,  5}, {  7, 20,  9},
1029    {  7, 20, 17}, {  7, 20, 19}, {  7, 20, 21}, {  7, 20, 23},
1030    {  7, 21,  1}, {  7, 21, 22}, {  7, 22,  1}, {  7, 23,  1},
1031    {  7, 23,  2}, {  7, 23,  5}, {  7, 23,  9}, {  7, 23, 17},
1032    {  7, 23, 21}, {  7, 23, 23}, {  7, 26,  1}, {  7, 26,  2},
1033    {  7, 26,  5}, {  7, 26,  9}, {  7, 26, 17}, {  7, 26, 19},
1034    {  7, 26, 21}, {  7, 26, 23}, {  7, 27,  1}, {  7, 27,  2},
1035    {  7, 27,  5}, {  7, 27,  9}, {  7, 27, 17}, {  7, 27, 19},
1036    {  7, 27, 21}, {  7, 27, 23}, {  7, 27, 24}, {  7, 27, 27},
1037    {  7, 27, 28}, {  7, 29,  1}, {  7, 29,  2}, {  7, 29,  5},
1038    {  7, 29,  9}, {  7, 29, 17}, {  7, 29, 19}, {  7, 29, 21},
1039    {  7, 29, 23}, {  8,  3,  1}, {  8,  3,  2}, {  8,  3,  5},
1040    {  8,  3,  7}, {  8,  3,  8}, {  8,  3,  9}, {  8,  3, 10},
1041    {  8,  3, 11}, {  8,  3, 17}, {  8,  3, 19}, {  8,  3, 21},
1042    {  8,  3, 23}, {  8,  3, 24}, {  8,  3, 27}, {  8,  3, 29},
1043    {  8,  4,  1}, {  8,  4,  2}, {  8,  4,  5}, {  8,  4,  9},
1044    {  8,  4, 17}, {  8,  4, 19}, {  8,  4, 21}, {  8,  4, 22},
1045    {  8,  4, 23}, {  8,  4, 24}, {  8,  5,  1}, {  8,  5,  2},
1046    {  8,  5,  9}, {  8,  5, 23}, {  8,  7,  1}, {  8,  7,  2},
1047    {  8,  7,  5}, {  8,  7,  9}, {  8,  7, 11}, {  8,  7, 17},
1048    {  8,  7, 19}, {  8,  7, 21}, {  8,  7, 23}, {  8,  7, 24},
1049    {  8,  7, 29}, {  8, 10,  1}, {  8, 10,  2}, {  8, 10,  5},
1050    {  8, 10,  9}, {  8, 10, 17}, {  8, 10, 19}, {  8, 10, 21},
1051    {  8, 10, 22}, {  8, 10, 23}, {  8, 11,  1}, {  8, 11,  2},
1052    {  8, 11,  5}, {  8, 11,  9}, {  8, 11, 21}, {  8, 11, 22},
1053    {  8, 11, 23}, {  8, 11, 25}, {  8, 12,  1}, {  8, 13,  1},
1054    {  8, 13,  2}, {  8, 13,  4}, {  8, 13,  5}, {  8, 13,  9},
1055    {  8, 13, 11}, {  8, 13, 17}, {  8, 13, 19}, {  8, 13, 21},
1056    {  8, 13, 23}, {  8, 14,  1}, {  8, 14,  5}, {  8, 14, 22},
1057    {  8, 14, 23}, {  8, 18,  1}, {  8, 18,  5}, {  8, 18,  9},
1058    {  8, 18, 19}, {  8, 18, 21}, {  8, 18, 23}, {  8, 19,  1},
1059    {  8, 19,  5}, {  8, 19,  9}, {  8, 19, 19}, {  8, 19, 21},
1060    {  8, 20,  1}, {  8, 20,  2}, {  8, 20,  3}, {  8, 20,  5},
1061    {  8, 20,  8}, {  8, 20,  9}, {  8, 20, 10}, {  8, 20, 11},
1062    {  8, 20, 17}, {  8, 20, 19}, {  8, 20, 21}, {  8, 20, 23},
1063    {  8, 20, 27}, {  8, 20, 29}, {  8, 21,  1}, {  8, 21,  5},
1064    {  8, 21,  9}, {  8, 21, 19}, {  8, 21, 21}, {  8, 22,  1},
1065    {  8, 23,  1}, {  8, 23,  5}, {  8, 23,  9}, {  8, 26,  1},
1066    {  8, 26,  5}, {  8, 26,  9}, {  8, 26, 17}, {  8, 26, 21},
1067    {  8, 27,  1}, {  8, 27,  5}, {  8, 27,  9}, {  8, 27, 17},
1068    {  8, 27, 21}, {  8, 29,  1}, {  8, 29,  2}, {  8, 29,  5},
1069    {  8, 29,  8}, {  8, 29,  9}, {  8, 29, 11}, {  8, 29, 17},
1070    {  8, 29, 19}, {  8, 29, 21}, {  8, 29, 22}, {  8, 29, 23},
1071    {  8, 29, 25}, {  8, 29, 27}, {  9,  3,  1}, {  9,  3,  2},
1072    {  9,  3,  3}, {  9,  3,  4}, {  9,  3,  5}, {  9,  3,  8},
1073    {  9,  3,  9}, {  9,  3, 10}, {  9,  3, 11}, {  9,  3, 12},
1074    {  9,  3, 17}, {  9,  3, 19}, {  9,  3, 21}, {  9,  3, 23},
1075    {  9,  3, 27}, {  9,  4,  1}, {  9,  4,  2}, {  9,  4,  5},
1076    {  9,  4,  9}, {  9,  4, 17}, {  9,  4, 19}, {  9,  4, 21},
1077    {  9,  4, 22}, {  9,  4, 23}, {  9,  4, 27}, {  9,  5,  1},
1078    {  9,  5,  2}, {  9,  5,  5}, {  9,  5, 19}, {  9,  7,  1},
1079    {  9,  7,  2}, {  9,  7,  5}, {  9,  7,  8}, {  9,  7,  9},
1080    {  9,  7, 11}, {  9,  7, 17}, {  9,  7, 19}, {  9,  7, 21},
1081    {  9,  7, 23}, {  9,  7, 24}, {  9, 10,  1}, {  9, 10,  2},
1082    {  9, 10,  5}, {  9, 10,  8}, {  9, 10,  9}, {  9, 10, 17},
1083    {  9, 10, 19}, {  9, 10, 21}, {  9, 10, 22}, {  9, 10, 23},
1084    {  9, 11,  1}, {  9, 11,  2}, {  9, 11,  5}, {  9, 11,  9},
1085    {  9, 11, 19}, {  9, 11, 21}, {  9, 11, 22}, {  9, 11, 23},
1086    {  9, 11, 27}, {  9, 12,  1}, {  9, 12,  5}, {  9, 13,  1},
1087    {  9, 13,  2}, {  9, 13,  3}, {  9, 13,  5}, {  9, 13,  9},
1088    {  9, 13, 17}, {  9, 13, 19}, {  9, 13, 21}, {  9, 13, 23},
1089    {  9, 14,  1}, {  9, 14,  5}, {  9, 14, 22}, {  9, 15,  1},
1090    {  9, 15, 22}, {  9, 18,  1}, {  9, 18,  2}, {  9, 18,  5},
1091    {  9, 18,  9}, {  9, 18, 17}, {  9, 18, 19}, {  9, 19,  1},
1092    {  9, 19,  5}, {  9, 20,  1}, {  9, 20,  2}, {  9, 20,  5},
1093    {  9, 20,  8}, {  9, 20,  9}, {  9, 20, 10}, {  9, 20, 11},
1094    {  9, 20, 17}, {  9, 20, 19}, {  9, 20, 21}, {  9, 20, 23},
1095    {  9, 20, 27}, {  9, 20, 28}, {  9, 21,  1}, {  9, 21,  9},
1096    {  9, 21, 22}, {  9, 22,  1}, {  9, 23,  1}, {  9, 23,  2},
1097    {  9, 23,  5}, {  9, 23,  9}, {  9, 23, 23}, {  9, 26,  1},
1098    {  9, 26,  5}, {  9, 26,  9}, {  9, 26, 17}, {  9, 26, 21},
1099    {  9, 26, 23}, {  9, 27,  1}, {  9, 27,  2}, {  9, 27,  5},
1100    {  9, 27,  9}, {  9, 27, 17}, {  9, 27, 19}, {  9, 27, 21},
1101    {  9, 29,  1}, {  9, 29,  2}, {  9, 29,  5}, {  9, 29,  9},
1102    {  9, 29, 11}, {  9, 29, 17}, {  9, 29, 19}, {  9, 29, 21},
1103    {  9, 29, 23}, {  9, 29, 24}, {  9, 29, 25}, { 10,  3,  1},
1104    { 10,  3,  2}, { 10,  3,  5}, { 10,  3,  9}, { 10,  3, 11},
1105    { 10,  3, 17}, { 10,  3, 19}, { 10,  3, 21}, { 10,  3, 22},
1106    { 10,  3, 23}, { 10,  3, 29}, { 10,  4,  1}, { 10,  4,  2},
1107    { 10,  4,  5}, { 10,  4,  9}, { 10,  4, 17}, { 10,  4, 19},
1108    { 10,  4, 21}, { 10,  4, 22}, { 10,  4, 23}, { 10,  5,  1},
1109    { 10,  5,  2}, { 10,  5, 17}, { 10,  7,  1}, { 10,  7,  2},
1110    { 10,  7,  5}, { 10,  7,  8}, { 10,  7,  9}, { 10,  7, 17},
1111    { 10,  7, 21}, { 10,  7, 22}, { 10,  7, 23}, { 10, 10,  1},
1112    { 10, 10, 23}, { 10, 11,  1}, { 10, 11,  2}, { 10, 11, 17},
1113    { 10, 11, 19}, { 10, 11, 21}, { 10, 11, 22}, { 10, 11, 23},
1114    { 10, 13,  1}, { 10, 13,  2}, { 10, 13,  5}, { 10, 13,  9},
1115    { 10, 13, 17}, { 10, 13, 19}, { 10, 13, 23}, { 10, 18,  1},
1116    { 10, 19,  1}, { 10, 19, 23}, { 10, 20,  1}, { 10, 20,  2},
1117    { 10, 20,  5}, { 10, 20,  9}, { 10, 20, 17}, { 10, 20, 21},
1118    { 10, 20, 23}, { 10, 26,  1}, { 10, 26, 23}, { 10, 27,  1},
1119    { 10, 27,  5}, { 10, 27,  9}, { 10, 27, 17}, { 10, 27, 19},
1120    { 10, 29,  1}, { 10, 29,  2}, { 10, 29,  5}, { 10, 29,  9},
1121    { 10, 29, 17}, { 10, 29, 19}, { 10, 29, 21}, { 10, 29, 23},
1122    { 11,  3,  1}, { 11,  3,  2}, { 11,  3,  4}, { 11,  3,  5},
1123    { 11,  3,  8}, { 11,  3,  9}, { 11,  3, 10}, { 11,  3, 11},
1124    { 11,  3, 17}, { 11,  3, 19}, { 11,  3, 21}, { 11,  3, 22},
1125    { 11,  3, 23}, { 11,  3, 27}, { 11,  4,  1}, { 11,  4,  2},
1126    { 11,  4,  5}, { 11,  4,  9}, { 11,  4, 17}, { 11,  4, 19},
1127    { 11,  4, 21}, { 11,  4, 22}, { 11,  4, 23}, { 11,  5,  1},
1128    { 11,  5,  2}, { 11,  5,  5}, { 11,  5,  9}, { 11,  5, 17},
1129    { 11,  5, 19}, { 11,  5, 21}, { 11,  5, 23}, { 11,  6,  1},
1130    { 11,  6,  5}, { 11,  6,  9}, { 11,  6, 17}, { 11,  6, 23},
1131    { 11,  7,  1}, { 11,  7,  2}, { 11,  7,  3}, { 11,  7,  4},
1132    { 11,  7,  5}, { 11,  7,  8}, { 11,  7,  9}, { 11,  7, 11},
1133    { 11,  7, 12}, { 11,  7, 17}, { 11,  7, 19}, { 11,  7, 21},
1134    { 11,  7, 22}, { 11,  7, 23}, { 11,  7, 28}, { 11, 10,  1},
1135    { 11, 10,  2}, { 11, 10,  5}, { 11, 10,  9}, { 11, 10, 17},
1136    { 11, 10, 19}, { 11, 10, 21}, { 11, 10, 22}, { 11, 10, 23},
1137    { 11, 11,  1}, { 11, 11,  2}, { 11, 11,  5}, { 11, 11,  9},
1138    { 11, 11, 17}, { 11, 11, 19}, { 11, 11, 21}, { 11, 11, 22},
1139    { 11, 11, 23}, { 11, 12,  1}, { 11, 12,  5}, { 11, 12,  9},
1140    { 11, 12, 23}, { 11, 13,  1}, { 11, 13,  2}, { 11, 13,  3},
1141    { 11, 13,  5}, { 11, 13,  9}, { 11, 13, 11}, { 11, 13, 17},
1142    { 11, 13, 19}, { 11, 13, 21}, { 11, 13, 23}, { 11, 13, 27},
1143    { 11, 14,  1}, { 11, 14,  2}, { 11, 14,  5}, { 11, 14,  9},
1144    { 11, 14, 23}, { 11, 15,  1}, { 11, 15,  5}, { 11, 15,  9},
1145    { 11, 15, 17}, { 11, 15, 21}, { 11, 15, 22}, { 11, 18,  1},
1146    { 11, 18,  5}, { 11, 18,  9}, { 11, 18, 17}, { 11, 18, 19},
1147    { 11, 18, 21}, { 11, 19,  1}, { 11, 19,  2}, { 11, 19,  5},
1148    { 11, 19,  9}, { 11, 19, 17}, { 11, 19, 19}, { 11, 19, 21},
1149    { 11, 19, 23}, { 11, 20,  1}, { 11, 20,  2}, { 11, 20,  5},
1150    { 11, 20,  8}, { 11, 20,  9}, { 11, 20, 17}, { 11, 20, 19},
1151    { 11, 20, 21}, { 11, 20, 23}, { 11, 20, 25}, { 11, 20, 27},
1152    { 11, 20, 28}, { 11, 21,  1}, { 11, 21, 22}, { 11, 22,  1},
1153    { 11, 22,  2}, { 11, 22,  5}, { 11, 22,  9}, { 11, 22, 17},
1154    { 11, 22, 23}, { 11, 23,  1}, { 11, 23,  2}, { 11, 23,  5},
1155    { 11, 23,  9}, { 11, 23, 17}, { 11, 23, 19}, { 11, 23, 21},
1156    { 11, 23, 23}, { 11, 26,  1}, { 11, 26,  2}, { 11, 26,  9},
1157    { 11, 26, 17}, { 11, 26, 21}, { 11, 26, 23}, { 11, 27,  1},
1158    { 11, 27,  2}, { 11, 27,  5}, { 11, 27,  9}, { 11, 27, 10},
1159    { 11, 27, 17}, { 11, 27, 19}, { 11, 27, 21}, { 11, 27, 23},
1160    { 11, 29,  1}, { 11, 29,  2}, { 11, 29,  5}, { 11, 29,  8},
1161    { 11, 29,  9}, { 11, 29, 16}, { 11, 29, 17}, { 11, 29, 19},
1162    { 11, 29, 21}, { 11, 29, 23}, { 11, 29, 28}, { 12,  3,  1},
1163    { 12,  3,  2}, { 12,  3,  4}, { 12,  3,  5}, { 12,  3,  9},
1164    { 12,  3, 17}, { 12,  3, 19}, { 12,  3, 22}, { 12,  3, 23},
1165    { 12,  3, 29}, { 12,  4,  1}, { 12,  4,  2}, { 12,  4,  5},
1166    { 12,  4,  9}, { 12,  4, 17}, { 12,  4, 19}, { 12,  4, 22},
1167    { 12,  4, 23}, { 12,  5, 23}, { 12,  7,  1}, { 12,  7,  2},
1168    { 12,  7,  5}, { 12,  7,  9}, { 12,  7, 11}, { 12,  7, 17},
1169    { 12,  7, 19}, { 12,  7, 22}, { 12,  7, 23}, { 12, 10,  1},
1170    { 12, 10,  5}, { 12, 10,  9}, { 12, 12,  5}, { 12, 13,  1},
1171    { 12, 13,  2}, { 12, 13,  5}, { 12, 13,  8}, { 12, 13,  9},
1172    { 12, 13, 11}, { 12, 13, 17}, { 12, 13, 19}, { 12, 13, 23},
1173    { 12, 14,  1}, { 12, 14,  2}, { 12, 14,  5}, { 12, 14, 22},
1174    { 12, 15,  1}, { 12, 15, 22}, { 12, 18,  1}, { 12, 18,  5},
1175    { 12, 18,  9}, { 12, 18, 17}, { 12, 18, 19}, { 12, 19,  1},
1176    { 12, 20,  1}, { 12, 20,  2}, { 12, 20,  5}, { 12, 20,  9},
1177    { 12, 20, 17}, { 12, 20, 19}, { 12, 20, 23}, { 12, 21,  1},
1178    { 12, 21, 22}, { 12, 22,  1}, { 12, 23,  1}, { 12, 23,  5},
1179    { 12, 26, 23}, { 12, 27,  1}, { 12, 27,  2}, { 12, 27,  5},
1180    { 12, 27,  9}, { 12, 27, 11}, { 12, 27, 16}, { 12, 27, 17},
1181    { 12, 27, 19}, { 12, 28,  1}, { 12, 28,  5}, { 12, 28,  9},
1182    { 12, 28, 17}, { 12, 29,  1}, { 12, 29,  2}, { 12, 29,  5},
1183    { 12, 29,  9}, { 12, 29, 17}, { 12, 29, 19}, { 12, 29, 21},
1184    { 12, 29, 23}, { 13,  3,  1}, { 13,  3,  2}, { 13,  3,  5},
1185    { 13,  3,  6}, { 13,  3,  7}, { 13,  3,  9}, { 13,  3, 10},
1186    { 13,  3, 11}, { 13,  3, 16}, { 13,  3, 17}, { 13,  3, 19},
1187    { 13,  3, 21}, { 13,  3, 22}, { 13,  3, 23}, { 13,  3, 27},
1188    { 13,  3, 28}, { 13,  4,  1}, { 13,  4,  2}, { 13,  4,  5},
1189    { 13,  4,  9}, { 13,  4, 17}, { 13,  4, 19}, { 13,  4, 21},
1190    { 13,  4, 22}, { 13,  4, 23}, { 13,  5,  1}, { 13,  5,  2},
1191    { 13,  5,  5}, { 13,  5,  9}, { 13,  5, 12}, { 13,  5, 17},
1192    { 13,  5, 19}, { 13,  5, 21}, { 13,  5, 23}, { 13,  5, 27},
1193    { 13,  5, 29}, { 13,  6,  1}, { 13,  6,  5}, { 13,  6,  9},
1194    { 13,  6, 19}, { 13,  7,  1}, { 13,  7,  2}, { 13,  7,  5},
1195    { 13,  7,  6}, { 13,  7,  8}, { 13,  7,  9}, { 13,  7, 10},
1196    { 13,  7, 11}, { 13,  7, 17}, { 13,  7, 19}, { 13,  7, 20},
1197    { 13,  7, 21}, { 13,  7, 22}, { 13,  7, 23}, { 13,  7, 24},
1198    { 13,  7, 26}, { 13,  7, 28}, { 13, 10,  1}, { 13, 10,  2},
1199    { 13, 10,  5}, { 13, 10,  9}, { 13, 10, 17}, { 13, 10, 19},
1200    { 13, 10, 21}, { 13, 10, 23}, { 13, 11,  1}, { 13, 11,  2},
1201    { 13, 11,  3}, { 13, 11,  5}, { 13, 11,  9}, { 13, 11, 11},
1202    { 13, 11, 12}, { 13, 11, 17}, { 13, 11, 19}, { 13, 11, 20},
1203    { 13, 11, 21}, { 13, 11, 22}, { 13, 11, 23}, { 13, 11, 27},
1204    { 13, 11, 28}, { 13, 11, 29}, { 13, 12,  1}, { 13, 12,  5},
1205    { 13, 12,  9}, { 13, 12, 17}, { 13, 12, 19}, { 13, 12, 21},
1206    { 13, 12, 22}, { 13, 13,  1}, { 13, 13,  2}, { 13, 13,  5},
1207    { 13, 13,  9}, { 13, 13, 10}, { 13, 13, 11}, { 13, 13, 13},
1208    { 13, 13, 16}, { 13, 13, 17}, { 13, 13, 19}, { 13, 13, 21},
1209    { 13, 13, 23}, { 13, 13, 25}, { 13, 14,  1}, { 13, 14,  2},
1210    { 13, 14,  5}, { 13, 14,  9}, { 13, 14, 17}, { 13, 14, 19},
1211    { 13, 14, 21}, { 13, 14, 22}, { 13, 14, 23}, { 13, 15,  1},
1212    { 13, 15,  2}, { 13, 15,  5}, { 13, 15, 17}, { 13, 15, 21},
1213    { 13, 15, 23}, { 13, 18,  1}, { 13, 18,  2}, { 13, 18,  5},
1214    { 13, 18,  9}, { 13, 18, 17}, { 13, 18, 19}, { 13, 18, 21},
1215    { 13, 18, 23}, { 13, 19,  1}, { 13, 19,  2}, { 13, 19,  5},
1216    { 13, 19,  9}, { 13, 19, 17}, { 13, 19, 19}, { 13, 19, 21},
1217    { 13, 19, 23}, { 13, 20,  1}, { 13, 20,  2}, { 13, 20,  5},
1218    { 13, 20,  9}, { 13, 20, 10}, { 13, 20, 11}, { 13, 20, 17},
1219    { 13, 20, 19}, { 13, 20, 21}, { 13, 20, 23}, { 13, 21,  1},
1220    { 13, 21,  2}, { 13, 21,  5}, { 13, 21,  9}, { 13, 21, 17},
1221    { 13, 21, 19}, { 13, 21, 22}, { 13, 21, 23}, { 13, 22,  1},
1222    { 13, 22,  2}, { 13, 22,  5}, { 13, 22,  9}, { 13, 22, 17},
1223    { 13, 22, 19}, { 13, 22, 23}, { 13, 23,  1}, { 13, 23,  2},
1224    { 13, 23,  5}, { 13, 23,  9}, { 13, 23, 17}, { 13, 23, 19},
1225    { 13, 23, 21}, { 13, 23, 23}, { 13, 26,  1}, { 13, 26,  2},
1226    { 13, 26,  5}, { 13, 26,  9}, { 13, 26, 17}, { 13, 26, 19},
1227    { 13, 26, 21}, { 13, 26, 23}, { 13, 26, 25}, { 13, 27,  1},
1228    { 13, 27,  2}, { 13, 27,  5}, { 13, 27,  9}, { 13, 27, 15},
1229    { 13, 27, 17}, { 13, 27, 19}, { 13, 27, 21}, { 13, 27, 23},
1230    { 13, 27, 24}, { 13, 27, 25}, { 13, 27, 26}, { 13, 27, 27},
1231    { 13, 27, 28}, { 13, 27, 29}, { 13, 28,  1}, { 13, 28,  5},
1232    { 13, 28,  9}, { 13, 28, 17}, { 13, 28, 21}, { 13, 29,  1},
1233    { 13, 29,  2}, { 13, 29,  5}, { 13, 29,  9}, { 13, 29, 10},
1234    { 13, 29, 11}, { 13, 29, 16}, { 13, 29, 17}, { 13, 29, 19},
1235    { 13, 29, 21}, { 13, 29, 22}, { 13, 29, 23}, { 13, 29, 24},
1236    { 13, 29, 28}, { 14,  3,  1}, { 14,  3,  2}, { 14,  3,  5},
1237    { 14,  3,  7}, { 14,  3,  8}, { 14,  3,  9}, { 14,  3, 11},
1238    { 14,  3, 17}, { 14,  3, 19}, { 14,  3, 21}, { 14,  3, 22},
1239    { 14,  3, 23}, { 14,  3, 24}, { 14,  4,  1}, { 14,  4,  2},
1240    { 14,  4,  5}, { 14,  4,  9}, { 14,  4, 17}, { 14,  4, 19},
1241    { 14,  4, 21}, { 14,  4, 22}, { 14,  4, 23}, { 14,  5,  1},
1242    { 14,  5,  2}, { 14,  5,  5}, { 14,  5,  7}, { 14,  5,  9},
1243    { 14,  5, 17}, { 14,  5, 23}, { 14,  6,  1}, { 14,  6,  5},
1244    { 14,  6,  9}, { 14,  7,  1}, { 14,  7,  2}, { 14,  7,  5},
1245    { 14,  7,  9}, { 14,  7, 11}, { 14,  7, 17}, { 14,  7, 19},
1246    { 14,  7, 21}, { 14,  7, 23}, { 14,  7, 24}, { 14, 10,  1},
1247    { 14, 10,  2}, { 14, 10,  5}, { 14, 10,  9}, { 14, 10, 17},
1248    { 14, 10, 19}, { 14, 10, 21}, { 14, 10, 23}, { 14, 11,  1},
1249    { 14, 11,  5}, { 14, 11,  9}, { 14, 11, 17}, { 14, 11, 19},
1250    { 14, 11, 22}, { 14, 11, 23}, { 14, 12,  1}, { 14, 13,  1},
1251    { 14, 13,  2}, { 14, 13,  5}, { 14, 13,  9}, { 14, 13, 11},
1252    { 14, 13, 17}, { 14, 13, 19}, { 14, 13, 21}, { 14, 13, 23},
1253    { 14, 13, 24}, { 14, 13, 25}, { 14, 13, 29}, { 14, 14,  1},
1254    { 14, 14,  2}, { 14, 14,  9}, { 14, 14, 19}, { 14, 14, 21},
1255    { 14, 14, 23}, { 14, 15,  1}, { 14, 15, 22}, { 14, 15, 23},
1256    { 14, 18,  1}, { 14, 18,  5}, { 14, 18,  9}, { 14, 18, 17},
1257    { 14, 18, 19}, { 14, 18, 21}, { 14, 18, 23}, { 14, 19,  1},
1258    { 14, 19,  2}, { 14, 19,  5}, { 14, 19, 23}, { 14, 20,  1},
1259    { 14, 20,  2}, { 14, 20,  5}, { 14, 20,  9}, { 14, 20, 10},
1260    { 14, 20, 11}, { 14, 20, 17}, { 14, 20, 19}, { 14, 20, 21},
1261    { 14, 20, 23}, { 14, 21,  1}, { 14, 21, 22}, { 14, 22,  1},
1262    { 14, 23,  1}, { 14, 23,  2}, { 14, 23,  5}, { 14, 23,  9},
1263    { 14, 23, 17}, { 14, 23, 19}, { 14, 23, 21}, { 14, 26,  1},
1264    { 14, 26,  5}, { 14, 26,  9}, { 14, 26, 17}, { 14, 27,  1},
1265    { 14, 27,  2}, { 14, 27,  5}, { 14, 27,  9}, { 14, 27, 17},
1266    { 14, 27, 19}, { 14, 27, 21}, { 14, 27, 23}, { 14, 29,  1},
1267    { 14, 29,  2}, { 14, 29,  5}, { 14, 29,  8}, { 14, 29,  9},
1268    { 14, 29, 11}, { 14, 29, 17}, { 14, 29, 19}, { 14, 29, 21},
1269    { 14, 29, 23}, { 14, 29, 24}, { 14, 29, 27}, { 14, 29, 28},
1270    { 15,  3,  1}, { 15,  3,  2}, { 15,  3,  5}, { 15,  3,  7},
1271    { 15,  3,  9}, { 15,  3, 12}, { 15,  3, 17}, { 15,  3, 19},
1272    { 15,  3, 21}, { 15,  3, 22}, { 15,  3, 23}, { 15,  4,  1},
1273    { 15,  4,  2}, { 15,  4,  5}, { 15,  4,  9}, { 15,  4, 17},
1274    { 15,  4, 19}, { 15,  4, 21}, { 15,  4, 22}, { 15,  4, 23},
1275    { 15,  5,  1}, { 15,  5,  5}, { 15,  5, 23}, { 15,  7,  1},
1276    { 15,  7,  2}, { 15,  7,  5}, { 15,  7,  9}, { 15,  7, 17},
1277    { 15,  7, 19}, { 15,  7, 21}, { 15,  7, 22}, { 15,  7, 23},
1278    { 15, 10,  1}, { 15, 10, 23}, { 15, 11,  1}, { 15, 11, 22},
1279    { 15, 13,  1}, { 15, 13,  2}, { 15, 13,  5}, { 15, 13,  9},
1280    { 15, 13, 17}, { 15, 13, 19}, { 15, 13, 21}, { 15, 13, 23},
1281    { 15, 13, 25}, { 15, 14,  1}, { 15, 14,  2}, { 15, 14,  9},
1282    { 15, 14, 22}, { 15, 15,  1}, { 15, 15, 22}, { 15, 18,  1},
1283    { 15, 18,  5}, { 15, 18,  9}, { 15, 18, 17}, { 15, 18, 19},
1284    { 15, 19, 23}, { 15, 20,  1}, { 15, 20,  2}, { 15, 20,  5},
1285    { 15, 20,  9}, { 15, 20, 17}, { 15, 20, 19}, { 15, 20, 23},
1286    { 15, 21,  1}, { 15, 21, 22}, { 15, 21, 23}, { 15, 23,  1},
1287    { 15, 26,  1}, { 15, 27,  1}, { 15, 27, 17}, { 15, 27, 21},
1288    { 15, 27, 23}, { 15, 29,  1}, { 15, 29,  2}, { 15, 29,  5},
1289    { 15, 29,  9}, { 15, 29, 17}, { 15, 29, 19}, { 15, 29, 23},
1290    { 15, 29, 24}, { 15, 29, 29}, { 16,  3,  1}, { 16,  3,  2},
1291    { 16,  3,  5}, { 16,  3,  7}, { 16,  3,  9}, { 16,  3, 17},
1292    { 16,  3, 19}, { 16,  3, 21}, { 16,  3, 22}, { 16,  3, 23},
1293    { 16,  3, 24}, { 16,  4,  1}, { 16,  4,  2}, { 16,  4,  5},
1294    { 16,  4,  9}, { 16,  4, 17}, { 16,  4, 19}, { 16,  4, 21},
1295    { 16,  4, 22}, { 16,  4, 23}, { 16,  5,  1}, { 16,  5,  5},
1296    { 16,  5,  7}, { 16,  5,  9}, { 16,  5, 17}, { 16,  5, 23},
1297    { 16,  7,  1}, { 16,  7,  2}, { 16,  7,  5}, { 16,  7,  9},
1298    { 16,  7, 17}, { 16,  7, 19}, { 16,  7, 21}, { 16,  7, 22},
1299    { 16,  7, 23}, { 16, 10,  1}, { 16, 10,  2}, { 16, 10,  5},
1300    { 16, 10,  9}, { 16, 10, 17}, { 16, 10, 19}, { 16, 10, 21},
1301    { 16, 10, 23}, { 16, 11,  1}, { 16, 11,  5}, { 16, 11, 22},
1302    { 16, 12,  1}, { 16, 12,  5}, { 16, 12, 23}, { 16, 13,  1},
1303    { 16, 13,  2}, { 16, 13,  5}, { 16, 13,  9}, { 16, 13, 17},
1304    { 16, 13, 19}, { 16, 13, 21}, { 16, 13, 23}, { 16, 14,  1},
1305    { 16, 14,  5}, { 16, 14,  9}, { 16, 14, 23}, { 16, 18,  1},
1306    { 16, 18,  5}, { 16, 18,  9}, { 16, 18, 17}, { 16, 18, 19},
1307    { 16, 18, 21}, { 16, 18, 23}, { 16, 19,  1}, { 16, 19, 17},
1308    { 16, 20,  1}, { 16, 20,  2}, { 16, 20,  5}, { 16, 20,  9},
1309    { 16, 20, 17}, { 16, 20, 19}, { 16, 20, 21}, { 16, 20, 23},
1310    { 16, 21,  1}, { 16, 21, 22}, { 16, 22,  1}, { 16, 22,  5},
1311    { 16, 23,  1}, { 16, 23,  5}, { 16, 23,  9}, { 16, 23, 17},
1312    { 16, 23, 19}, { 16, 23, 21}, { 16, 23, 23}, { 16, 26,  1},
1313    { 16, 26,  5}, { 16, 26,  9}, { 16, 26, 17}, { 16, 26, 23},
1314    { 16, 27,  1}, { 16, 27,  2}, { 16, 27,  5}, { 16, 27,  9},
1315    { 16, 27, 17}, { 16, 27, 19}, { 16, 27, 21}, { 16, 27, 23},
1316    { 16, 29,  1}, { 16, 29,  2}, { 16, 29,  5}, { 16, 29,  8},
1317    { 16, 29,  9}, { 16, 29, 10}, { 16, 29, 17}, { 16, 29, 19},
1318    { 16, 29, 21}, { 16, 29, 23}, { 17,  3,  1}, { 17,  3,  2},
1319    { 17,  3,  5}, { 17,  3,  9}, { 17,  3, 17}, { 17,  3, 19},
1320    { 17,  3, 21}, { 17,  3, 23}, { 17,  4,  1}, { 17,  4,  2},
1321    { 17,  4,  5}, { 17,  4,  9}, { 17,  4, 17}, { 17,  4, 19},
1322    { 17,  4, 21}, { 17,  4, 22}, { 17,  4, 23}, { 17,  5,  1},
1323    { 17,  5,  2}, { 17,  5, 23}, { 17,  7,  1}, { 17,  7,  2},
1324    { 17,  7,  5}, { 17,  7,  8}, { 17,  7,  9}, { 17,  7, 17},
1325    { 17,  7, 19}, { 17,  7, 21}, { 17,  7, 22}, { 17,  7, 23},
1326    { 17, 10,  1}, { 17, 10,  2}, { 17, 10,  5}, { 17, 10,  9},
1327    { 17, 10, 17}, { 17, 10, 19}, { 17, 10, 21}, { 17, 10, 23},
1328    { 17, 11,  1}, { 17, 11,  5}, { 17, 11,  9}, { 17, 11, 17},
1329    { 17, 11, 19}, { 17, 11, 21}, { 17, 11, 22}, { 17, 11, 23},
1330    { 17, 12,  1}, { 17, 13,  1}, { 17, 13,  2}, { 17, 13,  5},
1331    { 17, 13,  9}, { 17, 13, 17}, { 17, 13, 19}, { 17, 13, 21},
1332    { 17, 13, 23}, { 17, 14,  1}, { 17, 14,  2}, { 17, 14,  5},
1333    { 17, 14,  9}, { 17, 14, 17}, { 17, 14, 23}, { 17, 15,  1},
1334    { 17, 15, 23}, { 17, 18,  1}, { 17, 18,  9}, { 17, 19,  1},
1335    { 17, 20,  1}, { 17, 20,  2}, { 17, 20,  5}, { 17, 20,  9},
1336    { 17, 20, 17}, { 17, 20, 19}, { 17, 20, 21}, { 17, 20, 23},
1337    { 17, 21,  1}, { 17, 21,  5}, { 17, 21,  9}, { 17, 21, 23},
1338    { 17, 22,  1}, { 17, 22, 23}, { 17, 23,  1}, { 17, 23,  2},
1339    { 17, 23,  5}, { 17, 23,  9}, { 17, 23, 17}, { 17, 23, 19},
1340    { 17, 23, 21}, { 17, 23, 23}, { 17, 26,  1}, { 17, 26,  5},
1341    { 17, 26,  9}, { 17, 26, 17}, { 17, 27,  1}, { 17, 27,  2},
1342    { 17, 27,  5}, { 17, 27,  9}, { 17, 27, 17}, { 17, 27, 19},
1343    { 17, 27, 23}, { 17, 29,  1}, { 17, 29,  2}, { 17, 29,  5},
1344    { 17, 29,  9}, { 17, 29, 17}, { 17, 29, 19}, { 17, 29, 21},
1345    { 17, 29, 23}, { 18,  3,  1}, { 18,  3,  2}, { 18,  3,  5},
1346    { 18,  3,  9}, { 18,  3, 10}, { 18,  3, 17}, { 18,  3, 19},
1347    { 18,  3, 21}, { 18,  3, 22}, { 18,  3, 23}, { 18,  4,  1},
1348    { 18,  4,  2}, { 18,  4,  5}, { 18,  4,  9}, { 18,  4, 17},
1349    { 18,  4, 19}, { 18,  4, 21}, { 18,  4, 22}, { 18,  4, 23},
1350    { 18,  5,  1}, { 18,  5, 23}, { 18,  7,  1}, { 18,  7,  2},
1351    { 18,  7,  5}, { 18,  7,  9}, { 18,  7, 11}, { 18,  7, 17},
1352    { 18,  7, 19}, { 18,  7, 21}, { 18,  7, 22}, { 18,  7, 23},
1353    { 18, 10,  1}, { 18, 10,  2}, { 18, 10,  5}, { 18, 10,  9},
1354    { 18, 10, 17}, { 18, 10, 19}, { 18, 10, 21}, { 18, 10, 23},
1355    { 18, 11,  1}, { 18, 11,  5}, { 18, 11, 22}, { 18, 12,  1},
1356    { 18, 12,  5}, { 18, 13,  1}, { 18, 13,  2}, { 18, 13,  5},
1357    { 18, 13,  9}, { 18, 13, 17}, { 18, 13, 19}, { 18, 13, 21},
1358    { 18, 13, 23}, { 18, 13, 28}, { 18, 14,  1}, { 18, 14,  5},
1359    { 18, 15,  1}, { 18, 18,  1}, { 18, 18,  5}, { 18, 18, 21},
1360    { 18, 18, 23}, { 18, 19,  1}, { 18, 20,  1}, { 18, 20,  2},
1361    { 18, 20,  5}, { 18, 20,  9}, { 18, 20, 17}, { 18, 20, 19},
1362    { 18, 20, 21}, { 18, 20, 23}, { 18, 21,  1}, { 18, 21, 22},
1363    { 18, 22,  1}, { 18, 23,  1}, { 18, 23,  2}, { 18, 23,  5},
1364    { 18, 23,  9}, { 18, 23, 17}, { 18, 23, 19}, { 18, 23, 23},
1365    { 18, 26,  1}, { 18, 26,  5}, { 18, 26,  9}, { 18, 26, 17},
1366    { 18, 26, 23}, { 18, 27,  1}, { 18, 27,  2}, { 18, 27,  5},
1367    { 18, 27,  8}, { 18, 27,  9}, { 18, 27, 11}, { 18, 27, 17},
1368    { 18, 27, 19}, { 18, 27, 21}, { 18, 28,  1}, { 18, 28,  5},
1369    { 18, 28,  9}, { 18, 28, 17}, { 18, 28, 19}, { 18, 29,  1},
1370    { 18, 29,  2}, { 18, 29,  5}, { 18, 29,  9}, { 18, 29, 17},
1371    { 18, 29, 19}, { 18, 29, 21}, { 18, 29, 23}, { 19,  3,  1},
1372    { 19,  3,  2}, { 19,  3,  3}, { 19,  3,  5}, { 19,  3,  9},
1373    { 19,  3, 11}, { 19,  3, 17}, { 19,  3, 19}, { 19,  3, 21},
1374    { 19,  3, 22}, { 19,  3, 23}, { 19,  3, 27}, { 19,  4,  1},
1375    { 19,  4,  2}, { 19,  4,  5}, { 19,  4,  9}, { 19,  4, 17},
1376    { 19,  4, 19}, { 19,  4, 21}, { 19,  4, 22}, { 19,  4, 23},
1377    { 19,  5,  1}, { 19,  5,  2}, { 19,  7,  1}, { 19,  7,  2},
1378    { 19,  7,  5}, { 19,  7,  9}, { 19,  7, 17}, { 19,  7, 19},
1379    { 19,  7, 21}, { 19,  7, 22}, { 19,  7, 23}, { 19, 10,  1},
1380    { 19, 10,  2}, { 19, 10,  5}, { 19, 10,  9}, { 19, 10, 17},
1381    { 19, 10, 19}, { 19, 10, 21}, { 19, 10, 23}, { 19, 11,  1},
1382    { 19, 11,  5}, { 19, 11,  9}, { 19, 11, 17}, { 19, 11, 19},
1383    { 19, 11, 22}, { 19, 11, 23}, { 19, 12,  1}, { 19, 12,  9},
1384    { 19, 12, 19}, { 19, 12, 21}, { 19, 13,  1}, { 19, 13,  2},
1385    { 19, 13,  5}, { 19, 13,  9}, { 19, 13, 17}, { 19, 13, 19},
1386    { 19, 13, 21}, { 19, 13, 23}, { 19, 14,  1}, { 19, 14, 23},
1387    { 19, 18,  1}, { 19, 18,  5}, { 19, 19,  1}, { 19, 19,  5},
1388    { 19, 19,  9}, { 19, 19, 19}, { 19, 19, 21}, { 19, 20,  1},
1389    { 19, 20,  2}, { 19, 20,  5}, { 19, 20,  8}, { 19, 20,  9},
1390    { 19, 20, 11}, { 19, 20, 17}, { 19, 20, 19}, { 19, 20, 21},
1391    { 19, 20, 23}, { 19, 21,  1}, { 19, 21, 23}, { 19, 23,  1},
1392    { 19, 23,  5}, { 19, 23,  9}, { 19, 23, 17}, { 19, 23, 21},
1393    { 19, 26,  1}, { 19, 26,  5}, { 19, 26,  9}, { 19, 26, 17},
1394    { 19, 26, 21}, { 19, 26, 23}, { 19, 27,  1}, { 19, 27,  5},
1395    { 19, 27,  9}, { 19, 27, 17}, { 19, 27, 19}, { 19, 27, 21},
1396    { 19, 29,  1}, { 19, 29,  2}, { 19, 29,  5}, { 19, 29,  9},
1397    { 19, 29, 17}, { 19, 29, 19}, { 19, 29, 21}, { 19, 29, 23},
1398    { 20,  3,  1}, { 20,  3,  2}, { 20,  3,  5}, { 20,  3,  9},
1399    { 20,  3, 14}, { 20,  3, 17}, { 20,  3, 19}, { 20,  3, 21},
1400    { 20,  3, 23}, { 20,  4,  1}, { 20,  4,  2}, { 20,  4,  5},
1401    { 20,  4,  9}, { 20,  4, 17}, { 20,  4, 19}, { 20,  4, 21},
1402    { 20,  4, 22}, { 20,  4, 23}, { 20,  5,  1}, { 20,  5, 23},
1403    { 20,  7,  1}, { 20,  7,  2}, { 20,  7,  5}, { 20,  7,  9},
1404    { 20,  7, 11}, { 20,  7, 17}, { 20,  7, 19}, { 20,  7, 21},
1405    { 20,  7, 23}, { 20, 10,  1}, { 20, 10,  2}, { 20, 10,  5},
1406    { 20, 10,  9}, { 20, 10, 17}, { 20, 10, 19}, { 20, 10, 21},
1407    { 20, 10, 23}, { 20, 11,  1}, { 20, 11,  2}, { 20, 11,  5},
1408    { 20, 11,  9}, { 20, 11, 17}, { 20, 11, 19}, { 20, 11, 21},
1409    { 20, 11, 22}, { 20, 11, 23}, { 20, 12,  1}, { 20, 12,  5},
1410    { 20, 12,  9}, { 20, 12, 19}, { 20, 13,  1}, { 20, 13,  2},
1411    { 20, 13,  5}, { 20, 13,  9}, { 20, 13, 14}, { 20, 13, 17},
1412    { 20, 13, 19}, { 20, 13, 21}, { 20, 13, 23}, { 20, 13, 27},
1413    { 20, 14,  1}, { 20, 14,  2}, { 20, 14,  5}, { 20, 14,  9},
1414    { 20, 14, 21}, { 20, 14, 23}, { 20, 15,  1}, { 20, 15,  2},
1415    { 20, 15,  5}, { 20, 15, 21}, { 20, 15, 23}, { 20, 18,  1},
1416    { 20, 18,  2}, { 20, 18,  5}, { 20, 18,  9}, { 20, 18, 19},
1417    { 20, 18, 21}, { 20, 18, 23}, { 20, 19,  1}, { 20, 19,  5},
1418    { 20, 19,  9}, { 20, 19, 19}, { 20, 19, 21}, { 20, 20,  1},
1419    { 20, 20,  2}, { 20, 20,  5}, { 20, 20,  9}, { 20, 20, 14},
1420    { 20, 20, 17}, { 20, 20, 21}, { 20, 20, 23}, { 20, 21,  1},
1421    { 20, 21,  5}, { 20, 21,  9}, { 20, 21, 17}, { 20, 21, 23},
1422    { 20, 22,  1}, { 20, 22,  2}, { 20, 22,  5}, { 20, 22,  9},
1423    { 20, 22, 23}, { 20, 23,  1}, { 20, 23,  2}, { 20, 23,  5},
1424    { 20, 23,  9}, { 20, 23, 17}, { 20, 23, 19}, { 20, 23, 21},
1425    { 20, 23, 23}, { 20, 26,  1}, { 20, 26,  2}, { 20, 26,  5},
1426    { 20, 26,  9}, { 20, 26, 17}, { 20, 26, 21}, { 20, 26, 23},
1427    { 20, 27,  1}, { 20, 27,  2}, { 20, 27,  5}, { 20, 27,  7},
1428    { 20, 27,  8}, { 20, 27,  9}, { 20, 27, 10}, { 20, 27, 17},
1429    { 20, 27, 19}, { 20, 27, 21}, { 20, 27, 23}, { 20, 27, 27},
1430    { 20, 28,  1}, { 20, 28,  5}, { 20, 28,  9}, { 20, 28, 17},
1431    { 20, 28, 19}, { 20, 28, 23}, { 20, 29,  1}, { 20, 29,  2},
1432    { 20, 29,  5}, { 20, 29,  9}, { 20, 29, 17}, { 20, 29, 19},
1433    { 20, 29, 21}, { 20, 29, 23},
1434};
1435
1436
1437static const unsigned short ks_table2[][4] =
1438{
1439    {0xa4bf,  1,  3,  1},  {0xa4c0,  1,  4,  1},
1440    {0xa4c1,  1,  5,  1},  {0xa4c2,  1,  6,  1},
1441    {0xa4c3,  1,  7,  1},  {0xa4c4,  1, 10,  1},
1442    {0xa4c5,  1, 11,  1},  {0xa4c6,  1, 12,  1},
1443    {0xa4c7,  1, 13,  1},  {0xa4c8,  1, 14,  1},
1444    {0xa4c9,  1, 15,  1},  {0xa4ca,  1, 18,  1},
1445    {0xa4cb,  1, 19,  1},  {0xa4cc,  1, 20,  1},
1446    {0xa4cd,  1, 21,  1},  {0xa4ce,  1, 22,  1},
1447    {0xa4cf,  1, 23,  1},  {0xa4d0,  1, 26,  1},
1448    {0xa4d1,  1, 27,  1},  {0xa4d2,  1, 28,  1},
1449    {0xa4d3,  1, 29,  1},  {0xa4a1,  2,  2,  1},
1450    {0xa4a2,  3,  2,  1},  {0xa4a4,  4,  2,  1},
1451    {0xa4a7,  5,  2,  1},  {0xa4a8,  6,  2,  1},
1452    {0xa4a9,  7,  2,  1},  {0xa4b1,  8,  2,  1},
1453    {0xa4b2,  9,  2,  1},  {0xa4b3, 10,  2,  1},
1454    {0xa4b5, 11,  2,  1},  {0xa4b6, 12,  2,  1},
1455    {0xa4b7, 13,  2,  1},  {0xa4b8, 14,  2,  1},
1456    {0xa4b9, 15,  2,  1},  {0xa4ba, 16,  2,  1},
1457    {0xa4bb, 17,  2,  1},  {0xa4bc, 18,  2,  1},
1458    {0xa4bd, 19,  2,  1},  {0xa4be, 20,  2,  1},
1459};
1460
1461/* ������ �ʼ� - �ϼ��� ���� ��ȯ
1462 * conversion: initial sound of compound type - ??? of completion type
1463 */
1464
1465static const char_u johab_fcon_to_wan[] =
1466{
1467    0,
1468    0xd4, 0xa1, 0xa2, 0xa4, 0xa7,    /* (�),��,��,��,�� */
1469    0xa8, 0xa9, 0xb1, 0xb2, 0xb3,    /* ��,��,��,��,�� */
1470    0xb5, 0xb6, 0xb7, 0xb8, 0xb9,    /* ��,��,��,��,�� */
1471    0xba, 0xbb, 0xbc, 0xbd, 0xbe     /* ��,��,��,��,�� */
1472};
1473
1474/* ������ �߼� -> �ϼ��� ���� ��ȯ
1475 * conversion: medial vowel of compound type - ??? of completion type
1476 */
1477
1478static const char_u johab_vow_to_wan[] =
1479{
1480    0, 0,
1481    0xd4, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,	/* (�),��,��,��,��,�� */
1482    0, 0,
1483    0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, /* ��,��,��,��,�Ǥ�,�Ǥ� */
1484    0, 0,
1485    0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* �Ǥ�,��,��,�̤�,�̤�,�̤� */
1486    0, 0,
1487    0xd0, 0xd1, 0xd2, 0xd3	     /* ��,��,�Ѥ�,�� */
1488};
1489
1490/* ������ ���� -> �ϼ��� ���� ��ȯ
1491 * conversion: final consonant of compound type - ??? of completion type
1492 */
1493
1494static const char_u johab_lcon_to_wan[] =
1495{
1496    0,
1497    0xd4, 0xa1, 0xa2, 0xa3, 0xa4,    /* (�), ��, ��, ����, �� */
1498    0xa5, 0xa6, 0xa7, 0xa9, 0xaa,    /* ����, ����, ��, ��, ���� */
1499    0xab, 0xac, 0xad, 0xae, 0xaf,    /* ����, ����, ����, ����, ���� */
1500    0xb0, 0xb1, 0,    0xb2, 0xb4,    /* ����, ��, 0, ��, ���� */
1501    0xb5, 0xb6, 0xb7, 0xb8, 0xba,    /* ��, ��, ��, ��, �� */
1502    0xbb, 0xbc, 0xbd, 0xbe	     /* ��, ��, ��, �� */
1503};
1504
1505    static void
1506convert_ks_to_3(src, fp, mp, lp)
1507    const char_u    *src;
1508    int		    *fp;
1509    int		    *mp;
1510    int		    *lp;
1511{
1512    int h = *src;
1513    int low = *(src + 1);
1514    int c;
1515    int i;
1516
1517    if ((i = han_index(h, low)) >= 0
1518	&& i < sizeof(ks_table1)/sizeof(ks_table1[0]))
1519    {
1520	*fp = ks_table1[i][0];
1521	*mp = ks_table1[i][1];
1522	*lp = ks_table1[i][2];
1523    }
1524    else
1525    {
1526	c = (h << 8) | low;
1527	for (i = 0; i < 40; i++)
1528	    if (ks_table2[i][0] == c)
1529	    {
1530		*fp = ks_table2[i][1];
1531		*mp = ks_table2[i][2];
1532		*lp = ks_table2[i][3];
1533		return;
1534	    }
1535	*fp = 0xff;	/* �׷��� �ڵ� (graphic code) */
1536	*mp = h;
1537	*lp = low;
1538    }
1539}
1540
1541    static int
1542convert_3_to_ks(fv, mv, lv, des)
1543    int	    fv;
1544    int	    mv;
1545    int	    lv;
1546    char_u  *des;
1547{
1548    char_u key[3];
1549    register int hi, lo, mi = 0, result, found;
1550
1551    if (fv == 0xff)
1552    {
1553	des[0] = mv;
1554	des[1] = lv;
1555	return 2;
1556    }
1557    key[0] = fv;
1558    key[1] = mv;
1559    key[2] = lv;
1560    lo = 0;
1561    hi = sizeof(ks_table1)/3 - 1;
1562    found = 0;
1563    while (lo + 1 < hi)
1564    {
1565	mi = (lo + hi)/2;
1566	result = STRNCMP(ks_table1[mi], key, 3);
1567	if (result == 0)
1568	{
1569	    found = 1;
1570	    break;
1571	}
1572	else if (result > 0)
1573	    hi = mi;
1574	else
1575	    lo = mi;
1576    }
1577    if (!found)
1578    {
1579	if (!STRNCMP(ks_table1[lo], key, 3))
1580	{
1581	    found = 1;
1582	    mi = lo;
1583	}
1584	if (!STRNCMP(ks_table1[hi], key, 3))
1585	{
1586	    found = 1;
1587	    mi = hi;
1588	}
1589    }
1590    if (!found)
1591    {
1592	for (mi = 0; mi < 40; mi++)
1593	    if (ks_table2[mi][1] == fv && ks_table2[mi][2] == mv &&
1594		ks_table2[mi][3] == lv)
1595	    {
1596		des[0] = (unsigned)(ks_table2[mi][0]) >> 8;
1597		des[1] = ks_table2[mi][0];
1598		return 2;	/* found */
1599	    }
1600    }
1601    else
1602    {
1603	des[0] = mi / (0xff-0xa1) + 0xb0;
1604	des[1] = mi % (0xff-0xa1) + 0xa1;
1605	return 2;		/* found */
1606    }
1607
1608    /* �ϼ��� ǥ�� ���. ``KS C 5601 - 1992 ���� ��ȯ�� ��ȣ �ؼ�''
1609     * 3.3 �� ����� ������� encoding �Ѵ�.
1610     */
1611
1612    *des++ = 0xa4;		     /* � */
1613    *des++ = 0xd4;
1614    *des++ = 0xa4;		     /* ���ڴ� ��� a4 �࿡ �ִ�. */
1615    *des++ = johab_fcon_to_wan[fv];
1616    *des++ = 0xa4;
1617    *des++ = johab_vow_to_wan[mv];
1618    *des++ = 0xa4;
1619    *des++ = johab_lcon_to_wan[lv];
1620    return 8;
1621}
1622