- unsigned int eaten;
- unsigned int srclen=XMLString::stringLen(src);
- XMLUTF8Transcoder t(UTF8, srclen*4 + 1);
- char* buf=new char[srclen*4 + 1];
- memset(buf,0,srclen*4 + 1);
- t.transcodeTo(
- src,srclen,
- reinterpret_cast<XMLByte*>(buf),srclen*4,
- eaten,XMLTranscoder::UnRep_RepChar);
- return buf;
+ xsecsize_t eaten,factor=1,bufsize;
+ xsecsize_t srclen=XMLString::stringLen(src);
+ XMLUTF8Transcoder t(UTF8, 4096); // block size isn't used any more anyway
+ do {
+ bufsize = factor*srclen + 10;
+ char* buf = use_malloc ? reinterpret_cast<char*>(malloc(bufsize)) : new char[bufsize];
+ memset(buf,0,bufsize);
+ try {
+ t.transcodeTo(
+ src,srclen,
+ reinterpret_cast<XMLByte*>(buf),bufsize-1,
+ eaten,
+ XMLTranscoder::UnRep_Throw);
+ }
+ catch (XMLException&) {
+ if (use_malloc)
+ free(buf);
+ else
+ delete[] buf;
+ throw XMLToolingException("Source string contained an unrepresentable character.");
+ }
+ if (eaten >= srclen)
+ return buf;
+ if (use_malloc)
+ free(buf);
+ else
+ delete[] buf;
+ factor++;
+ } while (1);