changeset 57877:194fa92926e4

(casify_region): Handle changes in byte-length using replace_range_2.
author Richard M. Stallman <rms@gnu.org>
date Tue, 02 Nov 2004 09:12:51 +0000
parents eb20070961bb
children 57a0b4f747a1
files src/casefiddle.c
diffstat 1 files changed, 11 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/casefiddle.c	Tue Nov 02 09:10:13 2004 +0000
+++ b/src/casefiddle.c	Tue Nov 02 09:12:51 2004 +0000
@@ -235,6 +235,10 @@
       else if (!UPPERCASEP (c)
 	       && (!inword || flag != CASE_CAPITALIZE_UP))
 	c = UPCASE1 (c);
+      if (multibyte && c >= 0x80)
+	/* A multibyte result character can't be handled in this
+	   simple loop.  */
+	break;
       FETCH_BYTE (i) = c;
       if (c != c2)
 	changed = 1;
@@ -272,22 +276,17 @@
 		       tolen = CHAR_STRING (c2, str),
 		       fromlen == tolen)
 		{
+		  /* Length is unchanged.  */
 		  for (j = 0; j < tolen; ++j)
 		    FETCH_BYTE (i + j) = str[j];
 		}
 	      else
-		{
-		  error ("Can't casify letters that change length");
-#if 0 /* This is approximately what we'd like to be able to do here */
-		  if (tolen < fromlen)
-		    del_range_1 (i + tolen, i + fromlen, 0, 0);
-		  else if (tolen > fromlen)
-		    {
-		      TEMP_SET_PT (i + fromlen);
-		      insert_1 (str + fromlen, tolen - fromlen, 1, 0, 0);
-		    }
-#endif
-		}
+		/* Replace one character with the other,
+		   keeping text properties the same.  */
+		replace_range_2 (start + 1, i + tolen,
+				 start + 2, i + tolen + fromlen,
+				 str, 1, tolen,
+				 0);
 	    }
 	  if ((int) flag >= (int) CASE_CAPITALIZE)
 	    inword = SYNTAX (c2) == Sword;