about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--posix/regex.c24
2 files changed, 8 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 9b6bcf1cea..bbe67a7ea9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,7 +3,6 @@
 	* posix/regexbug1.c: Make it an error if the test fails.
 
 1999-08-23  Andreas Schwab  <schwab@suse.de>
-	    Ulrich Drepper  <drepper@cygnus.com>
 
 	* posix/regex.c (re_match_2_internal): Correct check for charset
 	after exactn in loop.
diff --git a/posix/regex.c b/posix/regex.c
index 1bd01911f5..16e91f1514 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -4833,23 +4833,15 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
 	      }
             else if ((re_opcode_t) *p2 == charset)
 	      {
-                if ((re_opcode_t) p1[3] == exactn)
+		/* We win if the first character of the loop is not part
+                   of the charset.  */
+                if ((re_opcode_t) p1[3] == exactn
+ 		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
+ 			  && (p2[2 + p1[5] / BYTEWIDTH]
+ 			      & (1 << (p1[5] % BYTEWIDTH)))))
 		  {
-		    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;
-		      }
+		    p[-3] = (unsigned char) pop_failure_jump;
+		    DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
                   }
 
 		else if ((re_opcode_t) p1[3] == charset_not)