--- parser3/src/main/pa_charset.C 2003/03/21 13:42:31 1.33.2.19.2.4 +++ parser3/src/main/pa_charset.C 2003/03/25 09:34:53 1.33.2.19.2.8 @@ -5,7 +5,7 @@ Author: Alexander Petrosyan(http://paf.design.ru) */ -static const char* IDENT_CHARSET_C="$Date: 2003/03/21 13:42:31 $"; +static const char* IDENT_CHARSET_C="$Date: 2003/03/25 09:34:53 $"; #include "pa_charset.h" #include "pa_charsets.h" @@ -68,16 +68,16 @@ static void element2case(unsigned char f // methods extern "C" unsigned char pcre_default_tables[]; // pcre/chartables.c -Charset::Charset(const String& aname, const String& afile_spec): +Charset::Charset(const String& aname, const String* afile_spec): fname(aname), - fname_cstr(aname->cstr()) { + fname_cstr(aname.cstrm()) { for(char *c=fname_cstr; *c; c++) - *c = toupper(*c); + *c = toupper(*c); if(afile_spec) { fisUTF8=false; - load_definition(afile_spec); + load_definition(*afile_spec); #ifdef XML addEncoding(fname_cstr); #endif @@ -117,8 +117,7 @@ void Charset::load_definition(const Stri tables.toTableSize++; // loading text - Pool pool_for_load_only; - char *data=file_read_text(pool_for_load_only, *UTF8_charset, afile_spec); + char *data=file_read_text(UTF8_charset, afile_spec); // ignore header getrow(&data); @@ -148,7 +147,7 @@ void Charset::load_definition(const Stri // charset if(tables.toTableSize>MAX_CHARSET_UNI_CODES) throw Exception("parser.runtime", - afile_spec, + &afile_spec, "charset must contain not more then %d unicode values", MAX_CHARSET_UNI_CODES); XMLCh unicode=(XMLCh)to_wchar_code(cell); @@ -225,17 +224,18 @@ void Charset::transcode( dest_body, dest_content_length); break; case 0x01: - source_charset.transcodeToUTF8(pool, + source_charset.transcodeToUTF8( source_body, source_content_length, dest_body, dest_content_length); break; case 0x10: - dest_charset.transcodeFromUTF8(pool, + dest_charset.transcodeFromUTF8( source_body, source_content_length, dest_body, dest_content_length); break; case 0x11: - dest_body=pool.copy((char*)source_body, dest_content_length=source_content_length); + dest_body=source_body; + dest_content_length=source_content_length; break; } } @@ -486,7 +486,8 @@ void Charset::transcodeToCharset( const void* source_body, size_t source_content_length, const void *& adest_body, size_t& adest_content_length) const { if(&dest_charset==this) { - adest_body=pool.copy((char*)source_body, adest_content_length=source_content_length); + adest_body=source_body; + adest_content_length=source_content_length; } else { size_t dest_content_length=source_content_length; unsigned char *dest_body=new unsigned char[dest_content_length]; @@ -537,8 +538,6 @@ static int xml256CharEncodingOut void Charset::addEncoding(char *name_cstr) { xmlCharEncodingHandler* handler=new xmlCharEncodingHandler; - fcreated_handler=xmlCharEncodingHandlerPtr(handler); - handler->name=name_cstr; handler->input=xml256CharEncodingInputFunc; handler->inputInfo=&tables; handler->output=xml256CharEncodingOutputFunc; handler->outputInfo=&tables; @@ -546,33 +545,33 @@ void Charset::addEncoding(char *name_cst xmlRegisterCharEncodingHandler(handler); } -void Charset::initTranscoder(const String* source, const char* name_cstr) { +void Charset::initTranscoder(const String& name, const char* name_cstr) { ftranscoder=xmlFindCharEncodingHandler(name_cstr); - transcoder(source); // check right way + transcoder(name); // check right way } -xmlCharEncodingHandler& Charset::transcoder(const String* source) { +xmlCharEncodingHandler& Charset::transcoder(const String& name) { if(!ftranscoder) throw Exception("parser.runtime", - source, + &name, "unsupported encoding"); return *ftranscoder; } -const char* Charset::transcode_cstrxmlChar* s) { +const char* Charset::transcode_cstr(xmlChar* s) { if(!s) return ""; int inlen=strlen((const char* )s); int outlen=inlen+1; // max - char *out=new char[outlen]; + char *out=new(PointerFreeGC) char[outlen]; int error; - if(xmlCharEncodingOutputFunc output=transcoder(0).output) { + if(xmlCharEncodingOutputFunc output=transcoder(fname).output) { error=output( (unsigned char*)out, &outlen, (const unsigned char*)s, &inlen, - transcoder(0).outputInfo); + transcoder(fname).outputInfo); } else { memcpy(out, s, outlen=inlen); error=0; @@ -585,43 +584,29 @@ const char* Charset::transcode_cstrxmlCh out[outlen/*surely would be less then on input*/]=0; return out; } -const String& Charset::transcodexmlChar* s -#ifndef NO_STRING_ORIGIN - , const String& origin -#endif - ) { - const String& result(new String()); - result->APPEND_CLEAN( - transcode_cstr(s), 0/*auto-size*/, - origin->origin().file, origin->origin().line); - return result; +const String& Charset::transcode(xmlChar* s) { + return *new String(transcode_cstr(s), 0/*auto-size*/, String::L_CLEAN); } -const char* Charset::transcode_cstrGdomeDOMString* s) { +const char* Charset::transcode_cstr(GdomeDOMString* s) { return s?transcode_cstr(BAD_CAST s->str):""; } -const String& Charset::transcodeGdomeDOMString* s -#ifndef NO_STRING_ORIGIN - , const String& origin -#endif - ) { - const String& result(new String()); - result->APPEND_CLEAN(transcode_cstr(s), 0/*auto-size*/, origin->origin().file, origin->origin().line); - return result; +const String& Charset::transcode(GdomeDOMString* s) { + return *new String(transcode_cstr(s), 0/*auto-size*/, String::L_CLEAN); } /// @test less memory using -maybe- xmlParserInputBufferCreateMem void* Charset::transcode_buf2mchar(transcode_buf_malloc_func malloc_func, - const char* buf, size_t buf_size) { + const char* buf, size_t buf_size) { unsigned char* out; int outlen; int error; - if(xmlCharEncodingInputFunc input=transcoder(0).input) { + if(xmlCharEncodingInputFunc input=transcoder(fname).input) { outlen=buf_size*6/*max*/; out=(unsigned char*)malloc_func(outlen+1); error=input( out, &outlen, (const unsigned char *)buf, (int *)&buf_size, - transcoder(0).inputInfo); + transcoder(fname).inputInfo); } else { outlen=buf_size; out=(unsigned char*)malloc_func(outlen+1); @@ -651,8 +636,13 @@ GdomeDOMString_auto_ptr Charset::transco return GdomeDOMString_auto_ptr(transcode_buf2gchar(buf, buf_size)); } GdomeDOMString_auto_ptr Charset::transcode(const String& s) { - const char* cstr=s->cstr(String::L_UNSPECIFIED); + const char* cstr=s.cstr(String::L_UNSPECIFIED); return transcode_buf2dom(cstr, strlen(cstr)); } +GdomeDOMString_auto_ptr Charset::transcode(const StringBody s) { + const char* cstr=s.cstr(); + + return transcode_buf2dom(cstr, s.length()); +} #endif