changeset 60031:8d84cdf36525

(encode_coding_string): Always return a unibyte string. If NOCOPY is nonzero and there's no need of encoding, make STR unibyte directly.
author Kenichi Handa <handa@m17n.org>
date Mon, 14 Feb 2005 01:01:50 +0000
parents e41b38ec1a82
children 65ef48d5f65a
files src/coding.c
diffstat 1 files changed, 28 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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));
 }