From 993928201df0c42258f32da6c882b791b1fab441 Mon Sep 17 00:00:00 2001 From: ph10 Date: Thu, 13 Jun 2019 16:49:40 +0000 Subject: [PATCH] Make pcre2_match() return (*MARK) names from successful conditional assertions, as Perl and the JIT do. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@1104 6239d852-aaf2-0410-a92c-79f79f948069 Petr Písař: Ported to 10.33. --- src/pcre2_match.c | 7 ++++--- testdata/testinput1 | 8 ++++++++ testdata/testoutput1 | 14 ++++++++++++++ diff --git a/src/pcre2_match.c b/src/pcre2_match.c index 849bb58..c7730a2 100644 --- a/src/pcre2_match.c +++ b/src/pcre2_match.c @@ -5472,15 +5472,16 @@ fprintf(stderr, "++ op=%d\n", *Fecode); /* If we are at the end of an assertion that is a condition, return a match, discarding any intermediate backtracking points. Copy back the - captures into the frame before N so that they are set on return. Doing - this for all assertions, both positive and negative, seems to match what - Perl does. */ + mark setting and the captures into the frame before N so that they are + set on return. Doing this for all assertions, both positive and negative, + seems to match what Perl does. */ if (GF_IDMASK(N->group_frame_type) == GF_CONDASSERT) { memcpy((char *)P + offsetof(heapframe, ovector), Fovector, Foffset_top * sizeof(PCRE2_SIZE)); P->offset_top = Foffset_top; + P->mark = Fmark; Fback_frame = (char *)F - (char *)P; RRETURN(MATCH_MATCH); } diff --git a/testdata/testinput1 b/testdata/testinput1 index 3fd5d2a..7b6918a 100644 --- a/testdata/testinput1 +++ b/testdata/testinput1 @@ -6343,4 +6343,12 @@ ef) x/x,mark /(?&word)* \. (? \w+ )/xi pokus.hokus +/a(?(?=(*:2)b).)/mark + abc + acb + +/a(?(?!(*:2)b).)/mark + acb + abc + # End of testinput1 diff --git a/testdata/testoutput1 b/testdata/testoutput1 index 8fd67b3..d9f8c3b 100644 --- a/testdata/testoutput1 +++ b/testdata/testoutput1 @@ -10049,4 +10049,18 @@ No match 0: pokus.hokus 1: hokus +/a(?(?=(*:2)b).)/mark + abc + 0: ab +MK: 2 + acb + 0: a + +/a(?(?!(*:2)b).)/mark + acb + 0: ac + abc + 0: a +MK: 2 + # End of testinput1 -- 2.20.1