return input;
}
+static void
+regcppartblow()
+{
+ I32 i = SSPOPINT;
+ U32 paren = 0;
+ char *input;
+ char *startp;
+ char *endp;
+ int lastparen;
+ int size;
+ assert(i == SAVEt_REGCONTEXT);
+ i = SSPOPINT;
+ input = (char *) SSPOPPTR;
+ lastparen = SSPOPINT;
+ size = SSPOPINT;
+ for (i -= 3; i > 0; i -= 3) {
+ paren = (U32)SSPOPINT;
+ startp = (char *) SSPOPPTR;
+ endp = (char *) SSPOPPTR;
+ if (paren <= *reglastparen && regendp[paren] == endp)
+ regstartp[paren] = startp;
+ }
+}
+
#define regcpblow(cp) leave_scope(cp)
/*
sayNO;
nextchar = UCHARAT(++locinput);
break;
+ case REFFL:
+ regtainted = TRUE;
+ /* FALL THROUGH */
case REF:
+ case REFF:
n = ARG1(scan); /* which paren pair */
s = regstartp[n];
if (!s)
if (s == regendp[n])
break;
/* Inline the first character, for speed. */
- if (UCHARAT(s) != nextchar)
+ if (UCHARAT(s) != nextchar &&
+ (OP(scan) == REF ||
+ (UCHARAT(s) != ((OP(scan) == REFF
+ ? fold : fold_locale)[nextchar]))))
sayNO;
ln = regendp[n] - s;
if (locinput + ln > regeol)
sayNO;
- if (ln > 1 && memNE(s, locinput, ln))
+ if (ln > 1 && (OP(scan) == REF
+ ? memNE(s, locinput, ln)
+ : (OP(scan) == REFF
+ ? ibcmp(s, locinput, ln)
+ : ibcmp_locale(s, locinput, ln))))
sayNO;
locinput += ln;
nextchar = UCHARAT(locinput);
case OPEN:
n = ARG1(scan); /* which paren pair */
regstartp[n] = locinput;
+ regendp[n] = 0;
if (n > regsize)
regsize = n;
break;
ln = regcc->cur;
cp = regcppush(cc->parenfloor);
if (regmatch(cc->next)) {
- regcpblow(cp);
+ regcppartblow(cp);
sayYES; /* All done. */
}
regcppop();
cc->lastloc = locinput;
cp = regcppush(cc->parenfloor);
if (regmatch(cc->scan)) {
- regcpblow(cp);
+ regcppartblow(cp);
sayYES;
}
regcppop();
cc->cur = n;
cc->lastloc = locinput;
if (regmatch(cc->scan)) {
- regcpblow(cp);
+ regcppartblow(cp);
sayYES;
}
regcppop(); /* Restore some previous $<digit>s? */