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  * Copyright (c) 1994 by Sun Microsystems, Inc.
23*16d86563SAlexander Pyhalov  */
24*16d86563SAlexander Pyhalov 
25*16d86563SAlexander Pyhalov 
26*16d86563SAlexander Pyhalov 
27*16d86563SAlexander Pyhalov #ifndef _NBYTE2UTF_H_
28*16d86563SAlexander Pyhalov #define _NBYTE2UTF_H_
29*16d86563SAlexander Pyhalov 
30*16d86563SAlexander Pyhalov 
31*16d86563SAlexander Pyhalov #include "hangulcode.h"
32*16d86563SAlexander Pyhalov 
33*16d86563SAlexander Pyhalov typedef struct __conv_desc {
34*16d86563SAlexander Pyhalov 	int	cur_stat;
35*16d86563SAlexander Pyhalov 	int	cur_act;
36*16d86563SAlexander Pyhalov 	char	hbuf[5];
37*16d86563SAlexander Pyhalov } _conv_desc;
38*16d86563SAlexander Pyhalov 
39*16d86563SAlexander Pyhalov int next_stat[14][21]={	/* next state table[current state][input] */
40*16d86563SAlexander Pyhalov 	/* input
41*16d86563SAlexander Pyhalov 	  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 */
42*16d86563SAlexander Pyhalov /*state*/
43*16d86563SAlexander Pyhalov /* 0 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
44*16d86563SAlexander Pyhalov /* 1 */ { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1},
45*16d86563SAlexander Pyhalov /* 2 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 1, 2},
46*16d86563SAlexander Pyhalov /* 3 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 1, 2},
47*16d86563SAlexander Pyhalov /* 4 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
48*16d86563SAlexander Pyhalov /* 5 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 8, 3, 8, 3, 3, 3, 2, 1, 2},
49*16d86563SAlexander Pyhalov /* 6 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 3, 8, 8, 3, 3, 3, 2, 1, 2},
50*16d86563SAlexander Pyhalov /* 7 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 3, 3, 8, 3, 3, 3, 2, 1, 2},
51*16d86563SAlexander Pyhalov /* 8 */ { 0, 4, 9,10,11,12,13,13,13,13,13, 3, 3, 3, 3, 3, 3, 3, 2, 1, 2},
52*16d86563SAlexander Pyhalov /* 9 */ { 0, 4, 4, 4, 4, 4, 4,13, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
53*16d86563SAlexander Pyhalov /*10 */ { 0, 4, 4, 4, 4, 4, 4, 4,13,13, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
54*16d86563SAlexander Pyhalov /*11 */ { 0, 4,13, 4, 4,13, 4,13, 4,13,13, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
55*16d86563SAlexander Pyhalov /*12 */ { 0, 4, 4, 4, 4, 4, 4,13, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2},
56*16d86563SAlexander Pyhalov /*13 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 5, 6, 7, 2, 1, 2}
57*16d86563SAlexander Pyhalov };
58*16d86563SAlexander Pyhalov 
59*16d86563SAlexander Pyhalov int next_act[14][21]={	/* next action table[current state][input]  */
60*16d86563SAlexander Pyhalov 	/*input
61*16d86563SAlexander Pyhalov 	  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 */
62*16d86563SAlexander Pyhalov /*state*/
63*16d86563SAlexander Pyhalov /* 0 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
64*16d86563SAlexander Pyhalov /* 1 */ { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4},
65*16d86563SAlexander Pyhalov /* 2 */ { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,15,15,15,15,15,15,15, 1, 3, 4},
66*16d86563SAlexander Pyhalov /* 3 */ { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,15,15,15,15,15,15,15, 1, 3, 4},
67*16d86563SAlexander Pyhalov /* 4 */ { 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 6, 6, 6, 6, 6,16,12,13},
68*16d86563SAlexander Pyhalov /* 5 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,14,10,14,10,10,10,16,12,13},
69*16d86563SAlexander Pyhalov /* 6 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,10,14,14,10,10,10,16,12,13},
70*16d86563SAlexander Pyhalov /* 7 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,10,10,14,10,10,10,16,12,13},
71*16d86563SAlexander Pyhalov /* 8 */ { 0, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7,10,10,10,10,10,10,10,16,12,13},
72*16d86563SAlexander Pyhalov /* 9 */ { 0, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9,17,17,17,17,17,17,17,16,12,13},
73*16d86563SAlexander Pyhalov /*10 */ { 0, 9, 9, 9, 9, 9, 9, 9, 8, 8, 9,17,17,17,17,17,17,17,16,12,13},
74*16d86563SAlexander Pyhalov /*11 */ { 0, 9, 8, 9, 9, 8, 9, 8, 9, 8, 8,17,17,17,17,17,17,17,16,12,13},
75*16d86563SAlexander Pyhalov /*12 */ { 0, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9,17,17,17,17,17,17,17,16,12,13},
76*16d86563SAlexander Pyhalov /*13 */ { 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,17,17,17,17,17,17,17,16,12,13}
77*16d86563SAlexander Pyhalov };
78*16d86563SAlexander Pyhalov 
79*16d86563SAlexander Pyhalov #define	ADD_CONVERTED_CODE(K, ADD)\
80*16d86563SAlexander Pyhalov 	{\
81*16d86563SAlexander Pyhalov 		char	temp[5];\
82*16d86563SAlexander Pyhalov 		\
83*16d86563SAlexander Pyhalov 		temp[1] = cd->hbuf[1];\
84*16d86563SAlexander Pyhalov 		temp[2] = cd->hbuf[2];\
85*16d86563SAlexander Pyhalov 		temp[3] = cd->hbuf[3];\
86*16d86563SAlexander Pyhalov 		temp[4] = cd->hbuf[4];\
87*16d86563SAlexander Pyhalov 		if ((result = _johap_to_utf8(&ci, &v, &cf,\
88*16d86563SAlexander Pyhalov 				make_johap_code((K), temp))) == HANGUL)\
89*16d86563SAlexander Pyhalov 		{\
90*16d86563SAlexander Pyhalov 			if ((obtail - ob) < ((cf ? 9 : 6) + (ADD)))\
91*16d86563SAlexander Pyhalov 			{\
92*16d86563SAlexander Pyhalov 				errno = E2BIG;\
93*16d86563SAlexander Pyhalov 				ret_val = (size_t)-1;\
94*16d86563SAlexander Pyhalov 				break;\
95*16d86563SAlexander Pyhalov 			}\
96*16d86563SAlexander Pyhalov 			cd->hbuf[1] = temp[1];\
97*16d86563SAlexander Pyhalov 			cd->hbuf[2] = temp[2];\
98*16d86563SAlexander Pyhalov 			cd->hbuf[3] = temp[3];\
99*16d86563SAlexander Pyhalov 			cd->hbuf[4] = temp[4];\
100*16d86563SAlexander Pyhalov 			*ob++ = (char)((ci >> 16) & 0xFF);\
101*16d86563SAlexander Pyhalov 			*ob++ = (char)((ci >> 8) & 0xFF);\
102*16d86563SAlexander Pyhalov 			*ob++ = (char)(ci & 0xFF);\
103*16d86563SAlexander Pyhalov 			*ob++ = (char)((v >> 16) & 0xFF);\
104*16d86563SAlexander Pyhalov 			*ob++ = (char)((v >> 8) & 0xFF);\
105*16d86563SAlexander Pyhalov 			*ob++ = (char)(v & 0xFF);\
106*16d86563SAlexander Pyhalov 			if (cf)\
107*16d86563SAlexander Pyhalov 			{\
108*16d86563SAlexander Pyhalov 				*ob++ = (char)((cf >> 16) & 0xFF);\
109*16d86563SAlexander Pyhalov 				*ob++ = (char)((cf >> 8) & 0xFF);\
110*16d86563SAlexander Pyhalov 				*ob++ = (char)(cf & 0xFF);\
111*16d86563SAlexander Pyhalov 			}\
112*16d86563SAlexander Pyhalov 		}\
113*16d86563SAlexander Pyhalov 		else if (result == FAILED)\
114*16d86563SAlexander Pyhalov 		{\
115*16d86563SAlexander Pyhalov 			if ((obtail - ob) < 3)\
116*16d86563SAlexander Pyhalov 			{\
117*16d86563SAlexander Pyhalov 				errno = E2BIG;\
118*16d86563SAlexander Pyhalov 				ret_val = (size_t)-1;\
119*16d86563SAlexander Pyhalov 				break;\
120*16d86563SAlexander Pyhalov 			}\
121*16d86563SAlexander Pyhalov 			*ob++ = UTF8_NON_ID_CHAR1;\
122*16d86563SAlexander Pyhalov 			*ob++ = UTF8_NON_ID_CHAR2;\
123*16d86563SAlexander Pyhalov 			*ob++ = UTF8_NON_ID_CHAR3;\
124*16d86563SAlexander Pyhalov 			ret_val += 3;\
125*16d86563SAlexander Pyhalov 		}\
126*16d86563SAlexander Pyhalov 		else  /* result == ILLEGAL_SEQ */\
127*16d86563SAlexander Pyhalov 		{\
128*16d86563SAlexander Pyhalov 			errno = EILSEQ;\
129*16d86563SAlexander Pyhalov 			ret_val = (size_t)-1;\
130*16d86563SAlexander Pyhalov 			break;\
131*16d86563SAlexander Pyhalov 		}\
132*16d86563SAlexander Pyhalov 	}
133*16d86563SAlexander Pyhalov 
134*16d86563SAlexander Pyhalov 
135*16d86563SAlexander Pyhalov #endif	/* _NBYTE2UTF_H_ */
136