#include <stdlib.h>
#include <errno.h>
#include <euc.h>
#include "japanese.h"
#include "jfp_iconv_unicode.h"
#define JFP_J2U_ICONV_X0213
#include "jfp_jis_to_ucs2.h"
struct _icv_state {
int _st_cset;
};
void *
_icv_open(void)
{
void *cd;
struct _icv_state *st;
cd = _icv_open_unicode(sizeof (struct _icv_state));
if (cd != NULL) {
st = (struct _icv_state *)(_icv_get_ext(cd));
st->_st_cset = CS_0;
}
return (cd);
}
void
_icv_close(void *cd)
{
_icv_close_unicode(cd);
return;
}
size_t
_icv_iconv(void *cd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft)
{
unsigned int u32;
unsigned short e16;
unsigned char ic1, ic2;
unsigned char ic3, ic4;
size_t rv = (size_t)0;
struct _icv_state *st;
unsigned char *ip;
size_t ileft;
char *op;
size_t oleft;
st = (struct _icv_state *)(_icv_get_ext(cd));
if ((inbuf == NULL) || (*inbuf == NULL)) {
st->_st_cset = CS_0;
_icv_reset_unicode(cd);
return ((size_t)0);
}
ip = (unsigned char *)*inbuf;
ileft = *inbytesleft;
op = *outbuf;
oleft = *outbytesleft;
while (ileft != 0) {
NGET(ic1, "never fail here");
if (ic1 == ESC) {
NGET(ic2, "ESC-2");
switch (ic2) {
case 0x24:
NGET(ic3, "ESC$-3");
switch (ic3) {
case 0x28:
NGET(ic4, "ESC$(-4");
switch (ic4) {
case 0x4f:
st->_st_cset = CS_1;
break;
case 0x50:
st->_st_cset = CS_3;
break;
case 0x51:
st->_st_cset = CS_1;
break;
default:
RETERROR(EILSEQ,
"Unknown ESC$(?");
}
break;
case 0x42:
st->_st_cset = CS_1;
break;
default:
RETERROR(EILSEQ, "Unknown ESC$?");
}
break;
case 0x28:
NGET(ic3, "ESC(-3");
switch (ic3) {
case 0x42:
st->_st_cset = CS_0;
break;
default:
RETERROR(EILSEQ, "Unknown ESC(?");
}
break;
default:
RETERROR(EILSEQ, "Unknown ESC?");
}
} else if (st->_st_cset == CS_0) {
if ((ic1 == 0x0e) || (ic1 == 0x0f) || (ic1 > 0x7f)) {
RETERROR(EILSEQ, "IRV-1")
}
u32 = (unsigned int)_jfp_tbl_jisx0201roman_to_ucs2[ic1];
PUTU(u32, "IRV");
} else if (st->_st_cset == CS_1) {
if ((ic1 < 0x21) || (ic1 > 0x7e)) {
RETERROR(EILSEQ, "PLANE1-1")
}
NGET(ic2, "PLANE1-2");
if ((ic2 < 0x21) || (ic2 > 0x7e)) {
RETERROR(EILSEQ, "PLANE1-2")
}
e16 = ((ic1 << 8) | ic2) | 0x8080;
u32 = (unsigned int)_jfp_tbl_jisx0208_to_ucs2[
(ic1 - 0x21) * 94 + (ic2 - 0x21)];
if (IFHISUR(u32)) {
u32 = _jfp_lookup_x0213_nonbmp(e16, u32);
PUTU(u32, "PLANE1->NONBMP");
} else if (u32 == 0xffff) {
unsigned int u32_2;
u32 = _jfp_lookup_x0213_compose(e16, &u32_2);
PUTU(u32, "PLANE1->CP1");
PUTU(u32_2, "PLANE1->CP2");
} else {
PUTU(u32, "PLANE1->BMP");
}
} else if (st->_st_cset == CS_3) {
if ((ic1 < 0x21) || (ic1 > 0x7e)) {
RETERROR(EILSEQ, "PLANE2-1")
}
NGET(ic2, "PLANE2-2");
if ((ic2 < 0x21) || (ic2 > 0x7e)) {
RETERROR(EILSEQ, "PLANE2-2")
}
e16 = ((ic1 << 8) | ic2) | 0x8000;
u32 = (unsigned int)_jfp_tbl_jisx0213p2_to_ucs2[
(ic1 - 0x21) * 94 + (ic2 - 0x21)];
if (IFHISUR(u32)) {
u32 = _jfp_lookup_x0213_nonbmp(e16, u32);
PUTU(u32, "PLANE2->NONBMP");
} else {
PUTU(u32, "PLANE2->BMP");
}
}
*inbuf = (char *)ip;
*inbytesleft = ileft;
*outbuf = op;
*outbytesleft = oleft;
}
ret:
DEBUGPRINTERROR
return ((rv == (size_t)-1) ? rv : *inbytesleft);
}