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