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 
22*16d86563SAlexander Pyhalov /*
23*16d86563SAlexander Pyhalov  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24*16d86563SAlexander Pyhalov  * Use is subject to license terms.
25*16d86563SAlexander Pyhalov  */
26*16d86563SAlexander Pyhalov 
27*16d86563SAlexander Pyhalov /*
28*16d86563SAlexander Pyhalov  * $Id: comp_to_pack.c,v 1.13 1997/10/31 16:16:56 binz Exp $ SMI ALE.
29*16d86563SAlexander Pyhalov  */
30*16d86563SAlexander Pyhalov 
31*16d86563SAlexander Pyhalov #include <stdio.h>
32*16d86563SAlexander Pyhalov #include <ctype.h>
33*16d86563SAlexander Pyhalov #include "kctype.h"
34*16d86563SAlexander Pyhalov #include "kdefs.h"
35*16d86563SAlexander Pyhalov #include "ktable.h"
36*16d86563SAlexander Pyhalov #ifdef TESTP
37*16d86563SAlexander Pyhalov #include <widec.h>
38*16d86563SAlexander Pyhalov #include <locale.h>
39*16d86563SAlexander Pyhalov #endif
40*16d86563SAlexander Pyhalov 
41*16d86563SAlexander Pyhalov KCHAR c2p();
42*16d86563SAlexander Pyhalov 
comptopack(comp)43*16d86563SAlexander Pyhalov KCHAR comptopack(comp)
44*16d86563SAlexander Pyhalov KCHAR comp;
45*16d86563SAlexander Pyhalov {
46*16d86563SAlexander Pyhalov     int	c;
47*16d86563SAlexander Pyhalov     KCHAR code;
48*16d86563SAlexander Pyhalov     unsigned char cnv_buf[2];
49*16d86563SAlexander Pyhalov 
50*16d86563SAlexander Pyhalov #ifdef TESTP
51*16d86563SAlexander Pyhalov     setlocale (LC_CTYPE, "");
52*16d86563SAlexander Pyhalov #endif
53*16d86563SAlexander Pyhalov 
54*16d86563SAlexander Pyhalov #if defined(i386) || defined(__ppc)
55*16d86563SAlexander Pyhalov     c = comp & 0x00ff;
56*16d86563SAlexander Pyhalov #else
57*16d86563SAlexander Pyhalov     c = comp>>8 & 0x00ff;
58*16d86563SAlexander Pyhalov #endif
59*16d86563SAlexander Pyhalov     if (iskorea1 (c)) {	/* output completion code */
60*16d86563SAlexander Pyhalov #if defined(i386) || defined(__ppc)
61*16d86563SAlexander Pyhalov 	code = (comp >> 8 & 0x00ff) | (((comp & 0x00ff) << 8) & 0xff00);
62*16d86563SAlexander Pyhalov #else
63*16d86563SAlexander Pyhalov 	code = comp;
64*16d86563SAlexander Pyhalov #endif
65*16d86563SAlexander Pyhalov 	if (iskorea2(code&BYTE_MASK)) {
66*16d86563SAlexander Pyhalov 	    /* Output hangul character */
67*16d86563SAlexander Pyhalov 	    if (ishangul(c)) {
68*16d86563SAlexander Pyhalov 		if ((code = c2p(code)) == K_ILLEGAL) {
69*16d86563SAlexander Pyhalov 			return(K_ILLEGAL);
70*16d86563SAlexander Pyhalov 		} else {
71*16d86563SAlexander Pyhalov 			cnv_buf[0] = code>>8;
72*16d86563SAlexander Pyhalov 			cnv_buf[1] = code&BYTE_MASK;
73*16d86563SAlexander Pyhalov 		}
74*16d86563SAlexander Pyhalov 
75*16d86563SAlexander Pyhalov 				/* output initial sound only case */
76*16d86563SAlexander Pyhalov 	    } else if (ishaninit(code)) {
77*16d86563SAlexander Pyhalov 		if (X32_19[code - 0xa4a0] == -1) {
78*16d86563SAlexander Pyhalov 		    return(K_ILLEGAL);
79*16d86563SAlexander Pyhalov 		} else {
80*16d86563SAlexander Pyhalov 		    cnv_buf[0] = (X32_19[code - 0xa4a0]<<2)|0x80;
81*16d86563SAlexander Pyhalov 		    cnv_buf[1] = 0x21; /* mid,last Fill */
82*16d86563SAlexander Pyhalov 		}
83*16d86563SAlexander Pyhalov 
84*16d86563SAlexander Pyhalov 		/* output middle sound only case */
85*16d86563SAlexander Pyhalov 	    } else if (ishanmid(code)) {
86*16d86563SAlexander Pyhalov 		code -= 0xa4be;
87*16d86563SAlexander Pyhalov 		code = ((code + code/3 + 1)<<5)|0xa401;
88*16d86563SAlexander Pyhalov 		/* a401 is first,last Fill */
89*16d86563SAlexander Pyhalov 		cnv_buf[0] = code>>8;
90*16d86563SAlexander Pyhalov 		cnv_buf[1] = code&BYTE_MASK;
91*16d86563SAlexander Pyhalov 
92*16d86563SAlexander Pyhalov 		/* output hanja character */
93*16d86563SAlexander Pyhalov 	    } else if (ishanja (c)) {
94*16d86563SAlexander Pyhalov 		return(K_ILLEGAL);
95*16d86563SAlexander Pyhalov 
96*16d86563SAlexander Pyhalov 		/* other case */
97*16d86563SAlexander Pyhalov 	    } else {
98*16d86563SAlexander Pyhalov 		return(K_ILLEGAL);
99*16d86563SAlexander Pyhalov 		/*
100*16d86563SAlexander Pyhalov 		cnv_buf[0] = c;
101*16d86563SAlexander Pyhalov 		cnv_buf[1] = code&BYTE_MASK;
102*16d86563SAlexander Pyhalov 		*/
103*16d86563SAlexander Pyhalov 	    }
104*16d86563SAlexander Pyhalov 
105*16d86563SAlexander Pyhalov 	} else {
106*16d86563SAlexander Pyhalov 	    return(K_ILLEGAL);
107*16d86563SAlexander Pyhalov 	}
108*16d86563SAlexander Pyhalov 
109*16d86563SAlexander Pyhalov     } else {
110*16d86563SAlexander Pyhalov         /* output normal Ascii code */
111*16d86563SAlexander Pyhalov 	return(comp);
112*16d86563SAlexander Pyhalov     }
113*16d86563SAlexander Pyhalov #if defined(i386) || defined(__ppc)
114*16d86563SAlexander Pyhalov     return(cnv_buf[1] << 8 | cnv_buf[0]);
115*16d86563SAlexander Pyhalov #else
116*16d86563SAlexander Pyhalov     return(cnv_buf[0] << 8 | cnv_buf[1]);
117*16d86563SAlexander Pyhalov #endif
118*16d86563SAlexander Pyhalov }
119*16d86563SAlexander Pyhalov 
120*16d86563SAlexander Pyhalov #ifdef TESTP
main()121*16d86563SAlexander Pyhalov main()  /* This main portion is just for test */
122*16d86563SAlexander Pyhalov {
123*16d86563SAlexander Pyhalov 	unsigned int comp2;
124*16d86563SAlexander Pyhalov 	unsigned short comb2;
125*16d86563SAlexander Pyhalov 	unsigned int wc;
126*16d86563SAlexander Pyhalov 
127*16d86563SAlexander Pyhalov 	for(;;) {
128*16d86563SAlexander Pyhalov 		wc = getwchar();
129*16d86563SAlexander Pyhalov 		wctomb((char *)&comb2, wc);
130*16d86563SAlexander Pyhalov 		comp2 = comptopack(comb2);
131*16d86563SAlexander Pyhalov 		printf("completion, combination = 0x%x  0x%x\n",
132*16d86563SAlexander Pyhalov 				comb2, comp2);
133*16d86563SAlexander Pyhalov 	}
134*16d86563SAlexander Pyhalov }
135*16d86563SAlexander Pyhalov #endif
136