about summary refs log tree commit diff
path: root/posix/regex.c
diff options
context:
space:
mode:
Diffstat (limited to 'posix/regex.c')
-rw-r--r--posix/regex.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/posix/regex.c b/posix/regex.c
index 99cf4c31a7..1bd01911f5 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -4833,26 +4833,23 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
 	      }
             else if ((re_opcode_t) *p2 == charset)
 	      {
-#ifdef DEBUG
-		register unsigned char c
-                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
-#endif
-
-#if 0
-                if ((re_opcode_t) p1[3] == exactn
-		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
-			  && (p2[2 + p1[5] / BYTEWIDTH]
-			      & (1 << (p1[5] % BYTEWIDTH)))))
-#else
-                if ((re_opcode_t) p1[3] == exactn
-		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[4]
-			  && (p2[2 + p1[4] / BYTEWIDTH]
-			      & (1 << (p1[4] % BYTEWIDTH)))))
-#endif
-                  {
-  		    p[-3] = (unsigned char) pop_failure_jump;
-                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
-                                  c, p1[5]);
+                if ((re_opcode_t) p1[3] == exactn)
+		  {
+		    unsigned char *p1end = &p1[5] + p1[4];
+		    unsigned char *runp1 = &p1[5];
+
+		    while (runp1 < p1end)
+		      {
+			if ((int) p2[1] * BYTEWIDTH <= (int) *runp1
+			    || (p2[2 + *runp1 / BYTEWIDTH]
+				& (1 << (*runp1 % BYTEWIDTH))) == 0)
+			  {
+			    p[-3] = (unsigned char) pop_failure_jump;
+			    DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+			    break;
+			  }
+			++runp1;
+		      }
                   }
 
 		else if ((re_opcode_t) p1[3] == charset_not)