aboutsummaryrefslogtreecommitdiffstats
path: root/src/syntax.c
diff options
context:
space:
mode:
authorPaul Eggert2013-06-18 22:45:35 -0700
committerPaul Eggert2013-06-18 22:45:35 -0700
commit178ba3e6f51c48ab196e44f82fc7abb3c7cd3d46 (patch)
tree7ca96e0d078f19be8b01a1b1a866b835b90abafd /src/syntax.c
parent102626e2259a927c563187d8ce3393d54a1a6b35 (diff)
downloademacs-178ba3e6f51c48ab196e44f82fc7abb3c7cd3d46.tar.gz
emacs-178ba3e6f51c48ab196e44f82fc7abb3c7cd3d46.zip
* 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.
Diffstat (limited to 'src/syntax.c')
-rw-r--r--src/syntax.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/src/syntax.c b/src/syntax.c
index 390d732944d..1b76f56dea6 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1577,34 +1577,31 @@ skip_chars (int forwardp, Lisp_Object string, Lisp_Object lim, int handle_iso_cl
1577 the corresponding multibyte chars. */ 1577 the corresponding multibyte chars. */
1578 if (multibyte && string_has_eight_bit) 1578 if (multibyte && string_has_eight_bit)
1579 { 1579 {
1580 unsigned char fastmap2[0400]; 1580 char *p1;
1581 int range_start_byte, range_start_char; 1581 char himap[0200 + 1];
1582 1582 memcpy (himap, fastmap + 0200, 0200);
1583 memcpy (fastmap + 0200, fastmap2 + 0200, 0200); 1583 himap[0200] = 0;
1584 memset (fastmap + 0200, 0, 0200); 1584 memset (fastmap + 0200, 0, 0200);
1585 /* We are sure that this loop stops. */
1586 for (i = 0200; ! fastmap2[i]; i++);
1587 c = BYTE8_TO_CHAR (i);
1588 fastmap[CHAR_LEADING_CODE (c)] = 1;
1589 range_start_byte = i;
1590 range_start_char = c;
1591 char_ranges = alloca (sizeof *char_ranges * 128 * 2); 1585 char_ranges = alloca (sizeof *char_ranges * 128 * 2);
1592 for (i = 129; i < 0400; i++) 1586 i = 0;
1587
1588 while ((p1 = memchr (himap + i, 1, 0200 - i)))
1593 { 1589 {
1594 c = BYTE8_TO_CHAR (i); 1590 /* Deduce the next range C..C2 from the next clump of 1s
1595 fastmap[CHAR_LEADING_CODE (c)] = 1; 1591 in HIMAP starting with &HIMAP[I]. HIMAP is the high
1596 if (i - range_start_byte != c - range_start_char) 1592 order half of the old FASTMAP. */
1597 { 1593 int c2, leading_code;
1598 char_ranges[n_char_ranges++] = range_start_char; 1594 i = p1 - himap;
1599 char_ranges[n_char_ranges++] = ((i - 1 - range_start_byte) 1595 c = BYTE8_TO_CHAR (i + 0200);
1600 + range_start_char); 1596 i += strlen (p1);
1601 range_start_byte = i; 1597 c2 = BYTE8_TO_CHAR (i + 0200 - 1);
1602 range_start_char = c; 1598
1603 } 1599 char_ranges[n_char_ranges++] = c;
1600 char_ranges[n_char_ranges++] = c2;
1601 leading_code = CHAR_LEADING_CODE (c);
1602 memset (fastmap + leading_code, 1,
1603 CHAR_LEADING_CODE (c2) - leading_code + 1);
1604 } 1604 }
1605 char_ranges[n_char_ranges++] = range_start_char;
1606 char_ranges[n_char_ranges++] = ((i - 1 - range_start_byte)
1607 + range_start_char);
1608 } 1605 }
1609 } 1606 }
1610 else /* STRING is multibyte */ 1607 else /* STRING is multibyte */