#include "code_converter.h"
#include bool codeconverter::initialize(const char* psztocode, const char* pszfromcode)
{
if(pszfromcode == null || psztocode == null) return false;
m_pszfromcode = pszfromcode;
m_psztocode = psztocode;
#ifndef win32
m_cd = iconv_open(m_psztocode,m_pszfromcode);
if(m_cd == (iconv_t)-1)
{
printf("cannot open iconv descripter\n");
return false;
}
#endif
return true;
}
size_t codeconverter:: convert(char* inbuf, size_t inbytesleft, char* outbuf, size_t outbyteslen)
{
int nreallen = 0;
#ifdef win32
if(stricmp(m_pszfromcode,"unicode") == 0)
{
nreallen = widechartomultibyte(cp_acp,0,(pwchar)inbuf, inbytesleft, (pchar)outbuf, outbyteslen,null,null);
}
if(stricmp(m_pszfromcode,"gb2312") == 0)
{
nreallen = multibytetowidechar(cp_acp,0,(pchar)inbuf,inbytesleft,(pwchar)outbuf, outbyteslen);
}
#else
size_t outbytesleft = outbyteslen;
size_t ret = 0;
while (1)
{
ret = iconv(m_cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
if (ret == 0) break;
if (ret == (size_t)-1)
{
printf("iconv error aaa: %s\n",strerror(errno));
return -1;
}
inbuf++; inbytesleft--;
}
nreallen = outbyteslen-outbytesleft;
outbuf[nreallen]=0;
#endif
return nreallen;
}