#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 u32;
unsigned char ic1, ic2, ic3;
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(ic1)) {
u32 = _jfp_tbl_jisx0201roman_to_ucs2[ic1];
PUTU(u32, "ASCII");
} else if (ISCS1(ic1)) {
NGET(ic2, "CS1-2 not available");
if (ISCS1(ic2)) {
u32 = _jfp_tbl_jisx0208_to_ucs2[
(ic1 - 0xa1) * 94 + (ic2 - 0xa1)];
PUTU(u32, "CS1");
} else {
RETERROR(EILSEQ, "CS1-2")
}
} else if (ic1 == SS2) {
NGET(ic2, "CS2-2");
if (ISCS2(ic2)) {
u32 = _jfp_tbl_jisx0201kana_to_ucs2[
(ic2 - 0xa1)];
PUTU(u32, "CS2");
} else {
RETERROR(EILSEQ, "CS2-2")
}
} else if (ic1 == SS3) {
NGET(ic2, "CS3-2");
if (ISCS3(ic2)) {
NGET(ic3, "CS3-3");
if (ISCS3(ic3)) {
u32 = _jfp_tbl_jisx0212_to_ucs2[
((ic2 - 0xa1) * 94 +
(ic3 - 0xa1))];
PUTU(u32, "CS3");
} else {
RETERROR(EILSEQ, "CS3-3")
}
} else {
RETERROR(EILSEQ, "CS3-2")
}
} else if (ISC1CTRLEUC(ic1)) {
u32 = ic1;
PUTU(u32, "C1CTRL");
} else {
RETERROR(EILSEQ, "at 1st")
}
*inbuf = (char *)ip;
*inbytesleft = ileft;
*outbuf = op;
*outbytesleft = oleft;
}
ret:
DEBUGPRINTERROR
return ((rv == (size_t)-1) ? rv : *inbytesleft);
}