#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <euc.h>
#include "japanese.h"
#include "jfp_iconv_unicode.h"
#ifdef JAVA_CONV_COMPAT
#define JFP_U2E_ICONV_JAVA
#elif JFP_ICONV_MS932
#define JFP_U2E_ICONV_MS932
#else
#define JFP_U2E_ICONV
#endif
#include "jfp_ucs2_to_euc16.h"
#define DEF_SINGLE '?'
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 char ic;
size_t rv = (size_t)0;
unsigned int ucs4;
unsigned short euc16;
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) {
GETU(&ucs4);
if (ucs4 > 0xffff) {
ic = (unsigned char)DEF_SINGLE;
NPUT(ic, "DEF for non-BMP");
} else {
euc16 = _jfp_ucs2_to_euc16((unsigned short)ucs4);
switch (euc16 & 0x8080) {
case 0x0000:
ic = (unsigned char)euc16;
NPUT(ic, "CS0");
break;
case 0x8080:
ic = (unsigned char)((euc16 >> 8) & 0xff);
NPUT(ic, "CS1-1");
ic = (unsigned char)(euc16 & 0xff);
NPUT(ic, "CS1-2");
break;
case 0x0080:
NPUT(SS2, "CS2-1");
ic = (unsigned char)euc16;
NPUT(ic, "CS2-2");
break;
case 0x8000:
NPUT(SS3, "E2BIG at CS3-1");
ic = (unsigned char)((euc16 >> 8) & 0xff);
NPUT(ic, "CS3-2");
ic = (unsigned char)(euc16 & CMASK);
NPUT(ic | CMSB, "CS3-3");
break;
}
}
next:
*inbuf = (char *)ip;
*inbytesleft = ileft;
*outbuf = op;
*outbytesleft = oleft;
}
ret:
DEBUGPRINTERROR
return ((rv == (size_t)-1) ? rv : *inbytesleft);
}