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