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 <signal.h>
27*16d86563SAlexander Pyhalov #include "kdefs.h"
28*16d86563SAlexander Pyhalov #include "ktable.h"
29*16d86563SAlexander Pyhalov 
30*16d86563SAlexander Pyhalov struct _cv_state {
31*16d86563SAlexander Pyhalov         char **my_outbuf;
32*16d86563SAlexander Pyhalov         size_t *my_outbytesleft;
33*16d86563SAlexander Pyhalov         int invalid;
34*16d86563SAlexander Pyhalov         int flush_obuf;
35*16d86563SAlexander Pyhalov         char temp_obuf[5];
36*16d86563SAlexander Pyhalov         int temp_obuf_cnt;
37*16d86563SAlexander Pyhalov };
38*16d86563SAlexander Pyhalov 
39*16d86563SAlexander Pyhalov void AddChar (char Char, struct _cv_state *st);
40*16d86563SAlexander Pyhalov void echo_conso(char code, struct _cv_state *st);
41*16d86563SAlexander Pyhalov void echo_vowel(char code, struct _cv_state *st);
42*16d86563SAlexander Pyhalov 
43*16d86563SAlexander Pyhalov 
44*16d86563SAlexander Pyhalov /* write Hangul 7-bit Standard code sequences (KSC 5601)
45*16d86563SAlexander Pyhalov  * from Standard 2-byte Combination code(87-3).
46*16d86563SAlexander Pyhalov  * also handles Hangul and English display modes */
47*16d86563SAlexander Pyhalov 
48*16d86563SAlexander Pyhalov int
write_21(code_2,st)49*16d86563SAlexander Pyhalov write_21(code_2, st)
50*16d86563SAlexander Pyhalov KCHAR code_2;
51*16d86563SAlexander Pyhalov struct _cv_state *st;
52*16d86563SAlexander Pyhalov {
53*16d86563SAlexander Pyhalov 	register KCHAR buffer;	/* buffer for Hangul code conversion */
54*16d86563SAlexander Pyhalov 	register char code_1;	/* 1-byte code converted */
55*16d86563SAlexander Pyhalov 
56*16d86563SAlexander Pyhalov 	buffer = Y19_32[(short)INITIAL_SOUND(code_2) - 0x09] + BEG_OF_CONSO;
57*16d86563SAlexander Pyhalov 	code_1 = (char) buffer;
58*16d86563SAlexander Pyhalov 	if(code_1 != BEG_OF_CONSO)
59*16d86563SAlexander Pyhalov 		AddChar(code_1, st);
60*16d86563SAlexander Pyhalov 
61*16d86563SAlexander Pyhalov 	buffer = Y21_32[(short)MIDDLE_SOUND(code_2)] + BEG_OF_VOW;
62*16d86563SAlexander Pyhalov 	code_1 = (char) buffer;
63*16d86563SAlexander Pyhalov 	if(code_1 != BEG_OF_VOW)
64*16d86563SAlexander Pyhalov 		echo_vowel(code_1, st);
65*16d86563SAlexander Pyhalov 
66*16d86563SAlexander Pyhalov 	buffer = Y28_32[FINAL_SOUND(code_2) - 0x01] + BEG_OF_CONSO;
67*16d86563SAlexander Pyhalov 	code_1 = (char) buffer;
68*16d86563SAlexander Pyhalov 	if(code_1 != BEG_OF_CONSO)
69*16d86563SAlexander Pyhalov 		echo_conso(code_1, st);
70*16d86563SAlexander Pyhalov 
71*16d86563SAlexander Pyhalov 	return(1);
72*16d86563SAlexander Pyhalov }
73*16d86563SAlexander Pyhalov 
74*16d86563SAlexander Pyhalov void
echo_vowel(char code,struct _cv_state * st)75*16d86563SAlexander Pyhalov echo_vowel(char code, struct _cv_state* st)
76*16d86563SAlexander Pyhalov {
77*16d86563SAlexander Pyhalov 	switch (code) {
78*16d86563SAlexander Pyhalov 	case O_A:				/* o-a	0x6d */
79*16d86563SAlexander Pyhalov 		AddChar(O, st);
80*16d86563SAlexander Pyhalov 		AddChar(A, st);
81*16d86563SAlexander Pyhalov 		break;
82*16d86563SAlexander Pyhalov 
83*16d86563SAlexander Pyhalov 	case O_AE:				/* o-ae	0x6e */
84*16d86563SAlexander Pyhalov 		AddChar(O, st);
85*16d86563SAlexander Pyhalov 		AddChar(AE, st);
86*16d86563SAlexander Pyhalov 		break;
87*16d86563SAlexander Pyhalov 
88*16d86563SAlexander Pyhalov 	case O_I:				/* o-i	0x6f */
89*16d86563SAlexander Pyhalov 		AddChar(O, st);
90*16d86563SAlexander Pyhalov 		AddChar(I, st);
91*16d86563SAlexander Pyhalov 		break;
92*16d86563SAlexander Pyhalov 
93*16d86563SAlexander Pyhalov 	case U_E:				/* u-e	0x74 */
94*16d86563SAlexander Pyhalov 		AddChar(U, st);
95*16d86563SAlexander Pyhalov 		AddChar(E, st);
96*16d86563SAlexander Pyhalov 		break;
97*16d86563SAlexander Pyhalov 
98*16d86563SAlexander Pyhalov 	case U_EA:				/* u-ea	0x75 */
99*16d86563SAlexander Pyhalov 		AddChar(U, st);
100*16d86563SAlexander Pyhalov 		AddChar(EA, st);
101*16d86563SAlexander Pyhalov 		break;
102*16d86563SAlexander Pyhalov 
103*16d86563SAlexander Pyhalov 	case U_I:				/* u-i	0x75 */
104*16d86563SAlexander Pyhalov 		AddChar(U, st);
105*16d86563SAlexander Pyhalov 		AddChar(I, st);
106*16d86563SAlexander Pyhalov 		break;
107*16d86563SAlexander Pyhalov 
108*16d86563SAlexander Pyhalov 	case EU_I:				/* eu-i	0x7b */
109*16d86563SAlexander Pyhalov 		AddChar(EU, st);
110*16d86563SAlexander Pyhalov 		AddChar(I, st);
111*16d86563SAlexander Pyhalov 		break;
112*16d86563SAlexander Pyhalov 
113*16d86563SAlexander Pyhalov 	default:
114*16d86563SAlexander Pyhalov 		AddChar(code, st);
115*16d86563SAlexander Pyhalov 		break;
116*16d86563SAlexander Pyhalov 
117*16d86563SAlexander Pyhalov 	}
118*16d86563SAlexander Pyhalov }
119*16d86563SAlexander Pyhalov 
120*16d86563SAlexander Pyhalov void
echo_conso(char code,struct _cv_state * st)121*16d86563SAlexander Pyhalov echo_conso(char code, struct _cv_state *st)
122*16d86563SAlexander Pyhalov {
123*16d86563SAlexander Pyhalov 	switch (code) {
124*16d86563SAlexander Pyhalov 	case GIUG_SIOD:				/* gi-ug and si-od	0x43 */
125*16d86563SAlexander Pyhalov 		AddChar(GI_UG, st);
126*16d86563SAlexander Pyhalov 		AddChar(SI_OD, st);
127*16d86563SAlexander Pyhalov 		break;
128*16d86563SAlexander Pyhalov 
129*16d86563SAlexander Pyhalov 	case NIUN_JIUD:				/* ni-un and ji-ud	0x45 */
130*16d86563SAlexander Pyhalov 		AddChar(NI_UN, st);
131*16d86563SAlexander Pyhalov 		AddChar(JI_UD, st);
132*16d86563SAlexander Pyhalov 		break;
133*16d86563SAlexander Pyhalov 
134*16d86563SAlexander Pyhalov 	case NIUN_HIUD:				/* ni-un and hi-ud	0x46 */
135*16d86563SAlexander Pyhalov 		AddChar(NI_UN, st);
136*16d86563SAlexander Pyhalov 		AddChar(HI_UD, st);
137*16d86563SAlexander Pyhalov 		break;
138*16d86563SAlexander Pyhalov 
139*16d86563SAlexander Pyhalov 	case RIUL_GIUG:				/* ri-ul and gi_ug	0x4a */
140*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
141*16d86563SAlexander Pyhalov 		AddChar(GI_UG, st);
142*16d86563SAlexander Pyhalov 		break;
143*16d86563SAlexander Pyhalov 
144*16d86563SAlexander Pyhalov 	case RIUL_MIUM:				/* ri-ul and mi_um	0x4b */
145*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
146*16d86563SAlexander Pyhalov 		AddChar(MI_UM, st);
147*16d86563SAlexander Pyhalov 		break;
148*16d86563SAlexander Pyhalov 
149*16d86563SAlexander Pyhalov 	case RIUL_BIUB:				/* ri-ul and bi_ub	0x4c */
150*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
151*16d86563SAlexander Pyhalov 		AddChar(BI_UB, st);
152*16d86563SAlexander Pyhalov 		break;
153*16d86563SAlexander Pyhalov 
154*16d86563SAlexander Pyhalov 	case RIUL_SIOD:				/* ri-ul and si-od	0x4d */
155*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
156*16d86563SAlexander Pyhalov 		AddChar(SI_OD, st);
157*16d86563SAlexander Pyhalov 		break;
158*16d86563SAlexander Pyhalov 
159*16d86563SAlexander Pyhalov 	case RIUL_TIGUT:			/* ri-ul and ti-gut	0x4e */
160*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
161*16d86563SAlexander Pyhalov 		AddChar(TI_GUT, st);
162*16d86563SAlexander Pyhalov 		break;
163*16d86563SAlexander Pyhalov 
164*16d86563SAlexander Pyhalov 	case RIUL_PIUP:				/* ri-ul and pi-up	0x4f */
165*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
166*16d86563SAlexander Pyhalov 		AddChar(PI_UP, st);
167*16d86563SAlexander Pyhalov 		break;
168*16d86563SAlexander Pyhalov 
169*16d86563SAlexander Pyhalov 	case RIUL_HIUD:				/* ri-ul and hi-ud	0x50 */
170*16d86563SAlexander Pyhalov 		AddChar(RI_UL, st);
171*16d86563SAlexander Pyhalov 		AddChar(HI_UD, st);
172*16d86563SAlexander Pyhalov 		break;
173*16d86563SAlexander Pyhalov 
174*16d86563SAlexander Pyhalov 	case BIUB_SIOD:				/* bi-ub and si-od	0x54 */
175*16d86563SAlexander Pyhalov 		AddChar(BI_UB, st);
176*16d86563SAlexander Pyhalov 		AddChar(SI_OD, st);
177*16d86563SAlexander Pyhalov 		break;
178*16d86563SAlexander Pyhalov 
179*16d86563SAlexander Pyhalov 	default :
180*16d86563SAlexander Pyhalov 		AddChar(code, st);
181*16d86563SAlexander Pyhalov 		break;
182*16d86563SAlexander Pyhalov 	}
183*16d86563SAlexander Pyhalov }
184*16d86563SAlexander Pyhalov 
185*16d86563SAlexander Pyhalov #ifdef TESTPRINT
main(argc,argv)186*16d86563SAlexander Pyhalov main(argc,argv)		/* Hangul 2-byte Combination code files
187*16d86563SAlexander Pyhalov                            to 7-bit ASCII file conversion */
188*16d86563SAlexander Pyhalov int argc;
189*16d86563SAlexander Pyhalov char *argv[];
190*16d86563SAlexander Pyhalov {
191*16d86563SAlexander Pyhalov 	int fd,i,n;
192*16d86563SAlexander Pyhalov 	char *myname;
193*16d86563SAlexander Pyhalov 	short buf[BUFSIZ];
194*16d86563SAlexander Pyhalov 
195*16d86563SAlexander Pyhalov 	myname = argv[0];
196*16d86563SAlexander Pyhalov 	if(argc == 1){
197*16d86563SAlexander Pyhalov 		printf("usage: %s file ...\n",myname);
198*16d86563SAlexander Pyhalov 		exit(0);
199*16d86563SAlexander Pyhalov 	} else {
200*16d86563SAlexander Pyhalov 		while(--argc > 0){
201*16d86563SAlexander Pyhalov 			if((fd = open(*++argv,0)) == -1){
202*16d86563SAlexander Pyhalov 				printf("%s: can't open %s\n",myname,*argv);
203*16d86563SAlexander Pyhalov 			} else {
204*16d86563SAlexander Pyhalov 				while ((n = read(fd,buf,bufsize)) > 0){
205*16d86563SAlexander Pyhalov 					for (i = 0; i < n/2; i++)
206*16d86563SAlexander Pyhalov 						write_21(buf[i]);
207*16d86563SAlexander Pyhalov 				}
208*16d86563SAlexander Pyhalov 				close(fd);
209*16d86563SAlexander Pyhalov 			}
210*16d86563SAlexander Pyhalov 		}
211*16d86563SAlexander Pyhalov 	}
212*16d86563SAlexander Pyhalov }
213*16d86563SAlexander Pyhalov #endif
214