#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <euc.h>
#define JFP_ICONV_STATELESS
#include "japanese.h"
void *
_icv_open(void)
{
return (_icv_open_stateless());
}
void
_icv_close(void *cd)
{
_icv_close_stateless(cd);
return;
}
size_t
_icv_iconv(void *cd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft)
{
int stat;
unsigned char *ip, ic, *op;
size_t ileft, oleft;
size_t retval;
if ((inbuf == NULL) || (*inbuf == NULL)) {
return ((size_t)0);
}
stat = ST_INIT;
ip = (unsigned char *)*inbuf;
op = (unsigned char *)*outbuf;
ileft = *inbytesleft;
oleft = *outbytesleft;
while ((int)ileft > 0) {
GET(ic);
if ((stat == ST_INCS1) || (stat == ST_INCS3)) {
ic = sjtojis2[ic];
PUT(ic | CMSB);
stat = ST_INIT;
continue;
} else if (ISASC((int)ic)) {
CHECK2BIG(EUCW0,1);
PUT(ic);
continue;
} else if (ISSJKANA(ic)) {
CHECK2BIG((SS2W + EUCW2),1);
PUT(SS2);
PUT(ic);
continue;
} else if (ISSJKANJI1(ic)) {
if ((int)ileft > 0) {
if (ISSJKANJI2(*ip)) {
CHECK2BIG(EUCW1,1);
stat = ST_INCS1;
ic = sjtojis1[(ic - 0x80)];
if (*ip >= 0x9f) {
ic++;
}
PUT(ic | CMSB);
continue;
} else {
UNGET();
errno = EILSEQ;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else {
UNGET();
errno = EINVAL;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else if (ISSJSUPKANJI1(ic)) {
if ((int)ileft > 0) {
if (ISSJKANJI2(*ip)) {
CHECK2BIG((SS3W + EUCW3),1);
stat = ST_INCS3;
ic = sjtojis1[(ic - 0x80)];
if (*ip >= 0x9f) {
ic++;
}
PUT(SS3);
PUT(ic | CMSB);
continue;
} else {
UNGET();
errno = EILSEQ;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else {
UNGET();
errno = EINVAL;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else if (ISSJIBM(ic) ||
ISSJNECIBM(ic)) {
if ((int)ileft > 0) {
if (ISSJKANJI2(*ip)) {
unsigned short dest;
dest = (ic << 8);
GET(ic);
dest += ic;
if ((0xed40 <= dest) &&
(dest <= 0xeffc)) {
REMAP_NEC(dest);
if (dest == 0xffff) {
goto ill_ibm;
}
}
if ((dest == 0xfa54) ||
(dest == 0xfa5b)) {
CHECK2BIG(EUCW1,2);
if (dest == 0xfa54) {
PUT(0xa2);
PUT(0xcc);
} else {
PUT(0xa2);
PUT(0xe8);
}
continue;
}
CHECK2BIG((SS3W + EUCW3),2);
dest = dest - 0xfa40 -
(((dest>>8) - 0xfa) * 0x40);
dest = sjtoibmext[dest];
if (dest == 0xffff) {
ill_ibm:
UNGET();
UNGET();
errno = EILSEQ;
retval = (size_t)ERR_RETURN;
goto ret;
}
PUT(SS3);
PUT((dest>>8) & 0xff);
PUT(dest & 0xff);
continue;
} else {
UNGET();
errno = EILSEQ;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else {
UNGET();
errno = EINVAL;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else if ((0xeb <= ic) && (ic <= 0xec)) {
if ((int)ileft > 0) {
if (ISSJKANJI2(*ip)) {
CHECK2BIG(EUCW1,1);
GET(ic);
PUT((EGETA>>8) & 0xff);
PUT(EGETA & 0xff);
continue;
} else {
UNGET();
errno = EILSEQ;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else {
UNGET();
errno = EINVAL;
retval = (size_t)ERR_RETURN;
goto ret;
}
} else {
UNGET();
errno = EILSEQ;
retval = (size_t)ERR_RETURN;
goto ret;
}
}
retval = ileft;
ret:
*inbuf = (char *)ip;
*inbytesleft = ileft;
*outbuf = (char *)op;
*outbytesleft = oleft;
return (retval);
}