UTF8 regexp patch from Inaba Hiroto.
Jarkko Hietaniemi [Fri, 18 Apr 2003 19:28:04 +0000 (19:28 +0000)]
p4raw-id: //depot/perl@19264

regcomp.c
t/op/pat.t

index c1ec5f9..8f52e28 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -576,14 +576,17 @@ S_cl_and(pTHX_ struct regnode_charclass_class *cl,
     if (!(and_with->flags & ANYOF_EOS))
        cl->flags &= ~ANYOF_EOS;
 
-    if (cl->flags & ANYOF_UNICODE_ALL && and_with->flags & ANYOF_UNICODE) {
+    if (cl->flags & ANYOF_UNICODE_ALL && and_with->flags & ANYOF_UNICODE &&
+       !(and_with->flags & ANYOF_INVERT)) {
        cl->flags &= ~ANYOF_UNICODE_ALL;
        cl->flags |= ANYOF_UNICODE;
        ARG_SET(cl, ARG(and_with));
     }
-    if (!(and_with->flags & ANYOF_UNICODE_ALL))
+    if (!(and_with->flags & ANYOF_UNICODE_ALL) &&
+       !(and_with->flags & ANYOF_INVERT))
        cl->flags &= ~ANYOF_UNICODE_ALL;
-    if (!(and_with->flags & (ANYOF_UNICODE|ANYOF_UNICODE_ALL)))
+    if (!(and_with->flags & (ANYOF_UNICODE|ANYOF_UNICODE_ALL)) &&
+       !(and_with->flags & ANYOF_INVERT))
        cl->flags &= ~ANYOF_UNICODE;
 }
 
index 26e8594..006e1b6 100755 (executable)
@@ -6,7 +6,7 @@
 
 $| = 1;
 
-print "1..997\n";
+print "1..998\n";
 
 BEGIN {
     chdir 't' if -d 't';
@@ -3166,4 +3166,10 @@ ok("bbbbac" =~ /$pattern/ && $1 eq 'a', "[perl #3547]");
        "[perl #17757] Parse::RecDescent triggers infinite loop");
 }
 
-# last test 997
+{
+    my $re = qq/^([^X]*)X/;
+    utf8::upgrade($re);
+    ok("\x{100}X" =~ /$re/, "S_cl_and ANYOF_UNICODE & ANYOF_INVERTED");
+}
+
+# last test 998