From: Hugo van der Sanden Date: Fri, 14 Jul 2000 04:16:20 +0000 (+0100) Subject: Replace change #6337 with a better one. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=29d1e993db685c67acc489087a44f0e4137e296c;p=p5sagit%2Fp5-mst-13.2.git Replace change #6337 with a better one. Subject: Re: [PATCH] [ID 20000701.002] Regular Expressions Not Unsetting $1 Vars When Backtracking Message-Id: <200007140316.EAA15857@crypt.compulink.co.uk> p4raw-link: @6337 on //depot/cfgperl: f06a1d4e6ae96bf8af49f0ef1c79f500d8de0143 p4raw-id: //depot/cfgperl@6395 --- diff --git a/regexec.c b/regexec.c index 6bddf2d..7472d09 100644 --- a/regexec.c +++ b/regexec.c @@ -221,6 +221,22 @@ typedef struct re_cc_state #define regcpblow(cp) LEAVE_SCOPE(cp) +#define TRYPAREN(paren, n, input) { \ + if (paren) { \ + if (n) { \ + PL_regstartp[paren] = HOPc(input, -1) - PL_bostr; \ + PL_regendp[paren] = input - PL_bostr; \ + } \ + else \ + PL_regendp[paren] = -1; \ + } \ + if (regmatch(next)) \ + sayYES; \ + if (paren && n) \ + PL_regendp[paren] = -1; \ +} + + /* * pregexec and friends */ @@ -3001,8 +3017,6 @@ S_regmatch(pTHX_ regnode *prog) else c1 = c2 = -1000; PL_reginput = locinput; - if (paren) - PL_regendp[paren] = -1; if (minmod) { CHECKPOINT lastcp; minmod = 0; @@ -3037,16 +3051,7 @@ S_regmatch(pTHX_ regnode *prog) sayNO; } /* PL_reginput == locinput now */ - if (paren) { - if (ln) { - PL_regstartp[paren] = HOPc(locinput, -1) - PL_bostr; - PL_regendp[paren] = locinput - PL_bostr; - } - else - PL_regendp[paren] = -1; - } - if (regmatch(next)) - sayYES; + TRYPAREN(paren, ln, locinput); PL_reginput = locinput; /* Could be reset... */ REGCP_UNWIND; /* Couldn't or didn't -- move forward. */ @@ -3060,16 +3065,7 @@ S_regmatch(pTHX_ regnode *prog) UCHARAT(PL_reginput) == c1 || UCHARAT(PL_reginput) == c2) { - if (paren) { - if (n) { - PL_regstartp[paren] = HOPc(PL_reginput, -1) - PL_bostr; - PL_regendp[paren] = PL_reginput - PL_bostr; - } - else - PL_regendp[paren] = -1; - } - if (regmatch(next)) - sayYES; + TRYPAREN(paren, n, PL_reginput); REGCP_UNWIND; } /* Couldn't or didn't -- move forward. */ @@ -3103,16 +3099,7 @@ S_regmatch(pTHX_ regnode *prog) UCHARAT(PL_reginput) == c1 || UCHARAT(PL_reginput) == c2) { - if (paren && n) { - if (n) { - PL_regstartp[paren] = HOPc(PL_reginput, -1) - PL_bostr; - PL_regendp[paren] = PL_reginput - PL_bostr; - } - else - PL_regendp[paren] = -1; - } - if (regmatch(next)) - sayYES; + TRYPAREN(paren, n, PL_reginput); REGCP_UNWIND; } /* Couldn't or didn't -- back up. */ @@ -3127,8 +3114,7 @@ S_regmatch(pTHX_ regnode *prog) UCHARAT(PL_reginput) == c1 || UCHARAT(PL_reginput) == c2) { - if (regmatch(next)) - sayYES; + TRYPAREN(paren, n, PL_reginput); REGCP_UNWIND; } /* Couldn't or didn't -- back up. */ diff --git a/t/op/re_tests b/t/op/re_tests index d944a25..b3137c7 100644 --- a/t/op/re_tests +++ b/t/op/re_tests @@ -751,6 +751,7 @@ tt+$ xxxtt y - - '^\S\s+aa$'m \nx aa y - - (^|a)b ab y - - ^([ab]*?)(b)?(c)$ abac y -$2- -- +(\w)?(abc)\1b abcab n - - ^(?:.,){2}c a,b,c y - - ^(.,){2}c a,b,c y $1 b, ^(?:[^,]*,){2}c a,b,c y - -