iconv() returning -1 still

This commit is contained in:
Josh Holtrop 2010-03-29 22:55:26 -04:00
parent f0af347ad8
commit 7f9f13e382

View File

@ -2,19 +2,21 @@
#include "serialize.h" #include "serialize.h"
#include <string.h> #include <string.h>
#include <iconv.h> #include <iconv.h>
#include <stdio.h>
using namespace std; using namespace std;
refptr< vector<unichar_t> > deserialize(const char * encoding, istream & in) refptr< vector<unichar_t> > deserialize(const char * encoding, istream & in)
{ {
const int buf_size = 200; const int buf_size = 200;
int num_read; int num_read;
char inbuf[buf_size]; char * inbuf = new char[buf_size];
char * inbuf_ptr = (char *) &inbuf[0]; char * inbuf_ptr = (char *) &inbuf[0];
unichar_t outbuf[buf_size]; unichar_t * outbuf = new unichar_t[buf_size];
char * outbuf_ptr; char * outbuf_ptr;
size_t chars_converted, inbytesleft = 0, outbytesleft; size_t chars_converted, inbytesleft = 0, outbytesleft;
refptr< vector<unichar_t> > ucs = new vector<unichar_t>(); refptr< vector<unichar_t> > ucs = new vector<unichar_t>();
cout << "encoding: " << encoding << endl;
iconv_t cd = iconv_open(encoding, "UTF-32"); iconv_t cd = iconv_open(encoding, "UTF-32");
if (cd == (iconv_t) -1) if (cd == (iconv_t) -1)
{ {
@ -22,19 +24,29 @@ refptr< vector<unichar_t> > deserialize(const char * encoding, istream & in)
return NULL; return NULL;
} }
outbuf_ptr = (char *) &outbuf[0];
outbytesleft = buf_size * sizeof(outbuf[0]);
iconv(cd, NULL, NULL, &outbuf_ptr, &outbytesleft);
cout << "initial outbytesleft: " << outbytesleft << endl;
for (;;) for (;;)
{ {
in.read(inbuf_ptr, sizeof(inbuf) - inbytesleft); in.read(inbuf_ptr, buf_size * sizeof(inbuf[0]) - inbytesleft);
num_read = in.gcount(); num_read = in.gcount();
cout << "num_read: " << num_read << endl; cout << "num_read: " << num_read << endl;
if (num_read <= 0) if (num_read <= 0)
break; break;
inbytesleft += num_read; inbytesleft += num_read;
outbuf_ptr = (char *) &outbuf[0]; outbuf_ptr = (char *) &outbuf[0];
outbytesleft = sizeof(outbuf); outbytesleft = buf_size * sizeof(outbuf[0]);
cout << "before inbytesleft: " << inbytesleft << ", outbytesleft: " << outbytesleft << endl; cout << "before inbytesleft: " << inbytesleft << ", outbytesleft: " << outbytesleft << endl;
cout << "inbuf_ptr: " << inbuf_ptr << endl;
chars_converted = iconv(cd, &inbuf_ptr, &inbytesleft, chars_converted = iconv(cd, &inbuf_ptr, &inbytesleft,
&outbuf_ptr, &outbytesleft); &outbuf_ptr, &outbytesleft);
if (chars_converted == (size_t) -1)
{
perror("iconv() error");
}
cout << "chars_converted: " << chars_converted << endl; cout << "chars_converted: " << chars_converted << endl;
cout << "after inbytesleft: " << inbytesleft << ", outbytesleft: " << outbytesleft << endl; cout << "after inbytesleft: " << inbytesleft << ", outbytesleft: " << outbytesleft << endl;
if (inbytesleft > 0) if (inbytesleft > 0)
@ -43,7 +55,8 @@ refptr< vector<unichar_t> > deserialize(const char * encoding, istream & in)
} }
inbuf_ptr = ((char *) &inbuf[0]) + inbytesleft; inbuf_ptr = ((char *) &inbuf[0]) + inbytesleft;
for (int i = 0; for (int i = 0;
i < ((sizeof(outbuf) - outbytesleft) / sizeof(outbuf[0])); i < (((buf_size * sizeof(outbuf[0])) - outbytesleft)
/ sizeof(outbuf[0]));
i++) i++)
{ {
ucs->push_back(outbuf[i]); ucs->push_back(outbuf[i]);
@ -52,6 +65,8 @@ refptr< vector<unichar_t> > deserialize(const char * encoding, istream & in)
break; break;
} }
delete[] inbuf;
delete[] outbuf;
iconv_close(cd); iconv_close(cd);
return ucs; return ucs;
} }