]> git.eshelyaron.com Git - emacs.git/commitdiff
More backward-compatible fix to char-equal core dump.
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 26 Mar 2014 17:55:31 +0000 (10:55 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 26 Mar 2014 17:55:31 +0000 (10:55 -0700)
* editfns.c (Fchar_equal): In unibyte buffers, assume values in
range 128-255 are raw bytes.  Suggested by Eli Zaretskii.

Fixes: debbugs:17011
src/ChangeLog
src/editfns.c

index bf27ece6af7cfa8a14e9befe0def2fae510bf903..025ea45b23be0a5baf59a732a3d2dc64fc5da855 100644 (file)
@@ -1,4 +1,8 @@
-2014-03-26  Paul Eggert  <eggert@cs.ucla.edu>
+2014-03-26  Paul Eggert  <eggert@penguin.cs.ucla.edu>
+
+       More backward-compatible fix to char-equal core dump (Bug#17011).
+       * editfns.c (Fchar_equal): In unibyte buffers, assume values in
+       range 128-255 are raw bytes.  Suggested by Eli Zaretskii.
 
        Fix core dump in char-equal (Bug#17011).
        * editfns.c (Fchar_equal): Do not use MAKE_CHAR_MULTIBYTE in
index 1986ee53d2367161c75ed6fb0438d8a5510353eb..9c1fcb0b7906f818cbc67a5e957af069a3a6b51c 100644 (file)
@@ -4377,13 +4377,23 @@ Case is ignored if `case-fold-search' is non-nil in the current buffer.  */)
   if (NILP (BVAR (current_buffer, case_fold_search)))
     return Qnil;
 
-  /* FIXME: When enable-multibyte-characters is nil, it's still possible
-     to manipulate multibyte chars, which means there is a bug for chars
-     in the range 128-255 as we can't tell whether they are eight-bit
-     bytes or Latin-1 chars.  For now, assume the latter.  See Bug#17011.
-     Also see casefiddle.c's casify_object, which has a similar problem.  */
   i1 = XFASTINT (c1);
   i2 = XFASTINT (c2);
+
+  /* FIXME: It is possible to compare multibyte characters even when
+     the current buffer is unibyte.  Unfortunately this is ambiguous
+     for characters between 128 and 255, as they could be either
+     eight-bit raw bytes or Latin-1 characters.  Assume the former for
+     now.  See Bug#17011, and also see casefiddle.c's casify_object,
+     which has a similar problem.  */
+  if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
+    {
+      if (SINGLE_BYTE_CHAR_P (i1))
+       i1 = UNIBYTE_TO_CHAR (i1);
+      if (SINGLE_BYTE_CHAR_P (i2))
+       i2 = UNIBYTE_TO_CHAR (i2);
+    }
+
   return (downcase (i1) == downcase (i2) ? Qt :  Qnil);
 }
 \f