1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* Copyright 1995 by Sun Microsystems, Inc. 22 * All rights are reserved. 23 */ 24 25 #include <stdio.h> 26 #include <signal.h> 27 #include "kdefs.h" 28 #include "ktable.h" 29 30 struct _cv_state { 31 char **my_outbuf; 32 size_t *my_outbytesleft; 33 int invalid; 34 int flush_obuf; 35 char temp_obuf[5]; 36 int temp_obuf_cnt; 37 }; 38 39 void AddChar (char Char, struct _cv_state *st); 40 void echo_conso(char code, struct _cv_state *st); 41 void echo_vowel(char code, struct _cv_state *st); 42 43 44 /* write Hangul 7-bit Standard code sequences (KSC 5601) 45 * from Standard 2-byte Combination code(87-3). 46 * also handles Hangul and English display modes */ 47 48 int 49 write_21(code_2, st) 50 KCHAR code_2; 51 struct _cv_state *st; 52 { 53 register KCHAR buffer; /* buffer for Hangul code conversion */ 54 register char code_1; /* 1-byte code converted */ 55 56 buffer = Y19_32[(short)INITIAL_SOUND(code_2) - 0x09] + BEG_OF_CONSO; 57 code_1 = (char) buffer; 58 if(code_1 != BEG_OF_CONSO) 59 AddChar(code_1, st); 60 61 buffer = Y21_32[(short)MIDDLE_SOUND(code_2)] + BEG_OF_VOW; 62 code_1 = (char) buffer; 63 if(code_1 != BEG_OF_VOW) 64 echo_vowel(code_1, st); 65 66 buffer = Y28_32[FINAL_SOUND(code_2) - 0x01] + BEG_OF_CONSO; 67 code_1 = (char) buffer; 68 if(code_1 != BEG_OF_CONSO) 69 echo_conso(code_1, st); 70 71 return(1); 72 } 73 74 void 75 echo_vowel(char code, struct _cv_state* st) 76 { 77 switch (code) { 78 case O_A: /* o-a 0x6d */ 79 AddChar(O, st); 80 AddChar(A, st); 81 break; 82 83 case O_AE: /* o-ae 0x6e */ 84 AddChar(O, st); 85 AddChar(AE, st); 86 break; 87 88 case O_I: /* o-i 0x6f */ 89 AddChar(O, st); 90 AddChar(I, st); 91 break; 92 93 case U_E: /* u-e 0x74 */ 94 AddChar(U, st); 95 AddChar(E, st); 96 break; 97 98 case U_EA: /* u-ea 0x75 */ 99 AddChar(U, st); 100 AddChar(EA, st); 101 break; 102 103 case U_I: /* u-i 0x75 */ 104 AddChar(U, st); 105 AddChar(I, st); 106 break; 107 108 case EU_I: /* eu-i 0x7b */ 109 AddChar(EU, st); 110 AddChar(I, st); 111 break; 112 113 default: 114 AddChar(code, st); 115 break; 116 117 } 118 } 119 120 void 121 echo_conso(char code, struct _cv_state *st) 122 { 123 switch (code) { 124 case GIUG_SIOD: /* gi-ug and si-od 0x43 */ 125 AddChar(GI_UG, st); 126 AddChar(SI_OD, st); 127 break; 128 129 case NIUN_JIUD: /* ni-un and ji-ud 0x45 */ 130 AddChar(NI_UN, st); 131 AddChar(JI_UD, st); 132 break; 133 134 case NIUN_HIUD: /* ni-un and hi-ud 0x46 */ 135 AddChar(NI_UN, st); 136 AddChar(HI_UD, st); 137 break; 138 139 case RIUL_GIUG: /* ri-ul and gi_ug 0x4a */ 140 AddChar(RI_UL, st); 141 AddChar(GI_UG, st); 142 break; 143 144 case RIUL_MIUM: /* ri-ul and mi_um 0x4b */ 145 AddChar(RI_UL, st); 146 AddChar(MI_UM, st); 147 break; 148 149 case RIUL_BIUB: /* ri-ul and bi_ub 0x4c */ 150 AddChar(RI_UL, st); 151 AddChar(BI_UB, st); 152 break; 153 154 case RIUL_SIOD: /* ri-ul and si-od 0x4d */ 155 AddChar(RI_UL, st); 156 AddChar(SI_OD, st); 157 break; 158 159 case RIUL_TIGUT: /* ri-ul and ti-gut 0x4e */ 160 AddChar(RI_UL, st); 161 AddChar(TI_GUT, st); 162 break; 163 164 case RIUL_PIUP: /* ri-ul and pi-up 0x4f */ 165 AddChar(RI_UL, st); 166 AddChar(PI_UP, st); 167 break; 168 169 case RIUL_HIUD: /* ri-ul and hi-ud 0x50 */ 170 AddChar(RI_UL, st); 171 AddChar(HI_UD, st); 172 break; 173 174 case BIUB_SIOD: /* bi-ub and si-od 0x54 */ 175 AddChar(BI_UB, st); 176 AddChar(SI_OD, st); 177 break; 178 179 default : 180 AddChar(code, st); 181 break; 182 } 183 } 184 185 #ifdef TESTPRINT 186 main(argc,argv) /* Hangul 2-byte Combination code files 187 to 7-bit ASCII file conversion */ 188 int argc; 189 char *argv[]; 190 { 191 int fd,i,n; 192 char *myname; 193 short buf[BUFSIZ]; 194 195 myname = argv[0]; 196 if(argc == 1){ 197 printf("usage: %s file ...\n",myname); 198 exit(0); 199 } else { 200 while(--argc > 0){ 201 if((fd = open(*++argv,0)) == -1){ 202 printf("%s: can't open %s\n",myname,*argv); 203 } else { 204 while ((n = read(fd,buf,bufsize)) > 0){ 205 for (i = 0; i < n/2; i++) 206 write_21(buf[i]); 207 } 208 close(fd); 209 } 210 } 211 } 212 } 213 #endif 214