8abe220b198edabb370dfa0f72bd7d58296f1c1f
[p5sagit/p5-mst-13.2.git] / regexec.c
1 /*    regexec.c
2  */
3
4 /*
5  * "One Ring to rule them all, One Ring to find them..."
6  */
7
8 /* This file contains functions for executing a regular expression.  See
9  * also regcomp.c which funnily enough, contains functions for compiling
10  * a regular expression.
11  *
12  * This file is also copied at build time to ext/re/re_exec.c, where
13  * it's built with -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT.
14  * This causes the main functions to be compiled under new names and with
15  * debugging support added, which makes "use re 'debug'" work.
16  */
17
18 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
19  * confused with the original package (see point 3 below).  Thanks, Henry!
20  */
21
22 /* Additional note: this code is very heavily munged from Henry's version
23  * in places.  In some spots I've traded clarity for efficiency, so don't
24  * blame Henry for some of the lack of readability.
25  */
26
27 /* The names of the functions have been changed from regcomp and
28  * regexec to  pregcomp and pregexec in order to avoid conflicts
29  * with the POSIX routines of the same names.
30 */
31
32 #ifdef PERL_EXT_RE_BUILD
33 #include "re_top.h"
34 #endif
35
36 /*
37  * pregcomp and pregexec -- regsub and regerror are not used in perl
38  *
39  *      Copyright (c) 1986 by University of Toronto.
40  *      Written by Henry Spencer.  Not derived from licensed software.
41  *
42  *      Permission is granted to anyone to use this software for any
43  *      purpose on any computer system, and to redistribute it freely,
44  *      subject to the following restrictions:
45  *
46  *      1. The author is not responsible for the consequences of use of
47  *              this software, no matter how awful, even if they arise
48  *              from defects in it.
49  *
50  *      2. The origin of this software must not be misrepresented, either
51  *              by explicit claim or by omission.
52  *
53  *      3. Altered versions must be plainly marked as such, and must not
54  *              be misrepresented as being the original software.
55  *
56  ****    Alterations to Henry's code are...
57  ****
58  ****    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
59  ****    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
60  ****
61  ****    You may distribute under the terms of either the GNU General Public
62  ****    License or the Artistic License, as specified in the README file.
63  *
64  * Beware that some of this code is subtly aware of the way operator
65  * precedence is structured in regular expressions.  Serious changes in
66  * regular-expression syntax might require a total rethink.
67  */
68 #include "EXTERN.h"
69 #define PERL_IN_REGEXEC_C
70 #include "perl.h"
71
72 #ifdef PERL_IN_XSUB_RE
73 #  include "re_comp.h"
74 #else
75 #  include "regcomp.h"
76 #endif
77
78 #define RF_tainted      1               /* tainted information used? */
79 #define RF_warned       2               /* warned about big count? */
80
81 #define RF_utf8         8               /* Pattern contains multibyte chars? */
82
83 #define UTF ((PL_reg_flags & RF_utf8) != 0)
84
85 #define RS_init         1               /* eval environment created */
86 #define RS_set          2               /* replsv value is set */
87
88 #ifndef STATIC
89 #define STATIC  static
90 #endif
91
92 #define REGINCLASS(prog,p,c)  (ANYOF_FLAGS(p) ? reginclass(prog,p,c,0,0) : ANYOF_BITMAP_TEST(p,*(c)))
93
94 /*
95  * Forwards.
96  */
97
98 #define CHR_SVLEN(sv) (do_utf8 ? sv_len_utf8(sv) : SvCUR(sv))
99 #define CHR_DIST(a,b) (PL_reg_match_utf8 ? utf8_distance(a,b) : a - b)
100
101 #define HOPc(pos,off) \
102         (char *)(PL_reg_match_utf8 \
103             ? reghop3((U8*)pos, off, (U8*)(off >= 0 ? PL_regeol : PL_bostr)) \
104             : (U8*)(pos + off))
105 #define HOPBACKc(pos, off) \
106         (char*)(PL_reg_match_utf8\
107             ? reghopmaybe3((U8*)pos, -off, (U8*)PL_bostr) \
108             : (pos - off >= PL_bostr)           \
109                 ? (U8*)pos - off                \
110                 : NULL)
111
112 #define HOP3(pos,off,lim) (PL_reg_match_utf8 ? reghop3((U8*)(pos), off, (U8*)(lim)) : (U8*)(pos + off))
113 #define HOP3c(pos,off,lim) ((char*)HOP3(pos,off,lim))
114
115 #define LOAD_UTF8_CHARCLASS(class,str) STMT_START { \
116     if (!CAT2(PL_utf8_,class)) { bool ok; ENTER; save_re_context(); ok=CAT2(is_utf8_,class)((const U8*)str); assert(ok); LEAVE; } } STMT_END
117 #define LOAD_UTF8_CHARCLASS_ALNUM() LOAD_UTF8_CHARCLASS(alnum,"a")
118 #define LOAD_UTF8_CHARCLASS_DIGIT() LOAD_UTF8_CHARCLASS(digit,"0")
119 #define LOAD_UTF8_CHARCLASS_SPACE() LOAD_UTF8_CHARCLASS(space," ")
120 #define LOAD_UTF8_CHARCLASS_MARK()  LOAD_UTF8_CHARCLASS(mark, "\xcd\x86")
121
122 /* TODO: Combine JUMPABLE and HAS_TEXT to cache OP(rn) */
123
124 /* for use after a quantifier and before an EXACT-like node -- japhy */
125 #define JUMPABLE(rn) ( \
126     OP(rn) == OPEN || OP(rn) == CLOSE || OP(rn) == EVAL || \
127     OP(rn) == SUSPEND || OP(rn) == IFMATCH || \
128     OP(rn) == PLUS || OP(rn) == MINMOD || \
129     (PL_regkind[OP(rn)] == CURLY && ARG1(rn) > 0) \
130 )
131
132 #define HAS_TEXT(rn) ( \
133     PL_regkind[OP(rn)] == EXACT || PL_regkind[OP(rn)] == REF \
134 )
135
136 /*
137   Search for mandatory following text node; for lookahead, the text must
138   follow but for lookbehind (rn->flags != 0) we skip to the next step.
139 */
140 #define FIND_NEXT_IMPT(rn) STMT_START { \
141     while (JUMPABLE(rn)) { \
142         const OPCODE type = OP(rn); \
143         if (type == SUSPEND || PL_regkind[type] == CURLY) \
144             rn = NEXTOPER(NEXTOPER(rn)); \
145         else if (type == PLUS) \
146             rn = NEXTOPER(rn); \
147         else if (type == IFMATCH) \
148             rn = (rn->flags == 0) ? NEXTOPER(NEXTOPER(rn)) : rn + ARG(rn); \
149         else rn += NEXT_OFF(rn); \
150     } \
151 } STMT_END 
152
153
154 static void restore_pos(pTHX_ void *arg);
155
156 STATIC CHECKPOINT
157 S_regcppush(pTHX_ I32 parenfloor)
158 {
159     dVAR;
160     const int retval = PL_savestack_ix;
161 #define REGCP_PAREN_ELEMS 4
162     const int paren_elems_to_push = (PL_regsize - parenfloor) * REGCP_PAREN_ELEMS;
163     int p;
164     GET_RE_DEBUG_FLAGS_DECL;
165
166     if (paren_elems_to_push < 0)
167         Perl_croak(aTHX_ "panic: paren_elems_to_push < 0");
168
169 #define REGCP_OTHER_ELEMS 8
170     SSGROW(paren_elems_to_push + REGCP_OTHER_ELEMS);
171     
172     for (p = PL_regsize; p > parenfloor; p--) {
173 /* REGCP_PARENS_ELEMS are pushed per pairs of parentheses. */
174         SSPUSHINT(PL_regendp[p]);
175         SSPUSHINT(PL_regstartp[p]);
176         SSPUSHPTR(PL_reg_start_tmp[p]);
177         SSPUSHINT(p);
178         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
179           "     saving \\%"UVuf" %"IVdf"(%"IVdf")..%"IVdf"\n",
180                       (UV)p, (IV)PL_regstartp[p],
181                       (IV)(PL_reg_start_tmp[p] - PL_bostr),
182                       (IV)PL_regendp[p]
183         ));
184     }
185 /* REGCP_OTHER_ELEMS are pushed in any case, parentheses or no. */
186     SSPUSHPTR(PL_regstartp);
187     SSPUSHPTR(PL_regendp);
188     SSPUSHINT(PL_regsize);
189     SSPUSHINT(*PL_reglastparen);
190     SSPUSHINT(*PL_reglastcloseparen);
191     SSPUSHPTR(PL_reginput);
192 #define REGCP_FRAME_ELEMS 2
193 /* REGCP_FRAME_ELEMS are part of the REGCP_OTHER_ELEMS and
194  * are needed for the regexp context stack bookkeeping. */
195     SSPUSHINT(paren_elems_to_push + REGCP_OTHER_ELEMS - REGCP_FRAME_ELEMS);
196     SSPUSHINT(SAVEt_REGCONTEXT); /* Magic cookie. */
197
198     return retval;
199 }
200
201 /* These are needed since we do not localize EVAL nodes: */
202 #define REGCP_SET(cp)                                           \
203     DEBUG_STATE_r(                                              \
204             PerlIO_printf(Perl_debug_log,                       \
205                 "  Setting an EVAL scope, savestack=%"IVdf"\n", \
206                 (IV)PL_savestack_ix));                          \
207     cp = PL_savestack_ix
208
209 #define REGCP_UNWIND(cp)                                        \
210     DEBUG_STATE_r(                                              \
211         if (cp != PL_savestack_ix)                              \
212             PerlIO_printf(Perl_debug_log,                       \
213                 "  Clearing an EVAL scope, savestack=%"IVdf"..%"IVdf"\n", \
214                 (IV)(cp), (IV)PL_savestack_ix));                \
215     regcpblow(cp)
216
217 STATIC char *
218 S_regcppop(pTHX_ const regexp *rex)
219 {
220     dVAR;
221     U32 i;
222     char *input;
223
224     GET_RE_DEBUG_FLAGS_DECL;
225
226     /* Pop REGCP_OTHER_ELEMS before the parentheses loop starts. */
227     i = SSPOPINT;
228     assert(i == SAVEt_REGCONTEXT); /* Check that the magic cookie is there. */
229     i = SSPOPINT; /* Parentheses elements to pop. */
230     input = (char *) SSPOPPTR;
231     *PL_reglastcloseparen = SSPOPINT;
232     *PL_reglastparen = SSPOPINT;
233     PL_regsize = SSPOPINT;
234     PL_regendp=(I32 *) SSPOPPTR;
235     PL_regstartp=(I32 *) SSPOPPTR;
236
237     
238     /* Now restore the parentheses context. */
239     for (i -= (REGCP_OTHER_ELEMS - REGCP_FRAME_ELEMS);
240          i > 0; i -= REGCP_PAREN_ELEMS) {
241         I32 tmps;
242         U32 paren = (U32)SSPOPINT;
243         PL_reg_start_tmp[paren] = (char *) SSPOPPTR;
244         PL_regstartp[paren] = SSPOPINT;
245         tmps = SSPOPINT;
246         if (paren <= *PL_reglastparen)
247             PL_regendp[paren] = tmps;
248         DEBUG_EXECUTE_r(
249             PerlIO_printf(Perl_debug_log,
250                           "     restoring \\%"UVuf" to %"IVdf"(%"IVdf")..%"IVdf"%s\n",
251                           (UV)paren, (IV)PL_regstartp[paren],
252                           (IV)(PL_reg_start_tmp[paren] - PL_bostr),
253                           (IV)PL_regendp[paren],
254                           (paren > *PL_reglastparen ? "(no)" : ""));
255         );
256     }
257     DEBUG_EXECUTE_r(
258         if (*PL_reglastparen + 1 <= rex->nparens) {
259             PerlIO_printf(Perl_debug_log,
260                           "     restoring \\%"IVdf"..\\%"IVdf" to undef\n",
261                           (IV)(*PL_reglastparen + 1), (IV)rex->nparens);
262         }
263     );
264 #if 1
265     /* It would seem that the similar code in regtry()
266      * already takes care of this, and in fact it is in
267      * a better location to since this code can #if 0-ed out
268      * but the code in regtry() is needed or otherwise tests
269      * requiring null fields (pat.t#187 and split.t#{13,14}
270      * (as of patchlevel 7877)  will fail.  Then again,
271      * this code seems to be necessary or otherwise
272      * building DynaLoader will fail:
273      * "Error: '*' not in typemap in DynaLoader.xs, line 164"
274      * --jhi */
275     for (i = *PL_reglastparen + 1; i <= rex->nparens; i++) {
276         if (i > PL_regsize)
277             PL_regstartp[i] = -1;
278         PL_regendp[i] = -1;
279     }
280 #endif
281     return input;
282 }
283
284 #define regcpblow(cp) LEAVE_SCOPE(cp)   /* Ignores regcppush()ed data. */
285
286 /*
287  * pregexec and friends
288  */
289
290 #ifndef PERL_IN_XSUB_RE
291 /*
292  - pregexec - match a regexp against a string
293  */
294 I32
295 Perl_pregexec(pTHX_ register regexp *prog, char *stringarg, register char *strend,
296          char *strbeg, I32 minend, SV *screamer, U32 nosave)
297 /* strend: pointer to null at end of string */
298 /* strbeg: real beginning of string */
299 /* minend: end of match must be >=minend after stringarg. */
300 /* nosave: For optimizations. */
301 {
302     return
303         regexec_flags(prog, stringarg, strend, strbeg, minend, screamer, NULL,
304                       nosave ? 0 : REXEC_COPY_STR);
305 }
306 #endif
307
308 /*
309  * Need to implement the following flags for reg_anch:
310  *
311  * USE_INTUIT_NOML              - Useful to call re_intuit_start() first
312  * USE_INTUIT_ML
313  * INTUIT_AUTORITATIVE_NOML     - Can trust a positive answer
314  * INTUIT_AUTORITATIVE_ML
315  * INTUIT_ONCE_NOML             - Intuit can match in one location only.
316  * INTUIT_ONCE_ML
317  *
318  * Another flag for this function: SECOND_TIME (so that float substrs
319  * with giant delta may be not rechecked).
320  */
321
322 /* Assumptions: if ANCH_GPOS, then strpos is anchored. XXXX Check GPOS logic */
323
324 /* If SCREAM, then SvPVX_const(sv) should be compatible with strpos and strend.
325    Otherwise, only SvCUR(sv) is used to get strbeg. */
326
327 /* XXXX We assume that strpos is strbeg unless sv. */
328
329 /* XXXX Some places assume that there is a fixed substring.
330         An update may be needed if optimizer marks as "INTUITable"
331         RExen without fixed substrings.  Similarly, it is assumed that
332         lengths of all the strings are no more than minlen, thus they
333         cannot come from lookahead.
334         (Or minlen should take into account lookahead.) 
335   NOTE: Some of this comment is not correct. minlen does now take account
336   of lookahead/behind. Further research is required. -- demerphq
337
338 */
339
340 /* A failure to find a constant substring means that there is no need to make
341    an expensive call to REx engine, thus we celebrate a failure.  Similarly,
342    finding a substring too deep into the string means that less calls to
343    regtry() should be needed.
344
345    REx compiler's optimizer found 4 possible hints:
346         a) Anchored substring;
347         b) Fixed substring;
348         c) Whether we are anchored (beginning-of-line or \G);
349         d) First node (of those at offset 0) which may distingush positions;
350    We use a)b)d) and multiline-part of c), and try to find a position in the
351    string which does not contradict any of them.
352  */
353
354 /* Most of decisions we do here should have been done at compile time.
355    The nodes of the REx which we used for the search should have been
356    deleted from the finite automaton. */
357
358 char *
359 Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
360                      char *strend, U32 flags, re_scream_pos_data *data)
361 {
362     dVAR;
363     register I32 start_shift = 0;
364     /* Should be nonnegative! */
365     register I32 end_shift   = 0;
366     register char *s;
367     register SV *check;
368     char *strbeg;
369     char *t;
370     const bool do_utf8 = (sv && SvUTF8(sv)) ? 1 : 0; /* if no sv we have to assume bytes */
371     I32 ml_anch;
372     register char *other_last = NULL;   /* other substr checked before this */
373     char *check_at = NULL;              /* check substr found at this pos */
374     const I32 multiline = prog->reganch & PMf_MULTILINE;
375 #ifdef DEBUGGING
376     const char * const i_strpos = strpos;
377 #endif
378
379     GET_RE_DEBUG_FLAGS_DECL;
380
381     RX_MATCH_UTF8_set(prog,do_utf8);
382
383     if (prog->reganch & ROPT_UTF8) {
384         PL_reg_flags |= RF_utf8;
385     }
386     DEBUG_EXECUTE_r( 
387         debug_start_match(prog, do_utf8, strpos, strend, 
388             sv ? "Guessing start of match in sv for"
389                : "Guessing start of match in string for");
390               );
391
392     /* CHR_DIST() would be more correct here but it makes things slow. */
393     if (prog->minlen > strend - strpos) {
394         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
395                               "String too short... [re_intuit_start]\n"));
396         goto fail;
397     }
398                 
399     strbeg = (sv && SvPOK(sv)) ? strend - SvCUR(sv) : strpos;
400     PL_regeol = strend;
401     if (do_utf8) {
402         if (!prog->check_utf8 && prog->check_substr)
403             to_utf8_substr(prog);
404         check = prog->check_utf8;
405     } else {
406         if (!prog->check_substr && prog->check_utf8)
407             to_byte_substr(prog);
408         check = prog->check_substr;
409     }
410     if (check == &PL_sv_undef) {
411         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
412                 "Non-utf8 string cannot match utf8 check string\n"));
413         goto fail;
414     }
415     if (prog->reganch & ROPT_ANCH) {    /* Match at beg-of-str or after \n */
416         ml_anch = !( (prog->reganch & ROPT_ANCH_SINGLE)
417                      || ( (prog->reganch & ROPT_ANCH_BOL)
418                           && !multiline ) );    /* Check after \n? */
419
420         if (!ml_anch) {
421           if ( !(prog->reganch & (ROPT_ANCH_GPOS /* Checked by the caller */
422                                   | ROPT_IMPLICIT)) /* not a real BOL */
423                /* SvCUR is not set on references: SvRV and SvPVX_const overlap */
424                && sv && !SvROK(sv)
425                && (strpos != strbeg)) {
426               DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Not at start...\n"));
427               goto fail;
428           }
429           if (prog->check_offset_min == prog->check_offset_max &&
430               !(prog->reganch & ROPT_CANY_SEEN)) {
431             /* Substring at constant offset from beg-of-str... */
432             I32 slen;
433
434             s = HOP3c(strpos, prog->check_offset_min, strend);
435             
436             if (SvTAIL(check)) {
437                 slen = SvCUR(check);    /* >= 1 */
438
439                 if ( strend - s > slen || strend - s < slen - 1
440                      || (strend - s == slen && strend[-1] != '\n')) {
441                     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "String too long...\n"));
442                     goto fail_finish;
443                 }
444                 /* Now should match s[0..slen-2] */
445                 slen--;
446                 if (slen && (*SvPVX_const(check) != *s
447                              || (slen > 1
448                                  && memNE(SvPVX_const(check), s, slen)))) {
449                   report_neq:
450                     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "String not equal...\n"));
451                     goto fail_finish;
452                 }
453             }
454             else if (*SvPVX_const(check) != *s
455                      || ((slen = SvCUR(check)) > 1
456                          && memNE(SvPVX_const(check), s, slen)))
457                 goto report_neq;
458             check_at = s;
459             goto success_at_start;
460           }
461         }
462         /* Match is anchored, but substr is not anchored wrt beg-of-str. */
463         s = strpos;
464         start_shift = prog->check_offset_min; /* okay to underestimate on CC */
465         end_shift = prog->check_end_shift;
466         
467         if (!ml_anch) {
468             const I32 end = prog->check_offset_max + CHR_SVLEN(check)
469                                          - (SvTAIL(check) != 0);
470             const I32 eshift = CHR_DIST((U8*)strend, (U8*)s) - end;
471
472             if (end_shift < eshift)
473                 end_shift = eshift;
474         }
475     }
476     else {                              /* Can match at random position */
477         ml_anch = 0;
478         s = strpos;
479         start_shift = prog->check_offset_min;  /* okay to underestimate on CC */
480         end_shift = prog->check_end_shift;
481         
482         /* end shift should be non negative here */
483     }
484
485 #ifdef DEBUGGING        /* 7/99: reports of failure (with the older version) */
486     if (end_shift < 0)
487         Perl_croak(aTHX_ "panic: end_shift: %"IVdf" pattern:\n%s\n ",
488                    (IV)end_shift, prog->precomp);
489 #endif
490
491   restart:
492     /* Find a possible match in the region s..strend by looking for
493        the "check" substring in the region corrected by start/end_shift. */
494     
495     {
496         I32 srch_start_shift = start_shift;
497         I32 srch_end_shift = end_shift;
498         if (srch_start_shift < 0 && strbeg - s > srch_start_shift) {
499             srch_end_shift -= ((strbeg - s) - srch_start_shift); 
500             srch_start_shift = strbeg - s;
501         }
502     DEBUG_OPTIMISE_MORE_r({
503         PerlIO_printf(Perl_debug_log, "Check offset min: %"IVdf" Start shift: %"IVdf" End shift %"IVdf" Real End Shift: %"IVdf"\n",
504             (IV)prog->check_offset_min,
505             (IV)srch_start_shift,
506             (IV)srch_end_shift, 
507             (IV)prog->check_end_shift);
508     });       
509         
510     if (flags & REXEC_SCREAM) {
511         I32 p = -1;                     /* Internal iterator of scream. */
512         I32 * const pp = data ? data->scream_pos : &p;
513
514         if (PL_screamfirst[BmRARE(check)] >= 0
515             || ( BmRARE(check) == '\n'
516                  && (BmPREVIOUS(check) == SvCUR(check) - 1)
517                  && SvTAIL(check) ))
518             s = screaminstr(sv, check,
519                             srch_start_shift + (s - strbeg), srch_end_shift, pp, 0);
520         else
521             goto fail_finish;
522         /* we may be pointing at the wrong string */
523         if (s && RX_MATCH_COPIED(prog))
524             s = strbeg + (s - SvPVX_const(sv));
525         if (data)
526             *data->scream_olds = s;
527     }
528     else {
529         U8* start_point;
530         U8* end_point;
531         if (prog->reganch & ROPT_CANY_SEEN) {
532             start_point= (U8*)(s + srch_start_shift);
533             end_point= (U8*)(strend - srch_end_shift);
534         } else {
535             start_point= HOP3(s, srch_start_shift, srch_start_shift < 0 ? strbeg : strend);
536             end_point= HOP3(strend, -srch_end_shift, strbeg);
537         }
538         DEBUG_OPTIMISE_MORE_r({
539             PerlIO_printf(Perl_debug_log, "fbm_instr len=%d str=<%.*s>\n", 
540                 (int)(end_point - start_point),
541                 (int)(end_point - start_point) > 20 ? 20 : (int)(end_point - start_point), 
542                 start_point);
543         });
544
545         s = fbm_instr( start_point, end_point,
546                       check, multiline ? FBMrf_MULTILINE : 0);
547     }
548     }
549     /* Update the count-of-usability, remove useless subpatterns,
550         unshift s.  */
551
552     DEBUG_EXECUTE_r({
553         RE_PV_QUOTED_DECL(quoted, do_utf8, PERL_DEBUG_PAD_ZERO(0), 
554             SvPVX_const(check), RE_SV_DUMPLEN(check), 30);
555         PerlIO_printf(Perl_debug_log, "%s %s substr %s%s%s",
556                           (s ? "Found" : "Did not find"),
557             (check == (do_utf8 ? prog->anchored_utf8 : prog->anchored_substr) 
558                 ? "anchored" : "floating"),
559             quoted,
560             RE_SV_TAIL(check),
561             (s ? " at offset " : "...\n") ); 
562     });
563
564     if (!s)
565         goto fail_finish;
566     /* Finish the diagnostic message */
567     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "%ld...\n", (long)(s - i_strpos)) );
568
569     /* XXX dmq: first branch is for positive lookbehind...
570        Our check string is offset from the beginning of the pattern.
571        So we need to do any stclass tests offset forward from that 
572        point. I think. :-(
573      */
574     
575         
576     
577     check_at=s;
578      
579
580     /* Got a candidate.  Check MBOL anchoring, and the *other* substr.
581        Start with the other substr.
582        XXXX no SCREAM optimization yet - and a very coarse implementation
583        XXXX /ttx+/ results in anchored="ttx", floating="x".  floating will
584                 *always* match.  Probably should be marked during compile...
585        Probably it is right to do no SCREAM here...
586      */
587
588     if (do_utf8 ? (prog->float_utf8 && prog->anchored_utf8) 
589                 : (prog->float_substr && prog->anchored_substr)) 
590     {
591         /* Take into account the "other" substring. */
592         /* XXXX May be hopelessly wrong for UTF... */
593         if (!other_last)
594             other_last = strpos;
595         if (check == (do_utf8 ? prog->float_utf8 : prog->float_substr)) {
596           do_other_anchored:
597             {
598                 char * const last = HOP3c(s, -start_shift, strbeg);
599                 char *last1, *last2;
600                 char * const saved_s = s;
601                 SV* must;
602
603                 t = s - prog->check_offset_max;
604                 if (s - strpos > prog->check_offset_max  /* signed-corrected t > strpos */
605                     && (!do_utf8
606                         || ((t = (char*)reghopmaybe3((U8*)s, -(prog->check_offset_max), (U8*)strpos))
607                             && t > strpos)))
608                     NOOP;
609                 else
610                     t = strpos;
611                 t = HOP3c(t, prog->anchored_offset, strend);
612                 if (t < other_last)     /* These positions already checked */
613                     t = other_last;
614                 last2 = last1 = HOP3c(strend, -prog->minlen, strbeg);
615                 if (last < last1)
616                     last1 = last;
617                 /* XXXX It is not documented what units *_offsets are in.  
618                    We assume bytes, but this is clearly wrong. 
619                    Meaning this code needs to be carefully reviewed for errors.
620                    dmq.
621                   */
622  
623                 /* On end-of-str: see comment below. */
624                 must = do_utf8 ? prog->anchored_utf8 : prog->anchored_substr;
625                 if (must == &PL_sv_undef) {
626                     s = (char*)NULL;
627                     DEBUG_r(must = prog->anchored_utf8);        /* for debug */
628                 }
629                 else
630                     s = fbm_instr(
631                         (unsigned char*)t,
632                         HOP3(HOP3(last1, prog->anchored_offset, strend)
633                                 + SvCUR(must), -(SvTAIL(must)!=0), strbeg),
634                         must,
635                         multiline ? FBMrf_MULTILINE : 0
636                     );
637                 DEBUG_EXECUTE_r({
638                     RE_PV_QUOTED_DECL(quoted, do_utf8, PERL_DEBUG_PAD_ZERO(0), 
639                         SvPVX_const(must), RE_SV_DUMPLEN(must), 30);
640                     PerlIO_printf(Perl_debug_log, "%s anchored substr %s%s",
641                         (s ? "Found" : "Contradicts"),
642                         quoted, RE_SV_TAIL(must));
643                 });                 
644                 
645                             
646                 if (!s) {
647                     if (last1 >= last2) {
648                         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
649                                                 ", giving up...\n"));
650                         goto fail_finish;
651                     }
652                     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
653                         ", trying floating at offset %ld...\n",
654                         (long)(HOP3c(saved_s, 1, strend) - i_strpos)));
655                     other_last = HOP3c(last1, prog->anchored_offset+1, strend);
656                     s = HOP3c(last, 1, strend);
657                     goto restart;
658                 }
659                 else {
660                     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, " at offset %ld...\n",
661                           (long)(s - i_strpos)));
662                     t = HOP3c(s, -prog->anchored_offset, strbeg);
663                     other_last = HOP3c(s, 1, strend);
664                     s = saved_s;
665                     if (t == strpos)
666                         goto try_at_start;
667                     goto try_at_offset;
668                 }
669             }
670         }
671         else {          /* Take into account the floating substring. */
672             char *last, *last1;
673             char * const saved_s = s;
674             SV* must;
675
676             t = HOP3c(s, -start_shift, strbeg);
677             last1 = last =
678                 HOP3c(strend, -prog->minlen + prog->float_min_offset, strbeg);
679             if (CHR_DIST((U8*)last, (U8*)t) > prog->float_max_offset)
680                 last = HOP3c(t, prog->float_max_offset, strend);
681             s = HOP3c(t, prog->float_min_offset, strend);
682             if (s < other_last)
683                 s = other_last;
684  /* XXXX It is not documented what units *_offsets are in.  Assume bytes.  */
685             must = do_utf8 ? prog->float_utf8 : prog->float_substr;
686             /* fbm_instr() takes into account exact value of end-of-str
687                if the check is SvTAIL(ed).  Since false positives are OK,
688                and end-of-str is not later than strend we are OK. */
689             if (must == &PL_sv_undef) {
690                 s = (char*)NULL;
691                 DEBUG_r(must = prog->float_utf8);       /* for debug message */
692             }
693             else
694                 s = fbm_instr((unsigned char*)s,
695                               (unsigned char*)last + SvCUR(must)
696                                   - (SvTAIL(must)!=0),
697                               must, multiline ? FBMrf_MULTILINE : 0);
698             DEBUG_EXECUTE_r({
699                 RE_PV_QUOTED_DECL(quoted, do_utf8, PERL_DEBUG_PAD_ZERO(0), 
700                     SvPVX_const(must), RE_SV_DUMPLEN(must), 30);
701                 PerlIO_printf(Perl_debug_log, "%s floating substr %s%s",
702                     (s ? "Found" : "Contradicts"),
703                     quoted, RE_SV_TAIL(must));
704             });
705             if (!s) {
706                 if (last1 == last) {
707                     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
708                                             ", giving up...\n"));
709                     goto fail_finish;
710                 }
711                 DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
712                     ", trying anchored starting at offset %ld...\n",
713                     (long)(saved_s + 1 - i_strpos)));
714                 other_last = last;
715                 s = HOP3c(t, 1, strend);
716                 goto restart;
717             }
718             else {
719                 DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, " at offset %ld...\n",
720                       (long)(s - i_strpos)));
721                 other_last = s; /* Fix this later. --Hugo */
722                 s = saved_s;
723                 if (t == strpos)
724                     goto try_at_start;
725                 goto try_at_offset;
726             }
727         }
728     }
729
730     
731     t= (char*)HOP3( s, -prog->check_offset_max, (prog->check_offset_max<0) ? strend : strpos);
732         
733     DEBUG_OPTIMISE_MORE_r(
734         PerlIO_printf(Perl_debug_log, 
735             "Check offset min:%"IVdf" max:%"IVdf" S:%"IVdf" t:%"IVdf" D:%"IVdf" end:%"IVdf"\n",
736             (IV)prog->check_offset_min,
737             (IV)prog->check_offset_max,
738             (IV)(s-strpos),
739             (IV)(t-strpos),
740             (IV)(t-s),
741             (IV)(strend-strpos)
742         )
743     );
744
745     if (s - strpos > prog->check_offset_max  /* signed-corrected t > strpos */
746         && (!do_utf8
747             || ((t = (char*)reghopmaybe3((U8*)s, -prog->check_offset_max, (U8*) ((prog->check_offset_max<0) ? strend : strpos)))
748                  && t > strpos))) 
749     {
750         /* Fixed substring is found far enough so that the match
751            cannot start at strpos. */
752       try_at_offset:
753         if (ml_anch && t[-1] != '\n') {
754             /* Eventually fbm_*() should handle this, but often
755                anchored_offset is not 0, so this check will not be wasted. */
756             /* XXXX In the code below we prefer to look for "^" even in
757                presence of anchored substrings.  And we search even
758                beyond the found float position.  These pessimizations
759                are historical artefacts only.  */
760           find_anchor:
761             while (t < strend - prog->minlen) {
762                 if (*t == '\n') {
763                     if (t < check_at - prog->check_offset_min) {
764                         if (do_utf8 ? prog->anchored_utf8 : prog->anchored_substr) {
765                             /* Since we moved from the found position,
766                                we definitely contradict the found anchored
767                                substr.  Due to the above check we do not
768                                contradict "check" substr.
769                                Thus we can arrive here only if check substr
770                                is float.  Redo checking for "other"=="fixed".
771                              */
772                             strpos = t + 1;                     
773                             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m at offset %ld, rescanning for anchored from offset %ld...\n",
774                                 PL_colors[0], PL_colors[1], (long)(strpos - i_strpos), (long)(strpos - i_strpos + prog->anchored_offset)));
775                             goto do_other_anchored;
776                         }
777                         /* We don't contradict the found floating substring. */
778                         /* XXXX Why not check for STCLASS? */
779                         s = t + 1;
780                         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m at offset %ld...\n",
781                             PL_colors[0], PL_colors[1], (long)(s - i_strpos)));
782                         goto set_useful;
783                     }
784                     /* Position contradicts check-string */
785                     /* XXXX probably better to look for check-string
786                        than for "\n", so one should lower the limit for t? */
787                     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m, restarting lookup for check-string at offset %ld...\n",
788                         PL_colors[0], PL_colors[1], (long)(t + 1 - i_strpos)));
789                     other_last = strpos = s = t + 1;
790                     goto restart;
791                 }
792                 t++;
793             }
794             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Did not find /%s^%s/m...\n",
795                         PL_colors[0], PL_colors[1]));
796             goto fail_finish;
797         }
798         else {
799             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Starting position does not contradict /%s^%s/m...\n",
800                         PL_colors[0], PL_colors[1]));
801         }
802         s = t;
803       set_useful:
804         ++BmUSEFUL(do_utf8 ? prog->check_utf8 : prog->check_substr);    /* hooray/5 */
805     }
806     else {
807         /* The found string does not prohibit matching at strpos,
808            - no optimization of calling REx engine can be performed,
809            unless it was an MBOL and we are not after MBOL,
810            or a future STCLASS check will fail this. */
811       try_at_start:
812         /* Even in this situation we may use MBOL flag if strpos is offset
813            wrt the start of the string. */
814         if (ml_anch && sv && !SvROK(sv) /* See prev comment on SvROK */
815             && (strpos != strbeg) && strpos[-1] != '\n'
816             /* May be due to an implicit anchor of m{.*foo}  */
817             && !(prog->reganch & ROPT_IMPLICIT))
818         {
819             t = strpos;
820             goto find_anchor;
821         }
822         DEBUG_EXECUTE_r( if (ml_anch)
823             PerlIO_printf(Perl_debug_log, "Position at offset %ld does not contradict /%s^%s/m...\n",
824                         (long)(strpos - i_strpos), PL_colors[0], PL_colors[1]);
825         );
826       success_at_start:
827         if (!(prog->reganch & ROPT_NAUGHTY)     /* XXXX If strpos moved? */
828             && (do_utf8 ? (
829                 prog->check_utf8                /* Could be deleted already */
830                 && --BmUSEFUL(prog->check_utf8) < 0
831                 && (prog->check_utf8 == prog->float_utf8)
832             ) : (
833                 prog->check_substr              /* Could be deleted already */
834                 && --BmUSEFUL(prog->check_substr) < 0
835                 && (prog->check_substr == prog->float_substr)
836             )))
837         {
838             /* If flags & SOMETHING - do not do it many times on the same match */
839             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "... Disabling check substring...\n"));
840             SvREFCNT_dec(do_utf8 ? prog->check_utf8 : prog->check_substr);
841             if (do_utf8 ? prog->check_substr : prog->check_utf8)
842                 SvREFCNT_dec(do_utf8 ? prog->check_substr : prog->check_utf8);
843             prog->check_substr = prog->check_utf8 = NULL;       /* disable */
844             prog->float_substr = prog->float_utf8 = NULL;       /* clear */
845             check = NULL;                       /* abort */
846             s = strpos;
847             /* XXXX This is a remnant of the old implementation.  It
848                     looks wasteful, since now INTUIT can use many
849                     other heuristics. */
850             prog->reganch &= ~RE_USE_INTUIT;
851         }
852         else
853             s = strpos;
854     }
855
856     /* Last resort... */
857     /* XXXX BmUSEFUL already changed, maybe multiple change is meaningful... */
858     /* trie stclasses are too expensive to use here, we are better off to
859        leave it to regmatch itself */
860     if (prog->regstclass && PL_regkind[OP(prog->regstclass)]!=TRIE) {
861         /* minlen == 0 is possible if regstclass is \b or \B,
862            and the fixed substr is ''$.
863            Since minlen is already taken into account, s+1 is before strend;
864            accidentally, minlen >= 1 guaranties no false positives at s + 1
865            even for \b or \B.  But (minlen? 1 : 0) below assumes that
866            regstclass does not come from lookahead...  */
867         /* If regstclass takes bytelength more than 1: If charlength==1, OK.
868            This leaves EXACTF only, which is dealt with in find_byclass().  */
869         const U8* const str = (U8*)STRING(prog->regstclass);
870         const int cl_l = (PL_regkind[OP(prog->regstclass)] == EXACT
871                     ? CHR_DIST(str+STR_LEN(prog->regstclass), str)
872                     : 1);
873         char * endpos;
874         if (prog->anchored_substr || prog->anchored_utf8 || ml_anch)
875             endpos= HOP3c(s, (prog->minlen ? cl_l : 0), strend);
876         else if (prog->float_substr || prog->float_utf8)
877             endpos= HOP3c(HOP3c(check_at, -start_shift, strbeg), cl_l, strend);
878         else 
879             endpos= strend;
880                     
881         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "start_shift: %"IVdf" check_at: %d s: %d endpos: %d\n",
882                                       (IV)start_shift, check_at - strbeg, s - strbeg, endpos - strbeg));
883         
884         t = s;
885         s = find_byclass(prog, prog->regstclass, s, endpos, NULL);
886         if (!s) {
887 #ifdef DEBUGGING
888             const char *what = NULL;
889 #endif
890             if (endpos == strend) {
891                 DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
892                                 "Could not match STCLASS...\n") );
893                 goto fail;
894             }
895             DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
896                                    "This position contradicts STCLASS...\n") );
897             if ((prog->reganch & ROPT_ANCH) && !ml_anch)
898                 goto fail;
899             /* Contradict one of substrings */
900             if (prog->anchored_substr || prog->anchored_utf8) {
901                 if ((do_utf8 ? prog->anchored_utf8 : prog->anchored_substr) == check) {
902                     DEBUG_EXECUTE_r( what = "anchored" );
903                   hop_and_restart:
904                     s = HOP3c(t, 1, strend);
905                     if (s + start_shift + end_shift > strend) {
906                         /* XXXX Should be taken into account earlier? */
907                         DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
908                                                "Could not match STCLASS...\n") );
909                         goto fail;
910                     }
911                     if (!check)
912                         goto giveup;
913                     DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
914                                 "Looking for %s substr starting at offset %ld...\n",
915                                  what, (long)(s + start_shift - i_strpos)) );
916                     goto restart;
917                 }
918                 /* Have both, check_string is floating */
919                 if (t + start_shift >= check_at) /* Contradicts floating=check */
920                     goto retry_floating_check;
921                 /* Recheck anchored substring, but not floating... */
922                 s = check_at;
923                 if (!check)
924                     goto giveup;
925                 DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
926                           "Looking for anchored substr starting at offset %ld...\n",
927                           (long)(other_last - i_strpos)) );
928                 goto do_other_anchored;
929             }
930             /* Another way we could have checked stclass at the
931                current position only: */
932             if (ml_anch) {
933                 s = t = t + 1;
934                 if (!check)
935                     goto giveup;
936                 DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
937                           "Looking for /%s^%s/m starting at offset %ld...\n",
938                           PL_colors[0], PL_colors[1], (long)(t - i_strpos)) );
939                 goto try_at_offset;
940             }
941             if (!(do_utf8 ? prog->float_utf8 : prog->float_substr))     /* Could have been deleted */
942                 goto fail;
943             /* Check is floating subtring. */
944           retry_floating_check:
945             t = check_at - start_shift;
946             DEBUG_EXECUTE_r( what = "floating" );
947             goto hop_and_restart;
948         }
949         if (t != s) {
950             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
951                         "By STCLASS: moving %ld --> %ld\n",
952                                   (long)(t - i_strpos), (long)(s - i_strpos))
953                    );
954         }
955         else {
956             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
957                                   "Does not contradict STCLASS...\n"); 
958                    );
959         }
960     }
961   giveup:
962     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "%s%s:%s match at offset %ld\n",
963                           PL_colors[4], (check ? "Guessed" : "Giving up"),
964                           PL_colors[5], (long)(s - i_strpos)) );
965     return s;
966
967   fail_finish:                          /* Substring not found */
968     if (prog->check_substr || prog->check_utf8)         /* could be removed already */
969         BmUSEFUL(do_utf8 ? prog->check_utf8 : prog->check_substr) += 5; /* hooray */
970   fail:
971     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "%sMatch rejected by optimizer%s\n",
972                           PL_colors[4], PL_colors[5]));
973     return NULL;
974 }
975
976
977
978 #define REXEC_TRIE_READ_CHAR(trie_type, trie, uc, uscan, len, uvc, charid,  \
979 foldlen, foldbuf, uniflags) STMT_START {                                    \
980     switch (trie_type) {                                                    \
981     case trie_utf8_fold:                                                    \
982         if ( foldlen>0 ) {                                                  \
983             uvc = utf8n_to_uvuni( uscan, UTF8_MAXLEN, &len, uniflags );     \
984             foldlen -= len;                                                 \
985             uscan += len;                                                   \
986             len=0;                                                          \
987         } else {                                                            \
988             uvc = utf8n_to_uvuni( (U8*)uc, UTF8_MAXLEN, &len, uniflags );   \
989             uvc = to_uni_fold( uvc, foldbuf, &foldlen );                    \
990             foldlen -= UNISKIP( uvc );                                      \
991             uscan = foldbuf + UNISKIP( uvc );                               \
992         }                                                                   \
993         break;                                                              \
994     case trie_utf8:                                                         \
995         uvc = utf8n_to_uvuni( (U8*)uc, UTF8_MAXLEN, &len, uniflags );       \
996         break;                                                              \
997     case trie_plain:                                                        \
998         uvc = (UV)*uc;                                                      \
999         len = 1;                                                            \
1000     }                                                                       \
1001                                                                             \
1002     if (uvc < 256) {                                                        \
1003         charid = trie->charmap[ uvc ];                                      \
1004     }                                                                       \
1005     else {                                                                  \
1006         charid = 0;                                                         \
1007         if (trie->widecharmap) {                                            \
1008             SV** const svpp = hv_fetch(trie->widecharmap,                   \
1009                         (char*)&uvc, sizeof(UV), 0);                        \
1010             if (svpp)                                                       \
1011                 charid = (U16)SvIV(*svpp);                                  \
1012         }                                                                   \
1013     }                                                                       \
1014 } STMT_END
1015
1016 #define REXEC_FBC_EXACTISH_CHECK(CoNd)                  \
1017     if ( (CoNd)                                        \
1018          && (ln == len ||                              \
1019              ibcmp_utf8(s, NULL, 0,  do_utf8,          \
1020                         m, NULL, ln, (bool)UTF))       \
1021          && (!reginfo || regtry(reginfo, &s)) )         \
1022         goto got_it;                                   \
1023     else {                                             \
1024          U8 foldbuf[UTF8_MAXBYTES_CASE+1];             \
1025          uvchr_to_utf8(tmpbuf, c);                     \
1026          f = to_utf8_fold(tmpbuf, foldbuf, &foldlen);  \
1027          if ( f != c                                   \
1028               && (f == c1 || f == c2)                  \
1029               && (ln == foldlen ||                     \
1030                   !ibcmp_utf8((char *) foldbuf,        \
1031                               NULL, foldlen, do_utf8,  \
1032                               m,                       \
1033                               NULL, ln, (bool)UTF))    \
1034               && (!reginfo || regtry(reginfo, &s)) )    \
1035               goto got_it;                             \
1036     }                                                  \
1037     s += len
1038
1039 #define REXEC_FBC_EXACTISH_SCAN(CoNd)                     \
1040 STMT_START {                                              \
1041     while (s <= e) {                                      \
1042         if ( (CoNd)                                       \
1043              && (ln == 1 || !(OP(c) == EXACTF             \
1044                               ? ibcmp(s, m, ln)           \
1045                               : ibcmp_locale(s, m, ln)))  \
1046              && (!reginfo || regtry(reginfo, &s)) )        \
1047             goto got_it;                                  \
1048         s++;                                              \
1049     }                                                     \
1050 } STMT_END
1051
1052 #define REXEC_FBC_UTF8_SCAN(CoDe)                     \
1053 STMT_START {                                          \
1054     while (s + (uskip = UTF8SKIP(s)) <= strend) {     \
1055         CoDe                                          \
1056         s += uskip;                                   \
1057     }                                                 \
1058 } STMT_END
1059
1060 #define REXEC_FBC_SCAN(CoDe)                          \
1061 STMT_START {                                          \
1062     while (s < strend) {                              \
1063         CoDe                                          \
1064         s++;                                          \
1065     }                                                 \
1066 } STMT_END
1067
1068 #define REXEC_FBC_UTF8_CLASS_SCAN(CoNd)               \
1069 REXEC_FBC_UTF8_SCAN(                                  \
1070     if (CoNd) {                                       \
1071         if (tmp && (!reginfo || regtry(reginfo, &s)))  \
1072             goto got_it;                              \
1073         else                                          \
1074             tmp = doevery;                            \
1075     }                                                 \
1076     else                                              \
1077         tmp = 1;                                      \
1078 )
1079
1080 #define REXEC_FBC_CLASS_SCAN(CoNd)                    \
1081 REXEC_FBC_SCAN(                                       \
1082     if (CoNd) {                                       \
1083         if (tmp && (!reginfo || regtry(reginfo, &s)))  \
1084             goto got_it;                              \
1085         else                                          \
1086             tmp = doevery;                            \
1087     }                                                 \
1088     else                                              \
1089         tmp = 1;                                      \
1090 )
1091
1092 #define REXEC_FBC_TRYIT               \
1093 if ((!reginfo || regtry(reginfo, &s))) \
1094     goto got_it
1095
1096 #define REXEC_FBC_CSCAN_PRELOAD(UtFpReLoAd,CoNdUtF8,CoNd)      \
1097     if (do_utf8) {                                             \
1098         UtFpReLoAd;                                            \
1099         REXEC_FBC_UTF8_CLASS_SCAN(CoNdUtF8);                   \
1100     }                                                          \
1101     else {                                                     \
1102         REXEC_FBC_CLASS_SCAN(CoNd);                            \
1103     }                                                          \
1104     break
1105
1106 #define REXEC_FBC_CSCAN_TAINT(CoNdUtF8,CoNd)                   \
1107     PL_reg_flags |= RF_tainted;                                \
1108     if (do_utf8) {                                             \
1109         REXEC_FBC_UTF8_CLASS_SCAN(CoNdUtF8);                   \
1110     }                                                          \
1111     else {                                                     \
1112         REXEC_FBC_CLASS_SCAN(CoNd);                            \
1113     }                                                          \
1114     break
1115
1116 #define DUMP_EXEC_POS(li,s,doutf8) \
1117     dump_exec_pos(li,s,(PL_regeol),(PL_bostr),(PL_reg_starttry),doutf8)
1118
1119 /* We know what class REx starts with.  Try to find this position... */
1120 /* if reginfo is NULL, its a dryrun */
1121 /* annoyingly all the vars in this routine have different names from their counterparts
1122    in regmatch. /grrr */
1123
1124 STATIC char *
1125 S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, 
1126     const char *strend, regmatch_info *reginfo)
1127 {
1128         dVAR;
1129         const I32 doevery = (prog->reganch & ROPT_SKIP) == 0;
1130         char *m;
1131         STRLEN ln;
1132         STRLEN lnc;
1133         register STRLEN uskip;
1134         unsigned int c1;
1135         unsigned int c2;
1136         char *e;
1137         register I32 tmp = 1;   /* Scratch variable? */
1138         register const bool do_utf8 = PL_reg_match_utf8;
1139
1140         /* We know what class it must start with. */
1141         switch (OP(c)) {
1142         case ANYOF:
1143             if (do_utf8) {
1144                  REXEC_FBC_UTF8_CLASS_SCAN((ANYOF_FLAGS(c) & ANYOF_UNICODE) ||
1145                           !UTF8_IS_INVARIANT((U8)s[0]) ?
1146                           reginclass(prog, c, (U8*)s, 0, do_utf8) :
1147                           REGINCLASS(prog, c, (U8*)s));
1148             }
1149             else {
1150                  while (s < strend) {
1151                       STRLEN skip = 1;
1152
1153                       if (REGINCLASS(prog, c, (U8*)s) ||
1154                           (ANYOF_FOLD_SHARP_S(c, s, strend) &&
1155                            /* The assignment of 2 is intentional:
1156                             * for the folded sharp s, the skip is 2. */
1157                            (skip = SHARP_S_SKIP))) {
1158                            if (tmp && (!reginfo || regtry(reginfo, &s)))
1159                                 goto got_it;
1160                            else
1161                                 tmp = doevery;
1162                       }
1163                       else 
1164                            tmp = 1;
1165                       s += skip;
1166                  }
1167             }
1168             break;
1169         case CANY:
1170             REXEC_FBC_SCAN(
1171                 if (tmp && (!reginfo || regtry(reginfo, &s)))
1172                     goto got_it;
1173                 else
1174                     tmp = doevery;
1175             );
1176             break;
1177         case EXACTF:
1178             m   = STRING(c);
1179             ln  = STR_LEN(c);   /* length to match in octets/bytes */
1180             lnc = (I32) ln;     /* length to match in characters */
1181             if (UTF) {
1182                 STRLEN ulen1, ulen2;
1183                 U8 *sm = (U8 *) m;
1184                 U8 tmpbuf1[UTF8_MAXBYTES_CASE+1];
1185                 U8 tmpbuf2[UTF8_MAXBYTES_CASE+1];
1186                 const U32 uniflags = UTF8_ALLOW_DEFAULT;
1187
1188                 to_utf8_lower((U8*)m, tmpbuf1, &ulen1);
1189                 to_utf8_upper((U8*)m, tmpbuf2, &ulen2);
1190
1191                 c1 = utf8n_to_uvchr(tmpbuf1, UTF8_MAXBYTES_CASE, 
1192                                     0, uniflags);
1193                 c2 = utf8n_to_uvchr(tmpbuf2, UTF8_MAXBYTES_CASE,
1194                                     0, uniflags);
1195                 lnc = 0;
1196                 while (sm < ((U8 *) m + ln)) {
1197                     lnc++;
1198                     sm += UTF8SKIP(sm);
1199                 }
1200             }
1201             else {
1202                 c1 = *(U8*)m;
1203                 c2 = PL_fold[c1];
1204             }
1205             goto do_exactf;
1206         case EXACTFL:
1207             m   = STRING(c);
1208             ln  = STR_LEN(c);
1209             lnc = (I32) ln;
1210             c1 = *(U8*)m;
1211             c2 = PL_fold_locale[c1];
1212           do_exactf:
1213             e = HOP3c(strend, -((I32)lnc), s);
1214
1215             if (!reginfo && e < s)
1216                 e = s;                  /* Due to minlen logic of intuit() */
1217
1218             /* The idea in the EXACTF* cases is to first find the
1219              * first character of the EXACTF* node and then, if
1220              * necessary, case-insensitively compare the full
1221              * text of the node.  The c1 and c2 are the first
1222              * characters (though in Unicode it gets a bit
1223              * more complicated because there are more cases
1224              * than just upper and lower: one needs to use
1225              * the so-called folding case for case-insensitive
1226              * matching (called "loose matching" in Unicode).
1227              * ibcmp_utf8() will do just that. */
1228
1229             if (do_utf8) {
1230                 UV c, f;
1231                 U8 tmpbuf [UTF8_MAXBYTES+1];
1232                 STRLEN len, foldlen;
1233                 const U32 uniflags = UTF8_ALLOW_DEFAULT;
1234                 if (c1 == c2) {
1235                     /* Upper and lower of 1st char are equal -
1236                      * probably not a "letter". */
1237                     while (s <= e) {
1238                         c = utf8n_to_uvchr((U8*)s, UTF8_MAXBYTES, &len,
1239                                            uniflags);
1240                         REXEC_FBC_EXACTISH_CHECK(c == c1);
1241                     }
1242                 }
1243                 else {
1244                     while (s <= e) {
1245                       c = utf8n_to_uvchr((U8*)s, UTF8_MAXBYTES, &len,
1246                                            uniflags);
1247
1248                         /* Handle some of the three Greek sigmas cases.
1249                          * Note that not all the possible combinations
1250                          * are handled here: some of them are handled
1251                          * by the standard folding rules, and some of
1252                          * them (the character class or ANYOF cases)
1253                          * are handled during compiletime in
1254                          * regexec.c:S_regclass(). */
1255                         if (c == (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA ||
1256                             c == (UV)UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA)
1257                             c = (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA;
1258
1259                         REXEC_FBC_EXACTISH_CHECK(c == c1 || c == c2);
1260                     }
1261                 }
1262             }
1263             else {
1264                 if (c1 == c2)
1265                     REXEC_FBC_EXACTISH_SCAN(*(U8*)s == c1);
1266                 else
1267                     REXEC_FBC_EXACTISH_SCAN(*(U8*)s == c1 || *(U8*)s == c2);
1268             }
1269             break;
1270         case BOUNDL:
1271             PL_reg_flags |= RF_tainted;
1272             /* FALL THROUGH */
1273         case BOUND:
1274             if (do_utf8) {
1275                 if (s == PL_bostr)
1276                     tmp = '\n';
1277                 else {
1278                     U8 * const r = reghop3((U8*)s, -1, (U8*)PL_bostr);
1279                     tmp = utf8n_to_uvchr(r, UTF8SKIP(r), 0, UTF8_ALLOW_DEFAULT);
1280                 }
1281                 tmp = ((OP(c) == BOUND ?
1282                         isALNUM_uni(tmp) : isALNUM_LC_uvchr(UNI_TO_NATIVE(tmp))) != 0);
1283                 LOAD_UTF8_CHARCLASS_ALNUM();
1284                 REXEC_FBC_UTF8_SCAN(
1285                     if (tmp == !(OP(c) == BOUND ?
1286                                  (bool)swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
1287                                  isALNUM_LC_utf8((U8*)s)))
1288                     {
1289                         tmp = !tmp;
1290                         REXEC_FBC_TRYIT;
1291                 }
1292                 );
1293             }
1294             else {
1295                 tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
1296                 tmp = ((OP(c) == BOUND ? isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
1297                 REXEC_FBC_SCAN(
1298                     if (tmp ==
1299                         !(OP(c) == BOUND ? isALNUM(*s) : isALNUM_LC(*s))) {
1300                         tmp = !tmp;
1301                         REXEC_FBC_TRYIT;
1302                 }
1303                 );
1304             }
1305             if ((!prog->minlen && tmp) && (!reginfo || regtry(reginfo, &s)))
1306                 goto got_it;
1307             break;
1308         case NBOUNDL:
1309             PL_reg_flags |= RF_tainted;
1310             /* FALL THROUGH */
1311         case NBOUND:
1312             if (do_utf8) {
1313                 if (s == PL_bostr)
1314                     tmp = '\n';
1315                 else {
1316                     U8 * const r = reghop3((U8*)s, -1, (U8*)PL_bostr);
1317                     tmp = utf8n_to_uvchr(r, UTF8SKIP(r), 0, UTF8_ALLOW_DEFAULT);
1318                 }
1319                 tmp = ((OP(c) == NBOUND ?
1320                         isALNUM_uni(tmp) : isALNUM_LC_uvchr(UNI_TO_NATIVE(tmp))) != 0);
1321                 LOAD_UTF8_CHARCLASS_ALNUM();
1322                 REXEC_FBC_UTF8_SCAN(
1323                     if (tmp == !(OP(c) == NBOUND ?
1324                                  (bool)swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
1325                                  isALNUM_LC_utf8((U8*)s)))
1326                         tmp = !tmp;
1327                     else REXEC_FBC_TRYIT;
1328                 );
1329             }
1330             else {
1331                 tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
1332                 tmp = ((OP(c) == NBOUND ?
1333                         isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
1334                 REXEC_FBC_SCAN(
1335                     if (tmp ==
1336                         !(OP(c) == NBOUND ? isALNUM(*s) : isALNUM_LC(*s)))
1337                         tmp = !tmp;
1338                     else REXEC_FBC_TRYIT;
1339                 );
1340             }
1341             if ((!prog->minlen && !tmp) && (!reginfo || regtry(reginfo, &s)))
1342                 goto got_it;
1343             break;
1344         case ALNUM:
1345             REXEC_FBC_CSCAN_PRELOAD(
1346                 LOAD_UTF8_CHARCLASS_ALNUM(),
1347                 swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8),
1348                 isALNUM(*s)
1349             );
1350         case ALNUML:
1351             REXEC_FBC_CSCAN_TAINT(
1352                 isALNUM_LC_utf8((U8*)s),
1353                 isALNUM_LC(*s)
1354             );
1355         case NALNUM:
1356             REXEC_FBC_CSCAN_PRELOAD(
1357                 LOAD_UTF8_CHARCLASS_ALNUM(),
1358                 !swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8),
1359                 !isALNUM(*s)
1360             );
1361         case NALNUML:
1362             REXEC_FBC_CSCAN_TAINT(
1363                 !isALNUM_LC_utf8((U8*)s),
1364                 !isALNUM_LC(*s)
1365             );
1366         case SPACE:
1367             REXEC_FBC_CSCAN_PRELOAD(
1368                 LOAD_UTF8_CHARCLASS_SPACE(),
1369                 *s == ' ' || swash_fetch(PL_utf8_space,(U8*)s, do_utf8),
1370                 isSPACE(*s)
1371             );
1372         case SPACEL:
1373             REXEC_FBC_CSCAN_TAINT(
1374                 *s == ' ' || isSPACE_LC_utf8((U8*)s),
1375                 isSPACE_LC(*s)
1376             );
1377         case NSPACE:
1378             REXEC_FBC_CSCAN_PRELOAD(
1379                 LOAD_UTF8_CHARCLASS_SPACE(),
1380                 !(*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s, do_utf8)),
1381                 !isSPACE(*s)
1382             );
1383         case NSPACEL:
1384             REXEC_FBC_CSCAN_TAINT(
1385                 !(*s == ' ' || isSPACE_LC_utf8((U8*)s)),
1386                 !isSPACE_LC(*s)
1387             );
1388         case DIGIT:
1389             REXEC_FBC_CSCAN_PRELOAD(
1390                 LOAD_UTF8_CHARCLASS_DIGIT(),
1391                 swash_fetch(PL_utf8_digit,(U8*)s, do_utf8),
1392                 isDIGIT(*s)
1393             );
1394         case DIGITL:
1395             REXEC_FBC_CSCAN_TAINT(
1396                 isDIGIT_LC_utf8((U8*)s),
1397                 isDIGIT_LC(*s)
1398             );
1399         case NDIGIT:
1400             REXEC_FBC_CSCAN_PRELOAD(
1401                 LOAD_UTF8_CHARCLASS_DIGIT(),
1402                 !swash_fetch(PL_utf8_digit,(U8*)s, do_utf8),
1403                 !isDIGIT(*s)
1404             );
1405         case NDIGITL:
1406             REXEC_FBC_CSCAN_TAINT(
1407                 !isDIGIT_LC_utf8((U8*)s),
1408                 !isDIGIT_LC(*s)
1409             );
1410         case AHOCORASICKC:
1411         case AHOCORASICK: 
1412             {
1413                 const enum { trie_plain, trie_utf8, trie_utf8_fold }
1414                     trie_type = do_utf8 ?
1415                           (c->flags == EXACT ? trie_utf8 : trie_utf8_fold)
1416                         : trie_plain;
1417                 /* what trie are we using right now */
1418                 reg_ac_data *aho
1419                     = (reg_ac_data*)prog->data->data[ ARG( c ) ];
1420                 reg_trie_data *trie=aho->trie;
1421
1422                 const char *last_start = strend - trie->minlen;
1423 #ifdef DEBUGGING
1424                 const char *real_start = s;
1425 #endif
1426                 STRLEN maxlen = trie->maxlen;
1427                 SV *sv_points;
1428                 U8 **points; /* map of where we were in the input string
1429                                 when reading a given char. For ASCII this
1430                                 is unnecessary overhead as the relationship
1431                                 is always 1:1, but for unicode, especially
1432                                 case folded unicode this is not true. */
1433                 U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1434                 U8 *bitmap=NULL;
1435
1436
1437                 GET_RE_DEBUG_FLAGS_DECL;
1438
1439                 /* We can't just allocate points here. We need to wrap it in
1440                  * an SV so it gets freed properly if there is a croak while
1441                  * running the match */
1442                 ENTER;
1443                 SAVETMPS;
1444                 sv_points=newSV(maxlen * sizeof(U8 *));
1445                 SvCUR_set(sv_points,
1446                     maxlen * sizeof(U8 *));
1447                 SvPOK_on(sv_points);
1448                 sv_2mortal(sv_points);
1449                 points=(U8**)SvPV_nolen(sv_points );
1450                 if ( trie_type != trie_utf8_fold 
1451                      && (trie->bitmap || OP(c)==AHOCORASICKC) ) 
1452                 {
1453                     if (trie->bitmap) 
1454                         bitmap=(U8*)trie->bitmap;
1455                     else
1456                         bitmap=(U8*)ANYOF_BITMAP(c);
1457                 }
1458                 /* this is the Aho-Corasick algorithm modified a touch
1459                    to include special handling for long "unknown char" 
1460                    sequences. The basic idea being that we use AC as long
1461                    as we are dealing with a possible matching char, when
1462                    we encounter an unknown char (and we have not encountered
1463                    an accepting state) we scan forward until we find a legal 
1464                    starting char. 
1465                    AC matching is basically that of trie matching, except
1466                    that when we encounter a failing transition, we fall back
1467                    to the current states "fail state", and try the current char 
1468                    again, a process we repeat until we reach the root state, 
1469                    state 1, or a legal transition. If we fail on the root state 
1470                    then we can either terminate if we have reached an accepting 
1471                    state previously, or restart the entire process from the beginning 
1472                    if we have not.
1473
1474                  */
1475                 while (s <= last_start) {
1476                     const U32 uniflags = UTF8_ALLOW_DEFAULT;
1477                     U8 *uc = (U8*)s;
1478                     U16 charid = 0;
1479                     U32 base = 1;
1480                     U32 state = 1;
1481                     UV uvc = 0;
1482                     STRLEN len = 0;
1483                     STRLEN foldlen = 0;
1484                     U8 *uscan = (U8*)NULL;
1485                     U8 *leftmost = NULL;
1486 #ifdef DEBUGGING                    
1487                     U32 accepted_word= 0;
1488 #endif
1489                     U32 pointpos = 0;
1490
1491                     while ( state && uc <= (U8*)strend ) {
1492                         int failed=0;
1493                         U32 word = aho->states[ state ].wordnum;
1494
1495                         if( state==1 ) {
1496                             if ( bitmap ) {
1497                                 DEBUG_TRIE_EXECUTE_r(
1498                                     if ( uc <= (U8*)last_start && !BITMAP_TEST(bitmap,*uc) ) {
1499                                         dump_exec_pos( (char *)uc, c, strend, real_start, 
1500                                             (char *)uc, do_utf8 );
1501                                         PerlIO_printf( Perl_debug_log,
1502                                             " Scanning for legal start char...\n");
1503                                     }
1504                                 );            
1505                                 while ( uc <= (U8*)last_start  && !BITMAP_TEST(bitmap,*uc) ) {
1506                                     uc++;
1507                                 }
1508                                 s= (char *)uc;
1509                             }
1510                             if (uc >(U8*)last_start) break;
1511                         }
1512                                             
1513                         if ( word ) {
1514                             U8 *lpos= points[ (pointpos - trie->wordlen[word-1] ) % maxlen ];
1515                             if (!leftmost || lpos < leftmost) {
1516                                 DEBUG_r(accepted_word=word);
1517                                 leftmost= lpos;
1518                             }
1519                             if (base==0) break;
1520                             
1521                         }
1522                         points[pointpos++ % maxlen]= uc;
1523                         REXEC_TRIE_READ_CHAR(trie_type, trie, uc, uscan, len,
1524                             uvc, charid, foldlen, foldbuf, uniflags);
1525                         DEBUG_TRIE_EXECUTE_r({
1526                             dump_exec_pos( (char *)uc, c, strend, real_start, 
1527                                 s,   do_utf8 );
1528                             PerlIO_printf(Perl_debug_log,
1529                                 " Charid:%3u CP:%4"UVxf" ",
1530                                  charid, uvc);
1531                         });
1532
1533                         do {
1534 #ifdef DEBUGGING
1535                             word = aho->states[ state ].wordnum;
1536 #endif
1537                             base = aho->states[ state ].trans.base;
1538
1539                             DEBUG_TRIE_EXECUTE_r({
1540                                 if (failed) 
1541                                     dump_exec_pos( (char *)uc, c, strend, real_start, 
1542                                         s,   do_utf8 );
1543                                 PerlIO_printf( Perl_debug_log,
1544                                     "%sState: %4"UVxf", word=%"UVxf,
1545                                     failed ? " Fail transition to " : "",
1546                                     (UV)state, (UV)word);
1547                             });
1548                             if ( base ) {
1549                                 U32 tmp;
1550                                 if (charid &&
1551                                      (base + charid > trie->uniquecharcount )
1552                                      && (base + charid - 1 - trie->uniquecharcount
1553                                             < trie->lasttrans)
1554                                      && trie->trans[base + charid - 1 -
1555                                             trie->uniquecharcount].check == state
1556                                      && (tmp=trie->trans[base + charid - 1 -
1557                                         trie->uniquecharcount ].next))
1558                                 {
1559                                     DEBUG_TRIE_EXECUTE_r(
1560                                         PerlIO_printf( Perl_debug_log," - legal\n"));
1561                                     state = tmp;
1562                                     break;
1563                                 }
1564                                 else {
1565                                     DEBUG_TRIE_EXECUTE_r(
1566                                         PerlIO_printf( Perl_debug_log," - fail\n"));
1567                                     failed = 1;
1568                                     state = aho->fail[state];
1569                                 }
1570                             }
1571                             else {
1572                                 /* we must be accepting here */
1573                                 DEBUG_TRIE_EXECUTE_r(
1574                                         PerlIO_printf( Perl_debug_log," - accepting\n"));
1575                                 failed = 1;
1576                                 break;
1577                             }
1578                         } while(state);
1579                         uc += len;
1580                         if (failed) {
1581                             if (leftmost)
1582                                 break;
1583                             if (!state) state = 1;
1584                         }
1585                     }
1586                     if ( aho->states[ state ].wordnum ) {
1587                         U8 *lpos = points[ (pointpos - trie->wordlen[aho->states[ state ].wordnum-1]) % maxlen ];
1588                         if (!leftmost || lpos < leftmost) {
1589                             DEBUG_r(accepted_word=aho->states[ state ].wordnum);
1590                             leftmost = lpos;
1591                         }
1592                     }
1593                     if (leftmost) {
1594                         s = (char*)leftmost;
1595                         DEBUG_TRIE_EXECUTE_r({
1596                             PerlIO_printf( 
1597                                 Perl_debug_log,"Matches word #%"UVxf" at position %d. Trying full pattern...\n",
1598                                 (UV)accepted_word, s - real_start
1599                             );
1600                         });
1601                         if (!reginfo || regtry(reginfo, &s)) {
1602                             FREETMPS;
1603                             LEAVE;
1604                             goto got_it;
1605                         }
1606                         s = HOPc(s,1);
1607                         DEBUG_TRIE_EXECUTE_r({
1608                             PerlIO_printf( Perl_debug_log,"Pattern failed. Looking for new start point...\n");
1609                         });
1610                     } else {
1611                         DEBUG_TRIE_EXECUTE_r(
1612                             PerlIO_printf( Perl_debug_log,"No match.\n"));
1613                         break;
1614                     }
1615                 }
1616                 FREETMPS;
1617                 LEAVE;
1618             }
1619             break;
1620         default:
1621             Perl_croak(aTHX_ "panic: unknown regstclass %d", (int)OP(c));
1622             break;
1623         }
1624         return 0;
1625       got_it:
1626         return s;
1627 }
1628
1629 /*
1630  - regexec_flags - match a regexp against a string
1631  */
1632 I32
1633 Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *strend,
1634               char *strbeg, I32 minend, SV *sv, void *data, U32 flags)
1635 /* strend: pointer to null at end of string */
1636 /* strbeg: real beginning of string */
1637 /* minend: end of match must be >=minend after stringarg. */
1638 /* data: May be used for some additional optimizations. */
1639 /* nosave: For optimizations. */
1640 {
1641     dVAR;
1642     /*register*/ char *s;
1643     register regnode *c;
1644     /*register*/ char *startpos = stringarg;
1645     I32 minlen;         /* must match at least this many chars */
1646     I32 dontbother = 0; /* how many characters not to try at end */
1647     I32 end_shift = 0;                  /* Same for the end. */         /* CC */
1648     I32 scream_pos = -1;                /* Internal iterator of scream. */
1649     char *scream_olds = NULL;
1650     SV* const oreplsv = GvSV(PL_replgv);
1651     const bool do_utf8 = (bool)DO_UTF8(sv);
1652     I32 multiline;
1653
1654     regmatch_info reginfo;  /* create some info to pass to regtry etc */
1655
1656     GET_RE_DEBUG_FLAGS_DECL;
1657
1658     PERL_UNUSED_ARG(data);
1659
1660     /* Be paranoid... */
1661     if (prog == NULL || startpos == NULL) {
1662         Perl_croak(aTHX_ "NULL regexp parameter");
1663         return 0;
1664     }
1665
1666     multiline = prog->reganch & PMf_MULTILINE;
1667     reginfo.prog = prog;
1668
1669     RX_MATCH_UTF8_set(prog, do_utf8);
1670     DEBUG_EXECUTE_r( 
1671         debug_start_match(prog, do_utf8, startpos, strend, 
1672         "Matching");
1673     );
1674
1675     minlen = prog->minlen;
1676     
1677     if (strend - startpos < (minlen+(prog->check_offset_min<0?prog->check_offset_min:0))) {
1678         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
1679                               "String too short [regexec_flags]...\n"));
1680         goto phooey;
1681     }
1682
1683     
1684     /* Check validity of program. */
1685     if (UCHARAT(prog->program) != REG_MAGIC) {
1686         Perl_croak(aTHX_ "corrupted regexp program");
1687     }
1688
1689     PL_reg_flags = 0;
1690     PL_reg_eval_set = 0;
1691     PL_reg_maxiter = 0;
1692
1693     if (prog->reganch & ROPT_UTF8)
1694         PL_reg_flags |= RF_utf8;
1695
1696     /* Mark beginning of line for ^ and lookbehind. */
1697     reginfo.bol = startpos; /* XXX not used ??? */
1698     PL_bostr  = strbeg;
1699     reginfo.sv = sv;
1700
1701     /* Mark end of line for $ (and such) */
1702     PL_regeol = strend;
1703
1704     /* see how far we have to get to not match where we matched before */
1705     reginfo.till = startpos+minend;
1706
1707     /* If there is a "must appear" string, look for it. */
1708     s = startpos;
1709
1710     if (prog->reganch & ROPT_GPOS_SEEN) { /* Need to set reginfo->ganch */
1711         MAGIC *mg;
1712
1713         if (flags & REXEC_IGNOREPOS)    /* Means: check only at start */
1714             reginfo.ganch = startpos;
1715         else if (sv && SvTYPE(sv) >= SVt_PVMG
1716                   && SvMAGIC(sv)
1717                   && (mg = mg_find(sv, PERL_MAGIC_regex_global))
1718                   && mg->mg_len >= 0) {
1719             reginfo.ganch = strbeg + mg->mg_len;        /* Defined pos() */
1720             if (prog->reganch & ROPT_ANCH_GPOS) {
1721                 if (s > reginfo.ganch)
1722                     goto phooey;
1723                 s = reginfo.ganch;
1724             }
1725         }
1726         else                            /* pos() not defined */
1727             reginfo.ganch = strbeg;
1728     }
1729     if (PL_curpm && (PM_GETRE(PL_curpm) == prog)) {
1730         I32 *t;
1731         if (!prog->swap) {
1732         /* We have to be careful. If the previous successful match
1733            was from this regex we don't want a subsequent paritally
1734            successful match to clobber the old results. 
1735            So when we detect this possibility we add a swap buffer
1736            to the re, and switch the buffer each match. If we fail
1737            we switch it back, otherwise we leave it swapped.
1738         */
1739             Newxz(prog->swap, 1, regexp_paren_ofs);
1740             /* no need to copy these */
1741             Newxz(prog->swap->startp, prog->nparens + 1, I32);
1742             Newxz(prog->swap->endp, prog->nparens + 1, I32);
1743         }
1744         t = prog->swap->startp;
1745         prog->swap->startp = prog->startp;
1746         prog->startp = t;
1747         t = prog->swap->endp;
1748         prog->swap->endp = prog->endp;
1749         prog->endp = t;
1750     }
1751     if (!(flags & REXEC_CHECKED) && (prog->check_substr != NULL || prog->check_utf8 != NULL)) {
1752         re_scream_pos_data d;
1753
1754         d.scream_olds = &scream_olds;
1755         d.scream_pos = &scream_pos;
1756         s = re_intuit_start(prog, sv, s, strend, flags, &d);
1757         if (!s) {
1758             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Not present...\n"));
1759             goto phooey;        /* not present */
1760         }
1761     }
1762
1763
1764
1765     /* Simplest case:  anchored match need be tried only once. */
1766     /*  [unless only anchor is BOL and multiline is set] */
1767     if (prog->reganch & (ROPT_ANCH & ~ROPT_ANCH_GPOS)) {
1768         if (s == startpos && regtry(&reginfo, &startpos))
1769             goto got_it;
1770         else if (multiline || (prog->reganch & ROPT_IMPLICIT)
1771                  || (prog->reganch & ROPT_ANCH_MBOL)) /* XXXX SBOL? */
1772         {
1773             char *end;
1774
1775             if (minlen)
1776                 dontbother = minlen - 1;
1777             end = HOP3c(strend, -dontbother, strbeg) - 1;
1778             /* for multiline we only have to try after newlines */
1779             if (prog->check_substr || prog->check_utf8) {
1780                 if (s == startpos)
1781                     goto after_try;
1782                 while (1) {
1783                     if (regtry(&reginfo, &s))
1784                         goto got_it;
1785                   after_try:
1786                     if (s >= end)
1787                         goto phooey;
1788                     if (prog->reganch & RE_USE_INTUIT) {
1789                         s = re_intuit_start(prog, sv, s + 1, strend, flags, NULL);
1790                         if (!s)
1791                             goto phooey;
1792                     }
1793                     else
1794                         s++;
1795                 }               
1796             } else {
1797                 if (s > startpos)
1798                     s--;
1799                 while (s < end) {
1800                     if (*s++ == '\n') { /* don't need PL_utf8skip here */
1801                         if (regtry(&reginfo, &s))
1802                             goto got_it;
1803                     }
1804                 }               
1805             }
1806         }
1807         goto phooey;
1808     } else if (ROPT_GPOS_CHECK == (prog->reganch & ROPT_GPOS_CHECK)) 
1809     {
1810         /* the warning about reginfo.ganch being used without intialization
1811            is bogus -- we set it above, when prog->reganch & ROPT_GPOS_SEEN 
1812            and we only enter this block when the same bit is set. */
1813         if (regtry(&reginfo, &reginfo.ganch))
1814             goto got_it;
1815         goto phooey;
1816     }
1817
1818     /* Messy cases:  unanchored match. */
1819     if ((prog->anchored_substr || prog->anchored_utf8) && prog->reganch & ROPT_SKIP) {
1820         /* we have /x+whatever/ */
1821         /* it must be a one character string (XXXX Except UTF?) */
1822         char ch;
1823 #ifdef DEBUGGING
1824         int did_match = 0;
1825 #endif
1826         if (!(do_utf8 ? prog->anchored_utf8 : prog->anchored_substr))
1827             do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1828         ch = SvPVX_const(do_utf8 ? prog->anchored_utf8 : prog->anchored_substr)[0];
1829
1830         if (do_utf8) {
1831             REXEC_FBC_SCAN(
1832                 if (*s == ch) {
1833                     DEBUG_EXECUTE_r( did_match = 1 );
1834                     if (regtry(&reginfo, &s)) goto got_it;
1835                     s += UTF8SKIP(s);
1836                     while (s < strend && *s == ch)
1837                         s += UTF8SKIP(s);
1838                 }
1839             );
1840         }
1841         else {
1842             REXEC_FBC_SCAN(
1843                 if (*s == ch) {
1844                     DEBUG_EXECUTE_r( did_match = 1 );
1845                     if (regtry(&reginfo, &s)) goto got_it;
1846                     s++;
1847                     while (s < strend && *s == ch)
1848                         s++;
1849                 }
1850             );
1851         }
1852         DEBUG_EXECUTE_r(if (!did_match)
1853                 PerlIO_printf(Perl_debug_log,
1854                                   "Did not find anchored character...\n")
1855                );
1856     }
1857     else if (prog->anchored_substr != NULL
1858               || prog->anchored_utf8 != NULL
1859               || ((prog->float_substr != NULL || prog->float_utf8 != NULL)
1860                   && prog->float_max_offset < strend - s)) {
1861         SV *must;
1862         I32 back_max;
1863         I32 back_min;
1864         char *last;
1865         char *last1;            /* Last position checked before */
1866 #ifdef DEBUGGING
1867         int did_match = 0;
1868 #endif
1869         if (prog->anchored_substr || prog->anchored_utf8) {
1870             if (!(do_utf8 ? prog->anchored_utf8 : prog->anchored_substr))
1871                 do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1872             must = do_utf8 ? prog->anchored_utf8 : prog->anchored_substr;
1873             back_max = back_min = prog->anchored_offset;
1874         } else {
1875             if (!(do_utf8 ? prog->float_utf8 : prog->float_substr))
1876                 do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1877             must = do_utf8 ? prog->float_utf8 : prog->float_substr;
1878             back_max = prog->float_max_offset;
1879             back_min = prog->float_min_offset;
1880         }
1881         
1882             
1883         if (must == &PL_sv_undef)
1884             /* could not downgrade utf8 check substring, so must fail */
1885             goto phooey;
1886
1887         if (back_min<0) {
1888             last = strend;
1889         } else {
1890             last = HOP3c(strend,        /* Cannot start after this */
1891                   -(I32)(CHR_SVLEN(must)
1892                          - (SvTAIL(must) != 0) + back_min), strbeg);
1893         }
1894         if (s > PL_bostr)
1895             last1 = HOPc(s, -1);
1896         else
1897             last1 = s - 1;      /* bogus */
1898
1899         /* XXXX check_substr already used to find "s", can optimize if
1900            check_substr==must. */
1901         scream_pos = -1;
1902         dontbother = end_shift;
1903         strend = HOPc(strend, -dontbother);
1904         while ( (s <= last) &&
1905                 ((flags & REXEC_SCREAM)
1906                  ? (s = screaminstr(sv, must, HOP3c(s, back_min, (back_min<0 ? strbeg : strend)) - strbeg,
1907                                     end_shift, &scream_pos, 0))
1908                  : (s = fbm_instr((unsigned char*)HOP3(s, back_min, (back_min<0 ? strbeg : strend)),
1909                                   (unsigned char*)strend, must,
1910                                   multiline ? FBMrf_MULTILINE : 0))) ) {
1911             /* we may be pointing at the wrong string */
1912             if ((flags & REXEC_SCREAM) && RX_MATCH_COPIED(prog))
1913                 s = strbeg + (s - SvPVX_const(sv));
1914             DEBUG_EXECUTE_r( did_match = 1 );
1915             if (HOPc(s, -back_max) > last1) {
1916                 last1 = HOPc(s, -back_min);
1917                 s = HOPc(s, -back_max);
1918             }
1919             else {
1920                 char * const t = (last1 >= PL_bostr) ? HOPc(last1, 1) : last1 + 1;
1921
1922                 last1 = HOPc(s, -back_min);
1923                 s = t;
1924             }
1925             if (do_utf8) {
1926                 while (s <= last1) {
1927                     if (regtry(&reginfo, &s))
1928                         goto got_it;
1929                     s += UTF8SKIP(s);
1930                 }
1931             }
1932             else {
1933                 while (s <= last1) {
1934                     if (regtry(&reginfo, &s))
1935                         goto got_it;
1936                     s++;
1937                 }
1938             }
1939         }
1940         DEBUG_EXECUTE_r(if (!did_match) {
1941             RE_PV_QUOTED_DECL(quoted, do_utf8, PERL_DEBUG_PAD_ZERO(0), 
1942                 SvPVX_const(must), RE_SV_DUMPLEN(must), 30);
1943             PerlIO_printf(Perl_debug_log, "Did not find %s substr %s%s...\n",
1944                               ((must == prog->anchored_substr || must == prog->anchored_utf8)
1945                                ? "anchored" : "floating"),
1946                 quoted, RE_SV_TAIL(must));
1947         });                 
1948         goto phooey;
1949     }
1950     else if ( (c = prog->regstclass) ) {
1951         if (minlen) {
1952             const OPCODE op = OP(prog->regstclass);
1953             /* don't bother with what can't match */
1954             if (PL_regkind[op] != EXACT && op != CANY && PL_regkind[op] != TRIE)
1955                 strend = HOPc(strend, -(minlen - 1));
1956         }
1957         DEBUG_EXECUTE_r({
1958             SV * const prop = sv_newmortal();
1959             regprop(prog, prop, c);
1960             {
1961                 RE_PV_QUOTED_DECL(quoted,UTF,PERL_DEBUG_PAD_ZERO(1),
1962                     s,strend-s,60);
1963                 PerlIO_printf(Perl_debug_log,
1964                     "Matching stclass %.*s against %s (%d chars)\n",
1965                     (int)SvCUR(prop), SvPVX_const(prop),
1966                      quoted, (int)(strend - s));
1967             }
1968         });
1969         if (find_byclass(prog, c, s, strend, &reginfo))
1970             goto got_it;
1971         DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "Contradicts stclass... [regexec_flags]\n"));
1972     }
1973     else {
1974         dontbother = 0;
1975         if (prog->float_substr != NULL || prog->float_utf8 != NULL) {
1976             /* Trim the end. */
1977             char *last;
1978             SV* float_real;
1979
1980             if (!(do_utf8 ? prog->float_utf8 : prog->float_substr))
1981                 do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1982             float_real = do_utf8 ? prog->float_utf8 : prog->float_substr;
1983
1984             if (flags & REXEC_SCREAM) {
1985                 last = screaminstr(sv, float_real, s - strbeg,
1986                                    end_shift, &scream_pos, 1); /* last one */
1987                 if (!last)
1988                     last = scream_olds; /* Only one occurrence. */
1989                 /* we may be pointing at the wrong string */
1990                 else if (RX_MATCH_COPIED(prog))
1991                     s = strbeg + (s - SvPVX_const(sv));
1992             }
1993             else {
1994                 STRLEN len;
1995                 const char * const little = SvPV_const(float_real, len);
1996
1997                 if (SvTAIL(float_real)) {
1998                     if (memEQ(strend - len + 1, little, len - 1))
1999                         last = strend - len + 1;
2000                     else if (!multiline)
2001                         last = memEQ(strend - len, little, len)
2002                             ? strend - len : NULL;
2003                     else
2004                         goto find_last;
2005                 } else {
2006                   find_last:
2007                     if (len)
2008                         last = rninstr(s, strend, little, little + len);
2009                     else
2010                         last = strend;  /* matching "$" */
2011                 }
2012             }
2013             if (last == NULL) {
2014                 DEBUG_EXECUTE_r(
2015                     PerlIO_printf(Perl_debug_log,
2016                         "%sCan't trim the tail, match fails (should not happen)%s\n",
2017                         PL_colors[4], PL_colors[5]));
2018                 goto phooey; /* Should not happen! */
2019             }
2020             dontbother = strend - last + prog->float_min_offset;
2021         }
2022         if (minlen && (dontbother < minlen))
2023             dontbother = minlen - 1;
2024         strend -= dontbother;              /* this one's always in bytes! */
2025         /* We don't know much -- general case. */
2026         if (do_utf8) {
2027             for (;;) {
2028                 if (regtry(&reginfo, &s))
2029                     goto got_it;
2030                 if (s >= strend)
2031                     break;
2032                 s += UTF8SKIP(s);
2033             };
2034         }
2035         else {
2036             do {
2037                 if (regtry(&reginfo, &s))
2038                     goto got_it;
2039             } while (s++ < strend);
2040         }
2041     }
2042
2043     /* Failure. */
2044     goto phooey;
2045
2046 got_it:
2047     RX_MATCH_TAINTED_set(prog, PL_reg_flags & RF_tainted);
2048
2049     if (PL_reg_eval_set) {
2050         /* Preserve the current value of $^R */
2051         if (oreplsv != GvSV(PL_replgv))
2052             sv_setsv(oreplsv, GvSV(PL_replgv));/* So that when GvSV(replgv) is
2053                                                   restored, the value remains
2054                                                   the same. */
2055         restore_pos(aTHX_ prog);
2056     }
2057     if (prog->paren_names) 
2058         (void)hv_iterinit(prog->paren_names);
2059
2060     /* make sure $`, $&, $', and $digit will work later */
2061     if ( !(flags & REXEC_NOT_FIRST) ) {
2062         RX_MATCH_COPY_FREE(prog);
2063         if (flags & REXEC_COPY_STR) {
2064             const I32 i = PL_regeol - startpos + (stringarg - strbeg);
2065 #ifdef PERL_OLD_COPY_ON_WRITE
2066             if ((SvIsCOW(sv)
2067                  || (SvFLAGS(sv) & CAN_COW_MASK) == CAN_COW_FLAGS)) {
2068                 if (DEBUG_C_TEST) {
2069                     PerlIO_printf(Perl_debug_log,
2070                                   "Copy on write: regexp capture, type %d\n",
2071                                   (int) SvTYPE(sv));
2072                 }
2073                 prog->saved_copy = sv_setsv_cow(prog->saved_copy, sv);
2074                 prog->subbeg = (char *)SvPVX_const(prog->saved_copy);
2075                 assert (SvPOKp(prog->saved_copy));
2076             } else
2077 #endif
2078             {
2079                 RX_MATCH_COPIED_on(prog);
2080                 s = savepvn(strbeg, i);
2081                 prog->subbeg = s;
2082             }
2083             prog->sublen = i;
2084         }
2085         else {
2086             prog->subbeg = strbeg;
2087             prog->sublen = PL_regeol - strbeg;  /* strend may have been modified */
2088         }
2089     }
2090
2091     return 1;
2092
2093 phooey:
2094     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "%sMatch failed%s\n",
2095                           PL_colors[4], PL_colors[5]));
2096     if (PL_reg_eval_set)
2097         restore_pos(aTHX_ prog);
2098     if (prog->swap) {
2099         /* we failed :-( roll it back */
2100         I32 *t;
2101         t = prog->swap->startp;
2102         prog->swap->startp = prog->startp;
2103         prog->startp = t;
2104         t = prog->swap->endp;
2105         prog->swap->endp = prog->endp;
2106         prog->endp = t;
2107     }
2108     return 0;
2109 }
2110
2111
2112 /*
2113  - regtry - try match at specific point
2114  */
2115 STATIC I32                      /* 0 failure, 1 success */
2116 S_regtry(pTHX_ regmatch_info *reginfo, char **startpos)
2117 {
2118     dVAR;
2119     register I32 *sp;
2120     register I32 *ep;
2121     CHECKPOINT lastcp;
2122     regexp *prog = reginfo->prog;
2123     GET_RE_DEBUG_FLAGS_DECL;
2124     reginfo->cutpoint=NULL;
2125
2126     if ((prog->reganch & ROPT_EVAL_SEEN) && !PL_reg_eval_set) {
2127         MAGIC *mg;
2128
2129         PL_reg_eval_set = RS_init;
2130         DEBUG_EXECUTE_r(DEBUG_s(
2131             PerlIO_printf(Perl_debug_log, "  setting stack tmpbase at %"IVdf"\n",
2132                           (IV)(PL_stack_sp - PL_stack_base));
2133             ));
2134         SAVESTACK_CXPOS();
2135         cxstack[cxstack_ix].blk_oldsp = PL_stack_sp - PL_stack_base;
2136         /* Otherwise OP_NEXTSTATE will free whatever on stack now.  */
2137         SAVETMPS;
2138         /* Apparently this is not needed, judging by wantarray. */
2139         /* SAVEI8(cxstack[cxstack_ix].blk_gimme);
2140            cxstack[cxstack_ix].blk_gimme = G_SCALAR; */
2141
2142         if (reginfo->sv) {
2143             /* Make $_ available to executed code. */
2144             if (reginfo->sv != DEFSV) {
2145                 SAVE_DEFSV;
2146                 DEFSV = reginfo->sv;
2147             }
2148         
2149             if (!(SvTYPE(reginfo->sv) >= SVt_PVMG && SvMAGIC(reginfo->sv)
2150                   && (mg = mg_find(reginfo->sv, PERL_MAGIC_regex_global)))) {
2151                 /* prepare for quick setting of pos */
2152 #ifdef PERL_OLD_COPY_ON_WRITE
2153                 if (SvIsCOW(reginfo->sv))
2154                     sv_force_normal_flags(reginfo->sv, 0);
2155 #endif
2156                 mg = sv_magicext(reginfo->sv, NULL, PERL_MAGIC_regex_global,
2157                                  &PL_vtbl_mglob, NULL, 0);
2158                 mg->mg_len = -1;
2159             }
2160             PL_reg_magic    = mg;
2161             PL_reg_oldpos   = mg->mg_len;
2162             SAVEDESTRUCTOR_X(restore_pos, prog);
2163         }
2164         if (!PL_reg_curpm) {
2165             Newxz(PL_reg_curpm, 1, PMOP);
2166 #ifdef USE_ITHREADS
2167             {
2168                 SV* const repointer = newSViv(0);
2169                 /* so we know which PL_regex_padav element is PL_reg_curpm */
2170                 SvFLAGS(repointer) |= SVf_BREAK;
2171                 av_push(PL_regex_padav,repointer);
2172                 PL_reg_curpm->op_pmoffset = av_len(PL_regex_padav);
2173                 PL_regex_pad = AvARRAY(PL_regex_padav);
2174             }
2175 #endif      
2176         }
2177         PM_SETRE(PL_reg_curpm, prog);
2178         PL_reg_oldcurpm = PL_curpm;
2179         PL_curpm = PL_reg_curpm;
2180         if (RX_MATCH_COPIED(prog)) {
2181             /*  Here is a serious problem: we cannot rewrite subbeg,
2182                 since it may be needed if this match fails.  Thus
2183                 $` inside (?{}) could fail... */
2184             PL_reg_oldsaved = prog->subbeg;
2185             PL_reg_oldsavedlen = prog->sublen;
2186 #ifdef PERL_OLD_COPY_ON_WRITE
2187             PL_nrs = prog->saved_copy;
2188 #endif
2189             RX_MATCH_COPIED_off(prog);
2190         }
2191         else
2192             PL_reg_oldsaved = NULL;
2193         prog->subbeg = PL_bostr;
2194         prog->sublen = PL_regeol - PL_bostr; /* strend may have been modified */
2195     }
2196     DEBUG_EXECUTE_r(PL_reg_starttry = *startpos);
2197     prog->startp[0] = *startpos - PL_bostr;
2198     PL_reginput = *startpos;
2199     PL_reglastparen = &prog->lastparen;
2200     PL_reglastcloseparen = &prog->lastcloseparen;
2201     prog->lastparen = 0;
2202     prog->lastcloseparen = 0;
2203     PL_regsize = 0;
2204     PL_regstartp = prog->startp;
2205     PL_regendp = prog->endp;
2206     if (PL_reg_start_tmpl <= prog->nparens) {
2207         PL_reg_start_tmpl = prog->nparens*3/2 + 3;
2208         if(PL_reg_start_tmp)
2209             Renew(PL_reg_start_tmp, PL_reg_start_tmpl, char*);
2210         else
2211             Newx(PL_reg_start_tmp, PL_reg_start_tmpl, char*);
2212     }
2213
2214     /* XXXX What this code is doing here?!!!  There should be no need
2215        to do this again and again, PL_reglastparen should take care of
2216        this!  --ilya*/
2217
2218     /* Tests pat.t#187 and split.t#{13,14} seem to depend on this code.
2219      * Actually, the code in regcppop() (which Ilya may be meaning by
2220      * PL_reglastparen), is not needed at all by the test suite
2221      * (op/regexp, op/pat, op/split), but that code is needed, oddly
2222      * enough, for building DynaLoader, or otherwise this
2223      * "Error: '*' not in typemap in DynaLoader.xs, line 164"
2224      * will happen.  Meanwhile, this code *is* needed for the
2225      * above-mentioned test suite tests to succeed.  The common theme
2226      * on those tests seems to be returning null fields from matches.
2227      * --jhi */
2228 #if 1
2229     sp = PL_regstartp;
2230     ep = PL_regendp;
2231     if (prog->nparens) {
2232         register I32 i;
2233         for (i = prog->nparens; i > (I32)*PL_reglastparen; i--) {
2234             *++sp = -1;
2235             *++ep = -1;
2236         }
2237     }
2238 #endif
2239     REGCP_SET(lastcp);
2240     if (regmatch(reginfo, prog->program + 1)) {
2241         PL_regendp[0] = PL_reginput - PL_bostr;
2242         return 1;
2243     }
2244     if (reginfo->cutpoint)
2245         *startpos= reginfo->cutpoint;
2246     REGCP_UNWIND(lastcp);
2247     return 0;
2248 }
2249
2250
2251 #define sayYES goto yes
2252 #define sayNO goto no
2253 #define sayNO_SILENT goto no_silent
2254
2255 /* we dont use STMT_START/END here because it leads to 
2256    "unreachable code" warnings, which are bogus, but distracting. */
2257 #define CACHEsayNO \
2258     if (ST.cache_mask) \
2259        PL_reg_poscache[ST.cache_offset] |= ST.cache_mask; \
2260     sayNO
2261
2262 /* this is used to determine how far from the left messages like
2263    'failed...' are printed. It should be set such that messages 
2264    are inline with the regop output that created them.
2265 */
2266 #define REPORT_CODE_OFF 32
2267
2268
2269 /* Make sure there is a test for this +1 options in re_tests */
2270 #define TRIE_INITAL_ACCEPT_BUFFLEN 4;
2271
2272 #define CHRTEST_UNINIT -1001 /* c1/c2 haven't been calculated yet */
2273 #define CHRTEST_VOID   -1000 /* the c1/c2 "next char" test should be skipped */
2274
2275 #define SLAB_FIRST(s) (&(s)->states[0])
2276 #define SLAB_LAST(s)  (&(s)->states[PERL_REGMATCH_SLAB_SLOTS-1])
2277
2278 /* grab a new slab and return the first slot in it */
2279
2280 STATIC regmatch_state *
2281 S_push_slab(pTHX)
2282 {
2283 #if PERL_VERSION < 9
2284     dMY_CXT;
2285 #endif
2286     regmatch_slab *s = PL_regmatch_slab->next;
2287     if (!s) {
2288         Newx(s, 1, regmatch_slab);
2289         s->prev = PL_regmatch_slab;
2290         s->next = NULL;
2291         PL_regmatch_slab->next = s;
2292     }
2293     PL_regmatch_slab = s;
2294     return SLAB_FIRST(s);
2295 }
2296
2297
2298 /* push a new state then goto it */
2299
2300 #define PUSH_STATE_GOTO(state, node) \
2301     scan = node; \
2302     st->resume_state = state; \
2303     goto push_state;
2304
2305 /* push a new state with success backtracking, then goto it */
2306
2307 #define PUSH_YES_STATE_GOTO(state, node) \
2308     scan = node; \
2309     st->resume_state = state; \
2310     goto push_yes_state;
2311
2312
2313
2314 /*
2315
2316 regmatch() - main matching routine
2317
2318 This is basically one big switch statement in a loop. We execute an op,
2319 set 'next' to point the next op, and continue. If we come to a point which
2320 we may need to backtrack to on failure such as (A|B|C), we push a
2321 backtrack state onto the backtrack stack. On failure, we pop the top
2322 state, and re-enter the loop at the state indicated. If there are no more
2323 states to pop, we return failure.
2324
2325 Sometimes we also need to backtrack on success; for example /A+/, where
2326 after successfully matching one A, we need to go back and try to
2327 match another one; similarly for lookahead assertions: if the assertion
2328 completes successfully, we backtrack to the state just before the assertion
2329 and then carry on.  In these cases, the pushed state is marked as
2330 'backtrack on success too'. This marking is in fact done by a chain of
2331 pointers, each pointing to the previous 'yes' state. On success, we pop to
2332 the nearest yes state, discarding any intermediate failure-only states.
2333 Sometimes a yes state is pushed just to force some cleanup code to be
2334 called at the end of a successful match or submatch; e.g. (??{$re}) uses
2335 it to free the inner regex.
2336
2337 Note that failure backtracking rewinds the cursor position, while
2338 success backtracking leaves it alone.
2339
2340 A pattern is complete when the END op is executed, while a subpattern
2341 such as (?=foo) is complete when the SUCCESS op is executed. Both of these
2342 ops trigger the "pop to last yes state if any, otherwise return true"
2343 behaviour.
2344
2345 A common convention in this function is to use A and B to refer to the two
2346 subpatterns (or to the first nodes thereof) in patterns like /A*B/: so A is
2347 the subpattern to be matched possibly multiple times, while B is the entire
2348 rest of the pattern. Variable and state names reflect this convention.
2349
2350 The states in the main switch are the union of ops and failure/success of
2351 substates associated with with that op.  For example, IFMATCH is the op
2352 that does lookahead assertions /(?=A)B/ and so the IFMATCH state means
2353 'execute IFMATCH'; while IFMATCH_A is a state saying that we have just
2354 successfully matched A and IFMATCH_A_fail is a state saying that we have
2355 just failed to match A. Resume states always come in pairs. The backtrack
2356 state we push is marked as 'IFMATCH_A', but when that is popped, we resume
2357 at IFMATCH_A or IFMATCH_A_fail, depending on whether we are backtracking
2358 on success or failure.
2359
2360 The struct that holds a backtracking state is actually a big union, with
2361 one variant for each major type of op. The variable st points to the
2362 top-most backtrack struct. To make the code clearer, within each
2363 block of code we #define ST to alias the relevant union.
2364
2365 Here's a concrete example of a (vastly oversimplified) IFMATCH
2366 implementation:
2367
2368     switch (state) {
2369     ....
2370
2371 #define ST st->u.ifmatch
2372
2373     case IFMATCH: // we are executing the IFMATCH op, (?=A)B
2374         ST.foo = ...; // some state we wish to save
2375         ...
2376         // push a yes backtrack state with a resume value of
2377         // IFMATCH_A/IFMATCH_A_fail, then continue execution at the
2378         // first node of A:
2379         PUSH_YES_STATE_GOTO(IFMATCH_A, A);
2380         // NOTREACHED
2381
2382     case IFMATCH_A: // we have successfully executed A; now continue with B
2383         next = B;
2384         bar = ST.foo; // do something with the preserved value
2385         break;
2386
2387     case IFMATCH_A_fail: // A failed, so the assertion failed
2388         ...;   // do some housekeeping, then ...
2389         sayNO; // propagate the failure
2390
2391 #undef ST
2392
2393     ...
2394     }
2395
2396 For any old-timers reading this who are familiar with the old recursive
2397 approach, the code above is equivalent to:
2398
2399     case IFMATCH: // we are executing the IFMATCH op, (?=A)B
2400     {
2401         int foo = ...
2402         ...
2403         if (regmatch(A)) {
2404             next = B;
2405             bar = foo;
2406             break;
2407         }
2408         ...;   // do some housekeeping, then ...
2409         sayNO; // propagate the failure
2410     }
2411
2412 The topmost backtrack state, pointed to by st, is usually free. If you
2413 want to claim it, populate any ST.foo fields in it with values you wish to
2414 save, then do one of
2415
2416         PUSH_STATE_GOTO(resume_state, node);
2417         PUSH_YES_STATE_GOTO(resume_state, node);
2418
2419 which sets that backtrack state's resume value to 'resume_state', pushes a
2420 new free entry to the top of the backtrack stack, then goes to 'node'.
2421 On backtracking, the free slot is popped, and the saved state becomes the
2422 new free state. An ST.foo field in this new top state can be temporarily
2423 accessed to retrieve values, but once the main loop is re-entered, it
2424 becomes available for reuse.
2425
2426 Note that the depth of the backtrack stack constantly increases during the
2427 left-to-right execution of the pattern, rather than going up and down with
2428 the pattern nesting. For example the stack is at its maximum at Z at the
2429 end of the pattern, rather than at X in the following:
2430
2431     /(((X)+)+)+....(Y)+....Z/
2432
2433 The only exceptions to this are lookahead/behind assertions and the cut,
2434 (?>A), which pop all the backtrack states associated with A before
2435 continuing.
2436  
2437 Bascktrack state structs are allocated in slabs of about 4K in size.
2438 PL_regmatch_state and st always point to the currently active state,
2439 and PL_regmatch_slab points to the slab currently containing
2440 PL_regmatch_state.  The first time regmatch() is called, the first slab is
2441 allocated, and is never freed until interpreter destruction. When the slab
2442 is full, a new one is allocated and chained to the end. At exit from
2443 regmatch(), slabs allocated since entry are freed.
2444
2445 */
2446  
2447
2448 #define DEBUG_STATE_pp(pp)                                  \
2449     DEBUG_STATE_r({                                         \
2450         DUMP_EXEC_POS(locinput, scan, do_utf8);             \
2451         PerlIO_printf(Perl_debug_log,                       \
2452             "    %*s"pp" %s%s%s%s%s\n",                     \
2453             depth*2, "",                                    \
2454             reg_name[st->resume_state],                     \
2455             ((st==yes_state||st==mark_state) ? "[" : ""),   \
2456             ((st==yes_state) ? "Y" : ""),                   \
2457             ((st==mark_state) ? "M" : ""),                  \
2458             ((st==yes_state||st==mark_state) ? "]" : "")    \
2459         );                                                  \
2460     });
2461
2462
2463 #define REG_NODE_NUM(x) ((x) ? (int)((x)-prog) : -1)
2464
2465 #ifdef DEBUGGING
2466
2467 STATIC void
2468 S_debug_start_match(pTHX_ const regexp *prog, const bool do_utf8, 
2469     const char *start, const char *end, const char *blurb)
2470 {
2471     const bool utf8_pat= prog->reganch & ROPT_UTF8 ? 1 : 0;
2472     if (!PL_colorset)   
2473             reginitcolors();    
2474     {
2475         RE_PV_QUOTED_DECL(s0, utf8_pat, PERL_DEBUG_PAD_ZERO(0), 
2476             prog->precomp, prog->prelen, 60);   
2477         
2478         RE_PV_QUOTED_DECL(s1, do_utf8, PERL_DEBUG_PAD_ZERO(1), 
2479             start, end - start, 60); 
2480         
2481         PerlIO_printf(Perl_debug_log, 
2482             "%s%s REx%s %s against %s\n", 
2483                        PL_colors[4], blurb, PL_colors[5], s0, s1); 
2484         
2485         if (do_utf8||utf8_pat) 
2486             PerlIO_printf(Perl_debug_log, "UTF-8 %s%s%s...\n",
2487                 utf8_pat ? "pattern" : "",
2488                 utf8_pat && do_utf8 ? " and " : "",
2489                 do_utf8 ? "string" : ""
2490             ); 
2491     }
2492 }
2493
2494 STATIC void
2495 S_dump_exec_pos(pTHX_ const char *locinput, 
2496                       const regnode *scan, 
2497                       const char *loc_regeol, 
2498                       const char *loc_bostr, 
2499                       const char *loc_reg_starttry,
2500                       const bool do_utf8)
2501 {
2502     const int docolor = *PL_colors[0] || *PL_colors[2] || *PL_colors[4];
2503     const int taill = (docolor ? 10 : 7); /* 3 chars for "> <" */
2504     int l = (loc_regeol - locinput) > taill ? taill : (loc_regeol - locinput);
2505     /* The part of the string before starttry has one color
2506        (pref0_len chars), between starttry and current
2507        position another one (pref_len - pref0_len chars),
2508        after the current position the third one.
2509        We assume that pref0_len <= pref_len, otherwise we
2510        decrease pref0_len.  */
2511     int pref_len = (locinput - loc_bostr) > (5 + taill) - l
2512         ? (5 + taill) - l : locinput - loc_bostr;
2513     int pref0_len;
2514
2515     while (do_utf8 && UTF8_IS_CONTINUATION(*(U8*)(locinput - pref_len)))
2516         pref_len++;
2517     pref0_len = pref_len  - (locinput - loc_reg_starttry);
2518     if (l + pref_len < (5 + taill) && l < loc_regeol - locinput)
2519         l = ( loc_regeol - locinput > (5 + taill) - pref_len
2520               ? (5 + taill) - pref_len : loc_regeol - locinput);
2521     while (do_utf8 && UTF8_IS_CONTINUATION(*(U8*)(locinput + l)))
2522         l--;
2523     if (pref0_len < 0)
2524         pref0_len = 0;
2525     if (pref0_len > pref_len)
2526         pref0_len = pref_len;
2527     {
2528         const int is_uni = (do_utf8 && OP(scan) != CANY) ? 1 : 0;
2529
2530         RE_PV_COLOR_DECL(s0,len0,is_uni,PERL_DEBUG_PAD(0),
2531             (locinput - pref_len),pref0_len, 60, 4, 5);
2532         
2533         RE_PV_COLOR_DECL(s1,len1,is_uni,PERL_DEBUG_PAD(1),
2534                     (locinput - pref_len + pref0_len),
2535                     pref_len - pref0_len, 60, 2, 3);
2536         
2537         RE_PV_COLOR_DECL(s2,len2,is_uni,PERL_DEBUG_PAD(2),
2538                     locinput, loc_regeol - locinput, 10, 0, 1);
2539
2540         const STRLEN tlen=len0+len1+len2;
2541         PerlIO_printf(Perl_debug_log,
2542                     "%4"IVdf" <%.*s%.*s%s%.*s>%*s|",
2543                     (IV)(locinput - loc_bostr),
2544                     len0, s0,
2545                     len1, s1,
2546                     (docolor ? "" : "> <"),
2547                     len2, s2,
2548                     (int)(tlen > 19 ? 0 :  19 - tlen),
2549                     "");
2550     }
2551 }
2552
2553 #endif
2554
2555 /* reg_check_named_buff_matched()
2556  * Checks to see if a named buffer has matched. The data array of 
2557  * buffer numbers corresponding to the buffer is expected to reside
2558  * in the regexp->data->data array in the slot stored in the ARG() of
2559  * node involved. Note that this routine doesn't actually care about the
2560  * name, that information is not preserved from compilation to execution.
2561  * Returns the index of the leftmost defined buffer with the given name
2562  * or 0 if non of the buffers matched.
2563  */
2564 STATIC I32
2565 S_reg_check_named_buff_matched(pTHX_ const regexp *rex, const regnode *scan) {
2566     I32 n;
2567     SV *sv_dat=(SV*)rex->data->data[ ARG( scan ) ];
2568     I32 *nums=(I32*)SvPVX(sv_dat);
2569     for ( n=0; n<SvIVX(sv_dat); n++ ) {
2570         if ((I32)*PL_reglastparen >= nums[n] &&
2571             PL_regendp[nums[n]] != -1)
2572         {
2573             return nums[n];
2574         }
2575     }
2576     return 0;
2577 }
2578
2579 STATIC I32                      /* 0 failure, 1 success */
2580 S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
2581 {
2582 #if PERL_VERSION < 9
2583     dMY_CXT;
2584 #endif
2585     dVAR;
2586     register const bool do_utf8 = PL_reg_match_utf8;
2587     const U32 uniflags = UTF8_ALLOW_DEFAULT;
2588
2589     regexp *rex = reginfo->prog;
2590
2591     regmatch_slab  *orig_slab;
2592     regmatch_state *orig_state;
2593
2594     /* the current state. This is a cached copy of PL_regmatch_state */
2595     register regmatch_state *st;
2596
2597     /* cache heavy used fields of st in registers */
2598     register regnode *scan;
2599     register regnode *next;
2600     register U32 n = 0; /* general value; init to avoid compiler warning */
2601     register I32 ln = 0; /* len or last;  init to avoid compiler warning */
2602     register char *locinput = PL_reginput;
2603     register I32 nextchr;   /* is always set to UCHARAT(locinput) */
2604
2605     bool result = 0;        /* return value of S_regmatch */
2606     int depth = 0;          /* depth of backtrack stack */
2607     int nochange_depth = 0; /* depth of GOSUB recursion with nochange*/
2608     regmatch_state *yes_state = NULL; /* state to pop to on success of
2609                                                             subpattern */
2610     /* mark_state piggy backs on the yes_state logic so that when we unwind 
2611        the stack on success we can update the mark_state as we go */
2612     regmatch_state *mark_state = NULL; /* last mark state we have seen */
2613     
2614     regmatch_state *cur_eval = NULL; /* most recent EVAL_AB state */
2615     struct regmatch_state  *cur_curlyx = NULL; /* most recent curlyx */
2616     U32 state_num;
2617     bool no_final = 0;      /* prevent failure from backtracking? */
2618     bool do_cutgroup = 0;   /* no_final only until next branch/trie entry */
2619     char *startpoint = PL_reginput;
2620     SV *popmark = NULL;     /* are we looking for a mark? */
2621     SV *sv_commit = NULL;   /* last mark name seen in failure */
2622     SV *sv_yes_mark = NULL; /* last mark name we have seen 
2623                                during a successfull match */
2624     U32 lastopen = 0;       /* last open we saw */
2625     bool has_cutgroup = RX_HAS_CUTGROUP(rex) ? 1 : 0;   
2626     
2627     /* these three flags are set by various ops to signal information to
2628      * the very next op. They have a useful lifetime of exactly one loop
2629      * iteration, and are not preserved or restored by state pushes/pops
2630      */
2631     bool sw = 0;            /* the condition value in (?(cond)a|b) */
2632     bool minmod = 0;        /* the next "{n,m}" is a "{n,m}?" */
2633     int logical = 0;        /* the following EVAL is:
2634                                 0: (?{...})
2635                                 1: (?(?{...})X|Y)
2636                                 2: (??{...})
2637                                or the following IFMATCH/UNLESSM is:
2638                                 false: plain (?=foo)
2639                                 true:  used as a condition: (?(?=foo))
2640                             */
2641
2642 #ifdef DEBUGGING
2643     GET_RE_DEBUG_FLAGS_DECL;
2644 #endif
2645
2646     DEBUG_STACK_r( {    
2647             PerlIO_printf(Perl_debug_log,"regmatch start\n");
2648     });
2649     /* on first ever call to regmatch, allocate first slab */
2650     if (!PL_regmatch_slab) {
2651         Newx(PL_regmatch_slab, 1, regmatch_slab);
2652         PL_regmatch_slab->prev = NULL;
2653         PL_regmatch_slab->next = NULL;
2654         PL_regmatch_state = SLAB_FIRST(PL_regmatch_slab);
2655     }
2656
2657     /* remember current high-water mark for exit */
2658     /* XXX this should be done with SAVE* instead */
2659     orig_slab  = PL_regmatch_slab;
2660     orig_state = PL_regmatch_state;
2661
2662     /* grab next free state slot */
2663     st = ++PL_regmatch_state;
2664     if (st >  SLAB_LAST(PL_regmatch_slab))
2665         st = PL_regmatch_state = S_push_slab(aTHX);
2666
2667     /* Note that nextchr is a byte even in UTF */
2668     nextchr = UCHARAT(locinput);
2669     scan = prog;
2670     while (scan != NULL) {
2671
2672         DEBUG_EXECUTE_r( {
2673             SV * const prop = sv_newmortal();
2674             regnode *rnext=regnext(scan);
2675             DUMP_EXEC_POS( locinput, scan, do_utf8 );
2676             regprop(rex, prop, scan);
2677             
2678             PerlIO_printf(Perl_debug_log,
2679                     "%3"IVdf":%*s%s(%"IVdf")\n",
2680                     (IV)(scan - rex->program), depth*2, "",
2681                     SvPVX_const(prop),
2682                     (PL_regkind[OP(scan)] == END || !rnext) ? 
2683                         0 : (IV)(rnext - rex->program));
2684         });
2685
2686         next = scan + NEXT_OFF(scan);
2687         if (next == scan)
2688             next = NULL;
2689         state_num = OP(scan);
2690
2691       reenter_switch:
2692         switch (state_num) {
2693         case BOL:
2694             if (locinput == PL_bostr)
2695             {
2696                 /* reginfo->till = reginfo->bol; */
2697                 break;
2698             }
2699             sayNO;
2700         case MBOL:
2701             if (locinput == PL_bostr ||
2702                 ((nextchr || locinput < PL_regeol) && locinput[-1] == '\n'))
2703             {
2704                 break;
2705             }
2706             sayNO;
2707         case SBOL:
2708             if (locinput == PL_bostr)
2709                 break;
2710             sayNO;
2711         case GPOS:
2712             if (locinput == reginfo->ganch)
2713                 break;
2714             sayNO;
2715         case EOL:
2716                 goto seol;
2717         case MEOL:
2718             if ((nextchr || locinput < PL_regeol) && nextchr != '\n')
2719                 sayNO;
2720             break;
2721         case SEOL:
2722           seol:
2723             if ((nextchr || locinput < PL_regeol) && nextchr != '\n')
2724                 sayNO;
2725             if (PL_regeol - locinput > 1)
2726                 sayNO;
2727             break;
2728         case EOS:
2729             if (PL_regeol != locinput)
2730                 sayNO;
2731             break;
2732         case SANY:
2733             if (!nextchr && locinput >= PL_regeol)
2734                 sayNO;
2735             if (do_utf8) {
2736                 locinput += PL_utf8skip[nextchr];
2737                 if (locinput > PL_regeol)
2738                     sayNO;
2739                 nextchr = UCHARAT(locinput);
2740             }
2741             else
2742                 nextchr = UCHARAT(++locinput);
2743             break;
2744         case CANY:
2745             if (!nextchr && locinput >= PL_regeol)
2746                 sayNO;
2747             nextchr = UCHARAT(++locinput);
2748             break;
2749         case REG_ANY:
2750             if ((!nextchr && locinput >= PL_regeol) || nextchr == '\n')
2751                 sayNO;
2752             if (do_utf8) {
2753                 locinput += PL_utf8skip[nextchr];
2754                 if (locinput > PL_regeol)
2755                     sayNO;
2756                 nextchr = UCHARAT(locinput);
2757             }
2758             else
2759                 nextchr = UCHARAT(++locinput);
2760             break;
2761
2762 #undef  ST
2763 #define ST st->u.trie
2764         case TRIEC:
2765             /* In this case the charclass data is available inline so
2766                we can fail fast without a lot of extra overhead. 
2767              */
2768             if (scan->flags == EXACT || !do_utf8) {
2769                 if(!ANYOF_BITMAP_TEST(scan, *locinput)) {
2770                     DEBUG_EXECUTE_r(
2771                         PerlIO_printf(Perl_debug_log,
2772                                   "%*s  %sfailed to match trie start class...%s\n",
2773                                   REPORT_CODE_OFF+depth*2, "", PL_colors[4], PL_colors[5])
2774                     );
2775                     sayNO_SILENT;
2776                     /* NOTREACHED */
2777                 }                       
2778             }
2779             /* FALL THROUGH */
2780         case TRIE:
2781             {
2782                 /* what type of TRIE am I? (utf8 makes this contextual) */
2783                 const enum { trie_plain, trie_utf8, trie_utf8_fold }
2784                     trie_type = do_utf8 ?
2785                           (scan->flags == EXACT ? trie_utf8 : trie_utf8_fold)
2786                         : trie_plain;
2787
2788                 /* what trie are we using right now */
2789                 reg_trie_data * const trie
2790                     = (reg_trie_data*)rex->data->data[ ARG( scan ) ];
2791                 U32 state = trie->startstate;
2792
2793                 if (trie->bitmap && trie_type != trie_utf8_fold &&
2794                     !TRIE_BITMAP_TEST(trie,*locinput)
2795                 ) {
2796                     if (trie->states[ state ].wordnum) {
2797                          DEBUG_EXECUTE_r(
2798                             PerlIO_printf(Perl_debug_log,
2799                                           "%*s  %smatched empty string...%s\n",
2800                                           REPORT_CODE_OFF+depth*2, "", PL_colors[4], PL_colors[5])
2801                         );
2802                         break;
2803                     } else {
2804                         DEBUG_EXECUTE_r(
2805                             PerlIO_printf(Perl_debug_log,
2806                                           "%*s  %sfailed to match trie start class...%s\n",
2807                                           REPORT_CODE_OFF+depth*2, "", PL_colors[4], PL_colors[5])
2808                         );
2809                         sayNO_SILENT;
2810                    }
2811                 }
2812
2813             { 
2814                 U8 *uc = ( U8* )locinput;
2815
2816                 STRLEN len = 0;
2817                 STRLEN foldlen = 0;
2818                 U8 *uscan = (U8*)NULL;
2819                 STRLEN bufflen=0;
2820                 SV *sv_accept_buff = NULL;
2821                 U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
2822
2823                 ST.accepted = 0; /* how many accepting states we have seen */
2824                 ST.B = next;
2825                 ST.jump = trie->jump;
2826                 ST.me = scan;
2827                 
2828                 /*
2829                    traverse the TRIE keeping track of all accepting states
2830                    we transition through until we get to a failing node.
2831                 */
2832
2833                 while ( state && uc <= (U8*)PL_regeol ) {
2834                     U32 base = trie->states[ state ].trans.base;
2835                     UV uvc = 0;
2836                     U16 charid;
2837                     /* We use charid to hold the wordnum as we don't use it
2838                        for charid until after we have done the wordnum logic. 
2839                        We define an alias just so that the wordnum logic reads
2840                        more naturally. */
2841
2842 #define got_wordnum charid
2843                     got_wordnum = trie->states[ state ].wordnum;
2844
2845                     if ( got_wordnum ) {
2846                         if ( ! ST.accepted ) {
2847                             ENTER;
2848                             SAVETMPS;
2849                             bufflen = TRIE_INITAL_ACCEPT_BUFFLEN;
2850                             sv_accept_buff=newSV(bufflen *
2851                                             sizeof(reg_trie_accepted) - 1);
2852                             SvCUR_set(sv_accept_buff, 0);
2853                             SvPOK_on(sv_accept_buff);
2854                             sv_2mortal(sv_accept_buff);
2855                             SAVETMPS;
2856                             ST.accept_buff =
2857                                 (reg_trie_accepted*)SvPV_nolen(sv_accept_buff );
2858                         }
2859                         do {
2860                             if (ST.accepted >= bufflen) {
2861                                 bufflen *= 2;
2862                                 ST.accept_buff =(reg_trie_accepted*)
2863                                     SvGROW(sv_accept_buff,
2864                                         bufflen * sizeof(reg_trie_accepted));
2865                             }
2866                             SvCUR_set(sv_accept_buff,SvCUR(sv_accept_buff)
2867                                 + sizeof(reg_trie_accepted));
2868
2869
2870                             ST.accept_buff[ST.accepted].wordnum = got_wordnum;
2871                             ST.accept_buff[ST.accepted].endpos = uc;
2872                             ++ST.accepted;
2873                         } while (trie->nextword && (got_wordnum= trie->nextword[got_wordnum]));
2874                     }
2875 #undef got_wordnum 
2876
2877                     DEBUG_TRIE_EXECUTE_r({
2878                                 DUMP_EXEC_POS( (char *)uc, scan, do_utf8 );
2879                                 PerlIO_printf( Perl_debug_log,
2880                                     "%*s  %sState: %4"UVxf" Accepted: %4"UVxf" ",
2881                                     2+depth * 2, "", PL_colors[4],
2882                                     (UV)state, (UV)ST.accepted );
2883                     });
2884
2885                     if ( base ) {
2886                         REXEC_TRIE_READ_CHAR(trie_type, trie, uc, uscan, len,
2887                             uvc, charid, foldlen, foldbuf, uniflags);
2888
2889                         if (charid &&
2890                              (base + charid > trie->uniquecharcount )
2891                              && (base + charid - 1 - trie->uniquecharcount
2892                                     < trie->lasttrans)
2893                              && trie->trans[base + charid - 1 -
2894                                     trie->uniquecharcount].check == state)
2895                         {
2896                             state = trie->trans[base + charid - 1 -
2897                                 trie->uniquecharcount ].next;
2898                         }
2899                         else {
2900                             state = 0;
2901                         }
2902                         uc += len;
2903
2904                     }
2905                     else {
2906                         state = 0;
2907                     }
2908                     DEBUG_TRIE_EXECUTE_r(
2909                         PerlIO_printf( Perl_debug_log,
2910                             "Charid:%3x CP:%4"UVxf" After State: %4"UVxf"%s\n",
2911                             charid, uvc, (UV)state, PL_colors[5] );
2912                     );
2913                 }
2914                 if (!ST.accepted )
2915                    sayNO;
2916
2917                 DEBUG_EXECUTE_r(
2918                     PerlIO_printf( Perl_debug_log,
2919                         "%*s  %sgot %"IVdf" possible matches%s\n",
2920                         REPORT_CODE_OFF + depth * 2, "",
2921                         PL_colors[4], (IV)ST.accepted, PL_colors[5] );
2922                 );
2923             }}
2924
2925             /* FALL THROUGH */
2926         case TRIE_next_fail: /* we failed - try next alterative */
2927             if (do_cutgroup) {
2928                 do_cutgroup = 0;
2929                 no_final = 0;
2930             }
2931             if ( ST.accepted == 1 ) {
2932                 /* only one choice left - just continue */
2933                 DEBUG_EXECUTE_r({
2934                     reg_trie_data * const trie
2935                         = (reg_trie_data*)rex->data->data[ ARG(ST.me) ];
2936                     SV ** const tmp = av_fetch( trie->words, 
2937                         ST.accept_buff[ 0 ].wordnum-1, 0 );
2938                     PerlIO_printf( Perl_debug_log,
2939                         "%*s  %sonly one match left: #%d <%s>%s\n",
2940                         REPORT_CODE_OFF+depth*2, "", PL_colors[4],
2941                         ST.accept_buff[ 0 ].wordnum,
2942                         tmp ? SvPV_nolen_const( *tmp ) : "not compiled under -Dr",
2943                         PL_colors[5] );
2944                 });
2945                 PL_reginput = (char *)ST.accept_buff[ 0 ].endpos;
2946                 /* in this case we free tmps/leave before we call regmatch
2947                    as we wont be using accept_buff again. */
2948                 
2949                 locinput = PL_reginput;
2950                 nextchr = UCHARAT(locinput);
2951                 if ( !ST.jump || !ST.jump[ST.accept_buff[0].wordnum]) 
2952                     scan = ST.B;
2953                 else
2954                     scan = ST.me + ST.jump[ST.accept_buff[0].wordnum];
2955                 if (!has_cutgroup) {
2956                     FREETMPS;
2957                     LEAVE;
2958                 } else {
2959                     ST.accepted--;
2960                     PUSH_YES_STATE_GOTO(TRIE_next, scan);
2961                 }
2962                 
2963                 continue; /* execute rest of RE */
2964             }
2965
2966             if (!ST.accepted-- ) {
2967                 DEBUG_EXECUTE_r({
2968                     PerlIO_printf( Perl_debug_log,
2969                         "%*s  %sTRIE failed...%s\n",
2970                         REPORT_CODE_OFF+depth*2, "", 
2971                         PL_colors[4],
2972                         PL_colors[5] );
2973                 });
2974                 FREETMPS;
2975                 LEAVE;
2976                 sayNO_SILENT;
2977             }
2978
2979             /*
2980                There are at least two accepting states left.  Presumably
2981                the number of accepting states is going to be low,
2982                typically two. So we simply scan through to find the one
2983                with lowest wordnum.  Once we find it, we swap the last
2984                state into its place and decrement the size. We then try to
2985                match the rest of the pattern at the point where the word
2986                ends. If we succeed, control just continues along the
2987                regex; if we fail we return here to try the next accepting
2988                state
2989              */
2990
2991             {
2992                 U32 best = 0;
2993                 U32 cur;
2994                 for( cur = 1 ; cur <= ST.accepted ; cur++ ) {
2995                     DEBUG_TRIE_EXECUTE_r(
2996                         PerlIO_printf( Perl_debug_log,
2997                             "%*s  %sgot %"IVdf" (%d) as best, looking at %"IVdf" (%d)%s\n",
2998                             REPORT_CODE_OFF + depth * 2, "", PL_colors[4],
2999                             (IV)best, ST.accept_buff[ best ].wordnum, (IV)cur,
3000                             ST.accept_buff[ cur ].wordnum, PL_colors[5] );
3001                     );
3002
3003                     if (ST.accept_buff[cur].wordnum <
3004                             ST.accept_buff[best].wordnum)
3005                         best = cur;
3006                 }
3007
3008                 DEBUG_EXECUTE_r({
3009                     reg_trie_data * const trie
3010                         = (reg_trie_data*)rex->data->data[ ARG(ST.me) ];
3011                     SV ** const tmp = av_fetch( trie->words, 
3012                         ST.accept_buff[ best ].wordnum - 1, 0 );
3013                     regnode *nextop=(!ST.jump || !ST.jump[ST.accept_buff[best].wordnum]) ? 
3014                                     ST.B : 
3015                                     ST.me + ST.jump[ST.accept_buff[best].wordnum];    
3016                     PerlIO_printf( Perl_debug_log, 
3017                         "%*s  %strying alternation #%d <%s> at node #%d %s\n",
3018                         REPORT_CODE_OFF+depth*2, "", PL_colors[4],
3019                         ST.accept_buff[best].wordnum,
3020                         tmp ? SvPV_nolen_const( *tmp ) : "not compiled under -Dr", 
3021                             REG_NODE_NUM(nextop),
3022                         PL_colors[5] );
3023                 });
3024
3025                 if ( best<ST.accepted ) {
3026                     reg_trie_accepted tmp = ST.accept_buff[ best ];
3027                     ST.accept_buff[ best ] = ST.accept_buff[ ST.accepted ];
3028                     ST.accept_buff[ ST.accepted ] = tmp;
3029                     best = ST.accepted;
3030                 }
3031                 PL_reginput = (char *)ST.accept_buff[ best ].endpos;
3032                 if ( !ST.jump || !ST.jump[ST.accept_buff[best].wordnum]) {
3033                     scan = ST.B;
3034                     /* NOTREACHED */
3035                 } else {
3036                     scan = ST.me + ST.jump[ST.accept_buff[best].wordnum];
3037                     /* NOTREACHED */
3038                 }
3039                 if (has_cutgroup) {
3040                     PUSH_YES_STATE_GOTO(TRIE_next, scan);    
3041                     /* NOTREACHED */
3042                 } else {
3043                     PUSH_STATE_GOTO(TRIE_next, scan);
3044                     /* NOTREACHED */
3045                 }
3046                 /* NOTREACHED */
3047             }
3048             /* NOTREACHED */
3049         case TRIE_next:
3050             FREETMPS;
3051             LEAVE;
3052             sayYES;
3053 #undef  ST
3054
3055         case EXACT: {
3056             char *s = STRING(scan);
3057             ln = STR_LEN(scan);
3058             if (do_utf8 != UTF) {
3059                 /* The target and the pattern have differing utf8ness. */
3060                 char *l = locinput;
3061                 const char * const e = s + ln;
3062
3063                 if (do_utf8) {
3064                     /* The target is utf8, the pattern is not utf8. */
3065                     while (s < e) {
3066                         STRLEN ulen;
3067                         if (l >= PL_regeol)
3068                              sayNO;
3069                         if (NATIVE_TO_UNI(*(U8*)s) !=
3070                             utf8n_to_uvuni((U8*)l, UTF8_MAXBYTES, &ulen,
3071                                             uniflags))
3072                              sayNO;
3073                         l += ulen;
3074                         s ++;
3075                     }
3076                 }
3077                 else {
3078                     /* The target is not utf8, the pattern is utf8. */
3079                     while (s < e) {
3080                         STRLEN ulen;
3081                         if (l >= PL_regeol)
3082                             sayNO;
3083                         if (NATIVE_TO_UNI(*((U8*)l)) !=
3084                             utf8n_to_uvuni((U8*)s, UTF8_MAXBYTES, &ulen,
3085                                            uniflags))
3086                             sayNO;
3087                         s += ulen;
3088                         l ++;
3089                     }
3090                 }
3091                 locinput = l;
3092                 nextchr = UCHARAT(locinput);
3093                 break;
3094             }
3095             /* The target and the pattern have the same utf8ness. */
3096             /* Inline the first character, for speed. */
3097             if (UCHARAT(s) != nextchr)
3098                 sayNO;
3099             if (PL_regeol - locinput < ln)
3100                 sayNO;
3101             if (ln > 1 && memNE(s, locinput, ln))
3102                 sayNO;
3103             locinput += ln;
3104             nextchr = UCHARAT(locinput);
3105             break;
3106             }
3107         case EXACTFL:
3108             PL_reg_flags |= RF_tainted;
3109             /* FALL THROUGH */
3110         case EXACTF: {
3111             char * const s = STRING(scan);
3112             ln = STR_LEN(scan);
3113
3114             if (do_utf8 || UTF) {
3115               /* Either target or the pattern are utf8. */
3116                 const char * const l = locinput;
3117                 char *e = PL_regeol;
3118
3119                 if (ibcmp_utf8(s, 0,  ln, (bool)UTF,
3120                                l, &e, 0,  do_utf8)) {
3121                      /* One more case for the sharp s:
3122                       * pack("U0U*", 0xDF) =~ /ss/i,
3123                       * the 0xC3 0x9F are the UTF-8
3124                       * byte sequence for the U+00DF. */
3125                      if (!(do_utf8 &&
3126                            toLOWER(s[0]) == 's' &&
3127                            ln >= 2 &&
3128                            toLOWER(s[1]) == 's' &&
3129                            (U8)l[0] == 0xC3 &&
3130                            e - l >= 2 &&
3131                            (U8)l[1] == 0x9F))
3132                           sayNO;
3133                 }
3134                 locinput = e;
3135                 nextchr = UCHARAT(locinput);
3136                 break;
3137             }
3138
3139             /* Neither the target and the pattern are utf8. */
3140
3141             /* Inline the first character, for speed. */
3142             if (UCHARAT(s) != nextchr &&
3143                 UCHARAT(s) != ((OP(scan) == EXACTF)
3144                                ? PL_fold : PL_fold_locale)[nextchr])
3145                 sayNO;
3146             if (PL_regeol - locinput < ln)
3147                 sayNO;
3148             if (ln > 1 && (OP(scan) == EXACTF
3149                            ? ibcmp(s, locinput, ln)
3150                            : ibcmp_locale(s, locinput, ln)))
3151                 sayNO;
3152             locinput += ln;
3153             nextchr = UCHARAT(locinput);
3154             break;
3155             }
3156         case ANYOF:
3157             if (do_utf8) {
3158                 STRLEN inclasslen = PL_regeol - locinput;
3159
3160                 if (!reginclass(rex, scan, (U8*)locinput, &inclasslen, do_utf8))
3161                     goto anyof_fail;
3162                 if (locinput >= PL_regeol)
3163                     sayNO;
3164                 locinput += inclasslen ? inclasslen : UTF8SKIP(locinput);
3165                 nextchr = UCHARAT(locinput);
3166                 break;
3167             }
3168             else {
3169                 if (nextchr < 0)
3170                     nextchr = UCHARAT(locinput);
3171                 if (!REGINCLASS(rex, scan, (U8*)locinput))
3172                     goto anyof_fail;
3173                 if (!nextchr && locinput >= PL_regeol)
3174                     sayNO;
3175                 nextchr = UCHARAT(++locinput);
3176                 break;
3177             }
3178         anyof_fail:
3179             /* If we might have the case of the German sharp s
3180              * in a casefolding Unicode character class. */
3181
3182             if (ANYOF_FOLD_SHARP_S(scan, locinput, PL_regeol)) {
3183                  locinput += SHARP_S_SKIP;
3184                  nextchr = UCHARAT(locinput);
3185             }
3186             else
3187                  sayNO;
3188             break;
3189         case ALNUML:
3190             PL_reg_flags |= RF_tainted;
3191             /* FALL THROUGH */
3192         case ALNUM:
3193             if (!nextchr)
3194                 sayNO;
3195             if (do_utf8) {
3196                 LOAD_UTF8_CHARCLASS_ALNUM();
3197                 if (!(OP(scan) == ALNUM
3198                       ? (bool)swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
3199                       : isALNUM_LC_utf8((U8*)locinput)))
3200                 {
3201                     sayNO;
3202                 }
3203                 locinput += PL_utf8skip[nextchr];
3204                 nextchr = UCHARAT(locinput);
3205                 break;
3206             }
3207             if (!(OP(scan) == ALNUM
3208                   ? isALNUM(nextchr) : isALNUM_LC(nextchr)))
3209                 sayNO;
3210             nextchr = UCHARAT(++locinput);
3211             break;
3212         case NALNUML:
3213             PL_reg_flags |= RF_tainted;
3214             /* FALL THROUGH */
3215         case NALNUM:
3216             if (!nextchr && locinput >= PL_regeol)
3217                 sayNO;
3218             if (do_utf8) {
3219                 LOAD_UTF8_CHARCLASS_ALNUM();
3220                 if (OP(scan) == NALNUM
3221                     ? (bool)swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
3222                     : isALNUM_LC_utf8((U8*)locinput))
3223                 {
3224                     sayNO;
3225                 }
3226                 locinput += PL_utf8skip[nextchr];
3227                 nextchr = UCHARAT(locinput);
3228                 break;
3229             }
3230             if (OP(scan) == NALNUM
3231                 ? isALNUM(nextchr) : isALNUM_LC(nextchr))
3232                 sayNO;
3233             nextchr = UCHARAT(++locinput);
3234             break;
3235         case BOUNDL:
3236         case NBOUNDL:
3237             PL_reg_flags |= RF_tainted;
3238             /* FALL THROUGH */
3239         case BOUND:
3240         case NBOUND:
3241             /* was last char in word? */
3242             if (do_utf8) {
3243                 if (locinput == PL_bostr)
3244                     ln = '\n';
3245                 else {
3246                     const U8 * const r = reghop3((U8*)locinput, -1, (U8*)PL_bostr);
3247                 
3248                     ln = utf8n_to_uvchr(r, UTF8SKIP(r), 0, uniflags);
3249                 }
3250                 if (OP(scan) == BOUND || OP(scan) == NBOUND) {
3251                     ln = isALNUM_uni(ln);
3252                     LOAD_UTF8_CHARCLASS_ALNUM();
3253                     n = swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8);
3254                 }
3255                 else {
3256                     ln = isALNUM_LC_uvchr(UNI_TO_NATIVE(ln));
3257                     n = isALNUM_LC_utf8((U8*)locinput);
3258                 }
3259             }
3260             else {
3261                 ln = (locinput != PL_bostr) ?
3262                     UCHARAT(locinput - 1) : '\n';
3263                 if (OP(scan) == BOUND || OP(scan) == NBOUND) {
3264                     ln = isALNUM(ln);
3265                     n = isALNUM(nextchr);
3266                 }
3267                 else {
3268                     ln = isALNUM_LC(ln);
3269                     n = isALNUM_LC(nextchr);
3270                 }
3271             }
3272             if (((!ln) == (!n)) == (OP(scan) == BOUND ||
3273                                     OP(scan) == BOUNDL))
3274                     sayNO;
3275             break;
3276         case SPACEL:
3277             PL_reg_flags |= RF_tainted;
3278             /* FALL THROUGH */
3279         case SPACE:
3280             if (!nextchr)
3281                 sayNO;
3282             if (do_utf8) {
3283                 if (UTF8_IS_CONTINUED(nextchr)) {
3284                     LOAD_UTF8_CHARCLASS_SPACE();
3285                     if (!(OP(scan) == SPACE
3286                           ? (bool)swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
3287                           : isSPACE_LC_utf8((U8*)locinput)))
3288                     {
3289                         sayNO;
3290                     }
3291                     locinput += PL_utf8skip[nextchr];
3292                     nextchr = UCHARAT(locinput);
3293                     break;
3294                 }
3295                 if (!(OP(scan) == SPACE
3296                       ? isSPACE(nextchr) : isSPACE_LC(nextchr)))
3297                     sayNO;
3298                 nextchr = UCHARAT(++locinput);
3299             }
3300             else {
3301                 if (!(OP(scan) == SPACE
3302                       ? isSPACE(nextchr) : isSPACE_LC(nextchr)))
3303                     sayNO;
3304                 nextchr = UCHARAT(++locinput);
3305             }
3306             break;
3307         case NSPACEL:
3308             PL_reg_flags |= RF_tainted;
3309             /* FALL THROUGH */
3310         case NSPACE:
3311             if (!nextchr && locinput >= PL_regeol)
3312                 sayNO;
3313             if (do_utf8) {
3314                 LOAD_UTF8_CHARCLASS_SPACE();
3315                 if (OP(scan) == NSPACE
3316                     ? (bool)swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
3317                     : isSPACE_LC_utf8((U8*)locinput))
3318                 {
3319                     sayNO;
3320                 }
3321                 locinput += PL_utf8skip[nextchr];
3322                 nextchr = UCHARAT(locinput);
3323                 break;
3324             }
3325             if (OP(scan) == NSPACE
3326                 ? isSPACE(nextchr) : isSPACE_LC(nextchr))
3327                 sayNO;
3328             nextchr = UCHARAT(++locinput);
3329             break;
3330         case DIGITL:
3331             PL_reg_flags |= RF_tainted;
3332             /* FALL THROUGH */
3333         case DIGIT:
3334             if (!nextchr)
3335                 sayNO;
3336             if (do_utf8) {
3337                 LOAD_UTF8_CHARCLASS_DIGIT();
3338                 if (!(OP(scan) == DIGIT
3339                       ? (bool)swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
3340                       : isDIGIT_LC_utf8((U8*)locinput)))
3341                 {
3342                     sayNO;
3343                 }
3344                 locinput += PL_utf8skip[nextchr];
3345                 nextchr = UCHARAT(locinput);
3346                 break;
3347             }
3348             if (!(OP(scan) == DIGIT
3349                   ? isDIGIT(nextchr) : isDIGIT_LC(nextchr)))
3350                 sayNO;
3351             nextchr = UCHARAT(++locinput);
3352             break;
3353         case NDIGITL:
3354             PL_reg_flags |= RF_tainted;
3355             /* FALL THROUGH */
3356         case NDIGIT:
3357             if (!nextchr && locinput >= PL_regeol)
3358                 sayNO;
3359             if (do_utf8) {
3360                 LOAD_UTF8_CHARCLASS_DIGIT();
3361                 if (OP(scan) == NDIGIT
3362                     ? (bool)swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
3363                     : isDIGIT_LC_utf8((U8*)locinput))
3364                 {
3365                     sayNO;
3366                 }
3367                 locinput += PL_utf8skip[nextchr];
3368                 nextchr = UCHARAT(locinput);
3369                 break;
3370             }
3371             if (OP(scan) == NDIGIT
3372                 ? isDIGIT(nextchr) : isDIGIT_LC(nextchr))
3373                 sayNO;
3374             nextchr = UCHARAT(++locinput);
3375             break;
3376         case CLUMP:
3377             if (locinput >= PL_regeol)
3378                 sayNO;
3379             if  (do_utf8) {
3380                 LOAD_UTF8_CHARCLASS_MARK();
3381                 if (swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
3382                     sayNO;
3383                 locinput += PL_utf8skip[nextchr];
3384                 while (locinput < PL_regeol &&
3385                        swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
3386                     locinput += UTF8SKIP(locinput);
3387                 if (locinput > PL_regeol)
3388                     sayNO;
3389             } 
3390             else
3391                locinput++;
3392             nextchr = UCHARAT(locinput);
3393             break;
3394             
3395         case NREFFL:
3396         {
3397             char *s;
3398             char type;
3399             PL_reg_flags |= RF_tainted;
3400             /* FALL THROUGH */
3401         case NREF:
3402         case NREFF:
3403             type = OP(scan);
3404             n = reg_check_named_buff_matched(rex,scan);
3405
3406             if ( n ) {
3407                 type = REF + ( type - NREF );
3408                 goto do_ref;
3409             } else {
3410                 sayNO;
3411             }
3412             /* unreached */
3413         case REFFL:
3414             PL_reg_flags |= RF_tainted;
3415             /* FALL THROUGH */
3416         case REF:
3417         case REFF: 
3418             n = ARG(scan);  /* which paren pair */
3419             type = OP(scan);
3420           do_ref:  
3421             ln = PL_regstartp[n];
3422             PL_reg_leftiter = PL_reg_maxiter;           /* Void cache */
3423             if (*PL_reglastparen < n || ln == -1)
3424                 sayNO;                  /* Do not match unless seen CLOSEn. */
3425             if (ln == PL_regendp[n])
3426                 break;
3427
3428             s = PL_bostr + ln;
3429             if (do_utf8 && type != REF) {       /* REF can do byte comparison */
3430                 char *l = locinput;
3431                 const char *e = PL_bostr + PL_regendp[n];
3432                 /*
3433                  * Note that we can't do the "other character" lookup trick as
3434                  * in the 8-bit case (no pun intended) because in Unicode we
3435                  * have to map both upper and title case to lower case.
3436                  */
3437                 if (type == REFF) {
3438                     while (s < e) {
3439                         STRLEN ulen1, ulen2;
3440                         U8 tmpbuf1[UTF8_MAXBYTES_CASE+1];
3441                         U8 tmpbuf2[UTF8_MAXBYTES_CASE+1];
3442
3443                         if (l >= PL_regeol)
3444                             sayNO;
3445                         toLOWER_utf8((U8*)s, tmpbuf1, &ulen1);
3446                         toLOWER_utf8((U8*)l, tmpbuf2, &ulen2);
3447                         if (ulen1 != ulen2 || memNE((char *)tmpbuf1, (char *)tmpbuf2, ulen1))
3448                             sayNO;
3449                         s += ulen1;
3450                         l += ulen2;
3451                     }
3452                 }
3453                 locinput = l;
3454                 nextchr = UCHARAT(locinput);
3455                 break;
3456             }
3457
3458             /* Inline the first character, for speed. */
3459             if (UCHARAT(s) != nextchr &&
3460                 (type == REF ||
3461                  (UCHARAT(s) != (type == REFF
3462                                   ? PL_fold : PL_fold_locale)[nextchr])))
3463                 sayNO;
3464             ln = PL_regendp[n] - ln;
3465             if (locinput + ln > PL_regeol)
3466                 sayNO;
3467             if (ln > 1 && (type == REF
3468                            ? memNE(s, locinput, ln)
3469                            : (type == REFF
3470                               ? ibcmp(s, locinput, ln)
3471                               : ibcmp_locale(s, locinput, ln))))
3472                 sayNO;
3473             locinput += ln;
3474             nextchr = UCHARAT(locinput);
3475             break;
3476         }
3477         case NOTHING:
3478         case TAIL:
3479             break;
3480         case BACK:
3481             break;
3482
3483 #undef  ST
3484 #define ST st->u.eval
3485         {
3486             SV *ret;
3487             regexp *re;
3488             regnode *startpoint;
3489
3490         case GOSTART:
3491         case GOSUB: /*    /(...(?1))/      */
3492             if (cur_eval && cur_eval->locinput==locinput) {
3493                 if (cur_eval->u.eval.close_paren == (U32)ARG(scan)) 
3494                     Perl_croak(aTHX_ "Infinite recursion in regex");
3495                 if ( ++nochange_depth > MAX_RECURSE_EVAL_NOCHANGE_DEPTH ) 
3496                     Perl_croak(aTHX_ 
3497                         "Pattern subroutine nesting without pos change"
3498                         " exceeded limit in regex");
3499             } else {
3500                 nochange_depth = 0;
3501             }
3502             re = rex;
3503             (void)ReREFCNT_inc(rex);
3504             if (OP(scan)==GOSUB) {
3505                 startpoint = scan + ARG2L(scan);
3506                 ST.close_paren = ARG(scan);
3507             } else {
3508                 startpoint = re->program+1;
3509                 ST.close_paren = 0;
3510             }
3511             goto eval_recurse_doit;
3512             /* NOTREACHED */
3513         case EVAL:  /*   /(?{A})B/   /(??{A})B/  and /(?(?{A})X|Y)B/   */        
3514             if (cur_eval && cur_eval->locinput==locinput) {
3515                 if ( ++nochange_depth > MAX_RECURSE_EVAL_NOCHANGE_DEPTH ) 
3516                     Perl_croak(aTHX_ "EVAL without pos change exceeded limit in regex");
3517             } else {
3518                 nochange_depth = 0;
3519             }    
3520             {
3521                 /* execute the code in the {...} */
3522                 dSP;
3523                 SV ** const before = SP;
3524                 OP_4tree * const oop = PL_op;
3525                 COP * const ocurcop = PL_curcop;
3526                 PAD *old_comppad;
3527             
3528                 n = ARG(scan);
3529                 PL_op = (OP_4tree*)rex->data->data[n];
3530                 DEBUG_STATE_r( PerlIO_printf(Perl_debug_log, 
3531                     "  re_eval 0x%"UVxf"\n", PTR2UV(PL_op)) );
3532                 PAD_SAVE_LOCAL(old_comppad, (PAD*)rex->data->data[n + 2]);
3533                 PL_regendp[0] = PL_reg_magic->mg_len = locinput - PL_bostr;
3534
3535                 CALLRUNOPS(aTHX);                       /* Scalar context. */
3536                 SPAGAIN;
3537                 if (SP == before)
3538                     ret = &PL_sv_undef;   /* protect against empty (?{}) blocks. */
3539                 else {
3540                     ret = POPs;
3541                     PUTBACK;
3542                 }
3543
3544                 PL_op = oop;
3545                 PAD_RESTORE_LOCAL(old_comppad);
3546                 PL_curcop = ocurcop;
3547                 if (!logical) {
3548                     /* /(?{...})/ */
3549                     sv_setsv(save_scalar(PL_replgv), ret);
3550                     break;
3551                 }
3552             }
3553             if (logical == 2) { /* Postponed subexpression: /(??{...})/ */
3554                 logical = 0;
3555                 {
3556                     /* extract RE object from returned value; compiling if
3557                      * necessary */
3558
3559                     MAGIC *mg = NULL;
3560                     const SV *sv;
3561                     if(SvROK(ret) && SvSMAGICAL(sv = SvRV(ret)))
3562                         mg = mg_find(sv, PERL_MAGIC_qr);
3563                     else if (SvSMAGICAL(ret)) {
3564                         if (SvGMAGICAL(ret))
3565                             sv_unmagic(ret, PERL_MAGIC_qr);
3566                         else
3567                             mg = mg_find(ret, PERL_MAGIC_qr);
3568                     }
3569
3570                     if (mg) {
3571                         re = (regexp *)mg->mg_obj;
3572                         (void)ReREFCNT_inc(re);
3573                     }
3574                     else {
3575                         STRLEN len;
3576                         const char * const t = SvPV_const(ret, len);
3577                         PMOP pm;
3578                         const I32 osize = PL_regsize;
3579
3580                         Zero(&pm, 1, PMOP);
3581                         if (DO_UTF8(ret)) pm.op_pmdynflags |= PMdf_DYN_UTF8;
3582                         re = CALLREGCOMP((char*)t, (char*)t + len, &pm);
3583                         if (!(SvFLAGS(ret)
3584                               & (SVs_TEMP | SVs_PADTMP | SVf_READONLY
3585                                 | SVs_GMG)))
3586                             sv_magic(ret,(SV*)ReREFCNT_inc(re),
3587                                         PERL_MAGIC_qr,0,0);
3588                         PL_regsize = osize;
3589                     }
3590                 }
3591                 DEBUG_EXECUTE_r(
3592                     debug_start_match(re, do_utf8, locinput, PL_regeol, 
3593                         "Matching embedded");
3594                 );              
3595                 startpoint = re->program + 1;
3596                 ST.close_paren = 0; /* only used for GOSUB */
3597                 /* borrowed from regtry */
3598                 if (PL_reg_start_tmpl <= re->nparens) {
3599                     PL_reg_start_tmpl = re->nparens*3/2 + 3;
3600                     if(PL_reg_start_tmp)
3601                         Renew(PL_reg_start_tmp, PL_reg_start_tmpl, char*);
3602                     else
3603                         Newx(PL_reg_start_tmp, PL_reg_start_tmpl, char*);
3604                 }                       
3605
3606         eval_recurse_doit: /* Share code with GOSUB below this line */                          
3607                 /* run the pattern returned from (??{...}) */
3608                 ST.cp = regcppush(0);   /* Save *all* the positions. */
3609                 REGCP_SET(ST.lastcp);
3610                 
3611                 PL_regstartp = re->startp; /* essentially NOOP on GOSUB */
3612                 PL_regendp = re->endp;     /* essentially NOOP on GOSUB */
3613                 
3614                 *PL_reglastparen = 0;
3615                 *PL_reglastcloseparen = 0;
3616                 PL_reginput = locinput;
3617                 PL_regsize = 0;
3618
3619                 /* XXXX This is too dramatic a measure... */
3620                 PL_reg_maxiter = 0;
3621
3622                 ST.toggle_reg_flags = PL_reg_flags;
3623                 if (re->reganch & ROPT_UTF8)
3624                     PL_reg_flags |= RF_utf8;
3625                 else
3626                     PL_reg_flags &= ~RF_utf8;
3627                 ST.toggle_reg_flags ^= PL_reg_flags; /* diff of old and new */
3628
3629                 ST.prev_rex = rex;
3630                 ST.prev_curlyx = cur_curlyx;
3631                 rex = re;
3632                 cur_curlyx = NULL;
3633                 ST.B = next;
3634                 ST.prev_eval = cur_eval;
3635                 cur_eval = st;
3636                 /* now continue from first node in postoned RE */
3637                 PUSH_YES_STATE_GOTO(EVAL_AB, startpoint);
3638                 /* NOTREACHED */
3639             }
3640             /* logical is 1,   /(?(?{...})X|Y)/ */
3641             sw = (bool)SvTRUE(ret);
3642             logical = 0;
3643             break;
3644         }
3645
3646         case EVAL_AB: /* cleanup after a successful (??{A})B */
3647             /* note: this is called twice; first after popping B, then A */
3648             PL_reg_flags ^= ST.toggle_reg_flags; 
3649             ReREFCNT_dec(rex);
3650             rex = ST.prev_rex;
3651             regcpblow(ST.cp);
3652             cur_eval = ST.prev_eval;
3653             cur_curlyx = ST.prev_curlyx;
3654             /* XXXX This is too dramatic a measure... */
3655             PL_reg_maxiter = 0;
3656             sayYES;
3657
3658
3659         case EVAL_AB_fail: /* unsuccessfully ran A or B in (??{A})B */
3660             /* note: this is called twice; first after popping B, then A */
3661             PL_reg_flags ^= ST.toggle_reg_flags; 
3662             ReREFCNT_dec(rex);
3663             rex = ST.prev_rex;
3664             PL_reginput = locinput;
3665             REGCP_UNWIND(ST.lastcp);
3666             regcppop(rex);
3667             cur_eval = ST.prev_eval;
3668             cur_curlyx = ST.prev_curlyx;
3669             /* XXXX This is too dramatic a measure... */
3670             PL_reg_maxiter = 0;
3671             sayNO_SILENT;
3672 #undef ST
3673
3674         case OPEN:
3675             n = ARG(scan);  /* which paren pair */
3676             PL_reg_start_tmp[n] = locinput;
3677             if (n > PL_regsize)
3678                 PL_regsize = n;
3679             lastopen = n;
3680             break;
3681         case CLOSE:
3682             n = ARG(scan);  /* which paren pair */
3683             PL_regstartp[n] = PL_reg_start_tmp[n] - PL_bostr;
3684             PL_regendp[n] = locinput - PL_bostr;
3685             /*if (n > PL_regsize)
3686                 PL_regsize = n;*/
3687             if (n > *PL_reglastparen)
3688                 *PL_reglastparen = n;
3689             *PL_reglastcloseparen = n;
3690             if (cur_eval && cur_eval->u.eval.close_paren == n) {
3691                 goto fake_end;
3692             }    
3693             break;
3694         case ACCEPT:
3695             if (ARG(scan)){
3696                 regnode *cursor;
3697                 for (cursor=scan;
3698                      cursor && OP(cursor)!=END; 
3699                      cursor=regnext(cursor)) 
3700                 {
3701                     if ( OP(cursor)==CLOSE ){
3702                         n = ARG(cursor);
3703                         if ( n <= lastopen ) {
3704                             PL_regstartp[n] = PL_reg_start_tmp[n] - PL_bostr;
3705                             PL_regendp[n] = locinput - PL_bostr;
3706                             /*if (n > PL_regsize)
3707                             PL_regsize = n;*/
3708                             if (n > *PL_reglastparen)
3709                                 *PL_reglastparen = n;
3710                             *PL_reglastcloseparen = n;
3711                             if ( n == ARG(scan) || (cur_eval &&
3712                                 cur_eval->u.eval.close_paren == n))
3713                                 break;
3714                         }
3715                     }
3716                 }
3717             }
3718             goto fake_end;
3719             /*NOTREACHED*/          
3720         case GROUPP:
3721             n = ARG(scan);  /* which paren pair */
3722             sw = (bool)(*PL_reglastparen >= n && PL_regendp[n] != -1);
3723             break;
3724         case NGROUPP:
3725             /* reg_check_named_buff_matched returns 0 for no match */
3726             sw = (bool)(0 < reg_check_named_buff_matched(rex,scan));
3727             break;
3728         case INSUBP:
3729             n = ARG(scan);
3730             sw = (cur_eval && (!n || cur_eval->u.eval.close_paren == n));
3731             break;
3732         case DEFINEP:
3733             sw = 0;
3734             break;
3735         case IFTHEN:
3736             PL_reg_leftiter = PL_reg_maxiter;           /* Void cache */
3737             if (sw)
3738                 next = NEXTOPER(NEXTOPER(scan));
3739             else {
3740                 next = scan + ARG(scan);
3741                 if (OP(next) == IFTHEN) /* Fake one. */
3742                     next = NEXTOPER(NEXTOPER(next));
3743             }
3744             break;
3745         case LOGICAL:
3746             logical = scan->flags;
3747             break;
3748
3749 /*******************************************************************
3750
3751 The CURLYX/WHILEM pair of ops handle the most generic case of the /A*B/
3752 pattern, where A and B are subpatterns. (For simple A, CURLYM or
3753 STAR/PLUS/CURLY/CURLYN are used instead.)
3754
3755 A*B is compiled as <CURLYX><A><WHILEM><B>
3756
3757 On entry to the subpattern, CURLYX is called. This pushes a CURLYX
3758 state, which contains the current count, initialised to -1. It also sets
3759 cur_curlyx to point to this state, with any previous value saved in the
3760 state block.
3761
3762 CURLYX then jumps straight to the WHILEM op, rather than executing A,
3763 since the pattern may possibly match zero times (i.e. it's a while {} loop
3764 rather than a do {} while loop).
3765
3766 Each entry to WHILEM represents a successful match of A. The count in the
3767 CURLYX block is incremented, another WHILEM state is pushed, and execution
3768 passes to A or B depending on greediness and the current count.
3769
3770 For example, if matching against the string a1a2a3b (where the aN are
3771 substrings that match /A/), then the match progresses as follows: (the
3772 pushed states are interspersed with the bits of strings matched so far):
3773
3774     <CURLYX cnt=-1>
3775     <CURLYX cnt=0><WHILEM>
3776     <CURLYX cnt=1><WHILEM> a1 <WHILEM>
3777     <CURLYX cnt=2><WHILEM> a1 <WHILEM> a2 <WHILEM>
3778     <CURLYX cnt=3><WHILEM> a1 <WHILEM> a2 <WHILEM> a3 <WHILEM>
3779     <CURLYX cnt=3><WHILEM> a1 <WHILEM> a2 <WHILEM> a3 <WHILEM> b
3780
3781 (Contrast this with something like CURLYM, which maintains only a single
3782 backtrack state:
3783
3784     <CURLYM cnt=0> a1
3785     a1 <CURLYM cnt=1> a2
3786     a1 a2 <CURLYM cnt=2> a3
3787     a1 a2 a3 <CURLYM cnt=3> b
3788 )
3789
3790 Each WHILEM state block marks a point to backtrack to upon partial failure
3791 of A or B, and also contains some minor state data related to that
3792 iteration.  The CURLYX block, pointed to by cur_curlyx, contains the
3793 overall state, such as the count, and pointers to the A and B ops.
3794
3795 This is complicated slightly by nested CURLYX/WHILEM's. Since cur_curlyx
3796 must always point to the *current* CURLYX block, the rules are:
3797
3798 When executing CURLYX, save the old cur_curlyx in the CURLYX state block,
3799 and set cur_curlyx to point the new block.
3800
3801 When popping the CURLYX block after a successful or unsuccessful match,
3802 restore the previous cur_curlyx.
3803
3804 When WHILEM is about to execute B, save the current cur_curlyx, and set it
3805 to the outer one saved in the CURLYX block.
3806
3807 When popping the WHILEM block after a successful or unsuccessful B match,
3808 restore the previous cur_curlyx.
3809
3810 Here's an example for the pattern (AI* BI)*BO
3811 I and O refer to inner and outer, C and W refer to CURLYX and WHILEM:
3812
3813 cur_
3814 curlyx backtrack stack
3815 ------ ---------------
3816 NULL   
3817 CO     <CO prev=NULL> <WO>
3818 CI     <CO prev=NULL> <WO> <CI prev=CO> <WI> ai 
3819 CO     <CO prev=NULL> <WO> <CI prev=CO> <WI> ai <WI prev=CI> bi 
3820 NULL   <CO prev=NULL> <WO> <CI prev=CO> <WI> ai <WI prev=CI> bi <WO prev=CO> bo
3821
3822 At this point the pattern succeeds, and we work back down the stack to
3823 clean up, restoring as we go:
3824
3825 CO     <CO prev=NULL> <WO> <CI prev=CO> <WI> ai <WI prev=CI> bi 
3826 CI     <CO prev=NULL> <WO> <CI prev=CO> <WI> ai 
3827 CO     <CO prev=NULL> <WO>
3828 NULL   
3829
3830 *******************************************************************/
3831
3832 #define ST st->u.curlyx
3833
3834         case CURLYX:    /* start of /A*B/  (for complex A) */
3835         {
3836             /* No need to save/restore up to this paren */
3837             I32 parenfloor = scan->flags;
3838             
3839             assert(next); /* keep Coverity happy */
3840             if (OP(PREVOPER(next)) == NOTHING) /* LONGJMP */
3841                 next += ARG(next);
3842
3843             /* XXXX Probably it is better to teach regpush to support
3844                parenfloor > PL_regsize... */
3845             if (parenfloor > (I32)*PL_reglastparen)
3846                 parenfloor = *PL_reglastparen; /* Pessimization... */
3847
3848             ST.prev_curlyx= cur_curlyx;
3849             cur_curlyx = st;
3850             ST.cp = PL_savestack_ix;
3851
3852             /* these fields contain the state of the current curly.
3853              * they are accessed by subsequent WHILEMs */
3854             ST.parenfloor = parenfloor;
3855             ST.min = ARG1(scan);
3856             ST.max = ARG2(scan);
3857             ST.A = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
3858             ST.B = next;
3859             ST.minmod = minmod;
3860             minmod = 0;
3861             ST.count = -1;      /* this will be updated by WHILEM */
3862             ST.lastloc = NULL;  /* this will be updated by WHILEM */
3863
3864             PL_reginput = locinput;
3865             PUSH_YES_STATE_GOTO(CURLYX_end, PREVOPER(next));
3866             /* NOTREACHED */
3867         }
3868
3869         case CURLYX_end: /* just finished matching all of A*B */
3870             if (PL_reg_eval_set){
3871                 SV *pres= GvSV(PL_replgv);
3872                 SvREFCNT_inc(pres);
3873                 regcpblow(ST.cp);
3874                 sv_setsv(GvSV(PL_replgv), pres);
3875                 SvREFCNT_dec(pres);
3876             } else {
3877                 regcpblow(ST.cp);
3878             }
3879             cur_curlyx = ST.prev_curlyx;
3880             sayYES;
3881             /* NOTREACHED */
3882
3883         case CURLYX_end_fail: /* just failed to match all of A*B */
3884             regcpblow(ST.cp);
3885             cur_curlyx = ST.prev_curlyx;
3886             sayNO;
3887             /* NOTREACHED */
3888
3889
3890 #undef ST
3891 #define ST st->u.whilem
3892
3893         case WHILEM:     /* just matched an A in /A*B/  (for complex A) */
3894         {
3895             /* see the discussion above about CURLYX/WHILEM */
3896             I32 n;
3897             assert(cur_curlyx); /* keep Coverity happy */
3898             n = ++cur_curlyx->u.curlyx.count; /* how many A's matched */
3899             ST.save_lastloc = cur_curlyx->u.curlyx.lastloc;
3900             ST.cache_offset = 0;
3901             ST.cache_mask = 0;
3902             
3903             PL_reginput = locinput;
3904
3905             DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3906                   "%*s  whilem: matched %ld out of %ld..%ld\n",
3907                   REPORT_CODE_OFF+depth*2, "", (long)n,
3908                   (long)cur_curlyx->u.curlyx.min,
3909                   (long)cur_curlyx->u.curlyx.max)
3910             );
3911
3912             /* First just match a string of min A's. */
3913
3914             if (n < cur_curlyx->u.curlyx.min) {
3915                 cur_curlyx->u.curlyx.lastloc = locinput;
3916                 PUSH_STATE_GOTO(WHILEM_A_pre, cur_curlyx->u.curlyx.A);
3917                 /* NOTREACHED */
3918             }
3919
3920             /* If degenerate A matches "", assume A done. */
3921
3922             if (locinput == cur_curlyx->u.curlyx.lastloc) {
3923                 DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3924                    "%*s  whilem: empty match detected, trying continuation...\n",
3925                    REPORT_CODE_OFF+depth*2, "")
3926                 );
3927                 goto do_whilem_B_max;
3928             }
3929
3930             /* super-linear cache processing */
3931
3932             if (scan->flags) {
3933
3934                 if (!PL_reg_maxiter) {
3935                     /* start the countdown: Postpone detection until we
3936                      * know the match is not *that* much linear. */
3937                     PL_reg_maxiter = (PL_regeol - PL_bostr + 1) * (scan->flags>>4);
3938                     /* possible overflow for long strings and many CURLYX's */
3939                     if (PL_reg_maxiter < 0)
3940                         PL_reg_maxiter = I32_MAX;
3941                     PL_reg_leftiter = PL_reg_maxiter;
3942                 }
3943
3944                 if (PL_reg_leftiter-- == 0) {
3945                     /* initialise cache */
3946                     const I32 size = (PL_reg_maxiter + 7)/8;
3947                     if (PL_reg_poscache) {
3948                         if ((I32)PL_reg_poscache_size < size) {
3949                             Renew(PL_reg_poscache, size, char);
3950                             PL_reg_poscache_size = size;
3951                         }
3952                         Zero(PL_reg_poscache, size, char);
3953                     }
3954                     else {
3955                         PL_reg_poscache_size = size;
3956                         Newxz(PL_reg_poscache, size, char);
3957                     }
3958                     DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3959       "%swhilem: Detected a super-linear match, switching on caching%s...\n",
3960                               PL_colors[4], PL_colors[5])
3961                     );
3962                 }
3963
3964                 if (PL_reg_leftiter < 0) {
3965                     /* have we already failed at this position? */
3966                     I32 offset, mask;
3967                     offset  = (scan->flags & 0xf) - 1
3968                                 + (locinput - PL_bostr)  * (scan->flags>>4);
3969                     mask    = 1 << (offset % 8);
3970                     offset /= 8;
3971                     if (PL_reg_poscache[offset] & mask) {
3972                         DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3973                             "%*s  whilem: (cache) already tried at this position...\n",
3974                             REPORT_CODE_OFF+depth*2, "")
3975                         );
3976                         sayNO; /* cache records failure */
3977                     }
3978                     ST.cache_offset = offset;
3979                     ST.cache_mask   = mask;
3980                 }
3981             }
3982
3983             /* Prefer B over A for minimal matching. */
3984
3985             if (cur_curlyx->u.curlyx.minmod) {
3986                 ST.save_curlyx = cur_curlyx;
3987                 cur_curlyx = cur_curlyx->u.curlyx.prev_curlyx;
3988                 ST.cp = regcppush(ST.save_curlyx->u.curlyx.parenfloor);
3989                 REGCP_SET(ST.lastcp);
3990                 PUSH_YES_STATE_GOTO(WHILEM_B_min, ST.save_curlyx->u.curlyx.B);
3991                 /* NOTREACHED */
3992             }
3993
3994             /* Prefer A over B for maximal matching. */
3995
3996             if (n < cur_curlyx->u.curlyx.max) { /* More greed allowed? */
3997                 ST.cp = regcppush(cur_curlyx->u.curlyx.parenfloor);
3998                 cur_curlyx->u.curlyx.lastloc = locinput;
3999                 REGCP_SET(ST.lastcp);
4000                 PUSH_STATE_GOTO(WHILEM_A_max, cur_curlyx->u.curlyx.A);
4001                 /* NOTREACHED */
4002             }
4003             goto do_whilem_B_max;
4004         }
4005         /* NOTREACHED */
4006
4007         case WHILEM_B_min: /* just matched B in a minimal match */
4008         case WHILEM_B_max: /* just matched B in a maximal match */
4009             cur_curlyx = ST.save_curlyx;
4010             sayYES;
4011             /* NOTREACHED */
4012
4013         case WHILEM_B_max_fail: /* just failed to match B in a maximal match */
4014             cur_curlyx = ST.save_curlyx;
4015             cur_curlyx->u.curlyx.lastloc = ST.save_lastloc;
4016             cur_curlyx->u.curlyx.count--;
4017             CACHEsayNO;
4018             /* NOTREACHED */
4019
4020         case WHILEM_A_min_fail: /* just failed to match A in a minimal match */
4021             REGCP_UNWIND(ST.lastcp);
4022             regcppop(rex);
4023             /* FALL THROUGH */
4024         case WHILEM_A_pre_fail: /* just failed to match even minimal A */
4025             cur_curlyx->u.curlyx.lastloc = ST.save_lastloc;
4026             cur_curlyx->u.curlyx.count--;
4027             CACHEsayNO;
4028             /* NOTREACHED */
4029
4030         case WHILEM_A_max_fail: /* just failed to match A in a maximal match */
4031             REGCP_UNWIND(ST.lastcp);
4032             regcppop(rex);      /* Restore some previous $<digit>s? */
4033             PL_reginput = locinput;
4034             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
4035                 "%*s  whilem: failed, trying continuation...\n",
4036                 REPORT_CODE_OFF+depth*2, "")
4037             );
4038           do_whilem_B_max:
4039             if (cur_curlyx->u.curlyx.count >= REG_INFTY
4040                 && ckWARN(WARN_REGEXP)
4041                 && !(PL_reg_flags & RF_warned))
4042             {
4043                 PL_reg_flags |= RF_warned;
4044                 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s limit (%d) exceeded",
4045                      "Complex regular subexpression recursion",
4046                      REG_INFTY - 1);
4047             }
4048
4049             /* now try B */
4050             ST.save_curlyx = cur_curlyx;
4051             cur_curlyx = cur_curlyx->u.curlyx.prev_curlyx;
4052             PUSH_YES_STATE_GOTO(WHILEM_B_max, ST.save_curlyx->u.curlyx.B);
4053             /* NOTREACHED */
4054
4055         case WHILEM_B_min_fail: /* just failed to match B in a minimal match */
4056             cur_curlyx = ST.save_curlyx;
4057             REGCP_UNWIND(ST.lastcp);
4058             regcppop(rex);
4059
4060             if (cur_curlyx->u.curlyx.count >= cur_curlyx->u.curlyx.max) {
4061                 /* Maximum greed exceeded */
4062                 if (cur_curlyx->u.curlyx.count >= REG_INFTY
4063                     && ckWARN(WARN_REGEXP)
4064                     && !(PL_reg_flags & RF_warned))
4065                 {
4066                     PL_reg_flags |= RF_warned;
4067                     Perl_warner(aTHX_ packWARN(WARN_REGEXP),
4068                         "%s limit (%d) exceeded",
4069                         "Complex regular subexpression recursion",
4070                         REG_INFTY - 1);
4071                 }
4072                 cur_curlyx->u.curlyx.count--;
4073                 CACHEsayNO;
4074             }
4075
4076             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
4077                 "%*s  trying longer...\n", REPORT_CODE_OFF+depth*2, "")
4078             );
4079             /* Try grabbing another A and see if it helps. */
4080             PL_reginput = locinput;
4081             cur_curlyx->u.curlyx.lastloc = locinput;
4082             ST.cp = regcppush(cur_curlyx->u.curlyx.parenfloor);
4083             REGCP_SET(ST.lastcp);
4084             PUSH_STATE_GOTO(WHILEM_A_min, ST.save_curlyx->u.curlyx.A);
4085             /* NOTREACHED */
4086
4087 #undef  ST
4088 #define ST st->u.branch
4089
4090         case BRANCHJ:       /*  /(...|A|...)/ with long next pointer */
4091             next = scan + ARG(scan);
4092             if (next == scan)
4093                 next = NULL;
4094             scan = NEXTOPER(scan);
4095             /* FALL THROUGH */
4096
4097         case BRANCH:        /*  /(...|A|...)/ */
4098             scan = NEXTOPER(scan); /* scan now points to inner node */
4099             if ((!next || (OP(next) != BRANCH && OP(next) != BRANCHJ)) 
4100                 && !has_cutgroup)
4101             {
4102                 /* last branch; skip state push and jump direct to node */
4103                 continue;
4104             }
4105             ST.lastparen = *PL_reglastparen;
4106             ST.next_branch = next;
4107             REGCP_SET(ST.cp);
4108             PL_reginput = locinput;
4109
4110             /* Now go into the branch */
4111             if (has_cutgroup) {
4112                 PUSH_YES_STATE_GOTO(BRANCH_next, scan);    
4113             } else {
4114                 PUSH_STATE_GOTO(BRANCH_next, scan);
4115             }
4116             /* NOTREACHED */
4117         case CUTGROUP:
4118             PL_reginput = locinput;
4119             sv_yes_mark = st->u.mark.mark_name = scan->flags ? NULL :
4120                 (SV*)rex->data->data[ ARG( scan ) ];
4121             PUSH_STATE_GOTO(CUTGROUP_next,next);
4122             /* NOTREACHED */
4123         case CUTGROUP_next_fail:
4124             do_cutgroup = 1;
4125             no_final = 1;
4126             if (st->u.mark.mark_name)
4127                 sv_commit = st->u.mark.mark_name;
4128             sayNO;          
4129             /* NOTREACHED */
4130         case BRANCH_next:
4131             sayYES;
4132             /* NOTREACHED */
4133         case BRANCH_next_fail: /* that branch failed; try the next, if any */
4134             if (do_cutgroup) {
4135                 do_cutgroup = 0;
4136                 no_final = 0;
4137             }
4138             REGCP_UNWIND(ST.cp);
4139             for (n = *PL_reglastparen; n > ST.lastparen; n--)
4140                 PL_regendp[n] = -1;
4141             *PL_reglastparen = n;
4142             /*dmq: *PL_reglastcloseparen = n; */
4143             scan = ST.next_branch;
4144             /* no more branches? */
4145             if (!scan || (OP(scan) != BRANCH && OP(scan) != BRANCHJ)) {
4146                 DEBUG_EXECUTE_r({
4147                     PerlIO_printf( Perl_debug_log,
4148                         "%*s  %sBRANCH failed...%s\n",
4149                         REPORT_CODE_OFF+depth*2, "", 
4150                         PL_colors[4],
4151                         PL_colors[5] );
4152                 });
4153                 sayNO_SILENT;
4154             }
4155             continue; /* execute next BRANCH[J] op */
4156             /* NOTREACHED */
4157     
4158         case MINMOD:
4159             minmod = 1;
4160             break;
4161
4162 #undef  ST
4163 #define ST st->u.curlym
4164
4165         case CURLYM:    /* /A{m,n}B/ where A is fixed-length */
4166
4167             /* This is an optimisation of CURLYX that enables us to push
4168              * only a single backtracking state, no matter now many matches
4169              * there are in {m,n}. It relies on the pattern being constant
4170              * length, with no parens to influence future backrefs
4171              */
4172
4173             ST.me = scan;
4174             scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
4175
4176             /* if paren positive, emulate an OPEN/CLOSE around A */
4177             if (ST.me->flags) {
4178                 U32 paren = ST.me->flags;
4179                 if (paren > PL_regsize)
4180                     PL_regsize = paren;
4181                 if (paren > *PL_reglastparen)
4182                     *PL_reglastparen = paren;
4183                 scan += NEXT_OFF(scan); /* Skip former OPEN. */
4184             }
4185             ST.A = scan;
4186             ST.B = next;
4187             ST.alen = 0;
4188             ST.count = 0;
4189             ST.minmod = minmod;
4190             minmod = 0;
4191             ST.c1 = CHRTEST_UNINIT;
4192             REGCP_SET(ST.cp);
4193
4194             if (!(ST.minmod ? ARG1(ST.me) : ARG2(ST.me))) /* min/max */
4195                 goto curlym_do_B;
4196
4197           curlym_do_A: /* execute the A in /A{m,n}B/  */
4198             PL_reginput = locinput;
4199             PUSH_YES_STATE_GOTO(CURLYM_A, ST.A); /* match A */
4200             /* NOTREACHED */
4201
4202         case CURLYM_A: /* we've just matched an A */
4203             locinput = st->locinput;
4204             nextchr = UCHARAT(locinput);
4205
4206             ST.count++;
4207             /* after first match, determine A's length: u.curlym.alen */
4208             if (ST.count == 1) {
4209                 if (PL_reg_match_utf8) {
4210                     char *s = locinput;
4211                     while (s < PL_reginput) {
4212                         ST.alen++;
4213                         s += UTF8SKIP(s);
4214                     }
4215                 }
4216                 else {
4217                     ST.alen = PL_reginput - locinput;
4218                 }
4219                 if (ST.alen == 0)
4220                     ST.count = ST.minmod ? ARG1(ST.me) : ARG2(ST.me);
4221             }
4222             DEBUG_EXECUTE_r(
4223                 PerlIO_printf(Perl_debug_log,
4224                           "%*s  CURLYM now matched %"IVdf" times, len=%"IVdf"...\n",
4225                           (int)(REPORT_CODE_OFF+(depth*2)), "",
4226                           (IV) ST.count, (IV)ST.alen)
4227             );
4228
4229             locinput = PL_reginput;
4230                         
4231             if (cur_eval && cur_eval->u.eval.close_paren && 
4232                 cur_eval->u.eval.close_paren == (U32)ST.me->flags) 
4233                 goto fake_end;
4234                 
4235             if ( ST.count < (ST.minmod ? ARG1(ST.me) : ARG2(ST.me)) )
4236                 goto curlym_do_A; /* try to match another A */
4237             goto curlym_do_B; /* try to match B */
4238
4239         case CURLYM_A_fail: /* just failed to match an A */
4240             REGCP_UNWIND(ST.cp);
4241
4242             if (ST.minmod || ST.count < ARG1(ST.me) /* min*/ 
4243                 || (cur_eval && cur_eval->u.eval.close_paren &&
4244                     cur_eval->u.eval.close_paren == (U32)ST.me->flags))
4245                 sayNO;
4246
4247           curlym_do_B: /* execute the B in /A{m,n}B/  */
4248             PL_reginput = locinput;
4249             if (ST.c1 == CHRTEST_UNINIT) {
4250                 /* calculate c1 and c2 for possible match of 1st char
4251                  * following curly */
4252                 ST.c1 = ST.c2 = CHRTEST_VOID;
4253                 if (HAS_TEXT(ST.B) || JUMPABLE(ST.B)) {
4254                     regnode *text_node = ST.B;
4255                     if (! HAS_TEXT(text_node))
4256                         FIND_NEXT_IMPT(text_node);
4257                     if (HAS_TEXT(text_node)
4258                         && PL_regkind[OP(text_node)] != REF)
4259                     {
4260                         ST.c1 = (U8)*STRING(text_node);
4261                         ST.c2 =
4262                             (OP(text_node) == EXACTF || OP(text_node) == REFF)
4263                             ? PL_fold[ST.c1]
4264                             : (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
4265                                 ? PL_fold_locale[ST.c1]
4266                                 : ST.c1;
4267                     }
4268                 }
4269             }
4270
4271             DEBUG_EXECUTE_r(
4272                 PerlIO_printf(Perl_debug_log,
4273                     "%*s  CURLYM trying tail with matches=%"IVdf"...\n",
4274                     (int)(REPORT_CODE_OFF+(depth*2)),
4275                     "", (IV)ST.count)
4276                 );
4277             if (ST.c1 != CHRTEST_VOID
4278                     && UCHARAT(PL_reginput) != ST.c1
4279                     && UCHARAT(PL_reginput) != ST.c2)
4280             {
4281                 /* simulate B failing */
4282                 state_num = CURLYM_B_fail;
4283                 goto reenter_switch;
4284             }
4285
4286             if (ST.me->flags) {
4287                 /* mark current A as captured */
4288                 I32 paren = ST.me->flags;
4289                 if (ST.count) {
4290                     PL_regstartp[paren]
4291                         = HOPc(PL_reginput, -ST.alen) - PL_bostr;
4292                     PL_regendp[paren] = PL_reginput - PL_bostr;
4293                     /*dmq: *PL_reglastcloseparen = paren; */
4294                 }
4295                 else
4296                     PL_regendp[paren] = -1;
4297                 if (cur_eval && cur_eval->u.eval.close_paren &&
4298                     cur_eval->u.eval.close_paren == (U32)ST.me->flags) 
4299                 {
4300                     if (ST.count) 
4301                         goto fake_end;
4302                     else
4303                         sayNO;
4304                 }
4305             }
4306             
4307             PUSH_STATE_GOTO(CURLYM_B, ST.B); /* match B */
4308             /* NOTREACHED */
4309
4310         case CURLYM_B_fail: /* just failed to match a B */
4311             REGCP_UNWIND(ST.cp);
4312             if (ST.minmod) {
4313                 if (ST.count == ARG2(ST.me) /* max */)
4314                     sayNO;
4315                 goto curlym_do_A; /* try to match a further A */
4316             }
4317             /* backtrack one A */
4318             if (ST.count == ARG1(ST.me) /* min */)
4319                 sayNO;
4320             ST.count--;
4321             locinput = HOPc(locinput, -ST.alen);
4322             goto curlym_do_B; /* try to match B */
4323
4324 #undef ST
4325 #define ST st->u.curly
4326
4327 #define CURLY_SETPAREN(paren, success) \
4328     if (paren) { \
4329         if (success) { \
4330             PL_regstartp[paren] = HOPc(locinput, -1) - PL_bostr; \
4331             PL_regendp[paren] = locinput - PL_bostr; \
4332             *PL_reglastcloseparen = paren; \
4333         } \
4334         else \
4335             PL_regendp[paren] = -1; \
4336     }
4337
4338         case STAR:              /*  /A*B/ where A is width 1 */
4339             ST.paren = 0;
4340             ST.min = 0;
4341             ST.max = REG_INFTY;
4342             scan = NEXTOPER(scan);
4343             goto repeat;
4344         case PLUS:              /*  /A+B/ where A is width 1 */
4345             ST.paren = 0;
4346             ST.min = 1;
4347             ST.max = REG_INFTY;
4348             scan = NEXTOPER(scan);
4349             goto repeat;
4350         case CURLYN:            /*  /(A){m,n}B/ where A is width 1 */
4351             ST.paren = scan->flags;     /* Which paren to set */
4352             if (ST.paren > PL_regsize)
4353                 PL_regsize = ST.paren;
4354             if (ST.paren > *PL_reglastparen)
4355                 *PL_reglastparen = ST.paren;
4356             ST.min = ARG1(scan);  /* min to match */
4357             ST.max = ARG2(scan);  /* max to match */
4358             if (cur_eval && cur_eval->u.eval.close_paren &&
4359                 cur_eval->u.eval.close_paren == (U32)ST.paren) {
4360                 ST.min=1;
4361                 ST.max=1;
4362             }
4363             scan = regnext(NEXTOPER(scan) + NODE_STEP_REGNODE);
4364             goto repeat;
4365         case CURLY:             /*  /A{m,n}B/ where A is width 1 */
4366             ST.paren = 0;
4367             ST.min = ARG1(scan);  /* min to match */
4368             ST.max = ARG2(scan);  /* max to match */
4369             scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
4370           repeat:
4371             /*
4372             * Lookahead to avoid useless match attempts
4373             * when we know what character comes next.
4374             *
4375             * Used to only do .*x and .*?x, but now it allows
4376             * for )'s, ('s and (?{ ... })'s to be in the way
4377             * of the quantifier and the EXACT-like node.  -- japhy
4378             */
4379
4380             if (ST.min > ST.max) /* XXX make this a compile-time check? */
4381                 sayNO;
4382             if (HAS_TEXT(next) || JUMPABLE(next)) {
4383                 U8 *s;
4384                 regnode *text_node = next;
4385
4386                 if (! HAS_TEXT(text_node)) 
4387                     FIND_NEXT_IMPT(text_node);
4388
4389                 if (! HAS_TEXT(text_node))
4390                     ST.c1 = ST.c2 = CHRTEST_VOID;
4391                 else {
4392                     if (PL_regkind[OP(text_node)] == REF) {
4393                         ST.c1 = ST.c2 = CHRTEST_VOID;
4394                         goto assume_ok_easy;
4395                     }
4396                     else
4397                         s = (U8*)STRING(text_node);
4398
4399                     if (!UTF) {
4400                         ST.c2 = ST.c1 = *s;
4401                         if (OP(text_node) == EXACTF || OP(text_node) == REFF)
4402                             ST.c2 = PL_fold[ST.c1];
4403                         else if (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
4404                             ST.c2 = PL_fold_locale[ST.c1];
4405                     }
4406                     else { /* UTF */
4407                         if (OP(text_node) == EXACTF || OP(text_node) == REFF) {
4408                              STRLEN ulen1, ulen2;
4409                              U8 tmpbuf1[UTF8_MAXBYTES_CASE+1];
4410                              U8 tmpbuf2[UTF8_MAXBYTES_CASE+1];
4411
4412                              to_utf8_lower((U8*)s, tmpbuf1, &ulen1);
4413                              to_utf8_upper((U8*)s, tmpbuf2, &ulen2);
4414 #ifdef EBCDIC
4415                              ST.c1 = utf8n_to_uvchr(tmpbuf1, UTF8_MAXLEN, 0,
4416                                                     ckWARN(WARN_UTF8) ?
4417                                                     0 : UTF8_ALLOW_ANY);
4418                              ST.c2 = utf8n_to_uvchr(tmpbuf2, UTF8_MAXLEN, 0,
4419                                                     ckWARN(WARN_UTF8) ?
4420                                                     0 : UTF8_ALLOW_ANY);
4421 #else
4422                              ST.c1 = utf8n_to_uvuni(tmpbuf1, UTF8_MAXBYTES, 0,
4423                                                     uniflags);
4424                              ST.c2 = utf8n_to_uvuni(tmpbuf2, UTF8_MAXBYTES, 0,
4425                                                     uniflags);
4426 #endif
4427                         }
4428                         else {
4429                             ST.c2 = ST.c1 = utf8n_to_uvchr(s, UTF8_MAXBYTES, 0,
4430                                                      uniflags);
4431                         }
4432                     }
4433                 }
4434             }
4435             else
4436                 ST.c1 = ST.c2 = CHRTEST_VOID;
4437         assume_ok_easy:
4438
4439             ST.A = scan;
4440             ST.B = next;
4441             PL_reginput = locinput;
4442             if (minmod) {
4443                 minmod = 0;
4444                 if (ST.min && regrepeat(rex, ST.A, ST.min, depth) < ST.min)
4445                     sayNO;
4446                 ST.count = ST.min;
4447                 locinput = PL_reginput;
4448                 REGCP_SET(ST.cp);
4449                 if (ST.c1 == CHRTEST_VOID)
4450                     goto curly_try_B_min;
4451
4452                 ST.oldloc = locinput;
4453
4454                 /* set ST.maxpos to the furthest point along the
4455                  * string that could possibly match */
4456                 if  (ST.max == REG_INFTY) {
4457                     ST.maxpos = PL_regeol - 1;
4458                     if (do_utf8)
4459                         while (UTF8_IS_CONTINUATION(*(U8*)ST.maxpos))
4460                             ST.maxpos--;
4461                 }
4462                 else if (do_utf8) {
4463                     int m = ST.max - ST.min;
4464                     for (ST.maxpos = locinput;
4465                          m >0 && ST.maxpos + UTF8SKIP(ST.maxpos) <= PL_regeol; m--)
4466                         ST.maxpos += UTF8SKIP(ST.maxpos);
4467                 }
4468                 else {
4469                     ST.maxpos = locinput + ST.max - ST.min;
4470                     if (ST.maxpos >= PL_regeol)
4471                         ST.maxpos = PL_regeol - 1;
4472                 }
4473                 goto curly_try_B_min_known;
4474
4475             }
4476             else {
4477                 ST.count = regrepeat(rex, ST.A, ST.max, depth);
4478                 locinput = PL_reginput;
4479                 if (ST.count < ST.min)
4480                     sayNO;
4481                 if ((ST.count > ST.min)
4482                     && (PL_regkind[OP(ST.B)] == EOL) && (OP(ST.B) != MEOL))
4483                 {
4484                     /* A{m,n} must come at the end of the string, there's
4485                      * no point in backing off ... */
4486                     ST.min = ST.count;
4487                     /* ...except that $ and \Z can match before *and* after
4488                        newline at the end.  Consider "\n\n" =~ /\n+\Z\n/.
4489                        We may back off by one in this case. */
4490                     if (UCHARAT(PL_reginput - 1) == '\n' && OP(ST.B) != EOS)
4491                         ST.min--;
4492                 }
4493                 REGCP_SET(ST.cp);
4494                 goto curly_try_B_max;
4495             }
4496             /* NOTREACHED */
4497
4498
4499         case CURLY_B_min_known_fail:
4500             /* failed to find B in a non-greedy match where c1,c2 valid */
4501             if (ST.paren && ST.count)
4502                 PL_regendp[ST.paren] = -1;
4503
4504             PL_reginput = locinput;     /* Could be reset... */
4505             REGCP_UNWIND(ST.cp);
4506             /* Couldn't or didn't -- move forward. */
4507             ST.oldloc = locinput;
4508             if (do_utf8)
4509                 locinput += UTF8SKIP(locinput);
4510             else
4511                 locinput++;
4512             ST.count++;
4513           curly_try_B_min_known:
4514              /* find the next place where 'B' could work, then call B */
4515             {
4516                 int n;
4517                 if (do_utf8) {
4518                     n = (ST.oldloc == locinput) ? 0 : 1;
4519                     if (ST.c1 == ST.c2) {
4520                         STRLEN len;
4521                         /* set n to utf8_distance(oldloc, locinput) */
4522                         while (locinput <= ST.maxpos &&
4523                                utf8n_to_uvchr((U8*)locinput,
4524                                               UTF8_MAXBYTES, &len,
4525                                               uniflags) != (UV)ST.c1) {
4526                             locinput += len;
4527                             n++;
4528                         }
4529                     }
4530                     else {
4531                         /* set n to utf8_distance(oldloc, locinput) */
4532                         while (locinput <= ST.maxpos) {
4533                             STRLEN len;
4534                             const UV c = utf8n_to_uvchr((U8*)locinput,
4535                                                   UTF8_MAXBYTES, &len,
4536                                                   uniflags);
4537                             if (c == (UV)ST.c1 || c == (UV)ST.c2)
4538                                 break;
4539                             locinput += len;
4540                             n++;
4541                         }
4542                     }
4543                 }
4544                 else {
4545                     if (ST.c1 == ST.c2) {
4546                         while (locinput <= ST.maxpos &&
4547                                UCHARAT(locinput) != ST.c1)
4548                             locinput++;
4549                     }
4550                     else {
4551                         while (locinput <= ST.maxpos
4552                                && UCHARAT(locinput) != ST.c1
4553                                && UCHARAT(locinput) != ST.c2)
4554                             locinput++;
4555                     }
4556                     n = locinput - ST.oldloc;
4557                 }
4558                 if (locinput > ST.maxpos)
4559                     sayNO;
4560                 /* PL_reginput == oldloc now */
4561                 if (n) {
4562                     ST.count += n;
4563                     if (regrepeat(rex, ST.A, n, depth) < n)
4564                         sayNO;
4565                 }
4566                 PL_reginput = locinput;
4567                 CURLY_SETPAREN(ST.paren, ST.count);
4568                 if (cur_eval && cur_eval->u.eval.close_paren && 
4569                     cur_eval->u.eval.close_paren == (U32)ST.paren) {
4570                     goto fake_end;
4571                 }
4572                 PUSH_STATE_GOTO(CURLY_B_min_known, ST.B);
4573             }
4574             /* NOTREACHED */
4575
4576
4577         case CURLY_B_min_fail:
4578             /* failed to find B in a non-greedy match where c1,c2 invalid */
4579             if (ST.paren && ST.count)
4580                 PL_regendp[ST.paren] = -1;
4581
4582             REGCP_UNWIND(ST.cp);
4583             /* failed -- move forward one */
4584             PL_reginput = locinput;
4585             if (regrepeat(rex, ST.A, 1, depth)) {
4586                 ST.count++;
4587                 locinput = PL_reginput;
4588                 if (ST.count <= ST.max || (ST.max == REG_INFTY &&
4589                         ST.count > 0)) /* count overflow ? */
4590                 {
4591                   curly_try_B_min:
4592                     CURLY_SETPAREN(ST.paren, ST.count);
4593                     if (cur_eval && cur_eval->u.eval.close_paren &&
4594                         cur_eval->u.eval.close_paren == (U32)ST.paren) {
4595                         goto fake_end;
4596                     }
4597                     PUSH_STATE_GOTO(CURLY_B_min, ST.B);
4598                 }
4599             }
4600             sayNO;
4601             /* NOTREACHED */
4602
4603
4604         curly_try_B_max:
4605             /* a successful greedy match: now try to match B */
4606             if (cur_eval && cur_eval->u.eval.close_paren &&
4607                 cur_eval->u.eval.close_paren == (U32)ST.paren) {
4608                 goto fake_end;
4609             }
4610             {
4611                 UV c = 0;
4612                 if (ST.c1 != CHRTEST_VOID)
4613                     c = do_utf8 ? utf8n_to_uvchr((U8*)PL_reginput,
4614                                            UTF8_MAXBYTES, 0, uniflags)
4615                                 : (UV) UCHARAT(PL_reginput);
4616                 /* If it could work, try it. */
4617                 if (ST.c1 == CHRTEST_VOID || c == (UV)ST.c1 || c == (UV)ST.c2) {
4618                     CURLY_SETPAREN(ST.paren, ST.count);
4619                     PUSH_STATE_GOTO(CURLY_B_max, ST.B);
4620                     /* NOTREACHED */
4621                 }
4622             }
4623             /* FALL THROUGH */
4624         case CURLY_B_max_fail:
4625             /* failed to find B in a greedy match */
4626             if (ST.paren && ST.count)
4627                 PL_regendp[ST.paren] = -1;
4628
4629             REGCP_UNWIND(ST.cp);
4630             /*  back up. */
4631             if (--ST.count < ST.min)
4632                 sayNO;
4633             PL_reginput = locinput = HOPc(locinput, -1);
4634             goto curly_try_B_max;
4635
4636 #undef ST
4637
4638         case END:
4639             fake_end:
4640             if (cur_eval) {
4641                 /* we've just finished A in /(??{A})B/; now continue with B */
4642                 I32 tmpix;
4643
4644
4645                 st->u.eval.toggle_reg_flags
4646                             = cur_eval->u.eval.toggle_reg_flags;
4647                 PL_reg_flags ^= st->u.eval.toggle_reg_flags; 
4648
4649                 st->u.eval.prev_rex = rex;              /* inner */
4650                 rex    = cur_eval->u.eval.prev_rex;     /* outer */
4651                 cur_curlyx = cur_eval->u.eval.prev_curlyx;
4652                 ReREFCNT_inc(rex);
4653                 st->u.eval.cp = regcppush(0);   /* Save *all* the positions. */
4654                 REGCP_SET(st->u.eval.lastcp);
4655                 PL_reginput = locinput;
4656
4657                 /* Restore parens of the outer rex without popping the
4658                  * savestack */
4659                 tmpix = PL_savestack_ix;
4660                 PL_savestack_ix = cur_eval->u.eval.lastcp;
4661                 regcppop(rex);
4662                 PL_savestack_ix = tmpix;
4663
4664                 st->u.eval.prev_eval = cur_eval;
4665                 cur_eval = cur_eval->u.eval.prev_eval;
4666                 DEBUG_EXECUTE_r(
4667                     PerlIO_printf(Perl_debug_log, "%*s  EVAL trying tail ... %"UVxf"\n",
4668                                       REPORT_CODE_OFF+depth*2, "",PTR2UV(cur_eval)););
4669                 PUSH_YES_STATE_GOTO(EVAL_AB,
4670                         st->u.eval.prev_eval->u.eval.B); /* match B */
4671             }
4672
4673             if (locinput < reginfo->till) {
4674                 DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
4675                                       "%sMatch possible, but length=%ld is smaller than requested=%ld, failing!%s\n",
4676                                       PL_colors[4],
4677                                       (long)(locinput - PL_reg_starttry),
4678                                       (long)(reginfo->till - PL_reg_starttry),
4679                                       PL_colors[5]));
4680                 sayNO_SILENT;           /* Cannot match: too short. */
4681             }
4682             PL_reginput = locinput;     /* put where regtry can find it */
4683             sayYES;                     /* Success! */
4684
4685         case SUCCEED: /* successful SUSPEND/UNLESSM/IFMATCH/CURLYM */
4686             DEBUG_EXECUTE_r(
4687             PerlIO_printf(Perl_debug_log,
4688                 "%*s  %ssubpattern success...%s\n",
4689                 REPORT_CODE_OFF+depth*2, "", PL_colors[4], PL_colors[5]));
4690             PL_reginput = locinput;     /* put where regtry can find it */
4691             sayYES;                     /* Success! */
4692
4693 #undef  ST
4694 #define ST st->u.ifmatch
4695
4696         case SUSPEND:   /* (?>A) */
4697             ST.wanted = 1;
4698             PL_reginput = locinput;
4699             goto do_ifmatch;    
4700
4701         case UNLESSM:   /* -ve lookaround: (?!A), or with flags, (?<!A) */
4702             ST.wanted = 0;
4703             goto ifmatch_trivial_fail_test;
4704
4705         case IFMATCH:   /* +ve lookaround: (?=A), or with flags, (?<=A) */
4706             ST.wanted = 1;
4707           ifmatch_trivial_fail_test:
4708             if (scan->flags) {
4709                 char * const s = HOPBACKc(locinput, scan->flags);
4710                 if (!s) {
4711                     /* trivial fail */
4712                     if (logical) {
4713                         logical = 0;
4714                         sw = 1 - (bool)ST.wanted;
4715                     }
4716                     else if (ST.wanted)
4717                         sayNO;
4718                     next = scan + ARG(scan);
4719                     if (next == scan)
4720                         next = NULL;
4721                     break;
4722                 }
4723                 PL_reginput = s;
4724             }
4725             else
4726                 PL_reginput = locinput;
4727
4728           do_ifmatch:
4729             ST.me = scan;
4730             ST.logical = logical;
4731             /* execute body of (?...A) */
4732             PUSH_YES_STATE_GOTO(IFMATCH_A, NEXTOPER(NEXTOPER(scan)));
4733             /* NOTREACHED */
4734
4735         case IFMATCH_A_fail: /* body of (?...A) failed */
4736             ST.wanted = !ST.wanted;
4737             /* FALL THROUGH */
4738
4739         case IFMATCH_A: /* body of (?...A) succeeded */
4740             if (ST.logical) {
4741                 sw = (bool)ST.wanted;
4742             }
4743             else if (!ST.wanted)
4744                 sayNO;
4745
4746             if (OP(ST.me) == SUSPEND)
4747                 locinput = PL_reginput;
4748             else {
4749                 locinput = PL_reginput = st->locinput;
4750                 nextchr = UCHARAT(locinput);
4751             }
4752             scan = ST.me + ARG(ST.me);
4753             if (scan == ST.me)
4754                 scan = NULL;
4755             continue; /* execute B */
4756
4757 #undef ST
4758
4759         case LONGJMP:
4760             next = scan + ARG(scan);
4761             if (next == scan)
4762                 next = NULL;
4763             break;
4764         case COMMIT:
4765             reginfo->cutpoint = PL_regeol;
4766             /* FALLTHROUGH */
4767         case PRUNE:
4768             PL_reginput = locinput;
4769             if (!scan->flags)
4770                 sv_yes_mark = sv_commit = (SV*)rex->data->data[ ARG( scan ) ];
4771             PUSH_STATE_GOTO(COMMIT_next,next);
4772             /* NOTREACHED */
4773         case COMMIT_next_fail:
4774             no_final = 1;    
4775             /* FALLTHROUGH */       
4776         case OPFAIL:
4777             sayNO;
4778             /* NOTREACHED */
4779
4780 #define ST st->u.mark
4781         case MARKPOINT:
4782             ST.prev_mark = mark_state;
4783             ST.mark_name = sv_commit = sv_yes_mark 
4784                 = (SV*)rex->data->data[ ARG( scan ) ];
4785             mark_state = st;
4786             ST.mark_loc = PL_reginput = locinput;
4787             PUSH_YES_STATE_GOTO(MARKPOINT_next,next);
4788             /* NOTREACHED */
4789         case MARKPOINT_next:
4790             mark_state = ST.prev_mark;
4791             sayYES;
4792             /* NOTREACHED */
4793         case MARKPOINT_next_fail:
4794             if (popmark && sv_eq(ST.mark_name,popmark)) 
4795             {
4796                 if (ST.mark_loc > startpoint)
4797                     reginfo->cutpoint = HOPBACKc(ST.mark_loc, 1);
4798                 popmark = NULL; /* we found our mark */
4799                 sv_commit = ST.mark_name;
4800
4801                 DEBUG_EXECUTE_r({
4802                         PerlIO_printf(Perl_debug_log,
4803                             "%*s  %ssetting cutpoint to mark:%"SVf"...%s\n",
4804                             REPORT_CODE_OFF+depth*2, "", 
4805                             PL_colors[4], sv_commit, PL_colors[5]);
4806                 });
4807             }
4808             mark_state = ST.prev_mark;
4809             sv_yes_mark = mark_state ? 
4810                 mark_state->u.mark.mark_name : NULL;
4811             sayNO;
4812             /* NOTREACHED */
4813         case SKIP:
4814             PL_reginput = locinput;
4815             if (scan->flags) {
4816                 /* (*CUT) : if we fail we cut here*/
4817                 ST.mark_name = NULL;
4818                 ST.mark_loc = locinput;
4819                 PUSH_STATE_GOTO(SKIP_next,next);    
4820             } else {
4821                 /* (*CUT:NAME) : if there is a (*MARK:NAME) fail where it was, 
4822                    otherwise do nothing.  Meaning we need to scan 
4823                  */
4824                 regmatch_state *cur = mark_state;
4825                 SV *find = (SV*)rex->data->data[ ARG( scan ) ];
4826                 
4827                 while (cur) {
4828                     if ( sv_eq( cur->u.mark.mark_name, 
4829                                 find ) ) 
4830                     {
4831                         ST.mark_name = find;
4832                         PUSH_STATE_GOTO( SKIP_next, next );
4833                     }
4834                     cur = cur->u.mark.prev_mark;
4835                 }
4836             }    
4837             /* Didn't find our (*MARK:NAME) so ignore this (*CUT:NAME) */
4838             break;    
4839         case SKIP_next_fail:
4840             if (ST.mark_name) {
4841                 /* (*CUT:NAME) - Set up to search for the name as we 
4842                    collapse the stack*/
4843                 popmark = ST.mark_name;    
4844             } else {
4845                 /* (*CUT) - No name, we cut here.*/
4846                 if (ST.mark_loc > startpoint)
4847                     reginfo->cutpoint = HOPBACKc(ST.mark_loc, 1);
4848                 /* but we set sv_commit to latest mark_name if there
4849                    is one so they can test to see how things lead to this
4850                    cut */    
4851                 if (mark_state) 
4852                     sv_commit=mark_state->u.mark.mark_name;                 
4853             } 
4854             no_final = 1; 
4855             sayNO;
4856             /* NOTREACHED */
4857 #undef ST
4858
4859         default:
4860             PerlIO_printf(Perl_error_log, "%"UVxf" %d\n",
4861                           PTR2UV(scan), OP(scan));
4862             Perl_croak(aTHX_ "regexp memory corruption");
4863             
4864         } /* end switch */ 
4865
4866         /* switch break jumps here */
4867         scan = next; /* prepare to execute the next op and ... */
4868         continue;    /* ... jump back to the top, reusing st */
4869         /* NOTREACHED */
4870
4871       push_yes_state:
4872         /* push a state that backtracks on success */
4873         st->u.yes.prev_yes_state = yes_state;
4874         yes_state = st;
4875         /* FALL THROUGH */
4876       push_state:
4877         /* push a new regex state, then continue at scan  */
4878         {
4879             regmatch_state *newst;
4880
4881             DEBUG_STACK_r({
4882                 regmatch_state *cur = st;
4883                 regmatch_state *curyes = yes_state;
4884                 int curd = depth;
4885                 regmatch_slab *slab = PL_regmatch_slab;
4886                 for (;curd > -1;cur--,curd--) {
4887                     if (cur < SLAB_FIRST(slab)) {
4888                         slab = slab->prev;
4889                         cur = SLAB_LAST(slab);
4890                     }
4891                     PerlIO_printf(Perl_error_log, "%*s#%-3d %-10s %s\n",
4892                         REPORT_CODE_OFF + 2 + depth * 2,"",
4893                         curd, reg_name[cur->resume_state],
4894                         (curyes == cur) ? "yes" : ""
4895                     );
4896                     if (curyes == cur)
4897                         curyes = cur->u.yes.prev_yes_state;
4898                 }
4899             } else 
4900                 DEBUG_STATE_pp("push")
4901             );
4902             depth++;
4903             st->locinput = locinput;
4904             newst = st+1; 
4905             if (newst >  SLAB_LAST(PL_regmatch_slab))
4906                 newst = S_push_slab(aTHX);
4907             PL_regmatch_state = newst;
4908
4909             locinput = PL_reginput;
4910             nextchr = UCHARAT(locinput);
4911             st = newst;
4912             continue;
4913             /* NOTREACHED */
4914         }
4915     }
4916
4917     /*
4918     * We get here only if there's trouble -- normally "case END" is
4919     * the terminating point.
4920     */
4921     Perl_croak(aTHX_ "corrupted regexp pointers");
4922     /*NOTREACHED*/
4923     sayNO;
4924
4925 yes:
4926     if (yes_state) {
4927         /* we have successfully completed a subexpression, but we must now
4928          * pop to the state marked by yes_state and continue from there */
4929         assert(st != yes_state);
4930 #ifdef DEBUGGING
4931         while (st != yes_state) {
4932             st--;
4933             if (st < SLAB_FIRST(PL_regmatch_slab)) {
4934                 PL_regmatch_slab = PL_regmatch_slab->prev;
4935                 st = SLAB_LAST(PL_regmatch_slab);
4936             }
4937             DEBUG_STATE_r({
4938                 if (no_final) {
4939                     DEBUG_STATE_pp("pop (no final)");        
4940                 } else {
4941                     DEBUG_STATE_pp("pop (yes)");
4942                 }
4943             });
4944             depth--;
4945         }
4946 #else
4947         while (yes_state < SLAB_FIRST(PL_regmatch_slab)
4948             || yes_state > SLAB_LAST(PL_regmatch_slab))
4949         {
4950             /* not in this slab, pop slab */
4951             depth -= (st - SLAB_FIRST(PL_regmatch_slab) + 1);
4952             PL_regmatch_slab = PL_regmatch_slab->prev;
4953             st = SLAB_LAST(PL_regmatch_slab);
4954         }
4955         depth -= (st - yes_state);
4956 #endif
4957         st = yes_state;
4958         yes_state = st->u.yes.prev_yes_state;
4959         PL_regmatch_state = st;
4960         
4961         if (no_final) {
4962             locinput= st->locinput;
4963             nextchr = UCHARAT(locinput);
4964         }
4965         state_num = st->resume_state + no_final;
4966         goto reenter_switch;
4967     }
4968
4969     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "%sMatch successful!%s\n",
4970                           PL_colors[4], PL_colors[5]));
4971
4972     result = 1;
4973     goto final_exit;
4974
4975 no:
4976     DEBUG_EXECUTE_r(
4977         PerlIO_printf(Perl_debug_log,
4978             "%*s  %sfailed...%s\n",
4979             REPORT_CODE_OFF+depth*2, "", 
4980             PL_colors[4], PL_colors[5])
4981         );
4982
4983 no_silent:
4984     if (no_final) {
4985         if (yes_state) {
4986             goto yes;
4987         } else {
4988             goto final_exit;
4989         }
4990     }    
4991     if (depth) {
4992         /* there's a previous state to backtrack to */
4993         st--;
4994         if (st < SLAB_FIRST(PL_regmatch_slab)) {
4995             PL_regmatch_slab = PL_regmatch_slab->prev;
4996             st = SLAB_LAST(PL_regmatch_slab);
4997         }
4998         PL_regmatch_state = st;
4999         locinput= st->locinput;
5000         nextchr = UCHARAT(locinput);
5001
5002         DEBUG_STATE_pp("pop");
5003         depth--;
5004         if (yes_state == st)
5005             yes_state = st->u.yes.prev_yes_state;
5006
5007         state_num = st->resume_state + 1; /* failure = success + 1 */
5008         goto reenter_switch;
5009     }
5010     result = 0;
5011
5012   final_exit:
5013     if (rex->reganch & ROPT_VERBARG_SEEN) {
5014         SV *sv_err = get_sv("REGERROR", 1);
5015         SV *sv_mrk = get_sv("REGMARK", 1);
5016         if (result) {
5017             sv_commit = &PL_sv_no;
5018             if (!sv_yes_mark) 
5019                 sv_yes_mark = &PL_sv_yes;
5020         } else {
5021             if (!sv_commit) 
5022                 sv_commit = &PL_sv_yes;
5023             sv_yes_mark = &PL_sv_no;
5024         }
5025         sv_setsv(sv_err, sv_commit);
5026         sv_setsv(sv_mrk, sv_yes_mark);
5027     }
5028     /* restore original high-water mark */
5029     PL_regmatch_slab  = orig_slab;
5030     PL_regmatch_state = orig_state;
5031
5032     /* free all slabs above current one */
5033     if (orig_slab->next) {
5034         regmatch_slab *sl = orig_slab->next;
5035         orig_slab->next = NULL;
5036         while (sl) {
5037             regmatch_slab * const osl = sl;
5038             sl = sl->next;
5039             Safefree(osl);
5040         }
5041     }
5042
5043     return result;
5044 }
5045
5046 /*
5047  - regrepeat - repeatedly match something simple, report how many
5048  */
5049 /*
5050  * [This routine now assumes that it will only match on things of length 1.
5051  * That was true before, but now we assume scan - reginput is the count,
5052  * rather than incrementing count on every character.  [Er, except utf8.]]
5053  */
5054 STATIC I32
5055 S_regrepeat(pTHX_ const regexp *prog, const regnode *p, I32 max, int depth)
5056 {
5057     dVAR;
5058     register char *scan;
5059     register I32 c;
5060     register char *loceol = PL_regeol;
5061     register I32 hardcount = 0;
5062     register bool do_utf8 = PL_reg_match_utf8;
5063
5064     scan = PL_reginput;
5065     if (max == REG_INFTY)
5066         max = I32_MAX;
5067     else if (max < loceol - scan)
5068         loceol = scan + max;
5069     switch (OP(p)) {
5070     case REG_ANY:
5071         if (do_utf8) {
5072             loceol = PL_regeol;
5073             while (scan < loceol && hardcount < max && *scan != '\n') {
5074                 scan += UTF8SKIP(scan);
5075                 hardcount++;
5076             }
5077         } else {
5078             while (scan < loceol && *scan != '\n')
5079                 scan++;
5080         }
5081         break;
5082     case SANY:
5083         if (do_utf8) {
5084             loceol = PL_regeol;
5085             while (scan < loceol && hardcount < max) {
5086                 scan += UTF8SKIP(scan);
5087                 hardcount++;
5088             }
5089         }
5090         else
5091             scan = loceol;
5092         break;
5093     case CANY:
5094         scan = loceol;
5095         break;
5096     case EXACT:         /* length of string is 1 */
5097         c = (U8)*STRING(p);
5098         while (scan < loceol && UCHARAT(scan) == c)
5099             scan++;
5100         break;
5101     case EXACTF:        /* length of string is 1 */
5102         c = (U8)*STRING(p);
5103         while (scan < loceol &&
5104                (UCHARAT(scan) == c || UCHARAT(scan) == PL_fold[c]))
5105             scan++;
5106         break;
5107     case EXACTFL:       /* length of string is 1 */
5108         PL_reg_flags |= RF_tainted;
5109         c = (U8)*STRING(p);
5110         while (scan < loceol &&
5111                (UCHARAT(scan) == c || UCHARAT(scan) == PL_fold_locale[c]))
5112             scan++;
5113         break;
5114     case ANYOF:
5115         if (do_utf8) {
5116             loceol = PL_regeol;
5117             while (hardcount < max && scan < loceol &&
5118                    reginclass(prog, p, (U8*)scan, 0, do_utf8)) {
5119                 scan += UTF8SKIP(scan);
5120                 hardcount++;
5121             }
5122         } else {
5123             while (scan < loceol && REGINCLASS(prog, p, (U8*)scan))
5124                 scan++;
5125         }
5126         break;
5127     case ALNUM:
5128         if (do_utf8) {
5129             loceol = PL_regeol;
5130             LOAD_UTF8_CHARCLASS_ALNUM();
5131             while (hardcount < max && scan < loceol &&
5132                    swash_fetch(PL_utf8_alnum, (U8*)scan, do_utf8)) {
5133                 scan += UTF8SKIP(scan);
5134                 hardcount++;
5135             }
5136         } else {
5137             while (scan < loceol && isALNUM(*scan))
5138                 scan++;
5139         }
5140         break;
5141     case ALNUML:
5142         PL_reg_flags |= RF_tainted;
5143         if (do_utf8) {
5144             loceol = PL_regeol;
5145             while (hardcount < max && scan < loceol &&
5146                    isALNUM_LC_utf8((U8*)scan)) {
5147                 scan += UTF8SKIP(scan);
5148                 hardcount++;
5149             }
5150         } else {
5151             while (scan < loceol && isALNUM_LC(*scan))
5152                 scan++;
5153         }
5154         break;
5155     case NALNUM:
5156         if (do_utf8) {
5157             loceol = PL_regeol;
5158             LOAD_UTF8_CHARCLASS_ALNUM();
5159             while (hardcount < max && scan < loceol &&
5160                    !swash_fetch(PL_utf8_alnum, (U8*)scan, do_utf8)) {
5161                 scan += UTF8SKIP(scan);
5162                 hardcount++;
5163             }
5164         } else {
5165             while (scan < loceol && !isALNUM(*scan))
5166                 scan++;
5167         }
5168         break;
5169     case NALNUML:
5170         PL_reg_flags |= RF_tainted;
5171         if (do_utf8) {
5172             loceol = PL_regeol;
5173             while (hardcount < max && scan < loceol &&
5174                    !isALNUM_LC_utf8((U8*)scan)) {
5175                 scan += UTF8SKIP(scan);
5176                 hardcount++;
5177             }
5178         } else {
5179             while (scan < loceol && !isALNUM_LC(*scan))
5180                 scan++;
5181         }
5182         break;
5183     case SPACE:
5184         if (do_utf8) {
5185             loceol = PL_regeol;
5186             LOAD_UTF8_CHARCLASS_SPACE();
5187             while (hardcount < max && scan < loceol &&
5188                    (*scan == ' ' ||
5189                     swash_fetch(PL_utf8_space,(U8*)scan, do_utf8))) {
5190                 scan += UTF8SKIP(scan);
5191                 hardcount++;
5192             }
5193         } else {
5194             while (scan < loceol && isSPACE(*scan))
5195                 scan++;
5196         }
5197         break;
5198     case SPACEL:
5199         PL_reg_flags |= RF_tainted;
5200         if (do_utf8) {
5201             loceol = PL_regeol;
5202             while (hardcount < max && scan < loceol &&
5203                    (*scan == ' ' || isSPACE_LC_utf8((U8*)scan))) {
5204                 scan += UTF8SKIP(scan);
5205                 hardcount++;
5206             }
5207         } else {
5208             while (scan < loceol && isSPACE_LC(*scan))
5209                 scan++;
5210         }
5211         break;
5212     case NSPACE:
5213         if (do_utf8) {
5214             loceol = PL_regeol;
5215             LOAD_UTF8_CHARCLASS_SPACE();
5216             while (hardcount < max && scan < loceol &&
5217                    !(*scan == ' ' ||
5218                      swash_fetch(PL_utf8_space,(U8*)scan, do_utf8))) {
5219                 scan += UTF8SKIP(scan);
5220                 hardcount++;
5221             }
5222         } else {
5223             while (scan < loceol && !isSPACE(*scan))
5224                 scan++;
5225             break;
5226         }
5227     case NSPACEL:
5228         PL_reg_flags |= RF_tainted;
5229         if (do_utf8) {
5230             loceol = PL_regeol;
5231             while (hardcount < max && scan < loceol &&
5232                    !(*scan == ' ' || isSPACE_LC_utf8((U8*)scan))) {
5233                 scan += UTF8SKIP(scan);
5234                 hardcount++;
5235             }
5236         } else {
5237             while (scan < loceol && !isSPACE_LC(*scan))
5238                 scan++;
5239         }
5240         break;
5241     case DIGIT:
5242         if (do_utf8) {
5243             loceol = PL_regeol;
5244             LOAD_UTF8_CHARCLASS_DIGIT();
5245             while (hardcount < max && scan < loceol &&
5246                    swash_fetch(PL_utf8_digit, (U8*)scan, do_utf8)) {
5247                 scan += UTF8SKIP(scan);
5248                 hardcount++;
5249             }
5250         } else {
5251             while (scan < loceol && isDIGIT(*scan))
5252                 scan++;
5253         }
5254         break;
5255     case NDIGIT:
5256         if (do_utf8) {
5257             loceol = PL_regeol;
5258             LOAD_UTF8_CHARCLASS_DIGIT();
5259             while (hardcount < max && scan < loceol &&
5260                    !swash_fetch(PL_utf8_digit, (U8*)scan, do_utf8)) {
5261                 scan += UTF8SKIP(scan);
5262                 hardcount++;
5263             }
5264         } else {
5265             while (scan < loceol && !isDIGIT(*scan))
5266                 scan++;
5267         }
5268         break;
5269     default:            /* Called on something of 0 width. */
5270         break;          /* So match right here or not at all. */
5271     }
5272
5273     if (hardcount)
5274         c = hardcount;
5275     else
5276         c = scan - PL_reginput;
5277     PL_reginput = scan;
5278
5279     DEBUG_r({
5280         GET_RE_DEBUG_FLAGS_DECL;
5281         DEBUG_EXECUTE_r({
5282             SV * const prop = sv_newmortal();
5283             regprop(prog, prop, p);
5284             PerlIO_printf(Perl_debug_log,
5285                         "%*s  %s can match %"IVdf" times out of %"IVdf"...\n",
5286                         REPORT_CODE_OFF + depth*2, "", SvPVX_const(prop),(IV)c,(IV)max);
5287         });
5288     });
5289
5290     return(c);
5291 }
5292
5293
5294 #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
5295 /*
5296 - regclass_swash - prepare the utf8 swash
5297 */
5298
5299 SV *
5300 Perl_regclass_swash(pTHX_ const regexp *prog, register const regnode* node, bool doinit, SV** listsvp, SV **altsvp)
5301 {
5302     dVAR;
5303     SV *sw  = NULL;
5304     SV *si  = NULL;
5305     SV *alt = NULL;
5306     const struct reg_data * const data = prog ? prog->data : NULL;
5307
5308     if (data && data->count) {
5309         const U32 n = ARG(node);
5310
5311         if (data->what[n] == 's') {
5312             SV * const rv = (SV*)data->data[n];
5313             AV * const av = (AV*)SvRV((SV*)rv);
5314             SV **const ary = AvARRAY(av);
5315             SV **a, **b;
5316         
5317             /* See the end of regcomp.c:S_regclass() for
5318              * documentation of these array elements. */
5319
5320             si = *ary;
5321             a  = SvROK(ary[1]) ? &ary[1] : 0;
5322             b  = SvTYPE(ary[2]) == SVt_PVAV ? &ary[2] : 0;
5323
5324             if (a)
5325                 sw = *a;
5326             else if (si && doinit) {
5327                 sw = swash_init("utf8", "", si, 1, 0);
5328                 (void)av_store(av, 1, sw);
5329             }
5330             if (b)
5331                 alt = *b;
5332         }
5333     }
5334         
5335     if (listsvp)
5336         *listsvp = si;
5337     if (altsvp)
5338         *altsvp  = alt;
5339
5340     return sw;
5341 }
5342 #endif
5343
5344 /*
5345  - reginclass - determine if a character falls into a character class
5346  
5347   The n is the ANYOF regnode, the p is the target string, lenp
5348   is pointer to the maximum length of how far to go in the p
5349   (if the lenp is zero, UTF8SKIP(p) is used),
5350   do_utf8 tells whether the target string is in UTF-8.
5351
5352  */
5353
5354 STATIC bool
5355 S_reginclass(pTHX_ const regexp *prog, register const regnode *n, register const U8* p, STRLEN* lenp, register bool do_utf8)
5356 {
5357     dVAR;
5358     const char flags = ANYOF_FLAGS(n);
5359     bool match = FALSE;
5360     UV c = *p;
5361     STRLEN len = 0;
5362     STRLEN plen;
5363
5364     if (do_utf8 && !UTF8_IS_INVARIANT(c)) {
5365         c = utf8n_to_uvchr(p, UTF8_MAXBYTES, &len,
5366                 (UTF8_ALLOW_DEFAULT & UTF8_ALLOW_ANYUV) | UTF8_CHECK_ONLY);
5367                 /* see [perl #37836] for UTF8_ALLOW_ANYUV */
5368         if (len == (STRLEN)-1) 
5369             Perl_croak(aTHX_ "Malformed UTF-8 character (fatal)");
5370     }
5371
5372     plen = lenp ? *lenp : UNISKIP(NATIVE_TO_UNI(c));
5373     if (do_utf8 || (flags & ANYOF_UNICODE)) {
5374         if (lenp)
5375             *lenp = 0;
5376         if (do_utf8 && !ANYOF_RUNTIME(n)) {
5377             if (len != (STRLEN)-1 && c < 256 && ANYOF_BITMAP_TEST(n, c))
5378                 match = TRUE;
5379         }
5380         if (!match && do_utf8 && (flags & ANYOF_UNICODE_ALL) && c >= 256)
5381             match = TRUE;
5382         if (!match) {
5383             AV *av;
5384             SV * const sw = regclass_swash(prog, n, TRUE, 0, (SV**)&av);
5385         
5386             if (sw) {
5387                 if (swash_fetch(sw, p, do_utf8))
5388                     match = TRUE;
5389                 else if (flags & ANYOF_FOLD) {
5390                     if (!match && lenp && av) {
5391                         I32 i;
5392                         for (i = 0; i <= av_len(av); i++) {
5393                             SV* const sv = *av_fetch(av, i, FALSE);
5394                             STRLEN len;
5395                             const char * const s = SvPV_const(sv, len);
5396                         
5397                             if (len <= plen && memEQ(s, (char*)p, len)) {
5398                                 *lenp = len;
5399                                 match = TRUE;
5400                                 break;
5401                             }
5402                         }
5403                     }
5404                     if (!match) {
5405                         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
5406                         STRLEN tmplen;
5407
5408                         to_utf8_fold(p, tmpbuf, &tmplen);
5409                         if (swash_fetch(sw, tmpbuf, do_utf8))
5410                             match = TRUE;
5411                     }
5412                 }
5413             }
5414         }
5415         if (match && lenp && *lenp == 0)
5416             *lenp = UNISKIP(NATIVE_TO_UNI(c));
5417     }
5418     if (!match && c < 256) {
5419         if (ANYOF_BITMAP_TEST(n, c))
5420             match = TRUE;
5421         else if (flags & ANYOF_FOLD) {
5422             U8 f;
5423
5424             if (flags & ANYOF_LOCALE) {
5425                 PL_reg_flags |= RF_tainted;
5426                 f = PL_fold_locale[c];
5427             }
5428             else
5429                 f = PL_fold[c];
5430             if (f != c && ANYOF_BITMAP_TEST(n, f))
5431                 match = TRUE;
5432         }
5433         
5434         if (!match && (flags & ANYOF_CLASS)) {
5435             PL_reg_flags |= RF_tainted;
5436             if (
5437                 (ANYOF_CLASS_TEST(n, ANYOF_ALNUM)   &&  isALNUM_LC(c))  ||
5438                 (ANYOF_CLASS_TEST(n, ANYOF_NALNUM)  && !isALNUM_LC(c))  ||
5439                 (ANYOF_CLASS_TEST(n, ANYOF_SPACE)   &&  isSPACE_LC(c))  ||
5440                 (ANYOF_CLASS_TEST(n, ANYOF_NSPACE)  && !isSPACE_LC(c))  ||
5441                 (ANYOF_CLASS_TEST(n, ANYOF_DIGIT)   &&  isDIGIT_LC(c))  ||
5442                 (ANYOF_CLASS_TEST(n, ANYOF_NDIGIT)  && !isDIGIT_LC(c))  ||
5443                 (ANYOF_CLASS_TEST(n, ANYOF_ALNUMC)  &&  isALNUMC_LC(c)) ||
5444                 (ANYOF_CLASS_TEST(n, ANYOF_NALNUMC) && !isALNUMC_LC(c)) ||
5445                 (ANYOF_CLASS_TEST(n, ANYOF_ALPHA)   &&  isALPHA_LC(c))  ||
5446                 (ANYOF_CLASS_TEST(n, ANYOF_NALPHA)  && !isALPHA_LC(c))  ||
5447                 (ANYOF_CLASS_TEST(n, ANYOF_ASCII)   &&  isASCII(c))     ||
5448                 (ANYOF_CLASS_TEST(n, ANYOF_NASCII)  && !isASCII(c))     ||
5449                 (ANYOF_CLASS_TEST(n, ANYOF_CNTRL)   &&  isCNTRL_LC(c))  ||
5450                 (ANYOF_CLASS_TEST(n, ANYOF_NCNTRL)  && !isCNTRL_LC(c))  ||
5451                 (ANYOF_CLASS_TEST(n, ANYOF_GRAPH)   &&  isGRAPH_LC(c))  ||
5452                 (ANYOF_CLASS_TEST(n, ANYOF_NGRAPH)  && !isGRAPH_LC(c))  ||
5453                 (ANYOF_CLASS_TEST(n, ANYOF_LOWER)   &&  isLOWER_LC(c))  ||
5454                 (ANYOF_CLASS_TEST(n, ANYOF_NLOWER)  && !isLOWER_LC(c))  ||
5455                 (ANYOF_CLASS_TEST(n, ANYOF_PRINT)   &&  isPRINT_LC(c))  ||
5456                 (ANYOF_CLASS_TEST(n, ANYOF_NPRINT)  && !isPRINT_LC(c))  ||
5457                 (ANYOF_CLASS_TEST(n, ANYOF_PUNCT)   &&  isPUNCT_LC(c))  ||
5458                 (ANYOF_CLASS_TEST(n, ANYOF_NPUNCT)  && !isPUNCT_LC(c))  ||
5459                 (ANYOF_CLASS_TEST(n, ANYOF_UPPER)   &&  isUPPER_LC(c))  ||
5460                 (ANYOF_CLASS_TEST(n, ANYOF_NUPPER)  && !isUPPER_LC(c))  ||
5461                 (ANYOF_CLASS_TEST(n, ANYOF_XDIGIT)  &&  isXDIGIT(c))    ||
5462                 (ANYOF_CLASS_TEST(n, ANYOF_NXDIGIT) && !isXDIGIT(c))    ||
5463                 (ANYOF_CLASS_TEST(n, ANYOF_PSXSPC)  &&  isPSXSPC(c))    ||
5464                 (ANYOF_CLASS_TEST(n, ANYOF_NPSXSPC) && !isPSXSPC(c))    ||
5465                 (ANYOF_CLASS_TEST(n, ANYOF_BLANK)   &&  isBLANK(c))     ||
5466                 (ANYOF_CLASS_TEST(n, ANYOF_NBLANK)  && !isBLANK(c))
5467                 ) /* How's that for a conditional? */
5468             {
5469                 match = TRUE;
5470             }
5471         }
5472     }
5473
5474     return (flags & ANYOF_INVERT) ? !match : match;
5475 }
5476
5477 STATIC U8 *
5478 S_reghop3(U8 *s, I32 off, const U8* lim)
5479 {
5480     dVAR;
5481     if (off >= 0) {
5482         while (off-- && s < lim) {
5483             /* XXX could check well-formedness here */
5484             s += UTF8SKIP(s);
5485         }
5486     }
5487     else {
5488         while (off++ && s > lim) {
5489             s--;
5490             if (UTF8_IS_CONTINUED(*s)) {
5491                 while (s > lim && UTF8_IS_CONTINUATION(*s))
5492                     s--;
5493             }
5494             /* XXX could check well-formedness here */
5495         }
5496     }
5497     return s;
5498 }
5499
5500 #ifdef XXX_dmq
5501 /* there are a bunch of places where we use two reghop3's that should
5502    be replaced with this routine. but since thats not done yet 
5503    we ifdef it out - dmq
5504 */
5505 STATIC U8 *
5506 S_reghop4(U8 *s, I32 off, const U8* llim, const U8* rlim)
5507 {
5508     dVAR;
5509     if (off >= 0) {
5510         while (off-- && s < rlim) {
5511             /* XXX could check well-formedness here */
5512             s += UTF8SKIP(s);
5513         }
5514     }
5515     else {
5516         while (off++ && s > llim) {
5517             s--;
5518             if (UTF8_IS_CONTINUED(*s)) {
5519                 while (s > llim && UTF8_IS_CONTINUATION(*s))
5520                     s--;
5521             }
5522             /* XXX could check well-formedness here */
5523         }
5524     }
5525     return s;
5526 }
5527 #endif
5528
5529 STATIC U8 *
5530 S_reghopmaybe3(U8* s, I32 off, const U8* lim)
5531 {
5532     dVAR;
5533     if (off >= 0) {
5534         while (off-- && s < lim) {
5535             /* XXX could check well-formedness here */
5536             s += UTF8SKIP(s);
5537         }
5538         if (off >= 0)
5539             return NULL;
5540     }
5541     else {
5542         while (off++ && s > lim) {
5543             s--;
5544             if (UTF8_IS_CONTINUED(*s)) {
5545                 while (s > lim && UTF8_IS_CONTINUATION(*s))
5546                     s--;
5547             }
5548             /* XXX could check well-formedness here */
5549         }
5550         if (off <= 0)
5551             return NULL;
5552     }
5553     return s;
5554 }
5555
5556 static void
5557 restore_pos(pTHX_ void *arg)
5558 {
5559     dVAR;
5560     regexp * const rex = (regexp *)arg;
5561     if (PL_reg_eval_set) {
5562         if (PL_reg_oldsaved) {
5563             rex->subbeg = PL_reg_oldsaved;
5564             rex->sublen = PL_reg_oldsavedlen;
5565 #ifdef PERL_OLD_COPY_ON_WRITE
5566             rex->saved_copy = PL_nrs;
5567 #endif
5568             RX_MATCH_COPIED_on(rex);
5569         }
5570         PL_reg_magic->mg_len = PL_reg_oldpos;
5571         PL_reg_eval_set = 0;
5572         PL_curpm = PL_reg_oldcurpm;
5573     }   
5574 }
5575
5576 STATIC void
5577 S_to_utf8_substr(pTHX_ register regexp *prog)
5578 {
5579     if (prog->float_substr && !prog->float_utf8) {
5580         SV* const sv = newSVsv(prog->float_substr);
5581         prog->float_utf8 = sv;
5582         sv_utf8_upgrade(sv);
5583         if (SvTAIL(prog->float_substr))
5584             SvTAIL_on(sv);
5585         if (prog->float_substr == prog->check_substr)
5586             prog->check_utf8 = sv;
5587     }
5588     if (prog->anchored_substr && !prog->anchored_utf8) {
5589         SV* const sv = newSVsv(prog->anchored_substr);
5590         prog->anchored_utf8 = sv;
5591         sv_utf8_upgrade(sv);
5592         if (SvTAIL(prog->anchored_substr))
5593             SvTAIL_on(sv);
5594         if (prog->anchored_substr == prog->check_substr)
5595             prog->check_utf8 = sv;
5596     }
5597 }
5598
5599 STATIC void
5600 S_to_byte_substr(pTHX_ register regexp *prog)
5601 {
5602     dVAR;
5603     if (prog->float_utf8 && !prog->float_substr) {
5604         SV* sv = newSVsv(prog->float_utf8);
5605         prog->float_substr = sv;
5606         if (sv_utf8_downgrade(sv, TRUE)) {
5607             if (SvTAIL(prog->float_utf8))
5608                 SvTAIL_on(sv);
5609         } else {
5610             SvREFCNT_dec(sv);
5611             prog->float_substr = sv = &PL_sv_undef;
5612         }
5613         if (prog->float_utf8 == prog->check_utf8)
5614             prog->check_substr = sv;
5615     }
5616     if (prog->anchored_utf8 && !prog->anchored_substr) {
5617         SV* sv = newSVsv(prog->anchored_utf8);
5618         prog->anchored_substr = sv;
5619         if (sv_utf8_downgrade(sv, TRUE)) {
5620             if (SvTAIL(prog->anchored_utf8))
5621                 SvTAIL_on(sv);
5622         } else {
5623             SvREFCNT_dec(sv);
5624             prog->anchored_substr = sv = &PL_sv_undef;
5625         }
5626         if (prog->anchored_utf8 == prog->check_utf8)
5627             prog->check_substr = sv;
5628     }
5629 }
5630
5631 /*
5632  * Local variables:
5633  * c-indentation-style: bsd
5634  * c-basic-offset: 4
5635  * indent-tabs-mode: t
5636  * End:
5637  *
5638  * ex: set ts=8 sts=4 sw=4 noet:
5639  */