emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r113066: * syntax.c (skip_chars): Don't use uninitia


From: Paul Eggert
Subject: [Emacs-diffs] trunk r113066: * syntax.c (skip_chars): Don't use uninitialized storage
Date: Wed, 19 Jun 2013 05:45:38 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 113066
revision-id: address@hidden
parent: address@hidden
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Tue 2013-06-18 22:45:35 -0700
message:
  * syntax.c (skip_chars): Don't use uninitialized storage
  
  when searching a multibyte buffer for characters that are not in a
  unibyte string that contains non-ASCII characters.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/syntax.c                   syntax.c-20091113204419-o5vbwnq5f7feedwu-180
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-06-18 18:41:48 +0000
+++ b/src/ChangeLog     2013-06-19 05:45:35 +0000
@@ -1,3 +1,9 @@
+2013-06-19  Paul Eggert  <address@hidden>
+
+       * syntax.c (skip_chars): Don't use uninitialized storage
+       when searching a multibyte buffer for characters that are not in a
+       unibyte string that contains non-ASCII characters.
+
 2013-06-18  Jan Djärv  <address@hidden>
 
        * process.c: Include xgselect.h if HAVE_GLIB.  Include glib.h

=== modified file 'src/syntax.c'
--- a/src/syntax.c      2013-02-10 16:25:33 +0000
+++ b/src/syntax.c      2013-06-19 05:45:35 +0000
@@ -1577,34 +1577,31 @@
         the corresponding multibyte chars.  */
       if (multibyte && string_has_eight_bit)
        {
-         unsigned char fastmap2[0400];
-         int range_start_byte, range_start_char;
-
-         memcpy (fastmap + 0200, fastmap2 + 0200, 0200);
+         char *p1;
+         char himap[0200 + 1];
+         memcpy (himap, fastmap + 0200, 0200);
+         himap[0200] = 0;
          memset (fastmap + 0200, 0, 0200);
-         /* We are sure that this loop stops.  */
-         for (i = 0200; ! fastmap2[i]; i++);
-         c = BYTE8_TO_CHAR (i);
-         fastmap[CHAR_LEADING_CODE (c)] = 1;
-         range_start_byte = i;
-         range_start_char = c;
          char_ranges = alloca (sizeof *char_ranges * 128 * 2);
-         for (i = 129; i < 0400; i++)
+         i = 0;
+
+         while ((p1 = memchr (himap + i, 1, 0200 - i)))
            {
-             c = BYTE8_TO_CHAR (i);
-             fastmap[CHAR_LEADING_CODE (c)] = 1;
-             if (i - range_start_byte != c - range_start_char)
-               {
-                 char_ranges[n_char_ranges++] = range_start_char;
-                 char_ranges[n_char_ranges++] = ((i - 1 - range_start_byte)
-                                                 + range_start_char);
-                 range_start_byte = i;
-                 range_start_char = c;
-               }
+             /* Deduce the next range C..C2 from the next clump of 1s
+                in HIMAP starting with &HIMAP[I].  HIMAP is the high
+                order half of the old FASTMAP.  */
+             int c2, leading_code;
+             i = p1 - himap;
+             c = BYTE8_TO_CHAR (i + 0200);
+             i += strlen (p1);
+             c2 = BYTE8_TO_CHAR (i + 0200 - 1);
+
+             char_ranges[n_char_ranges++] = c;
+             char_ranges[n_char_ranges++] = c2;
+             leading_code = CHAR_LEADING_CODE (c);
+             memset (fastmap + leading_code, 1,
+                     CHAR_LEADING_CODE (c2) - leading_code + 1);
            }
-         char_ranges[n_char_ranges++] = range_start_char;
-         char_ranges[n_char_ranges++] = ((i - 1 - range_start_byte)
-                                         + range_start_char);
        }
     }
   else                         /* STRING is multibyte */


reply via email to

[Prev in Thread] Current Thread [Next in Thread]