summaryrefslogtreecommitdiff
path: root/src/coding.c
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2005-02-14 01:04:50 +0000
committerKenichi Handa <handa@m17n.org>2005-02-14 01:04:50 +0000
commit3bb917bff6b70e242c8aefeb567c4c522cc9d185 (patch)
tree1f07c7436f49f76cece1ff32007da75dec5e2b21 /src/coding.c
parent1bd70c6e1d8bf8c2a02d68efd0fe8b4fa9bef60d (diff)
downloademacs-3bb917bff6b70e242c8aefeb567c4c522cc9d185.tar.gz
(encode_coding_string): Always return a unibyte string.
If NOCOPY is nonzero and there's no need of encoding, make STR unibyte directly.
Diffstat (limited to 'src/coding.c')
-rw-r--r--src/coding.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/src/coding.c b/src/coding.c
index 79e32fbed60..2ab4296381a 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -6361,7 +6361,12 @@ encode_coding_string (str, coding, nocopy)
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 @@ encode_coding_string (str, coding, nocopy)
/* 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 @@ encode_coding_string (str, coding, nocopy)
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 @@ encode_coding_string (str, coding, nocopy)
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));
}