Re: [pcre-dev] (*SKIP) action

Page principale
Supprimer ce message
Auteur: Philip Hazel
Date:  
À: ND
CC: Pcre-dev
Sujet: Re: [pcre-dev] (*SKIP) action
On Thu, 31 Dec 2009, ND wrote:

> And neighbour question:
>
> Subject string: ac
> Pattern: ^(?!a(*SKIP)b)
> Result: No match
> Expected: Match at position 1
>
> (*PRUNE) gives the same result.


I have fixed this bug and committed the patch for 8.00, which I have
also included below. This fix will be in 8.01, but there are still some
other things I need to do before the next release.

Philip

--
Philip Hazel



Index: pcre_exec.c
===================================================================
--- pcre_exec.c (revision 463)
+++ pcre_exec.c (working copy)
@@ -6,7 +6,7 @@
and semantics are as close as possible to those of the Perl 5 language.

                        Written by Philip Hazel
-           Copyright (c) 1997-2009 University of Cambridge
+           Copyright (c) 1997-2010 University of Cambridge


 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -1133,7 +1133,9 @@
     offset_top = md->end_offset_top;
     continue;


-    /* Negative assertion: all branches must fail to match */
+    /* Negative assertion: all branches must fail to match. Encountering SKIP,
+    PRUNE, or COMMIT means we must assume failure without checking subsequent 
+    branches. */


     case OP_ASSERT_NOT:
     case OP_ASSERTBACK_NOT:
@@ -1142,6 +1144,11 @@
       RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0,
         RM5);
       if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH);
+      if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT)
+        {
+        do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+        break; 
+        }  
       if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);
       ecode += GET(ecode,1);
       }