|
|
| version 1.118.2.2, 2003/09/23 10:37:05 | version 1.118.2.4, 2003/09/23 14:00:53 |
|---|---|
| Line 172 struct Append_fragment_info { | Line 172 struct Append_fragment_info { |
| String::Language lang; | String::Language lang; |
| const StringBody dest_body; | const StringBody dest_body; |
| String::Languages* dest_languages; | String::Languages* dest_languages; |
| size_t dest_body_plan_length; | |
| }; | }; |
| #endif | #endif |
| int append_fragment_optimizing(char alang, size_t asize, Append_fragment_info* info) { | int append_fragment_optimizing(char alang, size_t asize, Append_fragment_info* info) { |
| Line 180 int append_fragment_optimizing(char alan | Line 181 int append_fragment_optimizing(char alan |
| // tainted piece would get OPTIMIZED bit from 'lang' | // tainted piece would get OPTIMIZED bit from 'lang' |
| // clean piece would be marked OPTIMIZED manually | // clean piece would be marked OPTIMIZED manually |
| // pieces with determined languages [not tainted|clean] would retain theirs langs | // pieces with determined languages [not tainted|clean] would retain theirs langs |
| info->dest_languages->append(info->dest_body, | info->dest_languages->append(info->dest_body_plan_length, |
| lang==String::Language::L_TAINTED? | lang==String::Language::L_TAINTED? |
| info->lang | info->lang |
| :lang==String::Language::L_CLEAN? | :lang==String::Language::L_CLEAN? |
| (String::Language)(String::Language::L_CLEAN|String::Language::L_OPTIMIZE_BIT) // ORing with OPTIMIZED flag | (String::Language)(String::Language::L_CLEAN|String::Language::L_OPTIMIZE_BIT) // ORing with OPTIMIZED flag |
| :lang, | :lang, |
| asize); | asize); |
| info->dest_body_plan_length+=asize; | |
| return 0; // 0=continue | return 0; // 0=continue |
| } | } |
| int append_fragment_nonoptimizing(char alang, size_t asize, Append_fragment_info* info) { | int append_fragment_nonoptimizing(char alang, size_t asize, Append_fragment_info* info) { |
| const String::Language lang=(String::Language)alang; | const String::Language lang=(String::Language)alang; |
| // The core idea: tainted pieces got marked with context's lang | // The core idea: tainted pieces got marked with context's lang |
| info->dest_languages->append(info->dest_body, | info->dest_languages->append(info->dest_body_plan_length, |
| lang==String::Language::L_TAINTED? | lang==String::Language::L_TAINTED? |
| info->lang | info->lang |
| :lang, | :lang, |
| asize); | asize); |
| info->dest_body_plan_length+=asize; | |
| return 0; // 0=continue | return 0; // 0=continue |
| } | } |
| Line 215 String& String::append_to(String& dest, | Line 218 String& String::append_to(String& dest, |
| // first: fragment infos | // first: fragment infos |
| if(lang==L_PASS_APPENDED) // without language-change? | if(lang==L_PASS_APPENDED) // without language-change? |
| dest.langs.append(dest.body, body, langs); | dest.langs.append(dest.body, body.length(), langs); |
| else if(forced) //forcing passed lang? | else if(forced) //forcing passed lang? |
| dest.langs.append(dest.body, lang, length()); | dest.langs.append(dest.body, lang, length()); |
| else { | else { |
| Append_fragment_info info={lang, dest.body, &dest.langs}; | Append_fragment_info info={lang, dest.body, &dest.langs, dest.body.length()}; |
| langs.for_each(body, lang&L_OPTIMIZE_BIT? | langs.for_each(body, lang&L_OPTIMIZE_BIT? |
| append_fragment_optimizing | append_fragment_optimizing |
| :append_fragment_nonoptimizing, &info); | :append_fragment_nonoptimizing, &info); |
| Line 228 String& String::append_to(String& dest, | Line 231 String& String::append_to(String& dest, |
| // next: letters | // next: letters |
| dest.body<<body; | dest.body<<body; |
| ASSERT_STRING_INVARIANT(dest); | |
| return dest; | return dest; |
| } | } |
| Line 506 StringBody String::cstr_to_string_body(L | Line 510 StringBody String::cstr_to_string_body(L |
| body.set_pos(info.pos, 0); | body.set_pos(info.pos, 0); |
| info.fragment_begin=0; | info.fragment_begin=0; |
| info.whitespace=true; | info.whitespace=true; |
| langs.for_each(body, cstr_to_string_body_block, &info); | if(!is_empty()) |
| langs.for_each(body, cstr_to_string_body_block, &info); | |
| return StringBody(CORD_ec_to_cord(info.result)); | return StringBody(CORD_ec_to_cord(info.result)); |
| } | } |