changeset 35525:95c2eedea354

(mutually_exclusive_p): Don't blindly handle `charset_not' as if it was a `charset'.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 24 Jan 2001 23:11:40 +0000
parents 91c357a883aa
children b40a6cecc4d5
files src/regex.c
diffstat 1 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/regex.c	Wed Jan 24 22:21:31 2001 +0000
+++ b/src/regex.c	Wed Jan 24 23:11:40 2001 +0000
@@ -4263,7 +4263,7 @@
       {
 	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 @@
       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 @@
 	     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 @@
 		  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 @@
 	  }
       }
       
+    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