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) 1995 by Sun Microsystems, Inc.
23*16d86563SAlexander Pyhalov  * All Rights Reserved.
24*16d86563SAlexander Pyhalov  */
25*16d86563SAlexander Pyhalov 
26*16d86563SAlexander Pyhalov 
27*16d86563SAlexander Pyhalov #include <stdio.h>
28*16d86563SAlexander Pyhalov #include <stdlib.h>
29*16d86563SAlexander Pyhalov #include <ctype.h>
30*16d86563SAlexander Pyhalov #include <string.h>
31*16d86563SAlexander Pyhalov #include "kdefs.h"
32*16d86563SAlexander Pyhalov #include <errno.h>
33*16d86563SAlexander Pyhalov #include "ktable.h"
34*16d86563SAlexander Pyhalov #include "nbyte_euc.h"
35*16d86563SAlexander Pyhalov 
36*16d86563SAlexander Pyhalov extern KCHAR getc_12();
37*16d86563SAlexander Pyhalov extern KCHAR packtocomp();
38*16d86563SAlexander Pyhalov 
39*16d86563SAlexander Pyhalov struct _cv_state {
40*16d86563SAlexander Pyhalov 	char temp_ibuf[5];
41*16d86563SAlexander Pyhalov 	int  ibuf_left;
42*16d86563SAlexander Pyhalov 	int  istart, iend;
43*16d86563SAlexander Pyhalov 	char temp_obuf[1];
44*16d86563SAlexander Pyhalov 	int  flush_obuf;
45*16d86563SAlexander Pyhalov };
46*16d86563SAlexander Pyhalov 
47*16d86563SAlexander Pyhalov int is_SI(char **inbuf, size_t *inbytesleft, struct _cv_state *st);
48*16d86563SAlexander Pyhalov 
49*16d86563SAlexander Pyhalov static int _johap_to_wansung(unsigned short* wcode, unsigned short code);
50*16d86563SAlexander Pyhalov 
51*16d86563SAlexander Pyhalov /****  _ I C V _ O P E N  ****/
52*16d86563SAlexander Pyhalov 
_icv_open()53*16d86563SAlexander Pyhalov void* _icv_open()
54*16d86563SAlexander Pyhalov {
55*16d86563SAlexander Pyhalov 	_conv_desc* cd = (_conv_desc*)malloc(sizeof(_conv_desc));
56*16d86563SAlexander Pyhalov 
57*16d86563SAlexander Pyhalov 	if (cd == (_conv_desc*)NULL)
58*16d86563SAlexander Pyhalov 	{
59*16d86563SAlexander Pyhalov 		errno = ENOMEM;
60*16d86563SAlexander Pyhalov 		return((void*)-1);
61*16d86563SAlexander Pyhalov 	}
62*16d86563SAlexander Pyhalov 
63*16d86563SAlexander Pyhalov 	cd->cur_stat = 1;
64*16d86563SAlexander Pyhalov 	cd->hbuf[1] = cd->hbuf[2] = cd->hbuf[3] = cd->hbuf[4] = '\0';
65*16d86563SAlexander Pyhalov 	cd->cur_act = 0;
66*16d86563SAlexander Pyhalov 
67*16d86563SAlexander Pyhalov 	return((void*)cd);
68*16d86563SAlexander Pyhalov }  /* end of int _icv_open(). */
69*16d86563SAlexander Pyhalov 
70*16d86563SAlexander Pyhalov 
71*16d86563SAlexander Pyhalov /****  _ I C V _ C L O S E  ****/
72*16d86563SAlexander Pyhalov 
_icv_close(_conv_desc * cd)73*16d86563SAlexander Pyhalov void _icv_close(_conv_desc* cd)
74*16d86563SAlexander Pyhalov {
75*16d86563SAlexander Pyhalov 	if (!cd)
76*16d86563SAlexander Pyhalov 		errno = EBADF;
77*16d86563SAlexander Pyhalov 	else
78*16d86563SAlexander Pyhalov 		free((void*)cd);
79*16d86563SAlexander Pyhalov }  /* end of void _icv_close(_conv_desc*). */
80*16d86563SAlexander Pyhalov 
81*16d86563SAlexander Pyhalov 
82*16d86563SAlexander Pyhalov /****  _ I C V _ I C O N V  ****/
83*16d86563SAlexander Pyhalov 
_icv_iconv(_conv_desc * cd,char ** inbuf,size_t * inbufleft,char ** outbuf,size_t * outbufleft)84*16d86563SAlexander Pyhalov size_t _icv_iconv(_conv_desc* cd, char** inbuf, size_t* inbufleft,
85*16d86563SAlexander Pyhalov 			char** outbuf, size_t* outbufleft)
86*16d86563SAlexander Pyhalov {
87*16d86563SAlexander Pyhalov 	size_t		ret_val = 0;
88*16d86563SAlexander Pyhalov 	unsigned char*	ib;
89*16d86563SAlexander Pyhalov 	unsigned char*	ob;
90*16d86563SAlexander Pyhalov 	unsigned char*	ibtail;
91*16d86563SAlexander Pyhalov 	unsigned char*	obtail;
92*16d86563SAlexander Pyhalov 
93*16d86563SAlexander Pyhalov 	if (!cd)
94*16d86563SAlexander Pyhalov 	{
95*16d86563SAlexander Pyhalov 		errno = EBADF;
96*16d86563SAlexander Pyhalov 		return((size_t)-1);
97*16d86563SAlexander Pyhalov 	}
98*16d86563SAlexander Pyhalov 
99*16d86563SAlexander Pyhalov 	if (!inbuf || !(*inbuf))
100*16d86563SAlexander Pyhalov 	{
101*16d86563SAlexander Pyhalov 		cd->cur_stat = 1;
102*16d86563SAlexander Pyhalov 		cd->hbuf[1] = cd->hbuf[2] = cd->hbuf[3] = cd->hbuf[4] = '\0';
103*16d86563SAlexander Pyhalov 		cd->cur_act = 0;
104*16d86563SAlexander Pyhalov 		return((size_t)0);
105*16d86563SAlexander Pyhalov 	}
106*16d86563SAlexander Pyhalov 
107*16d86563SAlexander Pyhalov 	ib = (unsigned char*)*inbuf;
108*16d86563SAlexander Pyhalov 	ob = (unsigned char*)*outbuf;
109*16d86563SAlexander Pyhalov 	ibtail = ib + *inbufleft;
110*16d86563SAlexander Pyhalov 	obtail = ob + *outbufleft;
111*16d86563SAlexander Pyhalov 
112*16d86563SAlexander Pyhalov 	while (ib < ibtail)
113*16d86563SAlexander Pyhalov 	{
114*16d86563SAlexander Pyhalov 		int		cur_input, action, state;
115*16d86563SAlexander Pyhalov 		char		result;
116*16d86563SAlexander Pyhalov 		int		input_conv(char);
117*16d86563SAlexander Pyhalov 		unsigned short	make_johap_code(int, char*);
118*16d86563SAlexander Pyhalov 		int		_johap_to_wansung(unsigned short*,
119*16d86563SAlexander Pyhalov 							unsigned short);
120*16d86563SAlexander Pyhalov 
121*16d86563SAlexander Pyhalov 		cur_input = input_conv(*ib);
122*16d86563SAlexander Pyhalov 		action = next_act[cd->cur_stat][cur_input];
123*16d86563SAlexander Pyhalov 		state = next_stat[cd->cur_stat][cur_input];
124*16d86563SAlexander Pyhalov 		if (action == 4)
125*16d86563SAlexander Pyhalov 		{
126*16d86563SAlexander Pyhalov 			if (ob >= obtail)
127*16d86563SAlexander Pyhalov 			{
128*16d86563SAlexander Pyhalov 				errno = E2BIG;
129*16d86563SAlexander Pyhalov 				ret_val = (size_t)-1;
130*16d86563SAlexander Pyhalov 				break;
131*16d86563SAlexander Pyhalov 			}
132*16d86563SAlexander Pyhalov 			*ob++ = *ib;
133*16d86563SAlexander Pyhalov 		}
134*16d86563SAlexander Pyhalov 		else if (action >= 5 && action <= 8)
135*16d86563SAlexander Pyhalov 			cd->hbuf[action - 4] = *ib;
136*16d86563SAlexander Pyhalov 		else if (action == 9)
137*16d86563SAlexander Pyhalov 		{
138*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 0);
139*16d86563SAlexander Pyhalov 			cd->hbuf[1] = *ib;
140*16d86563SAlexander Pyhalov 		}
141*16d86563SAlexander Pyhalov 		else if (action == 10)
142*16d86563SAlexander Pyhalov 		{
143*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 0);
144*16d86563SAlexander Pyhalov 			cd->hbuf[2] = *ib;
145*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 0);
146*16d86563SAlexander Pyhalov 		}
147*16d86563SAlexander Pyhalov 		else if (action == 11 || action == 12)
148*16d86563SAlexander Pyhalov 		{
149*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 0);
150*16d86563SAlexander Pyhalov 		}
151*16d86563SAlexander Pyhalov 		else if (action == 13)
152*16d86563SAlexander Pyhalov 		{
153*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 1);
154*16d86563SAlexander Pyhalov 			*ob++ = *ib;
155*16d86563SAlexander Pyhalov 		}
156*16d86563SAlexander Pyhalov 		else if (action == 14)
157*16d86563SAlexander Pyhalov 		{
158*16d86563SAlexander Pyhalov 			register char c1 = cd->hbuf[2], c2 = *ib;
159*16d86563SAlexander Pyhalov 
160*16d86563SAlexander Pyhalov 			if (c1 == 'l' && c2 == 'b')  /* _|_ && |- */
161*16d86563SAlexander Pyhalov 				cd->hbuf[2] = 'm';
162*16d86563SAlexander Pyhalov 			else if (c1 == 'l' && c2 == 'c')  /* _|_ && H */
163*16d86563SAlexander Pyhalov 				cd->hbuf[2] = 'n';
164*16d86563SAlexander Pyhalov 			else if (c1 == 'l' && c2 == '|')  /* _|_ && | */
165*16d86563SAlexander Pyhalov 				cd->hbuf[2] = 'o';
166*16d86563SAlexander Pyhalov 			else if (c1 == 's' && c2 == 'f')  /* T && -| */
167*16d86563SAlexander Pyhalov 				cd->hbuf[2] = 't';
168*16d86563SAlexander Pyhalov 			else if (c1 == 's' && c2 == 'g')  /* T && -|| */
169*16d86563SAlexander Pyhalov 				cd->hbuf[2] = 'u';
170*16d86563SAlexander Pyhalov 			else if (c1 == 's' && c2 == '|')  /* T && | */
171*16d86563SAlexander Pyhalov 				cd->hbuf[2] = 'v';
172*16d86563SAlexander Pyhalov 			else if (c1 == 'z' && c2 == '|')  /* __ && | */
173*16d86563SAlexander Pyhalov 				cd->hbuf[2] = '{';
174*16d86563SAlexander Pyhalov 			else
175*16d86563SAlexander Pyhalov 				cd->hbuf[2] = *ib;  /* Just in case. */
176*16d86563SAlexander Pyhalov 		}
177*16d86563SAlexander Pyhalov 		else if (action == 15)
178*16d86563SAlexander Pyhalov 		{
179*16d86563SAlexander Pyhalov 			cd->hbuf[2] = *ib;
180*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 0);
181*16d86563SAlexander Pyhalov 		}
182*16d86563SAlexander Pyhalov 		else if (action == 16)
183*16d86563SAlexander Pyhalov 		{
184*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(0, 0);
185*16d86563SAlexander Pyhalov 		}
186*16d86563SAlexander Pyhalov 		else if (action == 17)
187*16d86563SAlexander Pyhalov 		{
188*16d86563SAlexander Pyhalov 			ADD_CONVERTED_CODE(1, 0);
189*16d86563SAlexander Pyhalov 			cd->hbuf[2] = *ib;
190*16d86563SAlexander Pyhalov 		}
191*16d86563SAlexander Pyhalov 		cd->cur_act = action;
192*16d86563SAlexander Pyhalov 		cd->cur_stat = state;
193*16d86563SAlexander Pyhalov 		ib++;
194*16d86563SAlexander Pyhalov 	}
195*16d86563SAlexander Pyhalov 
196*16d86563SAlexander Pyhalov 	*inbuf = (char*)ib;
197*16d86563SAlexander Pyhalov 	*inbufleft = ibtail - ib;
198*16d86563SAlexander Pyhalov 	*outbuf = (char*)ob;
199*16d86563SAlexander Pyhalov 	*outbufleft = obtail - ob;
200*16d86563SAlexander Pyhalov 
201*16d86563SAlexander Pyhalov 	return(ret_val);
202*16d86563SAlexander Pyhalov }  /* end of size_t _icv_iconv(_conv_desc*, char**, size_t*, char**, size_t*).*/
203*16d86563SAlexander Pyhalov 
204*16d86563SAlexander Pyhalov 
205*16d86563SAlexander Pyhalov /****  I N P U T _ C O N V  ****/
206*16d86563SAlexander Pyhalov 
input_conv(char c)207*16d86563SAlexander Pyhalov int input_conv(char c)
208*16d86563SAlexander Pyhalov {
209*16d86563SAlexander Pyhalov 	switch (c)
210*16d86563SAlexander Pyhalov 	{
211*16d86563SAlexander Pyhalov 		case 'H':	/* dd */
212*16d86563SAlexander Pyhalov 		case 'S':	/* bb */
213*16d86563SAlexander Pyhalov 		case 'Y':	/* jj */
214*16d86563SAlexander Pyhalov 			return(1);
215*16d86563SAlexander Pyhalov 
216*16d86563SAlexander Pyhalov 		case 'A':	/* g */
217*16d86563SAlexander Pyhalov 			return(2);
218*16d86563SAlexander Pyhalov 
219*16d86563SAlexander Pyhalov 		case 'D':	/* n */
220*16d86563SAlexander Pyhalov 			return(3);
221*16d86563SAlexander Pyhalov 
222*16d86563SAlexander Pyhalov 		case 'I':	/* r */
223*16d86563SAlexander Pyhalov 			return(4);
224*16d86563SAlexander Pyhalov 
225*16d86563SAlexander Pyhalov 		case 'R':	/* b */
226*16d86563SAlexander Pyhalov 			return(5);
227*16d86563SAlexander Pyhalov 
228*16d86563SAlexander Pyhalov 		case 'B':	/* gg */
229*16d86563SAlexander Pyhalov 		case 'G':	/* d */
230*16d86563SAlexander Pyhalov 		case 'V':	/* ss */
231*16d86563SAlexander Pyhalov 		case 'W':	/* o */
232*16d86563SAlexander Pyhalov 		case 'Z':	/* ch */
233*16d86563SAlexander Pyhalov 		case '[':	/* k */
234*16d86563SAlexander Pyhalov 			return(6);
235*16d86563SAlexander Pyhalov 
236*16d86563SAlexander Pyhalov 		case 'U':	/* s */
237*16d86563SAlexander Pyhalov 			return(7);
238*16d86563SAlexander Pyhalov 
239*16d86563SAlexander Pyhalov 		case 'X':	/* j */
240*16d86563SAlexander Pyhalov 			return(8);
241*16d86563SAlexander Pyhalov 
242*16d86563SAlexander Pyhalov 		case '^':	/* h */
243*16d86563SAlexander Pyhalov 			return(9);
244*16d86563SAlexander Pyhalov 
245*16d86563SAlexander Pyhalov 		case 'Q':	/* m */
246*16d86563SAlexander Pyhalov 		case ']':	/* p */
247*16d86563SAlexander Pyhalov 		case '\\':	/* t */
248*16d86563SAlexander Pyhalov 			return(10);
249*16d86563SAlexander Pyhalov 
250*16d86563SAlexander Pyhalov 		case 'k':	/* =|| */
251*16d86563SAlexander Pyhalov 		case 'd':	/* |= */
252*16d86563SAlexander Pyhalov 		case 'e':	/* |=| */
253*16d86563SAlexander Pyhalov 		case 'j':	/* =| */
254*16d86563SAlexander Pyhalov 		case 'r':	/* _||_ */
255*16d86563SAlexander Pyhalov 		case 'w':	/* TT */
256*16d86563SAlexander Pyhalov 			return(11);
257*16d86563SAlexander Pyhalov 
258*16d86563SAlexander Pyhalov 		case 'b':	/* |- */
259*16d86563SAlexander Pyhalov 		case 'c':	/* H */
260*16d86563SAlexander Pyhalov 			return(12);
261*16d86563SAlexander Pyhalov 
262*16d86563SAlexander Pyhalov 		case 'f':	/* -| */
263*16d86563SAlexander Pyhalov 		case 'g':	/* -|| */
264*16d86563SAlexander Pyhalov 			return(13);
265*16d86563SAlexander Pyhalov 
266*16d86563SAlexander Pyhalov 		case '|':	/* | */
267*16d86563SAlexander Pyhalov 			return(14);
268*16d86563SAlexander Pyhalov 
269*16d86563SAlexander Pyhalov 		case 'l':	/* _|_ */
270*16d86563SAlexander Pyhalov 			return(15);
271*16d86563SAlexander Pyhalov 
272*16d86563SAlexander Pyhalov 		case 's':	/* T */
273*16d86563SAlexander Pyhalov 			return(16);
274*16d86563SAlexander Pyhalov 
275*16d86563SAlexander Pyhalov 		case 'z':	/* __ */
276*16d86563SAlexander Pyhalov 			return(17);
277*16d86563SAlexander Pyhalov 
278*16d86563SAlexander Pyhalov 		case '\016':
279*16d86563SAlexander Pyhalov 			return(18);
280*16d86563SAlexander Pyhalov 
281*16d86563SAlexander Pyhalov 		case '\017':
282*16d86563SAlexander Pyhalov 		case '\024':
283*16d86563SAlexander Pyhalov 			return(19);
284*16d86563SAlexander Pyhalov 
285*16d86563SAlexander Pyhalov 		default:
286*16d86563SAlexander Pyhalov 			return(20);
287*16d86563SAlexander Pyhalov 	}
288*16d86563SAlexander Pyhalov }  /* end of int input_conv(char). */
289*16d86563SAlexander Pyhalov 
290*16d86563SAlexander Pyhalov 
291*16d86563SAlexander Pyhalov /****  M A K E _ J O H A P _ C O D E  ****/
292*16d86563SAlexander Pyhalov 
make_johap_code(int n,char * temp)293*16d86563SAlexander Pyhalov unsigned short make_johap_code(int n, char* temp)
294*16d86563SAlexander Pyhalov {
295*16d86563SAlexander Pyhalov 	register unsigned short code = 0;
296*16d86563SAlexander Pyhalov 	char 			save ='\0';
297*16d86563SAlexander Pyhalov 
298*16d86563SAlexander Pyhalov 	if (n == 1)
299*16d86563SAlexander Pyhalov 	{
300*16d86563SAlexander Pyhalov 		if (temp[4] == '\0')
301*16d86563SAlexander Pyhalov 		{
302*16d86563SAlexander Pyhalov 			save = temp[3];
303*16d86563SAlexander Pyhalov 			temp[3] = '\0';
304*16d86563SAlexander Pyhalov 		}
305*16d86563SAlexander Pyhalov 		else
306*16d86563SAlexander Pyhalov 		{
307*16d86563SAlexander Pyhalov 			save = temp[4];
308*16d86563SAlexander Pyhalov 			temp[4] = '\0';
309*16d86563SAlexander Pyhalov 		}
310*16d86563SAlexander Pyhalov 	}
311*16d86563SAlexander Pyhalov 
312*16d86563SAlexander Pyhalov 	code = (temp[1] >= 'A' && temp[1] <= '^') ?
313*16d86563SAlexander Pyhalov 			(unsigned short)X32_19[temp[1] - '@']
314*16d86563SAlexander Pyhalov 			: (unsigned short)9;
315*16d86563SAlexander Pyhalov 	code = (code << 5) | (unsigned short)((temp[2] >= 'b' &&
316*16d86563SAlexander Pyhalov 				temp[2] <= '|') ? X32_21[temp[2] - '`']
317*16d86563SAlexander Pyhalov 						    : 1);
318*16d86563SAlexander Pyhalov 	code = (code << 5) | (unsigned short)((temp[3] >= 'A' &&
319*16d86563SAlexander Pyhalov 				temp[3] <= '^') ? X32_28[temp[3] - '@']
320*16d86563SAlexander Pyhalov 						    : 1);
321*16d86563SAlexander Pyhalov 
322*16d86563SAlexander Pyhalov 	if (temp[4] >= 'A')
323*16d86563SAlexander Pyhalov 	{
324*16d86563SAlexander Pyhalov 		if (temp[3] == 'A' && temp[4] == 'U')  /* gs */
325*16d86563SAlexander Pyhalov 			code += 2;
326*16d86563SAlexander Pyhalov 		else if (temp[3] == 'D' && temp[4] == 'X')  /* nj */
327*16d86563SAlexander Pyhalov 			code++;
328*16d86563SAlexander Pyhalov 		else if (temp[3] == 'D' && temp[4] == '^')  /* nh */
329*16d86563SAlexander Pyhalov 			code += 2;
330*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == 'A')  /* rg */
331*16d86563SAlexander Pyhalov 			code++;
332*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == 'Q')  /* rm */
333*16d86563SAlexander Pyhalov 			code += 2;
334*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == 'R')  /* rb */
335*16d86563SAlexander Pyhalov 			code += 3;
336*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == 'U')  /* rs */
337*16d86563SAlexander Pyhalov 			code += 4;
338*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == '\\')  /* rt */
339*16d86563SAlexander Pyhalov 			code += 5;
340*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == ']')  /* rp */
341*16d86563SAlexander Pyhalov 			code += 6;
342*16d86563SAlexander Pyhalov 		else if (temp[3] == 'I' && temp[4] == '^')  /* rh */
343*16d86563SAlexander Pyhalov 			code += 7;
344*16d86563SAlexander Pyhalov 		else if (temp[3] == 'R' && temp[4] == 'U')  /* bs */
345*16d86563SAlexander Pyhalov 			code++;
346*16d86563SAlexander Pyhalov 		else if (temp[3] == 'U' && temp[4] == 'U')  /* ss */
347*16d86563SAlexander Pyhalov 			code++;
348*16d86563SAlexander Pyhalov 	}
349*16d86563SAlexander Pyhalov 
350*16d86563SAlexander Pyhalov 	temp[1] = (n == 1) ? save : '\0';
351*16d86563SAlexander Pyhalov 	temp[2] = temp[3] = temp[4] = '\0';
352*16d86563SAlexander Pyhalov 	return(code | 0x8000);
353*16d86563SAlexander Pyhalov }  /* end of unsigned short make_johap_code(int, char*). */
354*16d86563SAlexander Pyhalov 
355*16d86563SAlexander Pyhalov 
356*16d86563SAlexander Pyhalov /****  _ J O H A P _ T O _ W A N S U N G  ****/
357*16d86563SAlexander Pyhalov 
_johap_to_wansung(unsigned short * wcode,unsigned short code)358*16d86563SAlexander Pyhalov static int _johap_to_wansung(unsigned short* wcode, unsigned short code)
359*16d86563SAlexander Pyhalov {
360*16d86563SAlexander Pyhalov 	register unsigned short	i;
361*16d86563SAlexander Pyhalov 	unsigned short 		ci, v, cf;
362*16d86563SAlexander Pyhalov 	unsigned short		mask, disp;
363*16d86563SAlexander Pyhalov 	long			cfbit;
364*16d86563SAlexander Pyhalov 
365*16d86563SAlexander Pyhalov 	*wcode = 0;
366*16d86563SAlexander Pyhalov 	ci = CHOSUNG(code) - 0x0A;
367*16d86563SAlexander Pyhalov 	v = JOONGSUNG(code) - ((unsigned short)JOONGSUNG(code) / 4 + 2);
368*16d86563SAlexander Pyhalov 	cf = JONGSUNG(code);
369*16d86563SAlexander Pyhalov 
370*16d86563SAlexander Pyhalov 	if (JOONGSUNG(code) - ((unsigned short)JOONGSUNG(code) / 4 + 2) < 0)
371*16d86563SAlexander Pyhalov 		*wcode = 0xA4A0 + Y19_32[ci + 1];
372*16d86563SAlexander Pyhalov 	else if (CHOSUNG(code) - 0x0A < 0)
373*16d86563SAlexander Pyhalov 	{
374*16d86563SAlexander Pyhalov 		if (cf <= 1)
375*16d86563SAlexander Pyhalov 			*wcode = 0xA4BF + v;
376*16d86563SAlexander Pyhalov 		else
377*16d86563SAlexander Pyhalov 			return(FAILED);
378*16d86563SAlexander Pyhalov 	}
379*16d86563SAlexander Pyhalov 	else
380*16d86563SAlexander Pyhalov 	{
381*16d86563SAlexander Pyhalov 		 if (cf < 2)
382*16d86563SAlexander Pyhalov 			cf = 1;
383*16d86563SAlexander Pyhalov 
384*16d86563SAlexander Pyhalov 		cfbit = cmp_bitmap[ci][v];
385*16d86563SAlexander Pyhalov 		for (disp = 0, i = 0; i < cf; i++)
386*16d86563SAlexander Pyhalov 		{
387*16d86563SAlexander Pyhalov 			if (cfbit & BIT_MASK)
388*16d86563SAlexander Pyhalov 				disp++;
389*16d86563SAlexander Pyhalov 			cfbit >>= 1;
390*16d86563SAlexander Pyhalov 		}
391*16d86563SAlexander Pyhalov 		if (!(cfbit & BIT_MASK))
392*16d86563SAlexander Pyhalov 			return(FAILED);
393*16d86563SAlexander Pyhalov 
394*16d86563SAlexander Pyhalov 		*wcode = cmp_srchtbl[ci][v] + disp;
395*16d86563SAlexander Pyhalov 		mask = cmp_srchtbl[ci][v] & 0xFF;
396*16d86563SAlexander Pyhalov 
397*16d86563SAlexander Pyhalov 		*wcode += (((short)(mask + disp) > 0xFE) ? SKIP : 0);
398*16d86563SAlexander Pyhalov 	}
399*16d86563SAlexander Pyhalov 
400*16d86563SAlexander Pyhalov 	return(HANGUL);
401*16d86563SAlexander Pyhalov }  /* end of unsigned short _johap_to_wansung(unsigned short, unsigned short,
402*16d86563SAlexander Pyhalov     *						unsigned short). */
403*16d86563SAlexander Pyhalov 
404*16d86563SAlexander Pyhalov void *
_cv_open()405*16d86563SAlexander Pyhalov _cv_open()
406*16d86563SAlexander Pyhalov {
407*16d86563SAlexander Pyhalov         struct _cv_state *st;
408*16d86563SAlexander Pyhalov 
409*16d86563SAlexander Pyhalov         if ((st = (struct _cv_state *)malloc(sizeof(struct _cv_state))) == NULL)
410*16d86563SAlexander Pyhalov                 return ((void *)-1);
411*16d86563SAlexander Pyhalov 
412*16d86563SAlexander Pyhalov 	st->ibuf_left = 0;
413*16d86563SAlexander Pyhalov 	st->istart = 0;
414*16d86563SAlexander Pyhalov 	st->iend = 0;
415*16d86563SAlexander Pyhalov 	st->flush_obuf = 0;
416*16d86563SAlexander Pyhalov 
417*16d86563SAlexander Pyhalov         return (st);
418*16d86563SAlexander Pyhalov }
419*16d86563SAlexander Pyhalov 
420*16d86563SAlexander Pyhalov void
_cv_close(st)421*16d86563SAlexander Pyhalov _cv_close(st)
422*16d86563SAlexander Pyhalov struct _cv_state *st;
423*16d86563SAlexander Pyhalov {
424*16d86563SAlexander Pyhalov         free(st);
425*16d86563SAlexander Pyhalov }
426*16d86563SAlexander Pyhalov 
427*16d86563SAlexander Pyhalov size_t
_cv_enconv(st,inbuf,inbytesleft,outbuf,outbytesleft)428*16d86563SAlexander Pyhalov _cv_enconv(st, inbuf, inbytesleft, outbuf, outbytesleft)
429*16d86563SAlexander Pyhalov struct _cv_state *st;
430*16d86563SAlexander Pyhalov char **inbuf;
431*16d86563SAlexander Pyhalov size_t*inbytesleft;
432*16d86563SAlexander Pyhalov char **outbuf;
433*16d86563SAlexander Pyhalov size_t*outbytesleft;
434*16d86563SAlexander Pyhalov {
435*16d86563SAlexander Pyhalov 	unsigned short code;
436*16d86563SAlexander Pyhalov 
437*16d86563SAlexander Pyhalov         if (inbuf == NULL || *inbuf == NULL) { /* Reset request. */
438*16d86563SAlexander Pyhalov 		st->ibuf_left = 0;
439*16d86563SAlexander Pyhalov 		st->istart = 0;
440*16d86563SAlexander Pyhalov 		st->iend = 0;
441*16d86563SAlexander Pyhalov 		st->flush_obuf = 0;
442*16d86563SAlexander Pyhalov                 return (0);
443*16d86563SAlexander Pyhalov         }
444*16d86563SAlexander Pyhalov 
445*16d86563SAlexander Pyhalov 	if (st->flush_obuf) {
446*16d86563SAlexander Pyhalov 		**outbuf = st->temp_obuf[0];
447*16d86563SAlexander Pyhalov 		(*outbuf)++;
448*16d86563SAlexander Pyhalov 		(*outbytesleft)--;
449*16d86563SAlexander Pyhalov 		st->flush_obuf = 0;
450*16d86563SAlexander Pyhalov 		if (*outbytesleft <= 0) {
451*16d86563SAlexander Pyhalov 			return(*inbytesleft);
452*16d86563SAlexander Pyhalov 		}
453*16d86563SAlexander Pyhalov 	}
454*16d86563SAlexander Pyhalov 
455*16d86563SAlexander Pyhalov 	while (*inbytesleft > 0 && *outbytesleft > 0) {
456*16d86563SAlexander Pyhalov 		if (!is_SI(inbuf, inbytesleft, st))
457*16d86563SAlexander Pyhalov 			break;
458*16d86563SAlexander Pyhalov 
459*16d86563SAlexander Pyhalov 		code = getc_12(inbuf, inbytesleft, st);
460*16d86563SAlexander Pyhalov 
461*16d86563SAlexander Pyhalov 		if (code&0x8000) {
462*16d86563SAlexander Pyhalov 			code = packtocomp(code);
463*16d86563SAlexander Pyhalov 			**outbuf = code>>8;
464*16d86563SAlexander Pyhalov 			(*outbuf)++, (*outbytesleft)--;
465*16d86563SAlexander Pyhalov 			if (*outbytesleft <= 0) {
466*16d86563SAlexander Pyhalov 				st->flush_obuf = 1;
467*16d86563SAlexander Pyhalov 				st->temp_obuf[0] = code&0xFF;
468*16d86563SAlexander Pyhalov 			} else {
469*16d86563SAlexander Pyhalov 				**outbuf = code&0xFF;
470*16d86563SAlexander Pyhalov 				(*outbuf)++, (*outbytesleft)--;
471*16d86563SAlexander Pyhalov 			}
472*16d86563SAlexander Pyhalov 		} else {
473*16d86563SAlexander Pyhalov 			**outbuf = code&0xFF;
474*16d86563SAlexander Pyhalov 			(*outbuf)++, (*outbytesleft)--;
475*16d86563SAlexander Pyhalov 		}
476*16d86563SAlexander Pyhalov 	}
477*16d86563SAlexander Pyhalov         return (*inbytesleft);
478*16d86563SAlexander Pyhalov }
479*16d86563SAlexander Pyhalov 
480*16d86563SAlexander Pyhalov int
is_SI(inbuf,inbytesleft,st)481*16d86563SAlexander Pyhalov is_SI(inbuf, inbytesleft, st)
482*16d86563SAlexander Pyhalov char **inbuf;
483*16d86563SAlexander Pyhalov size_t *inbytesleft;
484*16d86563SAlexander Pyhalov struct _cv_state *st;
485*16d86563SAlexander Pyhalov {
486*16d86563SAlexander Pyhalov 	size_t i, x;
487*16d86563SAlexander Pyhalov 	char *buf;
488*16d86563SAlexander Pyhalov 	int SO_found = 0, SI_found = 0;
489*16d86563SAlexander Pyhalov 
490*16d86563SAlexander Pyhalov 	buf = *inbuf;
491*16d86563SAlexander Pyhalov 	for (i = *inbytesleft; i > 0; i--) {
492*16d86563SAlexander Pyhalov 	    /* if SO is found */
493*16d86563SAlexander Pyhalov 	    if (*buf == 0x0e) {
494*16d86563SAlexander Pyhalov 		SO_found = 1;
495*16d86563SAlexander Pyhalov 		break;
496*16d86563SAlexander Pyhalov 	    } else
497*16d86563SAlexander Pyhalov 		buf++;
498*16d86563SAlexander Pyhalov 	}
499*16d86563SAlexander Pyhalov 
500*16d86563SAlexander Pyhalov 	if (SO_found || st->ibuf_left) {
501*16d86563SAlexander Pyhalov 	    while (i > 0) {
502*16d86563SAlexander Pyhalov 		i--;
503*16d86563SAlexander Pyhalov 	        /* if SI is found */
504*16d86563SAlexander Pyhalov 	        if (*buf == 0x0f) {
505*16d86563SAlexander Pyhalov 		    SI_found = 1;
506*16d86563SAlexander Pyhalov 		    break;
507*16d86563SAlexander Pyhalov 	        } else
508*16d86563SAlexander Pyhalov 		    buf++;
509*16d86563SAlexander Pyhalov 	    }
510*16d86563SAlexander Pyhalov 	}
511*16d86563SAlexander Pyhalov 
512*16d86563SAlexander Pyhalov 
513*16d86563SAlexander Pyhalov 	/* if input buffer is not complete, i.e., last SI is not there */
514*16d86563SAlexander Pyhalov 	/* NEED to check for size of left buffer vs. temp_ibuf[] size */
515*16d86563SAlexander Pyhalov 	if ((SO_found && !SI_found) || (st->ibuf_left && !SI_found)) {
516*16d86563SAlexander Pyhalov 		st->ibuf_left = 1;
517*16d86563SAlexander Pyhalov 		x = *inbytesleft;
518*16d86563SAlexander Pyhalov 		for (i = 0; i < x; i++) {
519*16d86563SAlexander Pyhalov 			st->temp_ibuf[st->iend] = **inbuf;
520*16d86563SAlexander Pyhalov 			st->iend++;
521*16d86563SAlexander Pyhalov 			(*inbuf)++;
522*16d86563SAlexander Pyhalov 			(*inbytesleft)--;
523*16d86563SAlexander Pyhalov 		}
524*16d86563SAlexander Pyhalov 		return(0);
525*16d86563SAlexander Pyhalov 	}
526*16d86563SAlexander Pyhalov 	return(1);
527*16d86563SAlexander Pyhalov }
528*16d86563SAlexander Pyhalov 
529*16d86563SAlexander Pyhalov #ifdef TEST
530*16d86563SAlexander Pyhalov 
531*16d86563SAlexander Pyhalov /* test case 1 */
532*16d86563SAlexander Pyhalov char ibuf1[] = {0x0e, 0x57, 0x6c, 0x0f, 0x0e, 0x55, 0x67, 0x0f, 0x0e, 0x5a, 0x62, 0x57, 0x0f};
533*16d86563SAlexander Pyhalov char obuf1[20];
534*16d86563SAlexander Pyhalov 
535*16d86563SAlexander Pyhalov /* test case 2 */
536*16d86563SAlexander Pyhalov char ibuf2[] = {0x0e, 0x57, 0x6c, 0x0f, 0x0e, 0x55};
537*16d86563SAlexander Pyhalov char ibuf21[] = {0x67, 0x0f, 0x0e, 0x5a, 0x62, 0x57, 0x0f};
538*16d86563SAlexander Pyhalov char obuf2[20];
539*16d86563SAlexander Pyhalov 
540*16d86563SAlexander Pyhalov /* test case 3 */
541*16d86563SAlexander Pyhalov char ibuf3[] = {0x0e, 0x57, 0x6c, 0x0f, 0x0e, 0x55, 0x67, 0x0f, 0x0e, 0x5a, 0x62, 0x57, 0x0f};
542*16d86563SAlexander Pyhalov char obuf3[4];
543*16d86563SAlexander Pyhalov 
544*16d86563SAlexander Pyhalov /* test case 3+ */
545*16d86563SAlexander Pyhalov char obuf31[5];
546*16d86563SAlexander Pyhalov 
main()547*16d86563SAlexander Pyhalov main()
548*16d86563SAlexander Pyhalov {
549*16d86563SAlexander Pyhalov         int i;
550*16d86563SAlexander Pyhalov         struct _cv_state *st;
551*16d86563SAlexander Pyhalov         size_t oleft, ileft;
552*16d86563SAlexander Pyhalov         char *ip1 = &ibuf1[0], *op1 = &obuf1[0],
553*16d86563SAlexander Pyhalov              *ip2 = &ibuf2[0], *ip21 = &ibuf21[0], *op2 = &obuf2[0],
554*16d86563SAlexander Pyhalov              *ip3 = &ibuf3[0], *op3 = &obuf3[0];
555*16d86563SAlexander Pyhalov 
556*16d86563SAlexander Pyhalov         /****************************** test case 1 *************************/
557*16d86563SAlexander Pyhalov         ileft = sizeof(ibuf1);
558*16d86563SAlexander Pyhalov         oleft = sizeof(obuf1);
559*16d86563SAlexander Pyhalov 
560*16d86563SAlexander Pyhalov         st = _cv_open();
561*16d86563SAlexander Pyhalov 
562*16d86563SAlexander Pyhalov         printf("TEST 1\n INPUT BUFFER: ");
563*16d86563SAlexander Pyhalov         for (i = 0; i < ileft ; i++) {
564*16d86563SAlexander Pyhalov             printf("%x ", 0xff&ibuf1[i]);
565*16d86563SAlexander Pyhalov         }
566*16d86563SAlexander Pyhalov         printf("\n");
567*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
568*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip1, &ileft, &op1, &oleft));
569*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
570*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
571*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
572*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
573*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf1) - oleft) ; i++) {
574*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf1[i]);
575*16d86563SAlexander Pyhalov         }
576*16d86563SAlexander Pyhalov         printf("\n\n\n");
577*16d86563SAlexander Pyhalov         _cv_close(st);
578*16d86563SAlexander Pyhalov 
579*16d86563SAlexander Pyhalov         /************************ test case 2 ******************************/
580*16d86563SAlexander Pyhalov         ileft = sizeof(ibuf2);
581*16d86563SAlexander Pyhalov         oleft = sizeof(obuf2);
582*16d86563SAlexander Pyhalov 
583*16d86563SAlexander Pyhalov         st = _cv_open();
584*16d86563SAlexander Pyhalov 
585*16d86563SAlexander Pyhalov         printf("TEST 2\nINPUT BUFFER: ");
586*16d86563SAlexander Pyhalov         for (i = 0; i < ileft ; i++) {
587*16d86563SAlexander Pyhalov             printf("%x ", 0xff&ibuf2[i]);
588*16d86563SAlexander Pyhalov         }
589*16d86563SAlexander Pyhalov         printf("\n");
590*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
591*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip2, &ileft, &op2, &oleft));
592*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
593*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
594*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
595*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
596*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf2) - oleft) ; i++) {
597*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf2[i]);
598*16d86563SAlexander Pyhalov         }
599*16d86563SAlexander Pyhalov         printf("\n\n");
600*16d86563SAlexander Pyhalov 
601*16d86563SAlexander Pyhalov         ileft = sizeof(ibuf21);
602*16d86563SAlexander Pyhalov         oleft = sizeof(obuf2);
603*16d86563SAlexander Pyhalov         op2 = &obuf2[0];
604*16d86563SAlexander Pyhalov         printf("INPUT BUFFER: ");
605*16d86563SAlexander Pyhalov         for (i = 0; i < ileft ; i++) {
606*16d86563SAlexander Pyhalov             printf("%x ", 0xff&ibuf21[i]);
607*16d86563SAlexander Pyhalov         }
608*16d86563SAlexander Pyhalov         printf("\n");
609*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
610*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip21, &ileft, &op2, &oleft));
611*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
612*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
613*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
614*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
615*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf2) - oleft) ; i++) {
616*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf2[i]);
617*16d86563SAlexander Pyhalov         }
618*16d86563SAlexander Pyhalov         printf("\n\n\n");
619*16d86563SAlexander Pyhalov         _cv_close(st);
620*16d86563SAlexander Pyhalov 
621*16d86563SAlexander Pyhalov         /************************ test case 3 ******************************/
622*16d86563SAlexander Pyhalov         ileft = sizeof(ibuf3);
623*16d86563SAlexander Pyhalov         oleft = sizeof(obuf3);
624*16d86563SAlexander Pyhalov 
625*16d86563SAlexander Pyhalov         st = _cv_open();
626*16d86563SAlexander Pyhalov 
627*16d86563SAlexander Pyhalov         printf("TEST 3\nINPUT BUFFER: ");
628*16d86563SAlexander Pyhalov         for (i = 0; i < ileft ; i++) {
629*16d86563SAlexander Pyhalov             printf("%x ", 0xff&ibuf3[i]);
630*16d86563SAlexander Pyhalov         }
631*16d86563SAlexander Pyhalov         printf("\n");
632*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
633*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip3, &ileft, &op3, &oleft));
634*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
635*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
636*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
637*16d86563SAlexander Pyhalov         printf("        strat_cnt %d   end_cnt %d\n", st->istart,
638*16d86563SAlexander Pyhalov                                                         st->iend);
639*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
640*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf3) - oleft) ; i++) {
641*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf3[i]);
642*16d86563SAlexander Pyhalov         }
643*16d86563SAlexander Pyhalov         printf("\n\n");
644*16d86563SAlexander Pyhalov 
645*16d86563SAlexander Pyhalov         op3 = &obuf3[0];
646*16d86563SAlexander Pyhalov         oleft = sizeof(obuf3);
647*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
648*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip3, &ileft, &op3, &oleft));
649*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
650*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
651*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
652*16d86563SAlexander Pyhalov         printf("        strat_cnt %d   end_cnt %d\n", st->istart,
653*16d86563SAlexander Pyhalov                                                         st->iend);
654*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
655*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf3) - oleft) ; i++) {
656*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf3[i]);
657*16d86563SAlexander Pyhalov         }
658*16d86563SAlexander Pyhalov         printf("\n\n");
659*16d86563SAlexander Pyhalov 
660*16d86563SAlexander Pyhalov         op3 = &obuf3[0];
661*16d86563SAlexander Pyhalov         oleft = sizeof(obuf3);
662*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
663*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip3, &ileft, &op3, &oleft));
664*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
665*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
666*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
667*16d86563SAlexander Pyhalov         printf("        strat_cnt %d   end_cnt %d\n", st->istart,
668*16d86563SAlexander Pyhalov                                                         st->iend);
669*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
670*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf3) - oleft) ; i++) {
671*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf3[i]);
672*16d86563SAlexander Pyhalov         }
673*16d86563SAlexander Pyhalov         printf("\n\n\n");
674*16d86563SAlexander Pyhalov         _cv_close(st);
675*16d86563SAlexander Pyhalov 
676*16d86563SAlexander Pyhalov         /************************ test case 3+ ******************************/
677*16d86563SAlexander Pyhalov         ip3 = &ibuf3[0];
678*16d86563SAlexander Pyhalov 	op3 = &obuf31[0];
679*16d86563SAlexander Pyhalov         ileft = sizeof(ibuf3);
680*16d86563SAlexander Pyhalov         oleft = sizeof(obuf31);
681*16d86563SAlexander Pyhalov 
682*16d86563SAlexander Pyhalov         st = _cv_open();
683*16d86563SAlexander Pyhalov 
684*16d86563SAlexander Pyhalov         printf("TEST 3+\nINPUT BUFFER: ");
685*16d86563SAlexander Pyhalov         for (i = 0; i < ileft ; i++) {
686*16d86563SAlexander Pyhalov             printf("%x ", 0xff&ibuf3[i]);
687*16d86563SAlexander Pyhalov         }
688*16d86563SAlexander Pyhalov         printf("\n");
689*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
690*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip3, &ileft, &op3, &oleft));
691*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
692*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
693*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
694*16d86563SAlexander Pyhalov         printf("        strat_cnt %d   end_cnt %d\n", st->istart,
695*16d86563SAlexander Pyhalov                                                         st->iend);
696*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
697*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf31) - oleft) ; i++) {
698*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf31[i]);
699*16d86563SAlexander Pyhalov         }
700*16d86563SAlexander Pyhalov         printf("\n\n");
701*16d86563SAlexander Pyhalov 
702*16d86563SAlexander Pyhalov         op3 = &obuf31[0];
703*16d86563SAlexander Pyhalov         oleft = sizeof(obuf31);
704*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
705*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip3, &ileft, &op3, &oleft));
706*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
707*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
708*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
709*16d86563SAlexander Pyhalov         printf("        strat_cnt %d   end_cnt %d\n", st->istart,
710*16d86563SAlexander Pyhalov                                                         st->iend);
711*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
712*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf31) - oleft) ; i++) {
713*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf31[i]);
714*16d86563SAlexander Pyhalov         }
715*16d86563SAlexander Pyhalov         printf("\n\n");
716*16d86563SAlexander Pyhalov 
717*16d86563SAlexander Pyhalov         op3 = &obuf31[0];
718*16d86563SAlexander Pyhalov         oleft = sizeof(obuf31);
719*16d86563SAlexander Pyhalov         printf("OUTPUT: return value %d ",
720*16d86563SAlexander Pyhalov                 _cv_enconv(st, &ip3, &ileft, &op3, &oleft));
721*16d86563SAlexander Pyhalov         printf("ileft %d  oleft %d\n", ileft, oleft);
722*16d86563SAlexander Pyhalov         printf("        flush_obuf %d  ibuf_left %d\n", st->flush_obuf,
723*16d86563SAlexander Pyhalov                                                         st->ibuf_left);
724*16d86563SAlexander Pyhalov         printf("        strat_cnt %d   end_cnt %d\n", st->istart,
725*16d86563SAlexander Pyhalov                                                         st->iend);
726*16d86563SAlexander Pyhalov         printf("OUTPUT BUFFER: ");
727*16d86563SAlexander Pyhalov         for (i = 0; i < (sizeof(obuf31) - oleft) ; i++) {
728*16d86563SAlexander Pyhalov             printf("%x ", 0xff&obuf31[i]);
729*16d86563SAlexander Pyhalov         }
730*16d86563SAlexander Pyhalov         printf("\n\n\n");
731*16d86563SAlexander Pyhalov         _cv_close(st);
732*16d86563SAlexander Pyhalov }
733*16d86563SAlexander Pyhalov 
734*16d86563SAlexander Pyhalov /* expected output
735*16d86563SAlexander Pyhalov 
736*16d86563SAlexander Pyhalov TEST 1
737*16d86563SAlexander Pyhalov  INPUT BUFFER: e 57 6c f e 55 67 f e 5a 62 57 f
738*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 14
739*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
740*16d86563SAlexander Pyhalov OUTPUT BUFFER: bf c0 bc bc c3 a2
741*16d86563SAlexander Pyhalov 
742*16d86563SAlexander Pyhalov 
743*16d86563SAlexander Pyhalov TEST 2
744*16d86563SAlexander Pyhalov INPUT BUFFER: e 57 6c f e 55
745*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 18
746*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 1
747*16d86563SAlexander Pyhalov OUTPUT BUFFER: bf c0
748*16d86563SAlexander Pyhalov 
749*16d86563SAlexander Pyhalov INPUT BUFFER: 67 f e 5a 62 57 f
750*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 16
751*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
752*16d86563SAlexander Pyhalov OUTPUT BUFFER: bc bc c3 a2
753*16d86563SAlexander Pyhalov 
754*16d86563SAlexander Pyhalov 
755*16d86563SAlexander Pyhalov TEST 3
756*16d86563SAlexander Pyhalov INPUT BUFFER: e 57 6c f e 55 67 f e 5a 62 57 f
757*16d86563SAlexander Pyhalov OUTPUT: return value 5 ileft 5  oleft 0
758*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
759*16d86563SAlexander Pyhalov         strat_cnt 0   end_cnt 0
760*16d86563SAlexander Pyhalov OUTPUT BUFFER: bf c0 bc bc
761*16d86563SAlexander Pyhalov 
762*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 2
763*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
764*16d86563SAlexander Pyhalov         strat_cnt 0   end_cnt 0
765*16d86563SAlexander Pyhalov OUTPUT BUFFER: c3 a2
766*16d86563SAlexander Pyhalov 
767*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 4
768*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
769*16d86563SAlexander Pyhalov         strat_cnt 0   end_cnt 0
770*16d86563SAlexander Pyhalov OUTPUT BUFFER:
771*16d86563SAlexander Pyhalov 
772*16d86563SAlexander Pyhalov 
773*16d86563SAlexander Pyhalov TEST 3+
774*16d86563SAlexander Pyhalov INPUT BUFFER: e 57 6c f e 55 67 f e 5a 62 57 f
775*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 0
776*16d86563SAlexander Pyhalov         flush_obuf 1  ibuf_left 0
777*16d86563SAlexander Pyhalov         strat_cnt 0   end_cnt 0
778*16d86563SAlexander Pyhalov OUTPUT BUFFER: bf c0 bc bc c3
779*16d86563SAlexander Pyhalov 
780*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 4
781*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
782*16d86563SAlexander Pyhalov         strat_cnt 0   end_cnt 0
783*16d86563SAlexander Pyhalov OUTPUT BUFFER: a2
784*16d86563SAlexander Pyhalov 
785*16d86563SAlexander Pyhalov OUTPUT: return value 0 ileft 0  oleft 5
786*16d86563SAlexander Pyhalov         flush_obuf 0  ibuf_left 0
787*16d86563SAlexander Pyhalov         strat_cnt 0   end_cnt 0
788*16d86563SAlexander Pyhalov OUTPUT BUFFER:
789*16d86563SAlexander Pyhalov 
790*16d86563SAlexander Pyhalov */
791*16d86563SAlexander Pyhalov 
792*16d86563SAlexander Pyhalov #endif /* TEST */
793