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