diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2001-01-24 23:11:40 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2001-01-24 23:11:40 +0000 |
commit | 411e42030513baa141c736c709bb9c1e2817e3b4 (patch) | |
tree | da9b8c21af199ac6053db849434bf1ff7b00e2b1 /src/regex.c | |
parent | 9575b9aedb2df889d960705ffa21e282e18fbc2d (diff) | |
download | emacs-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.c | 25 |
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 |