#include <stdlib.h>
#include <errno.h>
#include <euc.h>
#include "japanese.h"
#include "jfp_iconv_unicode.h"
#define JFP_U2E_ICONV_X0213
#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 int u32;
unsigned short e16;
unsigned char ic;
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) {
GETU(&u32)
e16 = _jfp_u32_to_euc16(u32);
switch (e16 & 0x8080) {
case 0x0000:
ic = (unsigned char)e16;
NPUT(ic, "CS0");
break;
case 0x8080:
ic = (unsigned char)((e16 >> 8) & 0xff);
NPUT(ic, "CS1-1");
ic = (unsigned char)(e16 & 0xff);
NPUT(ic, "CS1-2");
break;
case 0x0080:
NPUT(SS2, "CS2-1");
ic = (unsigned char)e16;
NPUT(ic, "CS2-2");
break;
case 0x8000:
NPUT(SS3, "CS3-1");
ic = (unsigned char)((e16 >> 8) & 0xff);
NPUT(ic, "CS3-2");
ic = (unsigned char)(e16 & 0xff);
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);
}