1*16d86563SAlexander Pyhalov /*
2*16d86563SAlexander Pyhalov  * CDDL HEADER START
3*16d86563SAlexander Pyhalov  *
4*16d86563SAlexander Pyhalov  * The contents of this file are subject to the terms of the
5*16d86563SAlexander Pyhalov  * Common Development and Distribution License (the "License").
6*16d86563SAlexander Pyhalov  * You may not use this file except in compliance with the License.
7*16d86563SAlexander Pyhalov  *
8*16d86563SAlexander Pyhalov  * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE
9*16d86563SAlexander Pyhalov  * or http://www.opensolaris.org/os/licensing.
10*16d86563SAlexander Pyhalov  * See the License for the specific language governing permissions
11*16d86563SAlexander Pyhalov  * and limitations under the License.
12*16d86563SAlexander Pyhalov  *
13*16d86563SAlexander Pyhalov  * When distributing Covered Code, include this CDDL HEADER in each
14*16d86563SAlexander Pyhalov  * file and include the License file at src/OPENSOLARIS.LICENSE.
15*16d86563SAlexander Pyhalov  * If applicable, add the following below this CDDL HEADER, with the
16*16d86563SAlexander Pyhalov  * fields enclosed by brackets "[]" replaced with your own identifying
17*16d86563SAlexander Pyhalov  * information: Portions Copyright [yyyy] [name of copyright owner]
18*16d86563SAlexander Pyhalov  *
19*16d86563SAlexander Pyhalov  * CDDL HEADER END
20*16d86563SAlexander Pyhalov  */
21*16d86563SAlexander Pyhalov /* Copyright 1995 by Sun Microsystems, Inc.
22*16d86563SAlexander Pyhalov  * All rights are reserved.
23*16d86563SAlexander Pyhalov  */
24*16d86563SAlexander Pyhalov 
25*16d86563SAlexander Pyhalov #include <stdio.h>
26*16d86563SAlexander Pyhalov #include <string.h>
27*16d86563SAlexander Pyhalov #include "kdefs.h"
28*16d86563SAlexander Pyhalov #include "ktable.h"
29*16d86563SAlexander Pyhalov 
30*16d86563SAlexander Pyhalov int input_typ(char c);
31*16d86563SAlexander Pyhalov 
32*16d86563SAlexander Pyhalov struct _cv_state {
33*16d86563SAlexander Pyhalov 	char temp_ibuf[5];
34*16d86563SAlexander Pyhalov 	int  ibuf_left;
35*16d86563SAlexander Pyhalov 	int  istart, iend;
36*16d86563SAlexander Pyhalov 	char temp_obuf[1];
37*16d86563SAlexander Pyhalov 	int  flush_obuf;
38*16d86563SAlexander Pyhalov };
39*16d86563SAlexander Pyhalov 
40*16d86563SAlexander Pyhalov KCHAR packtocomp(KCHAR comb2);
41*16d86563SAlexander Pyhalov 
42*16d86563SAlexander Pyhalov #ifndef SUNVIEW
43*16d86563SAlexander Pyhalov char vowel_mix(char c1,char c2);
44*16d86563SAlexander Pyhalov #endif
45*16d86563SAlexander Pyhalov 
46*16d86563SAlexander Pyhalov /*
47*16d86563SAlexander Pyhalov  * Hangul 7-bit(KS C 5601) to Standard 2-byte Combination code(87-3)
48*16d86563SAlexander Pyhalov  */
49*16d86563SAlexander Pyhalov 
50*16d86563SAlexander Pyhalov 
51*16d86563SAlexander Pyhalov static int cur_stat = 1;	/* current state of automata */
52*16d86563SAlexander Pyhalov static int cur_act;		/* current action of automata */
53*16d86563SAlexander Pyhalov 
54*16d86563SAlexander Pyhalov static char han_buf[5] = {0,0,0,0,0 };	/* Hangul buffer */
55*16d86563SAlexander Pyhalov 
56*16d86563SAlexander Pyhalov static int temp_flag;		/* Hangul temporary flag */
57*16d86563SAlexander Pyhalov static int han_temp = 0;	/* Hangul temporary while two
58*16d86563SAlexander Pyhalov 				   2-byte code are generated */
59*16d86563SAlexander Pyhalov 
60*16d86563SAlexander Pyhalov static int next_stat[14][21]={	/* next state table[current state][input] */
61*16d86563SAlexander Pyhalov 	/* input
62*16d86563SAlexander Pyhalov 	  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 */
63*16d86563SAlexander Pyhalov /*state*/
64*16d86563SAlexander Pyhalov /* 0 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
65*16d86563SAlexander Pyhalov /* 1 */	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1},
66*16d86563SAlexander Pyhalov /* 2 */	{ 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 1, 2},
67*16d86563SAlexander Pyhalov /* 3 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 1, 2},
68*16d86563SAlexander Pyhalov /* 4 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
69*16d86563SAlexander Pyhalov /* 5 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 8, 3, 8, 3, 3, 3, 2, 1, 2},
70*16d86563SAlexander Pyhalov /* 6 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 3, 8, 8, 3, 3, 3, 2, 1, 2},
71*16d86563SAlexander Pyhalov /* 7 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 3, 3, 8, 3, 3, 3, 2, 1, 2},
72*16d86563SAlexander Pyhalov /* 8 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 3, 3, 3, 3, 3, 3, 2, 1, 2},
73*16d86563SAlexander Pyhalov /* 9 */ { 0, 4, 4, 4, 4, 4, 4,13, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
74*16d86563SAlexander Pyhalov /*10 */ { 0, 4, 4, 4, 4, 4, 4, 4,13,13, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
75*16d86563SAlexander Pyhalov /*11 */ { 0, 4,13, 4, 4,13, 4,13, 4,13,13, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
76*16d86563SAlexander Pyhalov /*12 */ { 0, 4, 4, 4, 4, 4, 4,13, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
77*16d86563SAlexander Pyhalov /*13 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2}
78*16d86563SAlexander Pyhalov };
79*16d86563SAlexander Pyhalov 
80*16d86563SAlexander Pyhalov static int next_act[14][21]={	/* next action table[current state][input]  */
81*16d86563SAlexander Pyhalov 	/*input
82*16d86563SAlexander Pyhalov 	  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 */
83*16d86563SAlexander Pyhalov /*state*/
84*16d86563SAlexander Pyhalov /* 0 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
85*16d86563SAlexander Pyhalov /* 1 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 1, 4},/*4-1*/
86*16d86563SAlexander Pyhalov /* 2 */ { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,15,15,15,15,15,15,15, 1, 3, 4},
87*16d86563SAlexander Pyhalov /* 3 */ { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,15,15,15,15,15,15,15, 1, 3, 4},
88*16d86563SAlexander Pyhalov /* 4 */ { 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 6, 6, 6, 6, 6,16,12,13},
89*16d86563SAlexander Pyhalov /* 5 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,14,10,14,10,10,10,16,12,13},
90*16d86563SAlexander Pyhalov /* 6 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,10,14,14,10,10,10,16,12,13},
91*16d86563SAlexander Pyhalov /* 7 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,10,10,14,10,10,10,16,12,13},
92*16d86563SAlexander Pyhalov /* 8 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,10,10,10,10,10,10,16,12,13},
93*16d86563SAlexander Pyhalov /* 9 */ { 0, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9,17,17,17,17,17,17,17,16,12,13},
94*16d86563SAlexander Pyhalov /*10 */ { 0, 9, 9, 9, 9, 9, 9, 9, 8, 8, 9,17,17,17,17,17,17,17,16,12,13},
95*16d86563SAlexander Pyhalov /*11 */ { 0, 9, 8, 9, 9, 8, 9, 8, 9, 8, 8,17,17,17,17,17,17,17,16,12,13},
96*16d86563SAlexander Pyhalov /*12 */ { 0, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9,17,17,17,17,17,17,17,16,12,13},
97*16d86563SAlexander Pyhalov /*13 */ { 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,17,17,17,17,17,17,17,16,12,13}
98*16d86563SAlexander Pyhalov };
99*16d86563SAlexander Pyhalov 
100*16d86563SAlexander Pyhalov KCHAR
getc_12(my_inbuf,my_inbytesleft,st)101*16d86563SAlexander Pyhalov getc_12(my_inbuf, my_inbytesleft, st)
102*16d86563SAlexander Pyhalov char **my_inbuf;
103*16d86563SAlexander Pyhalov size_t *my_inbytesleft;
104*16d86563SAlexander Pyhalov struct _cv_state *st;
105*16d86563SAlexander Pyhalov {
106*16d86563SAlexander Pyhalov 	register char	c;		/* input character */
107*16d86563SAlexander Pyhalov 	register int	cur_input;	/* type of input character */
108*16d86563SAlexander Pyhalov 	register KCHAR	code_2;		/* 2-byte char converted */
109*16d86563SAlexander Pyhalov 	KCHAR		make_2();
110*16d86563SAlexander Pyhalov 
111*16d86563SAlexander Pyhalov 	if(temp_flag == 1){
112*16d86563SAlexander Pyhalov 		code_2 = han_temp;
113*16d86563SAlexander Pyhalov 		temp_flag = 0;
114*16d86563SAlexander Pyhalov 		return(code_2);
115*16d86563SAlexander Pyhalov 	}
116*16d86563SAlexander Pyhalov 	for(;;){		/* read 1 byte */
117*16d86563SAlexander Pyhalov 		if (st->ibuf_left) {
118*16d86563SAlexander Pyhalov 			c = st->temp_ibuf[st->istart];
119*16d86563SAlexander Pyhalov 			st->istart++;
120*16d86563SAlexander Pyhalov 			if (st->istart >= st->iend) {
121*16d86563SAlexander Pyhalov 				st->ibuf_left = 0;
122*16d86563SAlexander Pyhalov 				st->istart = 0;
123*16d86563SAlexander Pyhalov 				st->iend = 0;
124*16d86563SAlexander Pyhalov 			}
125*16d86563SAlexander Pyhalov 		} else {
126*16d86563SAlexander Pyhalov 			c = **my_inbuf;
127*16d86563SAlexander Pyhalov 			(*my_inbuf)++, (*my_inbytesleft)--;
128*16d86563SAlexander Pyhalov 		}
129*16d86563SAlexander Pyhalov 				/* run Hangul automata */
130*16d86563SAlexander Pyhalov 		cur_input = input_typ(c);
131*16d86563SAlexander Pyhalov 		cur_act = next_act[cur_stat][cur_input];
132*16d86563SAlexander Pyhalov 		cur_stat = next_stat[cur_stat][cur_input];
133*16d86563SAlexander Pyhalov 		switch (cur_act) {
134*16d86563SAlexander Pyhalov 			case 1:
135*16d86563SAlexander Pyhalov 				break;
136*16d86563SAlexander Pyhalov 			case 2:
137*16d86563SAlexander Pyhalov 				break;
138*16d86563SAlexander Pyhalov 			case 3:
139*16d86563SAlexander Pyhalov 				break;
140*16d86563SAlexander Pyhalov 			case 4:
141*16d86563SAlexander Pyhalov 				return(0x0000 | c);
142*16d86563SAlexander Pyhalov 			case 5:
143*16d86563SAlexander Pyhalov 				han_buf[1] = c;
144*16d86563SAlexander Pyhalov 				break;
145*16d86563SAlexander Pyhalov 			case 6:
146*16d86563SAlexander Pyhalov 				han_buf[2] = c;
147*16d86563SAlexander Pyhalov 				if((code_2=packtocomp(make_2(2))) == 0xFFFF){
148*16d86563SAlexander Pyhalov 					han_buf[2] = 0;
149*16d86563SAlexander Pyhalov 					code_2 = make_2(0);
150*16d86563SAlexander Pyhalov 					if (st->ibuf_left) {
151*16d86563SAlexander Pyhalov 						st->istart--;
152*16d86563SAlexander Pyhalov 					} else {
153*16d86563SAlexander Pyhalov 						(*my_inbuf)--, (*my_inbytesleft)++;
154*16d86563SAlexander Pyhalov 					}
155*16d86563SAlexander Pyhalov 					cur_stat = 2;
156*16d86563SAlexander Pyhalov 					return(code_2);
157*16d86563SAlexander Pyhalov 				}
158*16d86563SAlexander Pyhalov 				break;
159*16d86563SAlexander Pyhalov 			case 7:
160*16d86563SAlexander Pyhalov 				han_buf[3] = c;
161*16d86563SAlexander Pyhalov 				if((code_2=packtocomp(make_2(2))) == 0xFFFF){
162*16d86563SAlexander Pyhalov 					han_buf[3] = 0;
163*16d86563SAlexander Pyhalov 					code_2 = make_2(0);
164*16d86563SAlexander Pyhalov 					if (st->ibuf_left) {
165*16d86563SAlexander Pyhalov 						st->istart--;
166*16d86563SAlexander Pyhalov 					} else {
167*16d86563SAlexander Pyhalov 						(*my_inbuf)--, (*my_inbytesleft)++;
168*16d86563SAlexander Pyhalov 					}
169*16d86563SAlexander Pyhalov 					cur_stat = 2;
170*16d86563SAlexander Pyhalov 					return(code_2);
171*16d86563SAlexander Pyhalov 				}
172*16d86563SAlexander Pyhalov 				break;
173*16d86563SAlexander Pyhalov 			case 8:
174*16d86563SAlexander Pyhalov 				han_buf[4] = c;
175*16d86563SAlexander Pyhalov 				if((code_2=packtocomp(make_2(2))) == 0xFFFF){
176*16d86563SAlexander Pyhalov 					han_buf[4] = 0;
177*16d86563SAlexander Pyhalov 					code_2 = make_2(0);
178*16d86563SAlexander Pyhalov 					cur_stat = 2;
179*16d86563SAlexander Pyhalov 					if (st->ibuf_left) {
180*16d86563SAlexander Pyhalov 						st->istart--;
181*16d86563SAlexander Pyhalov 					} else {
182*16d86563SAlexander Pyhalov 						(*my_inbuf)--, (*my_inbytesleft)++;
183*16d86563SAlexander Pyhalov 					}
184*16d86563SAlexander Pyhalov 					return(code_2);
185*16d86563SAlexander Pyhalov 				}
186*16d86563SAlexander Pyhalov 				break;
187*16d86563SAlexander Pyhalov 			case 9:
188*16d86563SAlexander Pyhalov 				code_2 = make_2(0);
189*16d86563SAlexander Pyhalov 				han_buf[1] = c;
190*16d86563SAlexander Pyhalov 				return(code_2);
191*16d86563SAlexander Pyhalov 			case 10:
192*16d86563SAlexander Pyhalov 				code_2 = make_2(0);
193*16d86563SAlexander Pyhalov 				han_buf[2] = c;
194*16d86563SAlexander Pyhalov 				han_temp = make_2(0);
195*16d86563SAlexander Pyhalov 				temp_flag = 1;
196*16d86563SAlexander Pyhalov 				return(code_2);
197*16d86563SAlexander Pyhalov 			case 11:			/* Unused */
198*16d86563SAlexander Pyhalov 				return(make_2(0));
199*16d86563SAlexander Pyhalov 			case 12:
200*16d86563SAlexander Pyhalov 				return(make_2(0));
201*16d86563SAlexander Pyhalov 			case 13:
202*16d86563SAlexander Pyhalov 				code_2 = make_2(0);
203*16d86563SAlexander Pyhalov 				han_temp = (0x0000 | c);
204*16d86563SAlexander Pyhalov 				temp_flag = 1;
205*16d86563SAlexander Pyhalov 				return(code_2);
206*16d86563SAlexander Pyhalov 			case 14:
207*16d86563SAlexander Pyhalov 				han_buf[0] = han_buf[2]; /* Save */
208*16d86563SAlexander Pyhalov 				han_buf[2] = vowel_mix(han_buf[2],c);
209*16d86563SAlexander Pyhalov 				if((code_2=packtocomp(make_2(2))) == 0xFFFF){
210*16d86563SAlexander Pyhalov 					han_buf[2] = han_buf[0]; /* Recover */
211*16d86563SAlexander Pyhalov 					code_2 = make_2(0);
212*16d86563SAlexander Pyhalov 					if (st->ibuf_left) {
213*16d86563SAlexander Pyhalov 						st->istart--;
214*16d86563SAlexander Pyhalov 					} else {
215*16d86563SAlexander Pyhalov 						(*my_inbuf)--, (*my_inbytesleft)++;
216*16d86563SAlexander Pyhalov 					}
217*16d86563SAlexander Pyhalov 					cur_stat = 2;
218*16d86563SAlexander Pyhalov 					return(code_2);
219*16d86563SAlexander Pyhalov 				}
220*16d86563SAlexander Pyhalov 				break;
221*16d86563SAlexander Pyhalov 			case 15:
222*16d86563SAlexander Pyhalov 				han_buf[2] = c;
223*16d86563SAlexander Pyhalov 				return(make_2(0));
224*16d86563SAlexander Pyhalov 			case 16:
225*16d86563SAlexander Pyhalov 				return(make_2(0));
226*16d86563SAlexander Pyhalov 			case 17:
227*16d86563SAlexander Pyhalov 				code_2 = make_2(1);
228*16d86563SAlexander Pyhalov 				han_buf[2] = c;
229*16d86563SAlexander Pyhalov 				return(code_2);
230*16d86563SAlexander Pyhalov 			default:
231*16d86563SAlexander Pyhalov 				break;
232*16d86563SAlexander Pyhalov 		}
233*16d86563SAlexander Pyhalov 	}
234*16d86563SAlexander Pyhalov }
235*16d86563SAlexander Pyhalov 
input_typ(char c)236*16d86563SAlexander Pyhalov int input_typ(char c)
237*16d86563SAlexander Pyhalov {
238*16d86563SAlexander Pyhalov 	switch(c) {
239*16d86563SAlexander Pyhalov 		case D_DI_GUD:	/* double di-gud	0x48 'H' */
240*16d86563SAlexander Pyhalov 		case D_BI_UB:	/* double bi-ub		0x52 'S' */
241*16d86563SAlexander Pyhalov 		case D_JI_UD:	/* double ji-ud		0x59 'Y' */
242*16d86563SAlexander Pyhalov 			return(1);
243*16d86563SAlexander Pyhalov 
244*16d86563SAlexander Pyhalov 		case GI_UG:	/* gi-ug 		0x41 'A' */
245*16d86563SAlexander Pyhalov 			return(2);
246*16d86563SAlexander Pyhalov 
247*16d86563SAlexander Pyhalov 		case NI_UN:	/* ni-un		0x44 'D' */
248*16d86563SAlexander Pyhalov 			return(3);
249*16d86563SAlexander Pyhalov 
250*16d86563SAlexander Pyhalov 		case RI_UL:	/* ri-ul		0x49 'I' */
251*16d86563SAlexander Pyhalov 			return(4);
252*16d86563SAlexander Pyhalov 
253*16d86563SAlexander Pyhalov 		case BI_UB:	/* bi-ub		0x52 'R' */
254*16d86563SAlexander Pyhalov 			return(5);
255*16d86563SAlexander Pyhalov 
256*16d86563SAlexander Pyhalov 		case D_GI_UG:	/* double gi-ug		0x42 'B' */
257*16d86563SAlexander Pyhalov 		case DI_GUD:	/* di-gud		0x47 'G' */
258*16d86563SAlexander Pyhalov 		case D_SI_OD:	/* double si-od		0x56 'V' */
259*16d86563SAlexander Pyhalov 		case YI_UNG:	/* yi-ung		0x57 'W' */
260*16d86563SAlexander Pyhalov 		case CHI_UD:	/* chi-ud		0x5a 'Z' */
261*16d86563SAlexander Pyhalov 		case KI_UK:	/* ki-uk		0x5b '[' */
262*16d86563SAlexander Pyhalov 			return(6);
263*16d86563SAlexander Pyhalov 
264*16d86563SAlexander Pyhalov 		case SI_OD:	/* si-od		0x55 'U' */
265*16d86563SAlexander Pyhalov 			return(7);
266*16d86563SAlexander Pyhalov 
267*16d86563SAlexander Pyhalov 		case JI_UD:	/* ji_ud		0x58 'X' */
268*16d86563SAlexander Pyhalov 			return(8);
269*16d86563SAlexander Pyhalov 
270*16d86563SAlexander Pyhalov 		case HI_UD:	/* hi-ud		0x5e '^' */
271*16d86563SAlexander Pyhalov 			return(9);
272*16d86563SAlexander Pyhalov 
273*16d86563SAlexander Pyhalov 		case MI_UM:	/* mi-um		0x51 'Q' */
274*16d86563SAlexander Pyhalov 		case PI_UP:	/* pi-up		0x5d ']' */
275*16d86563SAlexander Pyhalov 		case TI_GUT:	/* ti-gut		0x51 '\' */
276*16d86563SAlexander Pyhalov 			return(10);
277*16d86563SAlexander Pyhalov 
278*16d86563SAlexander Pyhalov 		case YEA:	/* yea 			0x6b 'k' */
279*16d86563SAlexander Pyhalov 		case IA:	/* ia			0x64 'd' */
280*16d86563SAlexander Pyhalov 		case IYAI:	/* iyai			0x65 'e' */
281*16d86563SAlexander Pyhalov 		case IE:	/* ie			0x6a 'j' */
282*16d86563SAlexander Pyhalov 		case YO:	/* yo			0x72 'r' */
283*16d86563SAlexander Pyhalov 		case YU:	/* yu			0x77 'g' */
284*16d86563SAlexander Pyhalov 			return(11);
285*16d86563SAlexander Pyhalov 
286*16d86563SAlexander Pyhalov 		case A:		/* a			0x62 'b' */
287*16d86563SAlexander Pyhalov 		case AE:	/* ae			0x63 'c' */
288*16d86563SAlexander Pyhalov 			return(12);
289*16d86563SAlexander Pyhalov 
290*16d86563SAlexander Pyhalov 		case E:		/* e			0x66 'f' */
291*16d86563SAlexander Pyhalov 		case EA:	/* ea			0x67 'g' */
292*16d86563SAlexander Pyhalov 			return(13);
293*16d86563SAlexander Pyhalov 
294*16d86563SAlexander Pyhalov 		case I:		/* i			0x7c '|' */
295*16d86563SAlexander Pyhalov 			return(14);
296*16d86563SAlexander Pyhalov 
297*16d86563SAlexander Pyhalov 		case O:		/* o			0x6c 'l' */
298*16d86563SAlexander Pyhalov 			return(15);
299*16d86563SAlexander Pyhalov 
300*16d86563SAlexander Pyhalov 		case U:		/* u			0x73 's' */
301*16d86563SAlexander Pyhalov 			return(16);
302*16d86563SAlexander Pyhalov 
303*16d86563SAlexander Pyhalov 		case EU:	/* eu			0x7a 'z' */
304*16d86563SAlexander Pyhalov 			return(17);
305*16d86563SAlexander Pyhalov 
306*16d86563SAlexander Pyhalov 		default:
307*16d86563SAlexander Pyhalov 			if(c == '\016')	/* Ctrl-N Hangul delimiter */
308*16d86563SAlexander Pyhalov 				return(18);
309*16d86563SAlexander Pyhalov 			if(c == '\017' || c == '\024')	/* Ctrl-O Ctrl-T English delimiter */
310*16d86563SAlexander Pyhalov 				return(19);
311*16d86563SAlexander Pyhalov 			return(20);
312*16d86563SAlexander Pyhalov 	}
313*16d86563SAlexander Pyhalov }
314*16d86563SAlexander Pyhalov 
315*16d86563SAlexander Pyhalov /* This routine make 2-byte code from hangul buffer, if parameter (1)
316*16d86563SAlexander Pyhalov     is given, han_buf[4] or han_buf[3] is eliminated before making a
317*16d86563SAlexander Pyhalov     2-byte code and inserted han_buf[1] after 2-byte code is made */
318*16d86563SAlexander Pyhalov 
make_2(n)319*16d86563SAlexander Pyhalov KCHAR make_2(n)
320*16d86563SAlexander Pyhalov register int n;
321*16d86563SAlexander Pyhalov {
322*16d86563SAlexander Pyhalov 	register KCHAR code_2 = 0;
323*16d86563SAlexander Pyhalov 	register char tmp = 0;
324*16d86563SAlexander Pyhalov 	register int i;
325*16d86563SAlexander Pyhalov 
326*16d86563SAlexander Pyhalov 			/* if n = 1, save han_buf[3] or han_buf[4] */
327*16d86563SAlexander Pyhalov 	if (n == 1) {
328*16d86563SAlexander Pyhalov 		if(han_buf[4]){
329*16d86563SAlexander Pyhalov 			tmp = han_buf[4];
330*16d86563SAlexander Pyhalov 			han_buf[4] = 0;
331*16d86563SAlexander Pyhalov 		} else{
332*16d86563SAlexander Pyhalov 			tmp = han_buf[3];
333*16d86563SAlexander Pyhalov 			han_buf[3] = 0;
334*16d86563SAlexander Pyhalov 		}
335*16d86563SAlexander Pyhalov 	}
336*16d86563SAlexander Pyhalov 
337*16d86563SAlexander Pyhalov 	if(han_buf[1] > BEG_OF_CONSO){
338*16d86563SAlexander Pyhalov 		code_2 = code_2 | X32_19[han_buf[1] - BEG_OF_CONSO];
339*16d86563SAlexander Pyhalov 	} else {
340*16d86563SAlexander Pyhalov 		code_2 = 0x9;
341*16d86563SAlexander Pyhalov 	}
342*16d86563SAlexander Pyhalov 
343*16d86563SAlexander Pyhalov 	if(han_buf[2] > BEG_OF_VOW){
344*16d86563SAlexander Pyhalov 		code_2 = ((code_2 << 5) | X32_21[han_buf[2] - BEG_OF_VOW]);
345*16d86563SAlexander Pyhalov 	} else{
346*16d86563SAlexander Pyhalov 		code_2 = (code_2 << 5) | 0x1;
347*16d86563SAlexander Pyhalov 	}
348*16d86563SAlexander Pyhalov 
349*16d86563SAlexander Pyhalov 	if(han_buf[3] > BEG_OF_CONSO){
350*16d86563SAlexander Pyhalov 		code_2 = ((code_2 << 5) | X32_28[han_buf[3] - BEG_OF_CONSO]);
351*16d86563SAlexander Pyhalov 	} else {
352*16d86563SAlexander Pyhalov 		code_2 = code_2 << 5 | 0x01;
353*16d86563SAlexander Pyhalov 	}
354*16d86563SAlexander Pyhalov 
355*16d86563SAlexander Pyhalov 	if(han_buf[4] > BEG_OF_CONSO){
356*16d86563SAlexander Pyhalov 		switch(han_buf[3]){
357*16d86563SAlexander Pyhalov 				/* process gi-ug si-od */
358*16d86563SAlexander Pyhalov 			case GI_UG:
359*16d86563SAlexander Pyhalov 				if(han_buf[4] == SI_OD){
360*16d86563SAlexander Pyhalov 					code_2 += 2;
361*16d86563SAlexander Pyhalov 				}
362*16d86563SAlexander Pyhalov 				break;
363*16d86563SAlexander Pyhalov 
364*16d86563SAlexander Pyhalov 				/* process ni-un zi-ud, ni-un hi-ud */
365*16d86563SAlexander Pyhalov 			case NI_UN:
366*16d86563SAlexander Pyhalov 				switch (han_buf[4]) {
367*16d86563SAlexander Pyhalov 				case JI_UD:
368*16d86563SAlexander Pyhalov 					code_2++;
369*16d86563SAlexander Pyhalov 					break;
370*16d86563SAlexander Pyhalov 				case HI_UD:
371*16d86563SAlexander Pyhalov 					code_2 += 2;
372*16d86563SAlexander Pyhalov 					break;
373*16d86563SAlexander Pyhalov 				default:
374*16d86563SAlexander Pyhalov 					break;
375*16d86563SAlexander Pyhalov 				}
376*16d86563SAlexander Pyhalov 				break;
377*16d86563SAlexander Pyhalov 
378*16d86563SAlexander Pyhalov 				/* process ri-ul gi-ug, ri-ul mi-um,
379*16d86563SAlexander Pyhalov 				     ri-ul bi-ub, ri-ul si-od, ri-ul ti-ut,
380*16d86563SAlexander Pyhalov 				     ri-ul pi-up, ri-ul hi-ud */
381*16d86563SAlexander Pyhalov 			case RI_UL:
382*16d86563SAlexander Pyhalov 				switch (han_buf[4]) {
383*16d86563SAlexander Pyhalov 				case GI_UG:
384*16d86563SAlexander Pyhalov 					code_2++;
385*16d86563SAlexander Pyhalov 					break;
386*16d86563SAlexander Pyhalov 
387*16d86563SAlexander Pyhalov 				case MI_UM:
388*16d86563SAlexander Pyhalov 					code_2 += 2;
389*16d86563SAlexander Pyhalov 					break;
390*16d86563SAlexander Pyhalov 
391*16d86563SAlexander Pyhalov 				case BI_UB:
392*16d86563SAlexander Pyhalov 					code_2 += 3;
393*16d86563SAlexander Pyhalov 					break;
394*16d86563SAlexander Pyhalov 
395*16d86563SAlexander Pyhalov 				case SI_OD:
396*16d86563SAlexander Pyhalov 					code_2 += 4;
397*16d86563SAlexander Pyhalov 					break;
398*16d86563SAlexander Pyhalov 
399*16d86563SAlexander Pyhalov 				case TI_GUT:
400*16d86563SAlexander Pyhalov 					code_2 += 5;
401*16d86563SAlexander Pyhalov 					break;
402*16d86563SAlexander Pyhalov 
403*16d86563SAlexander Pyhalov 				case PI_UP:
404*16d86563SAlexander Pyhalov 					code_2 += 6;
405*16d86563SAlexander Pyhalov 					break;
406*16d86563SAlexander Pyhalov 
407*16d86563SAlexander Pyhalov 				case HI_UD:
408*16d86563SAlexander Pyhalov 					code_2 += 7;
409*16d86563SAlexander Pyhalov 					break;
410*16d86563SAlexander Pyhalov 
411*16d86563SAlexander Pyhalov 				default:
412*16d86563SAlexander Pyhalov 					break;
413*16d86563SAlexander Pyhalov 				}
414*16d86563SAlexander Pyhalov 				break;
415*16d86563SAlexander Pyhalov 
416*16d86563SAlexander Pyhalov 				/* process bi-ub si-od */
417*16d86563SAlexander Pyhalov 			case BI_UB:
418*16d86563SAlexander Pyhalov 				if(han_buf[4] == SI_OD){
419*16d86563SAlexander Pyhalov 					code_2++;
420*16d86563SAlexander Pyhalov 				}
421*16d86563SAlexander Pyhalov 				break;
422*16d86563SAlexander Pyhalov 
423*16d86563SAlexander Pyhalov 				/* process si-od si-od */
424*16d86563SAlexander Pyhalov 			case SI_OD:
425*16d86563SAlexander Pyhalov 				if(han_buf[4] == SI_OD){
426*16d86563SAlexander Pyhalov 					code_2++;
427*16d86563SAlexander Pyhalov 				}
428*16d86563SAlexander Pyhalov 				break;
429*16d86563SAlexander Pyhalov 		}
430*16d86563SAlexander Pyhalov 	}
431*16d86563SAlexander Pyhalov 
432*16d86563SAlexander Pyhalov 				/* set 1st 7-bit of code_2 */
433*16d86563SAlexander Pyhalov 	code_2 = code_2 | 0x8000;
434*16d86563SAlexander Pyhalov 
435*16d86563SAlexander Pyhalov 				/* initialize Hangul buffer */
436*16d86563SAlexander Pyhalov 	if(n != 2)
437*16d86563SAlexander Pyhalov 		for(i = 0; i < 5; i++){
438*16d86563SAlexander Pyhalov 			han_buf[i] = 0;
439*16d86563SAlexander Pyhalov 		}
440*16d86563SAlexander Pyhalov 
441*16d86563SAlexander Pyhalov 	if(n == 1){			/* restore Hangul temporary */
442*16d86563SAlexander Pyhalov 		han_buf[1] = tmp;
443*16d86563SAlexander Pyhalov 	}
444*16d86563SAlexander Pyhalov 
445*16d86563SAlexander Pyhalov 	return(code_2);
446*16d86563SAlexander Pyhalov }
447*16d86563SAlexander Pyhalov 
448*16d86563SAlexander Pyhalov /* This routine make double vowel from han_buf[2] and input character c */
449*16d86563SAlexander Pyhalov 
450*16d86563SAlexander Pyhalov #ifndef SUNVIEW
vowel_mix(char c1,char c2)451*16d86563SAlexander Pyhalov char vowel_mix(char c1,char c2)
452*16d86563SAlexander Pyhalov {
453*16d86563SAlexander Pyhalov 	register char c = '\0';	/* result double vowel */
454*16d86563SAlexander Pyhalov 
455*16d86563SAlexander Pyhalov 	switch(c1){
456*16d86563SAlexander Pyhalov 				/* process o-a, o-ae, o-i */
457*16d86563SAlexander Pyhalov 		case O:
458*16d86563SAlexander Pyhalov 			switch (c2) {
459*16d86563SAlexander Pyhalov 			case A:
460*16d86563SAlexander Pyhalov 				c = c1 + 1;
461*16d86563SAlexander Pyhalov 				break;
462*16d86563SAlexander Pyhalov 			case AE:
463*16d86563SAlexander Pyhalov 				c = c1 + 2;
464*16d86563SAlexander Pyhalov 				break;
465*16d86563SAlexander Pyhalov 			case I:
466*16d86563SAlexander Pyhalov 				c = c1 + 3;
467*16d86563SAlexander Pyhalov 				break;
468*16d86563SAlexander Pyhalov 			}
469*16d86563SAlexander Pyhalov 			break;
470*16d86563SAlexander Pyhalov 
471*16d86563SAlexander Pyhalov 				/* process u-oe, u-e, u-i */
472*16d86563SAlexander Pyhalov 		case U:
473*16d86563SAlexander Pyhalov 			switch (c2) {
474*16d86563SAlexander Pyhalov 			case E:
475*16d86563SAlexander Pyhalov 				c = c1 + 1;
476*16d86563SAlexander Pyhalov 				break;
477*16d86563SAlexander Pyhalov 			case EA:
478*16d86563SAlexander Pyhalov 				c = c1 + 2;
479*16d86563SAlexander Pyhalov 				break;
480*16d86563SAlexander Pyhalov 			case I:
481*16d86563SAlexander Pyhalov 				c = c1 + 3;
482*16d86563SAlexander Pyhalov 				break;
483*16d86563SAlexander Pyhalov 			}
484*16d86563SAlexander Pyhalov 			break;
485*16d86563SAlexander Pyhalov 
486*16d86563SAlexander Pyhalov 				/* process eu-i */
487*16d86563SAlexander Pyhalov 		case EU:
488*16d86563SAlexander Pyhalov 			if(c2 == I){
489*16d86563SAlexander Pyhalov 				c = c1 + 1;
490*16d86563SAlexander Pyhalov 			}
491*16d86563SAlexander Pyhalov 			break;
492*16d86563SAlexander Pyhalov 	}
493*16d86563SAlexander Pyhalov 	return(c);
494*16d86563SAlexander Pyhalov }
495*16d86563SAlexander Pyhalov #endif
496