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
22 /*
23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /*
28 * $Id: pack_to_comp.c,v 1.15 1997/10/31 16:17:04 binz Exp $ SMI
29 */
30
31 /* Based on Korean Standard Code 87-3 */
32
33 /*
34 * convert 2 byte combination code into
35 * 2 byte completion code
36 */
37
38 #include <stdio.h>
39 #include "kdefs.h"
40 #include "ktable.h"
41
42 #define SKIP 0xa1 + 0xff - 0xfe
43
44 #ifdef __STDC__
packtocomp(KCHAR comb2)45 KCHAR packtocomp(KCHAR comb2)
46 #else
47 KCHAR packtocomp(comb2)
48 KCHAR comb2;
49 #endif
50 {
51 KCHAR comp2 ;
52 short Ci_val; /* initial sound */
53 short V_val ; /* middle sound */
54 short Cf_val; /* final sound */
55 short mask ;
56
57 int disp, k;
58
59 long Cfbit ;
60
61 #if defined(i386) || defined(__ppc)
62 comb2 = ((comb2 & 0xff00) >> 8) | ((comb2 & 0x00ff) << 8);
63 #endif
64
65 /* Find index value of initial sound */
66 /* middle sound */
67 /* final sound */
68 /* from combination code for table */
69
70 Ci_val = INITIAL_SOUND((unsigned int)comb2) - 0x0a;
71 V_val = MIDDLE_SOUND((unsigned int)comb2) - (MIDDLE_SOUND((unsigned int)comb2)/4 + 2);
72 Cf_val = FINAL_SOUND(comb2);
73
74 /*
75 * Special case code check
76 */
77 if ( V_val < 0 ) /* just initial sound */
78 #if defined(i386) || defined(__ppc)
79 {
80 comp2 = 0xa4a0 + Y19_32[INITIAL_SOUND((unsigned int)comb2)
81 - 0x09];
82 return(((comp2 & 0x00ff) << 8)|((comp2 & 0xff00) >> 8));
83 }
84 #else
85 return(0xa4a0 + Y19_32[INITIAL_SOUND((unsigned int)comb2)
86 - 0x09]);
87 #endif
88
89 if (Ci_val < 0 ) /* just middle sound */
90 {
91 if (Cf_val <= 1)
92 #if defined(i386) || defined(__ppc)
93 {
94 comp2 = 0xa4bf + MIDDLE_SOUND((unsigned int)comb2)
95 - MIDDLE_SOUND((unsigned int)comb2)/4 - 2;
96 return(((comp2 & 0x00ff) << 8)|((comp2 & 0xff00) >> 8));
97 }
98 #else
99 return(0xa4bf + MIDDLE_SOUND((unsigned int)comb2)
100 - MIDDLE_SOUND((unsigned int)comb2)/4 - 2);
101 #endif
102 return(K_ILLEGAL);
103 }
104
105 /*
106 * Existence check
107 */
108
109 Cfbit = cmp_bitmap[Ci_val][V_val] ;
110 for (disp = 0, k = 0; k < Cf_val; k++)
111 {
112 if (Cfbit & BIT_MASK)
113 disp++ ;
114 Cfbit >>= 1 ;
115 }
116
117 if (!(Cfbit & BIT_MASK)) /* check Ci-val'th bit */
118 return(K_ILLEGAL) ; /* non-existence */
119
120 /* Find 2 byte completion code */
121
122 comp2 = cmp_srchtbl[Ci_val][V_val] + disp ;
123 mask = cmp_srchtbl[Ci_val][V_val] & 0xff ;
124
125 if ((mask + disp) > 0xfe)
126 comp2 += SKIP ;
127 #if defined(i386) || defined(__ppc)
128 return(((comp2 & 0x00ff) << 8)|((comp2 & 0xff00) >> 8));
129 #else
130 return(comp2);
131 #endif
132 }
133
134 #ifdef TESTP
main()135 main() /* This main portion is just for test */
136 {
137 unsigned int comb2, comp2;
138 for(;;) {
139 scanf("%x",&comb2);
140 comp2 = packtocomp(comb2);
141 printf("/n completion code = 0x%x\n", comp2);
142 }
143 }
144 #endif
145