diff src/casefiddle.c @ 26839:97029667b1a9

Include composite.h. (casify_object): Use MAX_MULTIBYTE_LENGTH to allocate memory for a multibyte character. Adjusted for the change of CHAR_STRING. (casify_region): Likewise. Call update_compositions.
author Kenichi Handa <handa@m17n.org>
date Wed, 15 Dec 1999 00:02:33 +0000
parents 936b39bd05b4
children d7e7fa35dd10
line wrap: on
line diff
--- a/src/casefiddle.c	Wed Dec 15 00:02:12 1999 +0000
+++ b/src/casefiddle.c	Wed Dec 15 00:02:33 1999 +0000
@@ -25,6 +25,7 @@
 #include "charset.h"
 #include "commands.h"
 #include "syntax.h"
+#include "composite.h"
 
 enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP};
 
@@ -102,9 +103,7 @@
 		 character just encountered.  */
 	      int fromlen, tolen, j_byte = i;
 	      char *buf
-		= (char *) alloca ((len - i) * MAX_LENGTH_OF_MULTI_BYTE_FORM
-				   + i);
-	      unsigned char *str, workbuf[4];
+		= (char *) alloca ((len - i) * MAX_MULTIBYTE_LENGTH + i);
 
 	      /* Copy data already handled.  */
 	      bcopy (XSTRING (obj)->data, buf, i);
@@ -119,10 +118,8 @@
 		  else if (!UPPERCASEP (c)
 			   && (!inword || flag != CASE_CAPITALIZE_UP))
 		    c = UPCASE1 (c);
-		  tolen = CHAR_STRING (c, workbuf, str);
-		  bcopy (str, buf + j_byte, tolen);
 		  i += fromlen;
-		  j_byte += tolen;
+		  j_byte += CHAR_STRING (c, buf + j_byte);
 		  if ((int) flag >= (int) CASE_CAPITALIZE)
 		    inword = SYNTAX (c) == Sword;
 		}
@@ -195,6 +192,7 @@
   register int multibyte = !NILP (current_buffer->enable_multibyte_characters);
   int start, end;
   int start_byte, end_byte;
+  int changed = 0;
 
   if (EQ (b, e))
     /* Not modifying because nothing marked */
@@ -212,9 +210,10 @@
   start_byte = CHAR_TO_BYTE (start);
   end_byte = CHAR_TO_BYTE (end);
 
-  for (i = start_byte; i < end_byte; i++)
+  for (i = start_byte; i < end_byte; i++, start++)
     {
-      c = FETCH_BYTE (i);
+      int c2;
+      c = c2 = FETCH_BYTE (i);
       if (multibyte && c >= 0x80)
 	/* A multibyte character can't be handled in this simple loop.  */
 	break;
@@ -224,6 +223,8 @@
 	       && (!inword || flag != CASE_CAPITALIZE_UP))
 	c = UPCASE1 (c);
       FETCH_BYTE (i) = c;
+      if (c != c2)
+	changed = 1;
       if ((int) flag >= (int) CASE_CAPITALIZE)
 	inword = SYNTAX (c) == Sword;
     }
@@ -248,13 +249,14 @@
 	  if (c != c2)
 	    {
 	      int fromlen, tolen, j;
-	      unsigned char workbuf[4], *str;
+	      unsigned char str[MAX_MULTIBYTE_LENGTH];
 
+	      changed = 1;
 	      /* Handle the most likely case */
 	      if (c < 0400 && c2 < 0400)
 		FETCH_BYTE (i) = c2;
-	      else if (fromlen = CHAR_STRING (c, workbuf, str),
-		       tolen = CHAR_STRING (c2, workbuf, str),
+	      else if (fromlen = CHAR_STRING (c, str),
+		       tolen = CHAR_STRING (c2, str),
 		       fromlen == tolen)
 		{
 		  for (j = 0; j < tolen; ++j)
@@ -276,12 +278,17 @@
 	    }
 	  if ((int) flag >= (int) CASE_CAPITALIZE)
 	    inword = SYNTAX (c2) == Sword;
-	  INC_POS (i);
+	  INC_BOTH (start, i);
 	}
       TEMP_SET_PT_BOTH (opoint, opoint_byte);
     }
 
-  signal_after_change (start, end - start, end - start);
+  start = XFASTINT (b);
+  if (changed)
+    {
+      signal_after_change (start, end - start, end - start);
+      update_compositions (start, end, CHECK_ALL);
+    }
 }
 
 DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r",