--- parser3/src/main/untaint.C 2003/02/04 12:08:57 1.115.2.8 +++ parser3/src/main/untaint.C 2003/03/08 12:30:28 1.115.2.12 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_UNTAINT_C="$Date: 2003/02/04 12:08:57 $"; +static const char* IDENT_UNTAINT_C="$Date: 2003/03/08 12:30:28 $"; #include "pa_pool.h" #include "pa_string.h" @@ -140,15 +140,21 @@ inline bool need_quote_http_header(const or marking ALL pieces of it with a @a lang when @a forced to, and propagating OPTIMIZE language bit. */ -String& String::append_to(String& dest, uchar lang, bool forced) const { +String& String::append_to(String& dest, String_UL lang, bool forced) const { if(is_empty()) return dest; - // without language-chage, small[fitting dest tail] string? - if(lang==UL_PASS_APPENDED && fused<=(dest.fallocated-dest.fused)) { + // without language-chage string? + if(lang==UL_PASS_APPENDED) { + // can simply append elements + ssize_t delta=fused-(dest.fallocated-dest.fused); + if(delta>0) // they don't fit? + dest.expand(delta); + // felements[fused...]=src.felements[0..fused], fused+=src.fused memcpy(&dest.felements[dest.fused], felements, sizeof(felements[0])*fused); dest.fused+=fused; + dest.fsize+=fsize; return dest; } @@ -192,7 +198,7 @@ size_t String::cstr_bufsize(Untaint_lang const Request_charsets *charsets) const { size_t dest=1; // for terminating 0 STRING_FOREACH_FRAGMENT( - uchar to_lang=lang==UL_UNSPECIFIED?fragment->lang:lang; + String_UL to_lang=lang==UL_UNSPECIFIED?fragment->lang:lang; switch(to_lang & ~UL_OPTIMIZE_BIT) { case UL_CLEAN: @@ -320,7 +326,7 @@ char *String::store_to(char *dest, Untai // STRING_FOREACH_FRAGMENT( element_type *last = felements+fused; element_type *fragment = felements; for(; fragmentlang:lang; + String_UL to_lang=lang==UL_UNSPECIFIED?fragment->lang:lang; char *start=dest; @@ -378,11 +384,8 @@ char *String::store_to(char *dest, Untai // tainted, untaint language: mail-header // http://www.ietf.org/rfc/rfc2047.txt if(charsets) { - const void *mail_ptr; - size_t mail_size; - Charset::transcode(charsets->pool(), - charsets->source(), fragment->ptr, fragment->size, - charsets->mail(), mail_ptr, mail_size); + const void *mail_ptr=fragment->ptr; + size_t mail_size=fragment->size; CharPtr charset_name=charsets->mail().name()->cstr(); // Subject: Re: parser3: =?koi8-r?Q?=D3=C5=CD=C9=CE=C1=D2?= @@ -516,7 +519,7 @@ IFNDEF_NO_STRING_ORIGIN( else dest+=sprintf(dest, ""); ); - uchar show_lang=fragment->lang & ~UL_OPTIMIZE_BIT; + String_UL show_lang=fragment->lang & ~UL_OPTIMIZE_BIT; if(show_lang>=sizeof(String_Untaint_lang_name)/sizeof(String_Untaint_lang_name[0])) throw Exception(Exception::undefined_type, Exception::undefined_source,