summaryrefslogtreecommitdiff
path: root/src/regex.c
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2001-01-24 23:11:40 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2001-01-24 23:11:40 +0000
commit411e42030513baa141c736c709bb9c1e2817e3b4 (patch)
treeda9b8c21af199ac6053db849434bf1ff7b00e2b1 /src/regex.c
parent9575b9aedb2df889d960705ffa21e282e18fbc2d (diff)
downloademacs-411e42030513baa141c736c709bb9c1e2817e3b4.tar.gz
(mutually_exclusive_p): Don't blindly handle `charset_not'
as if it was a `charset'.
Diffstat (limited to 'src/regex.c')
-rw-r--r--src/regex.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/regex.c b/src/regex.c
index c8c53e93adc..ffc791236d7 100644
--- a/src/regex.c
+++ b/src/regex.c
@@ -4263,7 +4263,7 @@ mutually_exclusive_p (bufp, p1, p2)
{
register re_wchar_t c
= (re_opcode_t) *p2 == endline ? '\n'
- : RE_STRING_CHAR(p2 + 2, pend - p2 - 2);
+ : RE_STRING_CHAR (p2 + 2, pend - p2 - 2);
if ((re_opcode_t) *p1 == exactn)
{
@@ -4308,13 +4308,11 @@ mutually_exclusive_p (bufp, p1, p2)
break;
case charset:
- case charset_not:
{
if ((re_opcode_t) *p1 == exactn)
/* Reuse the code above. */
return mutually_exclusive_p (bufp, p2, p1);
-
/* It is hard to list up all the character in charset
P2 if it includes multibyte character. Give up in
such case. */
@@ -4330,7 +4328,7 @@ mutually_exclusive_p (bufp, p1, p2)
P2 is ASCII, it is enough to test only bitmap
table of P1. */
- if (*p1 == *p2)
+ if ((re_opcode_t) *p1 == charset)
{
int idx;
/* We win if the charset inside the loop
@@ -4349,8 +4347,7 @@ mutually_exclusive_p (bufp, p1, p2)
return 1;
}
}
- else if ((re_opcode_t) *p1 == charset
- || (re_opcode_t) *p1 == charset_not)
+ else if ((re_opcode_t) *p1 == charset_not)
{
int idx;
/* We win if the charset_not inside the loop lists
@@ -4370,6 +4367,22 @@ mutually_exclusive_p (bufp, p1, p2)
}
}
+ case charset_not:
+ switch (SWITCH_ENUM_CAST (*p1))
+ {
+ case exactn:
+ case charset:
+ /* Reuse the code above. */
+ return mutually_exclusive_p (bufp, p2, p1);
+ case charset_not:
+ /* When we have two charset_not, it's very unlikely that
+ they don't overlap. The union of the two sets of excluded
+ chars should cover all possible chars, which, as a matter of
+ fact, is virtually impossible in multibyte buffers. */
+ ;
+ }
+ break;
+
case wordend:
case notsyntaxspec:
return ((re_opcode_t) *p1 == syntaxspec