summaryrefslogtreecommitdiff
path: root/src/search.c
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2006-09-19 21:44:52 +0000
committerChong Yidong <cyd@stupidchicken.com>2006-09-19 21:44:52 +0000
commitb69e3c18052eb5003b9a4579c809d1b66abdd26b (patch)
tree1e16c8a6240ca61fa4d0d1e820906164559d9cd9 /src/search.c
parentf3209e4331c6190efeb099c6e12beececf20a4c5 (diff)
downloademacs-b69e3c18052eb5003b9a4579c809d1b66abdd26b.tar.gz
* search.c (struct regexp_cache): New entry syntax_table.
(compile_pattern_1): Set it. (syms_of_search): Initialize it. (compile_pattern): Require the syntax_table entry of the cache element to match the current syntax table entry.
Diffstat (limited to 'src/search.c')
-rw-r--r--src/search.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/search.c b/src/search.c
index 8b469a37b70..a74a320c356 100644
--- a/src/search.c
+++ b/src/search.c
@@ -42,6 +42,9 @@ struct regexp_cache
{
struct regexp_cache *next;
Lisp_Object regexp, whitespace_regexp;
+ /* Syntax table for which the regexp applies. We need this because
+ of character classes. */
+ Lisp_Object syntax_table;
struct re_pattern_buffer buf;
char fastmap[0400];
/* Nonzero means regexp was compiled to do full POSIX backtracking. */
@@ -167,6 +170,7 @@ compile_pattern_1 (cp, pattern, translate, regp, posix, multibyte)
cp->posix = posix;
cp->buf.multibyte = multibyte;
cp->whitespace_regexp = Vsearch_spaces_regexp;
+ cp->syntax_table = current_buffer->syntax_table;
/* Doing BLOCK_INPUT here has the effect that
the debugger won't run if an error occurs.
Why is BLOCK_INPUT needed here? */
@@ -256,6 +260,10 @@ compile_pattern (pattern, regp, translate, posix, multibyte)
&& EQ (cp->buf.translate, (! NILP (translate) ? translate : make_number (0)))
&& cp->posix == posix
&& cp->buf.multibyte == multibyte
+ /* TODO: Strictly speaking, we only need to match syntax
+ tables when a character class like [[:space:]] occurs in
+ the pattern. -- cyd*/
+ && EQ (cp->syntax_table, current_buffer->syntax_table)
&& !NILP (Fequal (cp->whitespace_regexp, Vsearch_spaces_regexp)))
break;
@@ -3114,8 +3122,10 @@ syms_of_search ()
searchbufs[i].buf.fastmap = searchbufs[i].fastmap;
searchbufs[i].regexp = Qnil;
searchbufs[i].whitespace_regexp = Qnil;
+ searchbufs[i].syntax_table = Qnil;
staticpro (&searchbufs[i].regexp);
staticpro (&searchbufs[i].whitespace_regexp);
+ staticpro (&searchbufs[i].syntax_table);
searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]);
}
searchbuf_head = &searchbufs[0];