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