*
**** Alterations to Henry's code are...
****
- **** Copyright (c) 1991-2003, Larry Wall
+ **** Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ **** 2000, 2001, 2002, 2003, by Larry Wall and others
****
**** You may distribute under the terms of either the GNU General Public
**** License or the Artistic License, as specified in the README file.
#define RF_warned 2 /* warned about big count? */
#define RF_evaled 4 /* Did an EVAL with setting? */
#define RF_utf8 8 /* String contains multibyte chars? */
+#define RF_false 16 /* odd number of nested negatives */
#define UTF ((PL_reg_flags & RF_utf8) != 0)
Perl_croak(aTHX_ "panic: paren_elems_to_push < 0");
#define REGCP_OTHER_ELEMS 6
- SSCHECK(paren_elems_to_push + REGCP_OTHER_ELEMS);
+ SSGROW(paren_elems_to_push + REGCP_OTHER_ELEMS);
for (p = PL_regsize; p > parenfloor; p--) {
/* REGCP_PARENS_ELEMS are pushed per pairs of parentheses. */
SSPUSHINT(PL_regendp[p]);
goto fail_finish;
/* we may be pointing at the wrong string */
if (s && RX_MATCH_COPIED(prog))
- s = prog->subbeg + (s - SvPVX(sv));
+ s = strbeg + (s - SvPVX(sv));
if (data)
*data->scream_olds = s;
}
PL_multiline ? FBMrf_MULTILINE : 0))) ) {
/* we may be pointing at the wrong string */
if ((flags & REXEC_SCREAM) && RX_MATCH_COPIED(prog))
- s = prog->subbeg + (s - SvPVX(sv));
+ s = strbeg + (s - SvPVX(sv));
DEBUG_r( did_match = 1 );
if (HOPc(s, -back_max) > last1) {
last1 = HOPc(s, -back_min);
last = scream_olds; /* Only one occurrence. */
/* we may be pointing at the wrong string */
else if (RX_MATCH_COPIED(prog))
- s = prog->subbeg + (s - SvPVX(sv));
+ s = strbeg + (s - SvPVX(sv));
}
else {
STRLEN len;
COP *ocurcop = PL_curcop;
PAD *old_comppad;
SV *ret;
+ struct regexp *oreg = PL_reg_re;
n = ARG(scan);
PL_op = (OP_4tree*)PL_regdata->data[n];
sw = SvTRUE(ret);
logical = 0;
}
- else
+ else {
sv_setsv(save_scalar(PL_replgv), ret);
+ cache_re(oreg);
+ }
break;
}
case OPEN:
"%*s already tried at this position...\n",
REPORT_CODE_OFF+PL_regindent*2, "")
);
- sayNO_SILENT;
+ if (PL_reg_flags & RF_false)
+ sayYES;
+ else
+ sayNO_SILENT;
}
PL_reg_poscache[o] |= (1<<b);
}
if (! HAS_TEXT(text_node)) c1 = c2 = -1000;
else {
if (PL_regkind[(U8)OP(text_node)] == REF) {
- I32 n, ln;
- n = ARG(text_node); /* which paren pair */
- ln = PL_regstartp[n];
- /* assume yes if we haven't seen CLOSEn */
- if (
- (I32)*PL_reglastparen < n ||
- ln == -1 ||
- ln == PL_regendp[n]
- ) {
- c1 = c2 = -1000;
- goto assume_ok_MM;
- }
- c1 = *(PL_bostr + ln);
+ c1 = c2 = -1000;
+ goto assume_ok_MM;
}
else { c1 = (U8)*STRING(text_node); }
if (OP(text_node) == EXACTF || OP(text_node) == REFF)
if (! HAS_TEXT(text_node)) c1 = c2 = -1000;
else {
if (PL_regkind[(U8)OP(text_node)] == REF) {
- I32 n, ln;
- n = ARG(text_node); /* which paren pair */
- ln = PL_regstartp[n];
- /* assume yes if we haven't seen CLOSEn */
- if (
- (I32)*PL_reglastparen < n ||
- ln == -1 ||
- ln == PL_regendp[n]
- ) {
- c1 = c2 = -1000;
- goto assume_ok_REG;
- }
- c1 = *(PL_bostr + ln);
+ c1 = c2 = -1000;
+ goto assume_ok_REG;
}
else { c1 = (U8)*STRING(text_node); }
if (! HAS_TEXT(text_node)) c1 = c2 = -1000;
else {
if (PL_regkind[(U8)OP(text_node)] == REF) {
- I32 n, ln;
- n = ARG(text_node); /* which paren pair */
- ln = PL_regstartp[n];
- /* assume yes if we haven't seen CLOSEn */
- if (
- (I32)*PL_reglastparen < n ||
- ln == -1 ||
- ln == PL_regendp[n]
- ) {
- c1 = c2 = -1000;
- goto assume_ok_easy;
- }
- s = (U8*)PL_bostr + ln;
+ c1 = c2 = -1000;
+ goto assume_ok_easy;
}
else { s = (U8*)STRING(text_node); }
}
else
PL_reginput = locinput;
+ PL_reg_flags ^= RF_false;
goto do_ifmatch;
case IFMATCH:
n = 1;
do_ifmatch:
inner = NEXTOPER(NEXTOPER(scan));
if (regmatch(inner) != n) {
+ if (n == 0)
+ PL_reg_flags ^= RF_false;
say_no:
if (logical) {
logical = 0;
else
sayNO;
}
+ if (n == 0)
+ PL_reg_flags ^= RF_false;
say_yes:
if (logical) {
logical = 0;