--- parser3/src/main/pa_charset.C 2002/06/28 09:59:01 1.24 +++ parser3/src/main/pa_charset.C 2002/10/15 15:12:57 1.31 @@ -3,10 +3,10 @@ Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan(http://paf.design.ru) - - $Id: pa_charset.C,v 1.24 2002/06/28 09:59:01 paf Exp $ */ +static const char* IDENT_CHARSET_C="$Date: 2002/10/15 15:12:57 $"; + #include "pa_charset.h" #ifdef XML @@ -191,7 +191,8 @@ void Charset::sort_ToTable() { } static XMLByte xlatOneTo(const XMLCh toXlat, - const Charset::Tables& tables) { + const Charset::Tables& tables, + XMLByte not_found) { unsigned int lowOfs = 0; unsigned int hiOfs = tables.toTableSize - 1; XMLByte curByte = 0; @@ -210,7 +211,7 @@ static XMLByte xlatOneTo(const XMLCh toX return tables.toTable[midOfs].extCh; } while(lowOfs+1output) { - size=output( + error=output( (unsigned char*)out, &outlen, (const unsigned char*)s, &inlen, transcoder(0)->outputInfo); - } else - memcpy(out, s, size=inlen); - if(size<0) + } else { + memcpy(out, s, outlen=inlen); + error=0; + } + if(error<0) throw Exception(0, 0, - "transcode_cstr failed (%d)", size); + "transcode_cstr failed (%d)", error); - out[size]=0; + out[outlen/*surely would be less then on input*/]=0; return out; } -String& Charset::transcode(xmlChar *s) { - return *NEW String(pool(), transcode_cstr(s)); +String& Charset::transcode(xmlChar *s +#ifndef NO_STRING_ORIGIN + , const String *origin +#endif + ) { + String& result=*NEW String(pool()); + result.APPEND_CLEAN(transcode_cstr(s), 0/*auto-size*/, origin->origin().file, origin->origin().line); + return result; } const char *Charset::transcode_cstr(GdomeDOMString *s) { return s?transcode_cstr(BAD_CAST s->str):""; } -String& Charset::transcode(GdomeDOMString *s) { - return *NEW String(pool(), transcode_cstr(s)); +String& Charset::transcode(GdomeDOMString *s +#ifndef NO_STRING_ORIGIN + , const String *origin +#endif + ) { + String& result=*NEW String(pool()); + result.APPEND_CLEAN(transcode_cstr(s), 0/*auto-size*/, origin->origin().file, origin->origin().line); + return result; } /// @test less memory using -maybe- xmlParserInputBufferCreateMem xmlChar *Charset::transcode_buf2xchar(const char *buf, size_t buf_size) { - int outlen=buf_size*6/*max*/+1; - unsigned char *out=(unsigned char*)malloc(outlen*sizeof(unsigned char)); - - int size; + unsigned char *out; + int outlen; + int error; if(xmlCharEncodingInputFunc input=transcoder(0)->input) { - size=input( + outlen=buf_size*6/*max*/+1; + out=(unsigned char*)malloc(outlen*sizeof(unsigned char)); + error=input( out, &outlen, (const unsigned char *)buf, (int *)&buf_size, transcoder(0)->inputInfo); - } else - memcpy(out, buf, size=buf_size); + } else { + outlen=buf_size; + out=(unsigned char*)malloc(outlen*sizeof(unsigned char)); + memcpy(out, buf, outlen); + error=0; + } - if(size<0) + if(error<0) throw Exception(0, 0, - "transcode_buf failed (%d)", size); + "transcode_buf failed (%d)", error); - out[size]=0; + out[outlen/*surely would be less then on input*/]=0; return (xmlChar *)out; } GdomeDOMString_auto_ptr Charset::transcode_buf2dom(const char *buf, size_t buf_size) {