#include <stdlib.h>
#include <errno.h>
#include <euc.h>
#include "japanese.h"
#include "jfp_iconv_unicode.h"
#ifdef JAVA_CONV_COMPAT
#define JFP_J2U_ICONV_JAVA
#elif JFP_ICONV_MS932
#define JFP_J2U_ICONV_MS932
#else
#define JFP_J2U_ICONV
#endif
#include "jfp_jis_to_ucs2.h"
void *
_icv_open(void)
{
return (_icv_open_unicode((size_t)0));
}
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 uni;
unsigned int index;
unsigned char ic1, ic2;
size_t rv = (size_t)0;
unsigned char *ip;
size_t ileft;
char *op;
size_t oleft;
if ((inbuf == NULL) || (*inbuf == NULL)) {
_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 (ISASC((int)ic1)) {
uni = _jfp_tbl_jisx0201roman_to_ucs2[ic1];
PUTU(uni, "ASCII");
} else if (ISSJKANA(ic1)) {
uni = _jfp_tbl_jisx0201kana_to_ucs2[(ic1 - 0xa1)];
PUTU(uni, "KANA");
} else if (ISSJKANJI1(ic1)) {
NGET(ic2, "CS1-2 not available");
if (ISSJKANJI2(ic2)) {
ic1 = sjtojis1[(ic1 - 0x80)];
if (ic2 >= 0x9f) {
ic1++;
}
index = ((ic1 - 0x21) * 94)
+ (sjtojis2[ic2] - 0x21);
uni = _jfp_tbl_jisx0208_to_ucs2[index];
PUTU(uni, "KANJI");
} else {
RETERROR(EILSEQ, "EILSEQ at CS1-2")
}
} else if (ISSJSUPKANJI1(ic1)) {
NGET(ic2, "SUP-2 not available");
if (ISSJKANJI2(ic2)) {
ic1 = sjtojis1[(ic1 - 0x80)];
if (ic2 >= 0x9f) {
ic1++;
}
index = ((ic1 - 0x21) * 94)
+ (sjtojis2[ic2] - 0x21);
uni = _jfp_tbl_jisx0212_to_ucs2[index];
PUTU(uni, "SUPKANJI");
} else {
RETERROR(EILSEQ, "EILSEQ at CS1-2")
}
} else if (ISSJIBM(ic1) ||
ISSJNECIBM(ic1)) {
NGET(ic2, "IBM-2 not available");
if (ISSJKANJI2(ic2)) {
unsigned short dest, upper, lower;
dest = (ic1 << 8) + ic2;
if ((0xed40 <= dest) && (dest <= 0xeffc)) {
REMAP_NEC(dest);
if (dest == 0xffff) {
RETERROR(EILSEQ, "invalid NEC")
}
}
if ((dest == 0xfa54) || (dest == 0xfa5b)) {
if (dest == 0xfa54) {
index = (2 - 1) * 94 + (44 - 1);
} else {
index = (2 - 1) * 94 + (72 - 1);
}
uni = _jfp_tbl_jisx0208_to_ucs2[index];
PUTU(uni, "IBM");
} else {
dest = dest - 0xfa40 -
(((dest>>8) - 0xfa) * 0x40);
dest = sjtoibmext[dest];
if (dest == 0xffff) {
RETERROR(EILSEQ, "invalid IBM")
}
upper = ((dest >> 8) & 0x7f) - 0x21;
lower = (dest & 0x7f) - 0x21;
index = (unsigned int)(upper * 94 +
lower);
uni = _jfp_tbl_jisx0212_to_ucs2[index];
PUTU(uni, "IBM");
}
} else {
RETERROR(EILSEQ, "EILSEQ at IBM-2")
}
} else if ((0xeb <= ic1) && (ic1 <= 0xec)) {
NGET(ic2, "GAP-2 not available");
if (ISSJKANJI2(ic2)) {
uni = 0xfffd;
PUTU(uni, "GAP");
} else {
RETERROR(EILSEQ, "EILSEQ at GAP-2")
}
} else {
RETERROR(EILSEQ, "EILSEQ at 1st")
}
*inbuf = (char *)ip;
*inbytesleft = ileft;
*outbuf = op;
*outbytesleft = oleft;
}
ret:
DEBUGPRINTERROR
return ((rv == (size_t)-1) ? rv : *inbytesleft);
}