# HG changeset patch # User Kenichi Handa # Date 1108342910 0 # Node ID 8d84cdf36525d44684e217838febac975cfc1f80 # Parent e41b38ec1a82a5963356229730f25f4e733fc351 (encode_coding_string): Always return a unibyte string. If NOCOPY is nonzero and there's no need of encoding, make STR unibyte directly. diff -r e41b38ec1a82 -r 8d84cdf36525 src/coding.c --- a/src/coding.c Mon Feb 14 00:59:42 2005 +0000 +++ b/src/coding.c Mon Feb 14 01:01:50 2005 +0000 @@ -6361,7 +6361,12 @@ if (SYMBOLP (coding->pre_write_conversion) && !NILP (Ffboundp (coding->pre_write_conversion))) - str = run_pre_post_conversion_on_str (str, coding, 1); + { + str = run_pre_post_conversion_on_str (str, coding, 1); + /* As STR is just newly generated, we don't have to copy it + anymore. */ + nocopy = 1; + } from = 0; to = SCHARS (str); @@ -6369,21 +6374,10 @@ /* Encoding routines determine the multibyteness of the source text by coding->src_multibyte. */ - coding->src_multibyte = STRING_MULTIBYTE (str); + coding->src_multibyte = SCHARS (str) < SBYTES (str); coding->dst_multibyte = 0; if (! CODING_REQUIRE_ENCODING (coding)) - { - coding->consumed = SBYTES (str); - coding->consumed_char = SCHARS (str); - if (STRING_MULTIBYTE (str)) - { - str = Fstring_as_unibyte (str); - nocopy = 1; - } - coding->produced = SBYTES (str); - coding->produced_char = SCHARS (str); - return (nocopy ? str : Fcopy_sequence (str)); - } + goto no_need_of_encoding; if (coding->composing != COMPOSITION_DISABLED) coding_save_composition (coding, from, to, str); @@ -6399,7 +6393,7 @@ if (from == to_byte) { coding_free_composition_data (coding); - return (nocopy ? str : Fcopy_sequence (str)); + goto no_need_of_encoding; } shrinked_bytes = from + (SBYTES (str) - to_byte); } @@ -6444,6 +6438,25 @@ coding_free_composition_data (coding); return newstr; + + no_need_of_encoding: + coding->consumed = SBYTES (str); + coding->consumed_char = SCHARS (str); + if (STRING_MULTIBYTE (str)) + { + if (nocopy) + /* We are sure that STR doesn't contain a multibyte + character. */ + STRING_SET_UNIBYTE (str); + else + { + str = Fstring_as_unibyte (str); + nocopy = 1; + } + } + coding->produced = SBYTES (str); + coding->produced_char = SCHARS (str); + return (nocopy ? str : Fcopy_sequence (str)); }