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 1994-2003 Sun Microsystems, Inc.  All rights reserved.
23*16d86563SAlexander Pyhalov  * Use is subject to license terms.
24*16d86563SAlexander Pyhalov  */
25*16d86563SAlexander Pyhalov 
26*16d86563SAlexander Pyhalov #include <stdio.h>
27*16d86563SAlexander Pyhalov #include <stdlib.h>
28*16d86563SAlexander Pyhalov #include <errno.h>
29*16d86563SAlexander Pyhalov #include <euc.h>
30*16d86563SAlexander Pyhalov #include "japanese.h"
31*16d86563SAlexander Pyhalov 
32*16d86563SAlexander Pyhalov /*
33*16d86563SAlexander Pyhalov  * struct _icv_state; to keep stat
34*16d86563SAlexander Pyhalov  */
35*16d86563SAlexander Pyhalov struct _icv_state {
36*16d86563SAlexander Pyhalov 	int	_st_cset;
37*16d86563SAlexander Pyhalov };
38*16d86563SAlexander Pyhalov 
39*16d86563SAlexander Pyhalov void *
_icv_open()40*16d86563SAlexander Pyhalov _icv_open()
41*16d86563SAlexander Pyhalov {
42*16d86563SAlexander Pyhalov 	struct _icv_state *st;
43*16d86563SAlexander Pyhalov 
44*16d86563SAlexander Pyhalov 	if ((st = (struct _icv_state *)malloc(sizeof (struct _icv_state)))
45*16d86563SAlexander Pyhalov 									== NULL)
46*16d86563SAlexander Pyhalov 		return ((void *)ERR_RETURN);
47*16d86563SAlexander Pyhalov 
48*16d86563SAlexander Pyhalov 	st->_st_cset = CS_0;
49*16d86563SAlexander Pyhalov 	return (st);
50*16d86563SAlexander Pyhalov }
51*16d86563SAlexander Pyhalov 
52*16d86563SAlexander Pyhalov void
_icv_close(struct _icv_state * st)53*16d86563SAlexander Pyhalov _icv_close(struct _icv_state *st)
54*16d86563SAlexander Pyhalov {
55*16d86563SAlexander Pyhalov 	free(st);
56*16d86563SAlexander Pyhalov }
57*16d86563SAlexander Pyhalov 
58*16d86563SAlexander Pyhalov size_t
_icv_iconv(struct _icv_state * st,char ** inbuf,size_t * inbytesleft,char ** outbuf,size_t * outbytesleft)59*16d86563SAlexander Pyhalov _icv_iconv(struct _icv_state *st, char **inbuf, size_t *inbytesleft,
60*16d86563SAlexander Pyhalov 				char **outbuf, size_t *outbytesleft)
61*16d86563SAlexander Pyhalov {
62*16d86563SAlexander Pyhalov 	int		cset;
63*16d86563SAlexander Pyhalov 	unsigned char	*ip, ic;
64*16d86563SAlexander Pyhalov 	char			*op;
65*16d86563SAlexander Pyhalov 	size_t			ileft, oleft;
66*16d86563SAlexander Pyhalov 	size_t			retval;
67*16d86563SAlexander Pyhalov #ifdef	RFC1468_MODE
68*16d86563SAlexander Pyhalov         unsigned short  zenkaku;
69*16d86563SAlexander Pyhalov #endif
70*16d86563SAlexander Pyhalov 
71*16d86563SAlexander Pyhalov 	/*
72*16d86563SAlexander Pyhalov 	 * If inbuf and/or *inbuf are NULL, reset conversion descriptor
73*16d86563SAlexander Pyhalov 	 * and put escape sequence if needed.
74*16d86563SAlexander Pyhalov 	 */
75*16d86563SAlexander Pyhalov 	if ((inbuf == NULL) || (*inbuf == NULL)) {
76*16d86563SAlexander Pyhalov 		if (st->_st_cset != CS_0) {
77*16d86563SAlexander Pyhalov 			if ((outbuf != NULL) && (*outbuf != NULL)
78*16d86563SAlexander Pyhalov 					&& (outbytesleft != NULL)) {
79*16d86563SAlexander Pyhalov 				op = *outbuf;
80*16d86563SAlexander Pyhalov 				oleft = *outbytesleft;
81*16d86563SAlexander Pyhalov 				if (oleft < SEQ_SBTOG0) {
82*16d86563SAlexander Pyhalov 					errno = E2BIG;
83*16d86563SAlexander Pyhalov 					return ((size_t)-1);
84*16d86563SAlexander Pyhalov 				}
85*16d86563SAlexander Pyhalov 				PUT(ESC);
86*16d86563SAlexander Pyhalov 				PUT(SBTOG0_1);
87*16d86563SAlexander Pyhalov 				PUT(F_X0201_RM);
88*16d86563SAlexander Pyhalov 				*outbuf = op;
89*16d86563SAlexander Pyhalov 				*outbytesleft = oleft;
90*16d86563SAlexander Pyhalov 			}
91*16d86563SAlexander Pyhalov 			st->_st_cset = CS_0;
92*16d86563SAlexander Pyhalov 		}
93*16d86563SAlexander Pyhalov 		return ((size_t)0);
94*16d86563SAlexander Pyhalov 	}
95*16d86563SAlexander Pyhalov 
96*16d86563SAlexander Pyhalov 	cset = st->_st_cset;
97*16d86563SAlexander Pyhalov 
98*16d86563SAlexander Pyhalov 	ip = (unsigned char *)*inbuf;
99*16d86563SAlexander Pyhalov 	op = *outbuf;
100*16d86563SAlexander Pyhalov 	ileft = *inbytesleft;
101*16d86563SAlexander Pyhalov 	oleft = *outbytesleft;
102*16d86563SAlexander Pyhalov 
103*16d86563SAlexander Pyhalov 	/*
104*16d86563SAlexander Pyhalov 	 * Main loop; basically 1 loop per 1 input byte
105*16d86563SAlexander Pyhalov 	 */
106*16d86563SAlexander Pyhalov 
107*16d86563SAlexander Pyhalov 	while ((int)ileft > 0) {
108*16d86563SAlexander Pyhalov 		GET(ic);
109*16d86563SAlexander Pyhalov 		if (ISASC((int)ic)) {		/* ASCII */
110*16d86563SAlexander Pyhalov 			if (cset != CS_0) {
111*16d86563SAlexander Pyhalov 				CHECK2BIG(SEQ_SBTOG0,1);
112*16d86563SAlexander Pyhalov 				PUT(ESC);	/* to JIS X 0201 Roman */
113*16d86563SAlexander Pyhalov 				PUT(SBTOG0_1);
114*16d86563SAlexander Pyhalov 				PUT(F_X0201_RM);
115*16d86563SAlexander Pyhalov 			}
116*16d86563SAlexander Pyhalov 			cset = CS_0;
117*16d86563SAlexander Pyhalov 			CHECK2BIG(JISW0,1);
118*16d86563SAlexander Pyhalov 			PUT(ic);
119*16d86563SAlexander Pyhalov 			continue;
120*16d86563SAlexander Pyhalov 		} else if (ISSJKANA(ic)) {		/* Kana starts */
121*16d86563SAlexander Pyhalov #ifdef  RFC1468_MODE	/* Substitute JIS X 0208 for JIS X 0201 katakana */
122*16d86563SAlexander Pyhalov 			if (cset != CS_1) {
123*16d86563SAlexander Pyhalov 				CHECK2BIG(SEQ_MBTOG0_O,1);
124*16d86563SAlexander Pyhalov 				cset = CS_1;
125*16d86563SAlexander Pyhalov 				PUT(ESC);
126*16d86563SAlexander Pyhalov 				PUT(MBTOG0_1);
127*16d86563SAlexander Pyhalov 				PUT(F_X0208_83_90);
128*16d86563SAlexander Pyhalov 			}
129*16d86563SAlexander Pyhalov 			CHECK2BIG(JISW1,1);
130*16d86563SAlexander Pyhalov 			zenkaku = halfkana2zenkakuj[ic - 0xA1];
131*16d86563SAlexander Pyhalov 			ic = (unsigned char)((zenkaku >> 8) & CMASK);
132*16d86563SAlexander Pyhalov 			PUT(ic);
133*16d86563SAlexander Pyhalov 			ic = (unsigned char)(zenkaku & CMASK);
134*16d86563SAlexander Pyhalov 			PUT(ic);
135*16d86563SAlexander Pyhalov #else   /* ISO-2022-JP.UIOSF */
136*16d86563SAlexander Pyhalov 			if (cset != CS_2) {
137*16d86563SAlexander Pyhalov 				CHECK2BIG(SEQ_SBTOG0,1);
138*16d86563SAlexander Pyhalov 				cset = CS_2;
139*16d86563SAlexander Pyhalov 				PUT(ESC);
140*16d86563SAlexander Pyhalov 				PUT(SBTOG0_1);
141*16d86563SAlexander Pyhalov 				PUT(F_X0201_KN);
142*16d86563SAlexander Pyhalov 			}
143*16d86563SAlexander Pyhalov 			CHECK2BIG(JISW2,1);
144*16d86563SAlexander Pyhalov 			PUT(ic & CMASK);
145*16d86563SAlexander Pyhalov #endif  /* RFC1468_MODE */
146*16d86563SAlexander Pyhalov 			continue;
147*16d86563SAlexander Pyhalov 		} else if (ISSJKANJI1(ic)) {	/* CS_1 Kanji starts */
148*16d86563SAlexander Pyhalov 			if ((int)ileft > 0) {
149*16d86563SAlexander Pyhalov 				if (ISSJKANJI2(*ip)) {
150*16d86563SAlexander Pyhalov 					if (cset != CS_1) {
151*16d86563SAlexander Pyhalov 						CHECK2BIG(SEQ_MBTOG0_O,1);
152*16d86563SAlexander Pyhalov 						cset = CS_1;
153*16d86563SAlexander Pyhalov 						PUT(ESC);
154*16d86563SAlexander Pyhalov 						PUT(MBTOG0_1);
155*16d86563SAlexander Pyhalov 						PUT(F_X0208_83_90);
156*16d86563SAlexander Pyhalov 					}
157*16d86563SAlexander Pyhalov 					CHECK2BIG(JISW1,1);
158*16d86563SAlexander Pyhalov #ifdef  RFC1468_MODE /* Convert VDC and UDC to GETA */
159*16d86563SAlexander Pyhalov 					if ((ic == 0x87) || (0xed <= ic )){
160*16d86563SAlexander Pyhalov 						PUT((JGETA >> 8) & CMASK);
161*16d86563SAlexander Pyhalov 						GET(ic); /* Get dummy */
162*16d86563SAlexander Pyhalov 						PUT(JGETA & CMASK);
163*16d86563SAlexander Pyhalov 						continue;
164*16d86563SAlexander Pyhalov 					}
165*16d86563SAlexander Pyhalov #endif  /* RFC1468_MODE */
166*16d86563SAlexander Pyhalov 					ic = sjtojis1[(ic - 0x80)];
167*16d86563SAlexander Pyhalov 					if (*ip >= 0x9f) {
168*16d86563SAlexander Pyhalov 						ic++;
169*16d86563SAlexander Pyhalov 					}
170*16d86563SAlexander Pyhalov 					PUT(ic);
171*16d86563SAlexander Pyhalov 					GET(ic);
172*16d86563SAlexander Pyhalov 					ic = sjtojis2[ic];
173*16d86563SAlexander Pyhalov 					PUT(ic);
174*16d86563SAlexander Pyhalov 					continue;
175*16d86563SAlexander Pyhalov 				} else {	/* 2nd byte is illegal */
176*16d86563SAlexander Pyhalov 					UNGET();
177*16d86563SAlexander Pyhalov 					errno = EILSEQ;
178*16d86563SAlexander Pyhalov 					retval = (size_t)ERR_RETURN;
179*16d86563SAlexander Pyhalov 					goto ret;
180*16d86563SAlexander Pyhalov 				}
181*16d86563SAlexander Pyhalov 			} else {		/* input fragment of Kanji */
182*16d86563SAlexander Pyhalov 				UNGET();
183*16d86563SAlexander Pyhalov 				errno = EINVAL;
184*16d86563SAlexander Pyhalov 				retval = (size_t)ERR_RETURN;
185*16d86563SAlexander Pyhalov 				goto ret;
186*16d86563SAlexander Pyhalov 			}
187*16d86563SAlexander Pyhalov 		} else if (ISSJSUPKANJI1(ic)) {	/* CS_3 Kanji starts */
188*16d86563SAlexander Pyhalov 			if ((int)ileft > 0) {
189*16d86563SAlexander Pyhalov 				if (ISSJKANJI2(*ip)) {
190*16d86563SAlexander Pyhalov #ifdef  RFC1468_MODE	/* Substitute JIS X 0208 "Geta" for JIS X 0212 */
191*16d86563SAlexander Pyhalov 					if (cset != CS_1) {
192*16d86563SAlexander Pyhalov 						CHECK2BIG(SEQ_MBTOG0_O,1);
193*16d86563SAlexander Pyhalov 						cset = CS_1;
194*16d86563SAlexander Pyhalov 						PUT(ESC);
195*16d86563SAlexander Pyhalov 						PUT(MBTOG0_1);
196*16d86563SAlexander Pyhalov 						PUT(F_X0208_83_90);
197*16d86563SAlexander Pyhalov 					}
198*16d86563SAlexander Pyhalov 					CHECK2BIG(JISW1,1);
199*16d86563SAlexander Pyhalov 					/* Put GETA (0x222e) */
200*16d86563SAlexander Pyhalov 					ic = (unsigned char)((JGETA >> 8) &
201*16d86563SAlexander Pyhalov 					CMASK);
202*16d86563SAlexander Pyhalov 					PUT(ic);
203*16d86563SAlexander Pyhalov 					ic = (unsigned char)(JGETA & CMASK);
204*16d86563SAlexander Pyhalov 					PUT(ic);
205*16d86563SAlexander Pyhalov 					GET(ic); /* dummy GET */
206*16d86563SAlexander Pyhalov #else   /* ISO-2022-JP.UIOSF */
207*16d86563SAlexander Pyhalov 					if (cset != CS_3) {
208*16d86563SAlexander Pyhalov 						CHECK2BIG(SEQ_MBTOG0,1);
209*16d86563SAlexander Pyhalov 						cset = CS_3;
210*16d86563SAlexander Pyhalov 						PUT(ESC);
211*16d86563SAlexander Pyhalov 						PUT(MBTOG0_1);
212*16d86563SAlexander Pyhalov 						PUT(MBTOG0_2);
213*16d86563SAlexander Pyhalov 						PUT(F_X0212_90);
214*16d86563SAlexander Pyhalov 					}
215*16d86563SAlexander Pyhalov 					CHECK2BIG(JISW3,1);
216*16d86563SAlexander Pyhalov 					ic = sjtojis1[(ic - 0x80)];
217*16d86563SAlexander Pyhalov 					if (*ip >= 0x9f) {
218*16d86563SAlexander Pyhalov 						ic++;
219*16d86563SAlexander Pyhalov 					}
220*16d86563SAlexander Pyhalov 					PUT(ic);
221*16d86563SAlexander Pyhalov 					GET(ic);
222*16d86563SAlexander Pyhalov 					ic = sjtojis2[ic];
223*16d86563SAlexander Pyhalov 					PUT(ic);
224*16d86563SAlexander Pyhalov #endif  /* RFC1468_MODE */
225*16d86563SAlexander Pyhalov 					continue;
226*16d86563SAlexander Pyhalov 				} else {	/* 2nd byte is illegal */
227*16d86563SAlexander Pyhalov 					UNGET();
228*16d86563SAlexander Pyhalov 					errno = EILSEQ;
229*16d86563SAlexander Pyhalov 					retval = (size_t)ERR_RETURN;
230*16d86563SAlexander Pyhalov 					goto ret;
231*16d86563SAlexander Pyhalov 				}
232*16d86563SAlexander Pyhalov 			} else {		/* input fragment of Kanji */
233*16d86563SAlexander Pyhalov 				UNGET();
234*16d86563SAlexander Pyhalov 				errno = EINVAL;
235*16d86563SAlexander Pyhalov 				retval = (size_t)ERR_RETURN;
236*16d86563SAlexander Pyhalov 				goto ret;
237*16d86563SAlexander Pyhalov 			}
238*16d86563SAlexander Pyhalov 		} else if (ISSJIBM(ic) || /* Extended IBM char. area */
239*16d86563SAlexander Pyhalov 			ISSJNECIBM(ic)) { /* NEC/IBM char. area */
240*16d86563SAlexander Pyhalov 			/*
241*16d86563SAlexander Pyhalov 			 * We need a special treatment for each codes.
242*16d86563SAlexander Pyhalov 			 * By adding some offset number for them, we
243*16d86563SAlexander Pyhalov 			 * can process them as the same way of that of
244*16d86563SAlexander Pyhalov 			 * extended IBM chars.
245*16d86563SAlexander Pyhalov 			 */
246*16d86563SAlexander Pyhalov 			if ((int)ileft > 0) {
247*16d86563SAlexander Pyhalov 				if (ISSJKANJI2(*ip)) {
248*16d86563SAlexander Pyhalov 					unsigned short dest;
249*16d86563SAlexander Pyhalov 					dest = (ic << 8);
250*16d86563SAlexander Pyhalov 					GET(ic);
251*16d86563SAlexander Pyhalov 					dest += ic;
252*16d86563SAlexander Pyhalov 					if ((0xed40 <= dest) &&
253*16d86563SAlexander Pyhalov 						(dest <= 0xeffc)) {
254*16d86563SAlexander Pyhalov 						REMAP_NEC(dest);
255*16d86563SAlexander Pyhalov 						if (dest == 0xffff) {
256*16d86563SAlexander Pyhalov 							goto ill_ibm;
257*16d86563SAlexander Pyhalov 						}
258*16d86563SAlexander Pyhalov 					}
259*16d86563SAlexander Pyhalov 					/*
260*16d86563SAlexander Pyhalov 					 * XXX: 0xfa54 and 0xfa5b must be mapped
261*16d86563SAlexander Pyhalov 					 *	to JIS0208 area. Therefore we
262*16d86563SAlexander Pyhalov 					 *	have to do special treatment.
263*16d86563SAlexander Pyhalov 					 */
264*16d86563SAlexander Pyhalov 					if ((cset != CS_1) &&
265*16d86563SAlexander Pyhalov 						((dest == 0xfa54) ||
266*16d86563SAlexander Pyhalov 						(dest == 0xfa5b))) {
267*16d86563SAlexander Pyhalov 						CHECK2BIG(SEQ_MBTOG0_O,2);
268*16d86563SAlexander Pyhalov 						cset = CS_1;
269*16d86563SAlexander Pyhalov 						PUT(ESC);
270*16d86563SAlexander Pyhalov 						PUT(MBTOG0_1);
271*16d86563SAlexander Pyhalov 						PUT(F_X0208_83_90);
272*16d86563SAlexander Pyhalov 						CHECK2BIG(JISW1,2);
273*16d86563SAlexander Pyhalov 						if (dest == 0xfa54) {
274*16d86563SAlexander Pyhalov 							PUT(0x22);
275*16d86563SAlexander Pyhalov 							PUT(0x4c);
276*16d86563SAlexander Pyhalov 						} else {
277*16d86563SAlexander Pyhalov 							PUT(0x22);
278*16d86563SAlexander Pyhalov 							PUT(0x68);
279*16d86563SAlexander Pyhalov 						}
280*16d86563SAlexander Pyhalov 						continue;
281*16d86563SAlexander Pyhalov 					}
282*16d86563SAlexander Pyhalov 					if (cset != CS_3) {
283*16d86563SAlexander Pyhalov 						CHECK2BIG(SEQ_MBTOG0,2);
284*16d86563SAlexander Pyhalov 						cset = CS_3;
285*16d86563SAlexander Pyhalov 						PUT(ESC);
286*16d86563SAlexander Pyhalov 						PUT(MBTOG0_1);
287*16d86563SAlexander Pyhalov 						PUT(MBTOG0_2);
288*16d86563SAlexander Pyhalov 						PUT(F_X0212_90);
289*16d86563SAlexander Pyhalov 					}
290*16d86563SAlexander Pyhalov 					CHECK2BIG(JISW3,2);
291*16d86563SAlexander Pyhalov 					dest = dest - 0xfa40 -
292*16d86563SAlexander Pyhalov 						(((dest>>8) - 0xfa) * 0x40);
293*16d86563SAlexander Pyhalov 					dest = sjtoibmext[dest];
294*16d86563SAlexander Pyhalov 					if (dest == 0xffff) {
295*16d86563SAlexander Pyhalov 						/*
296*16d86563SAlexander Pyhalov 						 * Illegal code points
297*16d86563SAlexander Pyhalov 						 * in IBM-EXT area.
298*16d86563SAlexander Pyhalov 						 */
299*16d86563SAlexander Pyhalov ill_ibm:
300*16d86563SAlexander Pyhalov 						UNGET();
301*16d86563SAlexander Pyhalov 						UNGET();
302*16d86563SAlexander Pyhalov 						errno = EILSEQ;
303*16d86563SAlexander Pyhalov 						retval = (size_t)ERR_RETURN;
304*16d86563SAlexander Pyhalov 						goto ret;
305*16d86563SAlexander Pyhalov 					}
306*16d86563SAlexander Pyhalov 					PUT(((dest>>8) & 0x7f));
307*16d86563SAlexander Pyhalov 					PUT(dest & 0x7f);
308*16d86563SAlexander Pyhalov 					continue;
309*16d86563SAlexander Pyhalov 				} else {	/* 2nd byte is illegal */
310*16d86563SAlexander Pyhalov 					UNGET();
311*16d86563SAlexander Pyhalov 					errno = EILSEQ;
312*16d86563SAlexander Pyhalov 					retval = (size_t)ERR_RETURN;
313*16d86563SAlexander Pyhalov 					goto ret;
314*16d86563SAlexander Pyhalov 				}
315*16d86563SAlexander Pyhalov 			} else {		/* input fragment of Kanji */
316*16d86563SAlexander Pyhalov 				UNGET();
317*16d86563SAlexander Pyhalov 				errno = EINVAL;
318*16d86563SAlexander Pyhalov 				retval = (size_t)ERR_RETURN;
319*16d86563SAlexander Pyhalov 				goto ret;
320*16d86563SAlexander Pyhalov 			}
321*16d86563SAlexander Pyhalov 		} else if ((0xeb <= ic) && (ic <= 0xec)) {
322*16d86563SAlexander Pyhalov 		/*
323*16d86563SAlexander Pyhalov 		 * Based on the draft convention of OSF-JVC CDEWG,
324*16d86563SAlexander Pyhalov 		 * characters in this area will be mapped to
325*16d86563SAlexander Pyhalov 		 * "CHIKAN-MOJI." (convertible character)
326*16d86563SAlexander Pyhalov 		 * So far, we'll use (0x222e) for it.
327*16d86563SAlexander Pyhalov 		 */
328*16d86563SAlexander Pyhalov 			if ((int)ileft > 0) {
329*16d86563SAlexander Pyhalov 				if (ISSJKANJI2(*ip)) {
330*16d86563SAlexander Pyhalov 					if (cset != CS_1) {
331*16d86563SAlexander Pyhalov 						CHECK2BIG(SEQ_MBTOG0_O,1);
332*16d86563SAlexander Pyhalov 						cset = CS_1;
333*16d86563SAlexander Pyhalov 						PUT(ESC);
334*16d86563SAlexander Pyhalov 						PUT(MBTOG0_1);
335*16d86563SAlexander Pyhalov 						PUT(F_X0208_83_90);
336*16d86563SAlexander Pyhalov 					}
337*16d86563SAlexander Pyhalov 					CHECK2BIG(JISW1,1);
338*16d86563SAlexander Pyhalov 					GET(ic); /* Dummy */
339*16d86563SAlexander Pyhalov 					PUT((JGETA>>8) & CMASK);
340*16d86563SAlexander Pyhalov 					PUT(JGETA & CMASK);
341*16d86563SAlexander Pyhalov 					continue;
342*16d86563SAlexander Pyhalov 				} else {	/* 2nd byte is illegal */
343*16d86563SAlexander Pyhalov 					UNGET();
344*16d86563SAlexander Pyhalov 					errno = EILSEQ;
345*16d86563SAlexander Pyhalov 					retval = (size_t)ERR_RETURN;
346*16d86563SAlexander Pyhalov 					goto ret;
347*16d86563SAlexander Pyhalov 				}
348*16d86563SAlexander Pyhalov 			} else {		/* input fragment of Kanji */
349*16d86563SAlexander Pyhalov 				UNGET();
350*16d86563SAlexander Pyhalov 				errno = EINVAL;
351*16d86563SAlexander Pyhalov 				retval = (size_t)ERR_RETURN;
352*16d86563SAlexander Pyhalov 				goto ret;
353*16d86563SAlexander Pyhalov 			}
354*16d86563SAlexander Pyhalov 		} else {			/* 1st byte is illegal */
355*16d86563SAlexander Pyhalov 			UNGET();
356*16d86563SAlexander Pyhalov 			errno = EILSEQ;
357*16d86563SAlexander Pyhalov 			retval = (size_t)ERR_RETURN;
358*16d86563SAlexander Pyhalov 			goto ret;
359*16d86563SAlexander Pyhalov 		}
360*16d86563SAlexander Pyhalov 	}
361*16d86563SAlexander Pyhalov 	retval = ileft;
362*16d86563SAlexander Pyhalov ret:
363*16d86563SAlexander Pyhalov 	*inbuf = (char *)ip;
364*16d86563SAlexander Pyhalov 	*inbytesleft = ileft;
365*16d86563SAlexander Pyhalov 	*outbuf = op;
366*16d86563SAlexander Pyhalov 	*outbytesleft = oleft;
367*16d86563SAlexander Pyhalov 	st->_st_cset = cset;
368*16d86563SAlexander Pyhalov 
369*16d86563SAlexander Pyhalov 	return (retval);
370*16d86563SAlexander Pyhalov }
371