d547ff71a29fb1441d81faa7daab29d38805cf06
[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             regcpblow(ST.cp);
3871             cur_curlyx = ST.prev_curlyx;
3872             sayYES;
3873             /* NOTREACHED */
3874
3875         case CURLYX_end_fail: /* just failed to match all of A*B */
3876             regcpblow(ST.cp);
3877             cur_curlyx = ST.prev_curlyx;
3878             sayNO;
3879             /* NOTREACHED */
3880
3881
3882 #undef ST
3883 #define ST st->u.whilem
3884
3885         case WHILEM:     /* just matched an A in /A*B/  (for complex A) */
3886         {
3887             /* see the discussion above about CURLYX/WHILEM */
3888             I32 n;
3889             assert(cur_curlyx); /* keep Coverity happy */
3890             n = ++cur_curlyx->u.curlyx.count; /* how many A's matched */
3891             ST.save_lastloc = cur_curlyx->u.curlyx.lastloc;
3892             ST.cache_offset = 0;
3893             ST.cache_mask = 0;
3894             
3895             PL_reginput = locinput;
3896
3897             DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3898                   "%*s  whilem: matched %ld out of %ld..%ld\n",
3899                   REPORT_CODE_OFF+depth*2, "", (long)n,
3900                   (long)cur_curlyx->u.curlyx.min,
3901                   (long)cur_curlyx->u.curlyx.max)
3902             );
3903
3904             /* First just match a string of min A's. */
3905
3906             if (n < cur_curlyx->u.curlyx.min) {
3907                 cur_curlyx->u.curlyx.lastloc = locinput;
3908                 PUSH_STATE_GOTO(WHILEM_A_pre, cur_curlyx->u.curlyx.A);
3909                 /* NOTREACHED */
3910             }
3911
3912             /* If degenerate A matches "", assume A done. */
3913
3914             if (locinput == cur_curlyx->u.curlyx.lastloc) {
3915                 DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3916                    "%*s  whilem: empty match detected, trying continuation...\n",
3917                    REPORT_CODE_OFF+depth*2, "")
3918                 );
3919                 goto do_whilem_B_max;
3920             }
3921
3922             /* super-linear cache processing */
3923
3924             if (scan->flags) {
3925
3926                 if (!PL_reg_maxiter) {
3927                     /* start the countdown: Postpone detection until we
3928                      * know the match is not *that* much linear. */
3929                     PL_reg_maxiter = (PL_regeol - PL_bostr + 1) * (scan->flags>>4);
3930                     /* possible overflow for long strings and many CURLYX's */
3931                     if (PL_reg_maxiter < 0)
3932                         PL_reg_maxiter = I32_MAX;
3933                     PL_reg_leftiter = PL_reg_maxiter;
3934                 }
3935
3936                 if (PL_reg_leftiter-- == 0) {
3937                     /* initialise cache */
3938                     const I32 size = (PL_reg_maxiter + 7)/8;
3939                     if (PL_reg_poscache) {
3940                         if ((I32)PL_reg_poscache_size < size) {
3941                             Renew(PL_reg_poscache, size, char);
3942                             PL_reg_poscache_size = size;
3943                         }
3944                         Zero(PL_reg_poscache, size, char);
3945                     }
3946                     else {
3947                         PL_reg_poscache_size = size;
3948                         Newxz(PL_reg_poscache, size, char);
3949                     }
3950                     DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3951       "%swhilem: Detected a super-linear match, switching on caching%s...\n",
3952                               PL_colors[4], PL_colors[5])
3953                     );
3954                 }
3955
3956                 if (PL_reg_leftiter < 0) {
3957                     /* have we already failed at this position? */
3958                     I32 offset, mask;
3959                     offset  = (scan->flags & 0xf) - 1
3960                                 + (locinput - PL_bostr)  * (scan->flags>>4);
3961                     mask    = 1 << (offset % 8);
3962                     offset /= 8;
3963                     if (PL_reg_poscache[offset] & mask) {
3964                         DEBUG_EXECUTE_r( PerlIO_printf(Perl_debug_log,
3965                             "%*s  whilem: (cache) already tried at this position...\n",
3966                             REPORT_CODE_OFF+depth*2, "")
3967                         );
3968                         sayNO; /* cache records failure */
3969                     }
3970                     ST.cache_offset = offset;
3971                     ST.cache_mask   = mask;
3972                 }
3973             }
3974
3975             /* Prefer B over A for minimal matching. */
3976
3977             if (cur_curlyx->u.curlyx.minmod) {
3978                 ST.save_curlyx = cur_curlyx;
3979                 cur_curlyx = cur_curlyx->u.curlyx.prev_curlyx;
3980                 ST.cp = regcppush(ST.save_curlyx->u.curlyx.parenfloor);
3981                 REGCP_SET(ST.lastcp);
3982                 PUSH_YES_STATE_GOTO(WHILEM_B_min, ST.save_curlyx->u.curlyx.B);
3983                 /* NOTREACHED */
3984             }
3985
3986             /* Prefer A over B for maximal matching. */
3987
3988             if (n < cur_curlyx->u.curlyx.max) { /* More greed allowed? */
3989                 ST.cp = regcppush(cur_curlyx->u.curlyx.parenfloor);
3990                 cur_curlyx->u.curlyx.lastloc = locinput;
3991                 REGCP_SET(ST.lastcp);
3992                 PUSH_STATE_GOTO(WHILEM_A_max, cur_curlyx->u.curlyx.A);
3993                 /* NOTREACHED */
3994             }
3995             goto do_whilem_B_max;
3996         }
3997         /* NOTREACHED */
3998
3999         case WHILEM_B_min: /* just matched B in a minimal match */
4000         case WHILEM_B_max: /* just matched B in a maximal match */
4001             cur_curlyx = ST.save_curlyx;
4002             sayYES;
4003             /* NOTREACHED */
4004
4005         case WHILEM_B_max_fail: /* just failed to match B in a maximal match */
4006             cur_curlyx = ST.save_curlyx;
4007             cur_curlyx->u.curlyx.lastloc = ST.save_lastloc;
4008             cur_curlyx->u.curlyx.count--;
4009             CACHEsayNO;
4010             /* NOTREACHED */
4011
4012         case WHILEM_A_min_fail: /* just failed to match A in a minimal match */
4013             REGCP_UNWIND(ST.lastcp);
4014             regcppop(rex);
4015             /* FALL THROUGH */
4016         case WHILEM_A_pre_fail: /* just failed to match even minimal A */
4017             cur_curlyx->u.curlyx.lastloc = ST.save_lastloc;
4018             cur_curlyx->u.curlyx.count--;
4019             CACHEsayNO;
4020             /* NOTREACHED */
4021
4022         case WHILEM_A_max_fail: /* just failed to match A in a maximal match */
4023             REGCP_UNWIND(ST.lastcp);
4024             regcppop(rex);      /* Restore some previous $<digit>s? */
4025             PL_reginput = locinput;
4026             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
4027                 "%*s  whilem: failed, trying continuation...\n",
4028                 REPORT_CODE_OFF+depth*2, "")
4029             );
4030           do_whilem_B_max:
4031             if (cur_curlyx->u.curlyx.count >= REG_INFTY
4032                 && ckWARN(WARN_REGEXP)
4033                 && !(PL_reg_flags & RF_warned))
4034             {
4035                 PL_reg_flags |= RF_warned;
4036                 Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s limit (%d) exceeded",
4037                      "Complex regular subexpression recursion",
4038                      REG_INFTY - 1);
4039             }
4040
4041             /* now try B */
4042             ST.save_curlyx = cur_curlyx;
4043             cur_curlyx = cur_curlyx->u.curlyx.prev_curlyx;
4044             PUSH_YES_STATE_GOTO(WHILEM_B_max, ST.save_curlyx->u.curlyx.B);
4045             /* NOTREACHED */
4046
4047         case WHILEM_B_min_fail: /* just failed to match B in a minimal match */
4048             cur_curlyx = ST.save_curlyx;
4049             REGCP_UNWIND(ST.lastcp);
4050             regcppop(rex);
4051
4052             if (cur_curlyx->u.curlyx.count >= cur_curlyx->u.curlyx.max) {
4053                 /* Maximum greed exceeded */
4054                 if (cur_curlyx->u.curlyx.count >= REG_INFTY
4055                     && ckWARN(WARN_REGEXP)
4056                     && !(PL_reg_flags & RF_warned))
4057                 {
4058                     PL_reg_flags |= RF_warned;
4059                     Perl_warner(aTHX_ packWARN(WARN_REGEXP),
4060                         "%s limit (%d) exceeded",
4061                         "Complex regular subexpression recursion",
4062                         REG_INFTY - 1);
4063                 }
4064                 cur_curlyx->u.curlyx.count--;
4065                 CACHEsayNO;
4066             }
4067
4068             DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
4069                 "%*s  trying longer...\n", REPORT_CODE_OFF+depth*2, "")
4070             );
4071             /* Try grabbing another A and see if it helps. */
4072             PL_reginput = locinput;
4073             cur_curlyx->u.curlyx.lastloc = locinput;
4074             ST.cp = regcppush(cur_curlyx->u.curlyx.parenfloor);
4075             REGCP_SET(ST.lastcp);
4076             PUSH_STATE_GOTO(WHILEM_A_min, ST.save_curlyx->u.curlyx.A);
4077             /* NOTREACHED */
4078
4079 #undef  ST
4080 #define ST st->u.branch
4081
4082         case BRANCHJ:       /*  /(...|A|...)/ with long next pointer */
4083             next = scan + ARG(scan);
4084             if (next == scan)
4085                 next = NULL;
4086             scan = NEXTOPER(scan);
4087             /* FALL THROUGH */
4088
4089         case BRANCH:        /*  /(...|A|...)/ */
4090             scan = NEXTOPER(scan); /* scan now points to inner node */
4091             if ((!next || (OP(next) != BRANCH && OP(next) != BRANCHJ)) 
4092                 && !has_cutgroup)
4093             {
4094                 /* last branch; skip state push and jump direct to node */
4095                 continue;
4096             }
4097             ST.lastparen = *PL_reglastparen;
4098             ST.next_branch = next;
4099             REGCP_SET(ST.cp);
4100             PL_reginput = locinput;
4101
4102             /* Now go into the branch */
4103             if (has_cutgroup) {
4104                 PUSH_YES_STATE_GOTO(BRANCH_next, scan);    
4105             } else {
4106                 PUSH_STATE_GOTO(BRANCH_next, scan);
4107             }
4108             /* NOTREACHED */
4109         case CUTGROUP:
4110             PL_reginput = locinput;
4111             sv_yes_mark = st->u.mark.mark_name = scan->flags ? NULL :
4112                 (SV*)rex->data->data[ ARG( scan ) ];
4113             PUSH_STATE_GOTO(CUTGROUP_next,next);
4114             /* NOTREACHED */
4115         case CUTGROUP_next_fail:
4116             do_cutgroup = 1;
4117             no_final = 1;
4118             if (st->u.mark.mark_name)
4119                 sv_commit = st->u.mark.mark_name;
4120             sayNO;          
4121             /* NOTREACHED */
4122         case BRANCH_next:
4123             sayYES;
4124             /* NOTREACHED */
4125         case BRANCH_next_fail: /* that branch failed; try the next, if any */
4126             if (do_cutgroup) {
4127                 do_cutgroup = 0;
4128                 no_final = 0;
4129             }
4130             REGCP_UNWIND(ST.cp);
4131             for (n = *PL_reglastparen; n > ST.lastparen; n--)
4132                 PL_regendp[n] = -1;
4133             *PL_reglastparen = n;
4134             /*dmq: *PL_reglastcloseparen = n; */
4135             scan = ST.next_branch;
4136             /* no more branches? */
4137             if (!scan || (OP(scan) != BRANCH && OP(scan) != BRANCHJ)) {
4138                 DEBUG_EXECUTE_r({
4139                     PerlIO_printf( Perl_debug_log,
4140                         "%*s  %sBRANCH failed...%s\n",
4141                         REPORT_CODE_OFF+depth*2, "", 
4142                         PL_colors[4],
4143                         PL_colors[5] );
4144                 });
4145                 sayNO_SILENT;
4146             }
4147             continue; /* execute next BRANCH[J] op */
4148             /* NOTREACHED */
4149     
4150         case MINMOD:
4151             minmod = 1;
4152             break;
4153
4154 #undef  ST
4155 #define ST st->u.curlym
4156
4157         case CURLYM:    /* /A{m,n}B/ where A is fixed-length */
4158
4159             /* This is an optimisation of CURLYX that enables us to push
4160              * only a single backtracking state, no matter now many matches
4161              * there are in {m,n}. It relies on the pattern being constant
4162              * length, with no parens to influence future backrefs
4163              */
4164
4165             ST.me = scan;
4166             scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
4167
4168             /* if paren positive, emulate an OPEN/CLOSE around A */
4169             if (ST.me->flags) {
4170                 U32 paren = ST.me->flags;
4171                 if (paren > PL_regsize)
4172                     PL_regsize = paren;
4173                 if (paren > *PL_reglastparen)
4174                     *PL_reglastparen = paren;
4175                 scan += NEXT_OFF(scan); /* Skip former OPEN. */
4176             }
4177             ST.A = scan;
4178             ST.B = next;
4179             ST.alen = 0;
4180             ST.count = 0;
4181             ST.minmod = minmod;
4182             minmod = 0;
4183             ST.c1 = CHRTEST_UNINIT;
4184             REGCP_SET(ST.cp);
4185
4186             if (!(ST.minmod ? ARG1(ST.me) : ARG2(ST.me))) /* min/max */
4187                 goto curlym_do_B;
4188
4189           curlym_do_A: /* execute the A in /A{m,n}B/  */
4190             PL_reginput = locinput;
4191             PUSH_YES_STATE_GOTO(CURLYM_A, ST.A); /* match A */
4192             /* NOTREACHED */
4193
4194         case CURLYM_A: /* we've just matched an A */
4195             locinput = st->locinput;
4196             nextchr = UCHARAT(locinput);
4197
4198             ST.count++;
4199             /* after first match, determine A's length: u.curlym.alen */
4200             if (ST.count == 1) {
4201                 if (PL_reg_match_utf8) {
4202                     char *s = locinput;
4203                     while (s < PL_reginput) {
4204                         ST.alen++;
4205                         s += UTF8SKIP(s);
4206                     }
4207                 }
4208                 else {
4209                     ST.alen = PL_reginput - locinput;
4210                 }
4211                 if (ST.alen == 0)
4212                     ST.count = ST.minmod ? ARG1(ST.me) : ARG2(ST.me);
4213             }
4214             DEBUG_EXECUTE_r(
4215                 PerlIO_printf(Perl_debug_log,
4216                           "%*s  CURLYM now matched %"IVdf" times, len=%"IVdf"...\n",
4217                           (int)(REPORT_CODE_OFF+(depth*2)), "",
4218                           (IV) ST.count, (IV)ST.alen)
4219             );
4220
4221             locinput = PL_reginput;
4222                         
4223             if (cur_eval && cur_eval->u.eval.close_paren && 
4224                 cur_eval->u.eval.close_paren == (U32)ST.me->flags) 
4225                 goto fake_end;
4226                 
4227             if ( ST.count < (ST.minmod ? ARG1(ST.me) : ARG2(ST.me)) )
4228                 goto curlym_do_A; /* try to match another A */
4229             goto curlym_do_B; /* try to match B */
4230
4231         case CURLYM_A_fail: /* just failed to match an A */
4232             REGCP_UNWIND(ST.cp);
4233
4234             if (ST.minmod || ST.count < ARG1(ST.me) /* min*/ 
4235                 || (cur_eval && cur_eval->u.eval.close_paren &&
4236                     cur_eval->u.eval.close_paren == (U32)ST.me->flags))
4237                 sayNO;
4238
4239           curlym_do_B: /* execute the B in /A{m,n}B/  */
4240             PL_reginput = locinput;
4241             if (ST.c1 == CHRTEST_UNINIT) {
4242                 /* calculate c1 and c2 for possible match of 1st char
4243                  * following curly */
4244                 ST.c1 = ST.c2 = CHRTEST_VOID;
4245                 if (HAS_TEXT(ST.B) || JUMPABLE(ST.B)) {
4246                     regnode *text_node = ST.B;
4247                     if (! HAS_TEXT(text_node))
4248                         FIND_NEXT_IMPT(text_node);
4249                     if (HAS_TEXT(text_node)
4250                         && PL_regkind[OP(text_node)] != REF)
4251                     {
4252                         ST.c1 = (U8)*STRING(text_node);
4253                         ST.c2 =
4254                             (OP(text_node) == EXACTF || OP(text_node) == REFF)
4255                             ? PL_fold[ST.c1]
4256                             : (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
4257                                 ? PL_fold_locale[ST.c1]
4258                                 : ST.c1;
4259                     }
4260                 }
4261             }
4262
4263             DEBUG_EXECUTE_r(
4264                 PerlIO_printf(Perl_debug_log,
4265                     "%*s  CURLYM trying tail with matches=%"IVdf"...\n",
4266                     (int)(REPORT_CODE_OFF+(depth*2)),
4267                     "", (IV)ST.count)
4268                 );
4269             if (ST.c1 != CHRTEST_VOID
4270                     && UCHARAT(PL_reginput) != ST.c1
4271                     && UCHARAT(PL_reginput) != ST.c2)
4272             {
4273                 /* simulate B failing */
4274                 state_num = CURLYM_B_fail;
4275                 goto reenter_switch;
4276             }
4277
4278             if (ST.me->flags) {
4279                 /* mark current A as captured */
4280                 I32 paren = ST.me->flags;
4281                 if (ST.count) {
4282                     PL_regstartp[paren]
4283                         = HOPc(PL_reginput, -ST.alen) - PL_bostr;
4284                     PL_regendp[paren] = PL_reginput - PL_bostr;
4285                     /*dmq: *PL_reglastcloseparen = paren; */
4286                 }
4287                 else
4288                     PL_regendp[paren] = -1;
4289                 if (cur_eval && cur_eval->u.eval.close_paren &&
4290                     cur_eval->u.eval.close_paren == (U32)ST.me->flags) 
4291                 {
4292                     if (ST.count) 
4293                         goto fake_end;
4294                     else
4295                         sayNO;
4296                 }
4297             }
4298             
4299             PUSH_STATE_GOTO(CURLYM_B, ST.B); /* match B */
4300             /* NOTREACHED */
4301
4302         case CURLYM_B_fail: /* just failed to match a B */
4303             REGCP_UNWIND(ST.cp);
4304             if (ST.minmod) {
4305                 if (ST.count == ARG2(ST.me) /* max */)
4306                     sayNO;
4307                 goto curlym_do_A; /* try to match a further A */
4308             }
4309             /* backtrack one A */
4310             if (ST.count == ARG1(ST.me) /* min */)
4311                 sayNO;
4312             ST.count--;
4313             locinput = HOPc(locinput, -ST.alen);
4314             goto curlym_do_B; /* try to match B */
4315
4316 #undef ST
4317 #define ST st->u.curly
4318
4319 #define CURLY_SETPAREN(paren, success) \
4320     if (paren) { \
4321         if (success) { \
4322             PL_regstartp[paren] = HOPc(locinput, -1) - PL_bostr; \
4323             PL_regendp[paren] = locinput - PL_bostr; \
4324             *PL_reglastcloseparen = paren; \
4325         } \
4326         else \
4327             PL_regendp[paren] = -1; \
4328     }
4329
4330         case STAR:              /*  /A*B/ where A is width 1 */
4331             ST.paren = 0;
4332             ST.min = 0;
4333             ST.max = REG_INFTY;
4334             scan = NEXTOPER(scan);
4335             goto repeat;
4336         case PLUS:              /*  /A+B/ where A is width 1 */
4337             ST.paren = 0;
4338             ST.min = 1;
4339             ST.max = REG_INFTY;
4340             scan = NEXTOPER(scan);
4341             goto repeat;
4342         case CURLYN:            /*  /(A){m,n}B/ where A is width 1 */
4343             ST.paren = scan->flags;     /* Which paren to set */
4344             if (ST.paren > PL_regsize)
4345                 PL_regsize = ST.paren;
4346             if (ST.paren > *PL_reglastparen)
4347                 *PL_reglastparen = ST.paren;
4348             ST.min = ARG1(scan);  /* min to match */
4349             ST.max = ARG2(scan);  /* max to match */
4350             if (cur_eval && cur_eval->u.eval.close_paren &&
4351                 cur_eval->u.eval.close_paren == (U32)ST.paren) {
4352                 ST.min=1;
4353                 ST.max=1;
4354             }
4355             scan = regnext(NEXTOPER(scan) + NODE_STEP_REGNODE);
4356             goto repeat;
4357         case CURLY:             /*  /A{m,n}B/ where A is width 1 */
4358             ST.paren = 0;
4359             ST.min = ARG1(scan);  /* min to match */
4360             ST.max = ARG2(scan);  /* max to match */
4361             scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
4362           repeat:
4363             /*
4364             * Lookahead to avoid useless match attempts
4365             * when we know what character comes next.
4366             *
4367             * Used to only do .*x and .*?x, but now it allows
4368             * for )'s, ('s and (?{ ... })'s to be in the way
4369             * of the quantifier and the EXACT-like node.  -- japhy
4370             */
4371
4372             if (ST.min > ST.max) /* XXX make this a compile-time check? */
4373                 sayNO;
4374             if (HAS_TEXT(next) || JUMPABLE(next)) {
4375                 U8 *s;
4376                 regnode *text_node = next;
4377
4378                 if (! HAS_TEXT(text_node)) 
4379                     FIND_NEXT_IMPT(text_node);
4380
4381                 if (! HAS_TEXT(text_node))
4382                     ST.c1 = ST.c2 = CHRTEST_VOID;
4383                 else {
4384                     if (PL_regkind[OP(text_node)] == REF) {
4385                         ST.c1 = ST.c2 = CHRTEST_VOID;
4386                         goto assume_ok_easy;
4387                     }
4388                     else
4389                         s = (U8*)STRING(text_node);
4390
4391                     if (!UTF) {
4392                         ST.c2 = ST.c1 = *s;
4393                         if (OP(text_node) == EXACTF || OP(text_node) == REFF)
4394                             ST.c2 = PL_fold[ST.c1];
4395                         else if (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
4396                             ST.c2 = PL_fold_locale[ST.c1];
4397                     }
4398                     else { /* UTF */
4399                         if (OP(text_node) == EXACTF || OP(text_node) == REFF) {
4400                              STRLEN ulen1, ulen2;
4401                              U8 tmpbuf1[UTF8_MAXBYTES_CASE+1];
4402                              U8 tmpbuf2[UTF8_MAXBYTES_CASE+1];
4403
4404                              to_utf8_lower((U8*)s, tmpbuf1, &ulen1);
4405                              to_utf8_upper((U8*)s, tmpbuf2, &ulen2);
4406 #ifdef EBCDIC
4407                              ST.c1 = utf8n_to_uvchr(tmpbuf1, UTF8_MAXLEN, 0,
4408                                                     ckWARN(WARN_UTF8) ?
4409                                                     0 : UTF8_ALLOW_ANY);
4410                              ST.c2 = utf8n_to_uvchr(tmpbuf2, UTF8_MAXLEN, 0,
4411                                                     ckWARN(WARN_UTF8) ?
4412                                                     0 : UTF8_ALLOW_ANY);
4413 #else
4414                              ST.c1 = utf8n_to_uvuni(tmpbuf1, UTF8_MAXBYTES, 0,
4415                                                     uniflags);
4416                              ST.c2 = utf8n_to_uvuni(tmpbuf2, UTF8_MAXBYTES, 0,
4417                                                     uniflags);
4418 #endif
4419                         }
4420                         else {
4421                             ST.c2 = ST.c1 = utf8n_to_uvchr(s, UTF8_MAXBYTES, 0,
4422                                                      uniflags);
4423                         }
4424                     }
4425                 }
4426             }
4427             else
4428                 ST.c1 = ST.c2 = CHRTEST_VOID;
4429         assume_ok_easy:
4430
4431             ST.A = scan;
4432             ST.B = next;
4433             PL_reginput = locinput;
4434             if (minmod) {
4435                 minmod = 0;
4436                 if (ST.min && regrepeat(rex, ST.A, ST.min, depth) < ST.min)
4437                     sayNO;
4438                 ST.count = ST.min;
4439                 locinput = PL_reginput;
4440                 REGCP_SET(ST.cp);
4441                 if (ST.c1 == CHRTEST_VOID)
4442                     goto curly_try_B_min;
4443
4444                 ST.oldloc = locinput;
4445
4446                 /* set ST.maxpos to the furthest point along the
4447                  * string that could possibly match */
4448                 if  (ST.max == REG_INFTY) {
4449                     ST.maxpos = PL_regeol - 1;
4450                     if (do_utf8)
4451                         while (UTF8_IS_CONTINUATION(*(U8*)ST.maxpos))
4452                             ST.maxpos--;
4453                 }
4454                 else if (do_utf8) {
4455                     int m = ST.max - ST.min;
4456                     for (ST.maxpos = locinput;
4457                          m >0 && ST.maxpos + UTF8SKIP(ST.maxpos) <= PL_regeol; m--)
4458                         ST.maxpos += UTF8SKIP(ST.maxpos);
4459                 }
4460                 else {
4461                     ST.maxpos = locinput + ST.max - ST.min;
4462                     if (ST.maxpos >= PL_regeol)
4463                         ST.maxpos = PL_regeol - 1;
4464                 }
4465                 goto curly_try_B_min_known;
4466
4467             }
4468             else {
4469                 ST.count = regrepeat(rex, ST.A, ST.max, depth);
4470                 locinput = PL_reginput;
4471                 if (ST.count < ST.min)
4472                     sayNO;
4473                 if ((ST.count > ST.min)
4474                     && (PL_regkind[OP(ST.B)] == EOL) && (OP(ST.B) != MEOL))
4475                 {
4476                     /* A{m,n} must come at the end of the string, there's
4477                      * no point in backing off ... */
4478                     ST.min = ST.count;
4479                     /* ...except that $ and \Z can match before *and* after
4480                        newline at the end.  Consider "\n\n" =~ /\n+\Z\n/.
4481                        We may back off by one in this case. */
4482                     if (UCHARAT(PL_reginput - 1) == '\n' && OP(ST.B) != EOS)
4483                         ST.min--;
4484                 }
4485                 REGCP_SET(ST.cp);
4486                 goto curly_try_B_max;
4487             }
4488             /* NOTREACHED */
4489
4490
4491         case CURLY_B_min_known_fail:
4492             /* failed to find B in a non-greedy match where c1,c2 valid */
4493             if (ST.paren && ST.count)
4494                 PL_regendp[ST.paren] = -1;
4495
4496             PL_reginput = locinput;     /* Could be reset... */
4497             REGCP_UNWIND(ST.cp);
4498             /* Couldn't or didn't -- move forward. */
4499             ST.oldloc = locinput;
4500             if (do_utf8)
4501                 locinput += UTF8SKIP(locinput);
4502             else
4503                 locinput++;
4504             ST.count++;
4505           curly_try_B_min_known:
4506              /* find the next place where 'B' could work, then call B */
4507             {
4508                 int n;
4509                 if (do_utf8) {
4510                     n = (ST.oldloc == locinput) ? 0 : 1;
4511                     if (ST.c1 == ST.c2) {
4512                         STRLEN len;
4513                         /* set n to utf8_distance(oldloc, locinput) */
4514                         while (locinput <= ST.maxpos &&
4515                                utf8n_to_uvchr((U8*)locinput,
4516                                               UTF8_MAXBYTES, &len,
4517                                               uniflags) != (UV)ST.c1) {
4518                             locinput += len;
4519                             n++;
4520                         }
4521                     }
4522                     else {
4523                         /* set n to utf8_distance(oldloc, locinput) */
4524                         while (locinput <= ST.maxpos) {
4525                             STRLEN len;
4526                             const UV c = utf8n_to_uvchr((U8*)locinput,
4527                                                   UTF8_MAXBYTES, &len,
4528                                                   uniflags);
4529                             if (c == (UV)ST.c1 || c == (UV)ST.c2)
4530                                 break;
4531                             locinput += len;
4532                             n++;
4533                         }
4534                     }
4535                 }
4536                 else {
4537                     if (ST.c1 == ST.c2) {
4538                         while (locinput <= ST.maxpos &&
4539                                UCHARAT(locinput) != ST.c1)
4540                             locinput++;
4541                     }
4542                     else {
4543                         while (locinput <= ST.maxpos
4544                                && UCHARAT(locinput) != ST.c1
4545                                && UCHARAT(locinput) != ST.c2)
4546                             locinput++;
4547                     }
4548                     n = locinput - ST.oldloc;
4549                 }
4550                 if (locinput > ST.maxpos)
4551                     sayNO;
4552                 /* PL_reginput == oldloc now */
4553                 if (n) {
4554                     ST.count += n;
4555                     if (regrepeat(rex, ST.A, n, depth) < n)
4556                         sayNO;
4557                 }
4558                 PL_reginput = locinput;
4559                 CURLY_SETPAREN(ST.paren, ST.count);
4560                 if (cur_eval && cur_eval->u.eval.close_paren && 
4561                     cur_eval->u.eval.close_paren == (U32)ST.paren) {
4562                     goto fake_end;
4563                 }
4564                 PUSH_STATE_GOTO(CURLY_B_min_known, ST.B);
4565             }
4566             /* NOTREACHED */
4567
4568
4569         case CURLY_B_min_fail:
4570             /* failed to find B in a non-greedy match where c1,c2 invalid */
4571             if (ST.paren && ST.count)
4572                 PL_regendp[ST.paren] = -1;
4573
4574             REGCP_UNWIND(ST.cp);
4575             /* failed -- move forward one */
4576             PL_reginput = locinput;
4577             if (regrepeat(rex, ST.A, 1, depth)) {
4578                 ST.count++;
4579                 locinput = PL_reginput;
4580                 if (ST.count <= ST.max || (ST.max == REG_INFTY &&
4581                         ST.count > 0)) /* count overflow ? */
4582                 {
4583                   curly_try_B_min:
4584                     CURLY_SETPAREN(ST.paren, ST.count);
4585                     if (cur_eval && cur_eval->u.eval.close_paren &&
4586                         cur_eval->u.eval.close_paren == (U32)ST.paren) {
4587                         goto fake_end;
4588                     }
4589                     PUSH_STATE_GOTO(CURLY_B_min, ST.B);
4590                 }
4591             }
4592             sayNO;
4593             /* NOTREACHED */
4594
4595
4596         curly_try_B_max:
4597             /* a successful greedy match: now try to match B */
4598             if (cur_eval && cur_eval->u.eval.close_paren &&
4599                 cur_eval->u.eval.close_paren == (U32)ST.paren) {
4600                 goto fake_end;
4601             }
4602             {
4603                 UV c = 0;
4604                 if (ST.c1 != CHRTEST_VOID)
4605                     c = do_utf8 ? utf8n_to_uvchr((U8*)PL_reginput,
4606                                            UTF8_MAXBYTES, 0, uniflags)
4607                                 : (UV) UCHARAT(PL_reginput);
4608                 /* If it could work, try it. */
4609                 if (ST.c1 == CHRTEST_VOID || c == (UV)ST.c1 || c == (UV)ST.c2) {
4610                     CURLY_SETPAREN(ST.paren, ST.count);
4611                     PUSH_STATE_GOTO(CURLY_B_max, ST.B);
4612                     /* NOTREACHED */
4613                 }
4614             }
4615             /* FALL THROUGH */
4616         case CURLY_B_max_fail:
4617             /* failed to find B in a greedy match */
4618             if (ST.paren && ST.count)
4619                 PL_regendp[ST.paren] = -1;
4620
4621             REGCP_UNWIND(ST.cp);
4622             /*  back up. */
4623             if (--ST.count < ST.min)
4624                 sayNO;
4625             PL_reginput = locinput = HOPc(locinput, -1);
4626             goto curly_try_B_max;
4627
4628 #undef ST
4629
4630         case END:
4631             fake_end:
4632             if (cur_eval) {
4633                 /* we've just finished A in /(??{A})B/; now continue with B */
4634                 I32 tmpix;
4635
4636
4637                 st->u.eval.toggle_reg_flags
4638                             = cur_eval->u.eval.toggle_reg_flags;
4639                 PL_reg_flags ^= st->u.eval.toggle_reg_flags; 
4640
4641                 st->u.eval.prev_rex = rex;              /* inner */
4642                 rex    = cur_eval->u.eval.prev_rex;     /* outer */
4643                 cur_curlyx = cur_eval->u.eval.prev_curlyx;
4644                 ReREFCNT_inc(rex);
4645                 st->u.eval.cp = regcppush(0);   /* Save *all* the positions. */
4646                 REGCP_SET(st->u.eval.lastcp);
4647                 PL_reginput = locinput;
4648
4649                 /* Restore parens of the outer rex without popping the
4650                  * savestack */
4651                 tmpix = PL_savestack_ix;
4652                 PL_savestack_ix = cur_eval->u.eval.lastcp;
4653                 regcppop(rex);
4654                 PL_savestack_ix = tmpix;
4655
4656                 st->u.eval.prev_eval = cur_eval;
4657                 cur_eval = cur_eval->u.eval.prev_eval;
4658                 DEBUG_EXECUTE_r(
4659                     PerlIO_printf(Perl_debug_log, "%*s  EVAL trying tail ... %"UVxf"\n",
4660                                       REPORT_CODE_OFF+depth*2, "",PTR2UV(cur_eval)););
4661                 PUSH_YES_STATE_GOTO(EVAL_AB,
4662                         st->u.eval.prev_eval->u.eval.B); /* match B */
4663             }
4664
4665             if (locinput < reginfo->till) {
4666                 DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log,
4667                                       "%sMatch possible, but length=%ld is smaller than requested=%ld, failing!%s\n",
4668                                       PL_colors[4],
4669                                       (long)(locinput - PL_reg_starttry),
4670                                       (long)(reginfo->till - PL_reg_starttry),
4671                                       PL_colors[5]));
4672                 sayNO_SILENT;           /* Cannot match: too short. */
4673             }
4674             PL_reginput = locinput;     /* put where regtry can find it */
4675             sayYES;                     /* Success! */
4676
4677         case SUCCEED: /* successful SUSPEND/UNLESSM/IFMATCH/CURLYM */
4678             DEBUG_EXECUTE_r(
4679             PerlIO_printf(Perl_debug_log,
4680                 "%*s  %ssubpattern success...%s\n",
4681                 REPORT_CODE_OFF+depth*2, "", PL_colors[4], PL_colors[5]));
4682             PL_reginput = locinput;     /* put where regtry can find it */
4683             sayYES;                     /* Success! */
4684
4685 #undef  ST
4686 #define ST st->u.ifmatch
4687
4688         case SUSPEND:   /* (?>A) */
4689             ST.wanted = 1;
4690             PL_reginput = locinput;
4691             goto do_ifmatch;    
4692
4693         case UNLESSM:   /* -ve lookaround: (?!A), or with flags, (?<!A) */
4694             ST.wanted = 0;
4695             goto ifmatch_trivial_fail_test;
4696
4697         case IFMATCH:   /* +ve lookaround: (?=A), or with flags, (?<=A) */
4698             ST.wanted = 1;
4699           ifmatch_trivial_fail_test:
4700             if (scan->flags) {
4701                 char * const s = HOPBACKc(locinput, scan->flags);
4702                 if (!s) {
4703                     /* trivial fail */
4704                     if (logical) {
4705                         logical = 0;
4706                         sw = 1 - (bool)ST.wanted;
4707                     }
4708                     else if (ST.wanted)
4709                         sayNO;
4710                     next = scan + ARG(scan);
4711                     if (next == scan)
4712                         next = NULL;
4713                     break;
4714                 }
4715                 PL_reginput = s;
4716             }
4717             else
4718                 PL_reginput = locinput;
4719
4720           do_ifmatch:
4721             ST.me = scan;
4722             ST.logical = logical;
4723             /* execute body of (?...A) */
4724             PUSH_YES_STATE_GOTO(IFMATCH_A, NEXTOPER(NEXTOPER(scan)));
4725             /* NOTREACHED */
4726
4727         case IFMATCH_A_fail: /* body of (?...A) failed */
4728             ST.wanted = !ST.wanted;
4729             /* FALL THROUGH */
4730
4731         case IFMATCH_A: /* body of (?...A) succeeded */
4732             if (ST.logical) {
4733                 sw = (bool)ST.wanted;
4734             }
4735             else if (!ST.wanted)
4736                 sayNO;
4737
4738             if (OP(ST.me) == SUSPEND)
4739                 locinput = PL_reginput;
4740             else {
4741                 locinput = PL_reginput = st->locinput;
4742                 nextchr = UCHARAT(locinput);
4743             }
4744             scan = ST.me + ARG(ST.me);
4745             if (scan == ST.me)
4746                 scan = NULL;
4747             continue; /* execute B */
4748
4749 #undef ST
4750
4751         case LONGJMP:
4752             next = scan + ARG(scan);
4753             if (next == scan)
4754                 next = NULL;
4755             break;
4756         case COMMIT:
4757             reginfo->cutpoint = PL_regeol;
4758             /* FALLTHROUGH */
4759         case PRUNE:
4760             PL_reginput = locinput;
4761             if (!scan->flags)
4762                 sv_yes_mark = sv_commit = (SV*)rex->data->data[ ARG( scan ) ];
4763             PUSH_STATE_GOTO(COMMIT_next,next);
4764             /* NOTREACHED */
4765         case COMMIT_next_fail:
4766             no_final = 1;    
4767             /* FALLTHROUGH */       
4768         case OPFAIL:
4769             sayNO;
4770             /* NOTREACHED */
4771
4772 #define ST st->u.mark
4773         case MARKPOINT:
4774             ST.prev_mark = mark_state;
4775             ST.mark_name = sv_commit = sv_yes_mark 
4776                 = (SV*)rex->data->data[ ARG( scan ) ];
4777             mark_state = st;
4778             ST.mark_loc = PL_reginput = locinput;
4779             PUSH_YES_STATE_GOTO(MARKPOINT_next,next);
4780             /* NOTREACHED */
4781         case MARKPOINT_next:
4782             mark_state = ST.prev_mark;
4783             sayYES;
4784             /* NOTREACHED */
4785         case MARKPOINT_next_fail:
4786             if (popmark && sv_eq(ST.mark_name,popmark)) 
4787             {
4788                 if (ST.mark_loc > startpoint)
4789                     reginfo->cutpoint = HOPBACKc(ST.mark_loc, 1);
4790                 popmark = NULL; /* we found our mark */
4791                 sv_commit = ST.mark_name;
4792
4793                 DEBUG_EXECUTE_r({
4794                         PerlIO_printf(Perl_debug_log,
4795                             "%*s  %ssetting cutpoint to mark:%"SVf"...%s\n",
4796                             REPORT_CODE_OFF+depth*2, "", 
4797                             PL_colors[4], sv_commit, PL_colors[5]);
4798                 });
4799             }
4800             mark_state = ST.prev_mark;
4801             sv_yes_mark = mark_state ? 
4802                 mark_state->u.mark.mark_name : NULL;
4803             sayNO;
4804             /* NOTREACHED */
4805         case SKIP:
4806             PL_reginput = locinput;
4807             if (scan->flags) {
4808                 /* (*CUT) : if we fail we cut here*/
4809                 ST.mark_name = NULL;
4810                 ST.mark_loc = locinput;
4811                 PUSH_STATE_GOTO(SKIP_next,next);    
4812             } else {
4813                 /* (*CUT:NAME) : if there is a (*MARK:NAME) fail where it was, 
4814                    otherwise do nothing.  Meaning we need to scan 
4815                  */
4816                 regmatch_state *cur = mark_state;
4817                 SV *find = (SV*)rex->data->data[ ARG( scan ) ];
4818                 
4819                 while (cur) {
4820                     if ( sv_eq( cur->u.mark.mark_name, 
4821                                 find ) ) 
4822                     {
4823                         ST.mark_name = find;
4824                         PUSH_STATE_GOTO( SKIP_next, next );
4825                     }
4826                     cur = cur->u.mark.prev_mark;
4827                 }
4828             }    
4829             /* Didn't find our (*MARK:NAME) so ignore this (*CUT:NAME) */
4830             break;    
4831         case SKIP_next_fail:
4832             if (ST.mark_name) {
4833                 /* (*CUT:NAME) - Set up to search for the name as we 
4834                    collapse the stack*/
4835                 popmark = ST.mark_name;    
4836             } else {
4837                 /* (*CUT) - No name, we cut here.*/
4838                 if (ST.mark_loc > startpoint)
4839                     reginfo->cutpoint = HOPBACKc(ST.mark_loc, 1);
4840                 /* but we set sv_commit to latest mark_name if there
4841                    is one so they can test to see how things lead to this
4842                    cut */    
4843                 if (mark_state) 
4844                     sv_commit=mark_state->u.mark.mark_name;                 
4845             } 
4846             no_final = 1; 
4847             sayNO;
4848             /* NOTREACHED */
4849 #undef ST
4850
4851         default:
4852             PerlIO_printf(Perl_error_log, "%"UVxf" %d\n",
4853                           PTR2UV(scan), OP(scan));
4854             Perl_croak(aTHX_ "regexp memory corruption");
4855             
4856         } /* end switch */ 
4857
4858         /* switch break jumps here */
4859         scan = next; /* prepare to execute the next op and ... */
4860         continue;    /* ... jump back to the top, reusing st */
4861         /* NOTREACHED */
4862
4863       push_yes_state:
4864         /* push a state that backtracks on success */
4865         st->u.yes.prev_yes_state = yes_state;
4866         yes_state = st;
4867         /* FALL THROUGH */
4868       push_state:
4869         /* push a new regex state, then continue at scan  */
4870         {
4871             regmatch_state *newst;
4872
4873             DEBUG_STACK_r({
4874                 regmatch_state *cur = st;
4875                 regmatch_state *curyes = yes_state;
4876                 int curd = depth;
4877                 regmatch_slab *slab = PL_regmatch_slab;
4878                 for (;curd > -1;cur--,curd--) {
4879                     if (cur < SLAB_FIRST(slab)) {
4880                         slab = slab->prev;
4881                         cur = SLAB_LAST(slab);
4882                     }
4883                     PerlIO_printf(Perl_error_log, "%*s#%-3d %-10s %s\n",
4884                         REPORT_CODE_OFF + 2 + depth * 2,"",
4885                         curd, reg_name[cur->resume_state],
4886                         (curyes == cur) ? "yes" : ""
4887                     );
4888                     if (curyes == cur)
4889                         curyes = cur->u.yes.prev_yes_state;
4890                 }
4891             } else 
4892                 DEBUG_STATE_pp("push")
4893             );
4894             depth++;
4895             st->locinput = locinput;
4896             newst = st+1; 
4897             if (newst >  SLAB_LAST(PL_regmatch_slab))
4898                 newst = S_push_slab(aTHX);
4899             PL_regmatch_state = newst;
4900
4901             locinput = PL_reginput;
4902             nextchr = UCHARAT(locinput);
4903             st = newst;
4904             continue;
4905             /* NOTREACHED */
4906         }
4907     }
4908
4909     /*
4910     * We get here only if there's trouble -- normally "case END" is
4911     * the terminating point.
4912     */
4913     Perl_croak(aTHX_ "corrupted regexp pointers");
4914     /*NOTREACHED*/
4915     sayNO;
4916
4917 yes:
4918     if (yes_state) {
4919         /* we have successfully completed a subexpression, but we must now
4920          * pop to the state marked by yes_state and continue from there */
4921         assert(st != yes_state);
4922 #ifdef DEBUGGING
4923         while (st != yes_state) {
4924             st--;
4925             if (st < SLAB_FIRST(PL_regmatch_slab)) {
4926                 PL_regmatch_slab = PL_regmatch_slab->prev;
4927                 st = SLAB_LAST(PL_regmatch_slab);
4928             }
4929             DEBUG_STATE_r({
4930                 if (no_final) {
4931                     DEBUG_STATE_pp("pop (no final)");        
4932                 } else {
4933                     DEBUG_STATE_pp("pop (yes)");
4934                 }
4935             });
4936             depth--;
4937         }
4938 #else
4939         while (yes_state < SLAB_FIRST(PL_regmatch_slab)
4940             || yes_state > SLAB_LAST(PL_regmatch_slab))
4941         {
4942             /* not in this slab, pop slab */
4943             depth -= (st - SLAB_FIRST(PL_regmatch_slab) + 1);
4944             PL_regmatch_slab = PL_regmatch_slab->prev;
4945             st = SLAB_LAST(PL_regmatch_slab);
4946         }
4947         depth -= (st - yes_state);
4948 #endif
4949         st = yes_state;
4950         yes_state = st->u.yes.prev_yes_state;
4951         PL_regmatch_state = st;
4952         
4953         if (no_final) {
4954             locinput= st->locinput;
4955             nextchr = UCHARAT(locinput);
4956         }
4957         state_num = st->resume_state + no_final;
4958         goto reenter_switch;
4959     }
4960
4961     DEBUG_EXECUTE_r(PerlIO_printf(Perl_debug_log, "%sMatch successful!%s\n",
4962                           PL_colors[4], PL_colors[5]));
4963
4964     result = 1;
4965     goto final_exit;
4966
4967 no:
4968     DEBUG_EXECUTE_r(
4969         PerlIO_printf(Perl_debug_log,
4970             "%*s  %sfailed...%s\n",
4971             REPORT_CODE_OFF+depth*2, "", 
4972             PL_colors[4], PL_colors[5])
4973         );
4974
4975 no_silent:
4976     if (no_final) {
4977         if (yes_state) {
4978             goto yes;
4979         } else {
4980             goto final_exit;
4981         }
4982     }    
4983     if (depth) {
4984         /* there's a previous state to backtrack to */
4985         st--;
4986         if (st < SLAB_FIRST(PL_regmatch_slab)) {
4987             PL_regmatch_slab = PL_regmatch_slab->prev;
4988             st = SLAB_LAST(PL_regmatch_slab);
4989         }
4990         PL_regmatch_state = st;
4991         locinput= st->locinput;
4992         nextchr = UCHARAT(locinput);
4993
4994         DEBUG_STATE_pp("pop");
4995         depth--;
4996         if (yes_state == st)
4997             yes_state = st->u.yes.prev_yes_state;
4998
4999         state_num = st->resume_state + 1; /* failure = success + 1 */
5000         goto reenter_switch;
5001     }
5002     result = 0;
5003
5004   final_exit:
5005     if (rex->reganch & ROPT_VERBARG_SEEN) {
5006         SV *sv_err = get_sv("REGERROR", 1);
5007         SV *sv_mrk = get_sv("REGMARK", 1);
5008         if (result) {
5009             sv_commit = &PL_sv_no;
5010             if (!sv_yes_mark) 
5011                 sv_yes_mark = &PL_sv_yes;
5012         } else {
5013             if (!sv_commit) 
5014                 sv_commit = &PL_sv_yes;
5015             sv_yes_mark = &PL_sv_no;
5016         }
5017         sv_setsv(sv_err, sv_commit);
5018         sv_setsv(sv_mrk, sv_yes_mark);
5019     }
5020     /* restore original high-water mark */
5021     PL_regmatch_slab  = orig_slab;
5022     PL_regmatch_state = orig_state;
5023
5024     /* free all slabs above current one */
5025     if (orig_slab->next) {
5026         regmatch_slab *sl = orig_slab->next;
5027         orig_slab->next = NULL;
5028         while (sl) {
5029             regmatch_slab * const osl = sl;
5030             sl = sl->next;
5031             Safefree(osl);
5032         }
5033     }
5034
5035     return result;
5036 }
5037
5038 /*
5039  - regrepeat - repeatedly match something simple, report how many
5040  */
5041 /*
5042  * [This routine now assumes that it will only match on things of length 1.
5043  * That was true before, but now we assume scan - reginput is the count,
5044  * rather than incrementing count on every character.  [Er, except utf8.]]
5045  */
5046 STATIC I32
5047 S_regrepeat(pTHX_ const regexp *prog, const regnode *p, I32 max, int depth)
5048 {
5049     dVAR;
5050     register char *scan;
5051     register I32 c;
5052     register char *loceol = PL_regeol;
5053     register I32 hardcount = 0;
5054     register bool do_utf8 = PL_reg_match_utf8;
5055
5056     scan = PL_reginput;
5057     if (max == REG_INFTY)
5058         max = I32_MAX;
5059     else if (max < loceol - scan)
5060         loceol = scan + max;
5061     switch (OP(p)) {
5062     case REG_ANY:
5063         if (do_utf8) {
5064             loceol = PL_regeol;
5065             while (scan < loceol && hardcount < max && *scan != '\n') {
5066                 scan += UTF8SKIP(scan);
5067                 hardcount++;
5068             }
5069         } else {
5070             while (scan < loceol && *scan != '\n')
5071                 scan++;
5072         }
5073         break;
5074     case SANY:
5075         if (do_utf8) {
5076             loceol = PL_regeol;
5077             while (scan < loceol && hardcount < max) {
5078                 scan += UTF8SKIP(scan);
5079                 hardcount++;
5080             }
5081         }
5082         else
5083             scan = loceol;
5084         break;
5085     case CANY:
5086         scan = loceol;
5087         break;
5088     case EXACT:         /* length of string is 1 */
5089         c = (U8)*STRING(p);
5090         while (scan < loceol && UCHARAT(scan) == c)
5091             scan++;
5092         break;
5093     case EXACTF:        /* length of string is 1 */
5094         c = (U8)*STRING(p);
5095         while (scan < loceol &&
5096                (UCHARAT(scan) == c || UCHARAT(scan) == PL_fold[c]))
5097             scan++;
5098         break;
5099     case EXACTFL:       /* length of string is 1 */
5100         PL_reg_flags |= RF_tainted;
5101         c = (U8)*STRING(p);
5102         while (scan < loceol &&
5103                (UCHARAT(scan) == c || UCHARAT(scan) == PL_fold_locale[c]))
5104             scan++;
5105         break;
5106     case ANYOF:
5107         if (do_utf8) {
5108             loceol = PL_regeol;
5109             while (hardcount < max && scan < loceol &&
5110                    reginclass(prog, p, (U8*)scan, 0, do_utf8)) {
5111                 scan += UTF8SKIP(scan);
5112                 hardcount++;
5113             }
5114         } else {
5115             while (scan < loceol && REGINCLASS(prog, p, (U8*)scan))
5116                 scan++;
5117         }
5118         break;
5119     case ALNUM:
5120         if (do_utf8) {
5121             loceol = PL_regeol;
5122             LOAD_UTF8_CHARCLASS_ALNUM();
5123             while (hardcount < max && scan < loceol &&
5124                    swash_fetch(PL_utf8_alnum, (U8*)scan, do_utf8)) {
5125                 scan += UTF8SKIP(scan);
5126                 hardcount++;
5127             }
5128         } else {
5129             while (scan < loceol && isALNUM(*scan))
5130                 scan++;
5131         }
5132         break;
5133     case ALNUML:
5134         PL_reg_flags |= RF_tainted;
5135         if (do_utf8) {
5136             loceol = PL_regeol;
5137             while (hardcount < max && scan < loceol &&
5138                    isALNUM_LC_utf8((U8*)scan)) {
5139                 scan += UTF8SKIP(scan);
5140                 hardcount++;
5141             }
5142         } else {
5143             while (scan < loceol && isALNUM_LC(*scan))
5144                 scan++;
5145         }
5146         break;
5147     case NALNUM:
5148         if (do_utf8) {
5149             loceol = PL_regeol;
5150             LOAD_UTF8_CHARCLASS_ALNUM();
5151             while (hardcount < max && scan < loceol &&
5152                    !swash_fetch(PL_utf8_alnum, (U8*)scan, do_utf8)) {
5153                 scan += UTF8SKIP(scan);
5154                 hardcount++;
5155             }
5156         } else {
5157             while (scan < loceol && !isALNUM(*scan))
5158                 scan++;
5159         }
5160         break;
5161     case NALNUML:
5162         PL_reg_flags |= RF_tainted;
5163         if (do_utf8) {
5164             loceol = PL_regeol;
5165             while (hardcount < max && scan < loceol &&
5166                    !isALNUM_LC_utf8((U8*)scan)) {
5167                 scan += UTF8SKIP(scan);
5168                 hardcount++;
5169             }
5170         } else {
5171             while (scan < loceol && !isALNUM_LC(*scan))
5172                 scan++;
5173         }
5174         break;
5175     case SPACE:
5176         if (do_utf8) {
5177             loceol = PL_regeol;
5178             LOAD_UTF8_CHARCLASS_SPACE();
5179             while (hardcount < max && scan < loceol &&
5180                    (*scan == ' ' ||
5181                     swash_fetch(PL_utf8_space,(U8*)scan, do_utf8))) {
5182                 scan += UTF8SKIP(scan);
5183                 hardcount++;
5184             }
5185         } else {
5186             while (scan < loceol && isSPACE(*scan))
5187                 scan++;
5188         }
5189         break;
5190     case SPACEL:
5191         PL_reg_flags |= RF_tainted;
5192         if (do_utf8) {
5193             loceol = PL_regeol;
5194             while (hardcount < max && scan < loceol &&
5195                    (*scan == ' ' || isSPACE_LC_utf8((U8*)scan))) {
5196                 scan += UTF8SKIP(scan);
5197                 hardcount++;
5198             }
5199         } else {
5200             while (scan < loceol && isSPACE_LC(*scan))
5201                 scan++;
5202         }
5203         break;
5204     case NSPACE:
5205         if (do_utf8) {
5206             loceol = PL_regeol;
5207             LOAD_UTF8_CHARCLASS_SPACE();
5208             while (hardcount < max && scan < loceol &&
5209                    !(*scan == ' ' ||
5210                      swash_fetch(PL_utf8_space,(U8*)scan, do_utf8))) {
5211                 scan += UTF8SKIP(scan);
5212                 hardcount++;
5213             }
5214         } else {
5215             while (scan < loceol && !isSPACE(*scan))
5216                 scan++;
5217             break;
5218         }
5219     case NSPACEL:
5220         PL_reg_flags |= RF_tainted;
5221         if (do_utf8) {
5222             loceol = PL_regeol;
5223             while (hardcount < max && scan < loceol &&
5224                    !(*scan == ' ' || isSPACE_LC_utf8((U8*)scan))) {
5225                 scan += UTF8SKIP(scan);
5226                 hardcount++;
5227             }
5228         } else {
5229             while (scan < loceol && !isSPACE_LC(*scan))
5230                 scan++;
5231         }
5232         break;
5233     case DIGIT:
5234         if (do_utf8) {
5235             loceol = PL_regeol;
5236             LOAD_UTF8_CHARCLASS_DIGIT();
5237             while (hardcount < max && scan < loceol &&
5238                    swash_fetch(PL_utf8_digit, (U8*)scan, do_utf8)) {
5239                 scan += UTF8SKIP(scan);
5240                 hardcount++;
5241             }
5242         } else {
5243             while (scan < loceol && isDIGIT(*scan))
5244                 scan++;
5245         }
5246         break;
5247     case NDIGIT:
5248         if (do_utf8) {
5249             loceol = PL_regeol;
5250             LOAD_UTF8_CHARCLASS_DIGIT();
5251             while (hardcount < max && scan < loceol &&
5252                    !swash_fetch(PL_utf8_digit, (U8*)scan, do_utf8)) {
5253                 scan += UTF8SKIP(scan);
5254                 hardcount++;
5255             }
5256         } else {
5257             while (scan < loceol && !isDIGIT(*scan))
5258                 scan++;
5259         }
5260         break;
5261     default:            /* Called on something of 0 width. */
5262         break;          /* So match right here or not at all. */
5263     }
5264
5265     if (hardcount)
5266         c = hardcount;
5267     else
5268         c = scan - PL_reginput;
5269     PL_reginput = scan;
5270
5271     DEBUG_r({
5272         GET_RE_DEBUG_FLAGS_DECL;
5273         DEBUG_EXECUTE_r({
5274             SV * const prop = sv_newmortal();
5275             regprop(prog, prop, p);
5276             PerlIO_printf(Perl_debug_log,
5277                         "%*s  %s can match %"IVdf" times out of %"IVdf"...\n",
5278                         REPORT_CODE_OFF + depth*2, "", SvPVX_const(prop),(IV)c,(IV)max);
5279         });
5280     });
5281
5282     return(c);
5283 }
5284
5285
5286 #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION)
5287 /*
5288 - regclass_swash - prepare the utf8 swash
5289 */
5290
5291 SV *
5292 Perl_regclass_swash(pTHX_ const regexp *prog, register const regnode* node, bool doinit, SV** listsvp, SV **altsvp)
5293 {
5294     dVAR;
5295     SV *sw  = NULL;
5296     SV *si  = NULL;
5297     SV *alt = NULL;
5298     const struct reg_data * const data = prog ? prog->data : NULL;
5299
5300     if (data && data->count) {
5301         const U32 n = ARG(node);
5302
5303         if (data->what[n] == 's') {
5304             SV * const rv = (SV*)data->data[n];
5305             AV * const av = (AV*)SvRV((SV*)rv);
5306             SV **const ary = AvARRAY(av);
5307             SV **a, **b;
5308         
5309             /* See the end of regcomp.c:S_regclass() for
5310              * documentation of these array elements. */
5311
5312             si = *ary;
5313             a  = SvROK(ary[1]) ? &ary[1] : 0;
5314             b  = SvTYPE(ary[2]) == SVt_PVAV ? &ary[2] : 0;
5315
5316             if (a)
5317                 sw = *a;
5318             else if (si && doinit) {
5319                 sw = swash_init("utf8", "", si, 1, 0);
5320                 (void)av_store(av, 1, sw);
5321             }
5322             if (b)
5323                 alt = *b;
5324         }
5325     }
5326         
5327     if (listsvp)
5328         *listsvp = si;
5329     if (altsvp)
5330         *altsvp  = alt;
5331
5332     return sw;
5333 }
5334 #endif
5335
5336 /*
5337  - reginclass - determine if a character falls into a character class
5338  
5339   The n is the ANYOF regnode, the p is the target string, lenp
5340   is pointer to the maximum length of how far to go in the p
5341   (if the lenp is zero, UTF8SKIP(p) is used),
5342   do_utf8 tells whether the target string is in UTF-8.
5343
5344  */
5345
5346 STATIC bool
5347 S_reginclass(pTHX_ const regexp *prog, register const regnode *n, register const U8* p, STRLEN* lenp, register bool do_utf8)
5348 {
5349     dVAR;
5350     const char flags = ANYOF_FLAGS(n);
5351     bool match = FALSE;
5352     UV c = *p;
5353     STRLEN len = 0;
5354     STRLEN plen;
5355
5356     if (do_utf8 && !UTF8_IS_INVARIANT(c)) {
5357         c = utf8n_to_uvchr(p, UTF8_MAXBYTES, &len,
5358                 (UTF8_ALLOW_DEFAULT & UTF8_ALLOW_ANYUV) | UTF8_CHECK_ONLY);
5359                 /* see [perl #37836] for UTF8_ALLOW_ANYUV */
5360         if (len == (STRLEN)-1) 
5361             Perl_croak(aTHX_ "Malformed UTF-8 character (fatal)");
5362     }
5363
5364     plen = lenp ? *lenp : UNISKIP(NATIVE_TO_UNI(c));
5365     if (do_utf8 || (flags & ANYOF_UNICODE)) {
5366         if (lenp)
5367             *lenp = 0;
5368         if (do_utf8 && !ANYOF_RUNTIME(n)) {
5369             if (len != (STRLEN)-1 && c < 256 && ANYOF_BITMAP_TEST(n, c))
5370                 match = TRUE;
5371         }
5372         if (!match && do_utf8 && (flags & ANYOF_UNICODE_ALL) && c >= 256)
5373             match = TRUE;
5374         if (!match) {
5375             AV *av;
5376             SV * const sw = regclass_swash(prog, n, TRUE, 0, (SV**)&av);
5377         
5378             if (sw) {
5379                 if (swash_fetch(sw, p, do_utf8))
5380                     match = TRUE;
5381                 else if (flags & ANYOF_FOLD) {
5382                     if (!match && lenp && av) {
5383                         I32 i;
5384                         for (i = 0; i <= av_len(av); i++) {
5385                             SV* const sv = *av_fetch(av, i, FALSE);
5386                             STRLEN len;
5387                             const char * const s = SvPV_const(sv, len);
5388                         
5389                             if (len <= plen && memEQ(s, (char*)p, len)) {
5390                                 *lenp = len;
5391                                 match = TRUE;
5392                                 break;
5393                             }
5394                         }
5395                     }
5396                     if (!match) {
5397                         U8 tmpbuf[UTF8_MAXBYTES_CASE+1];
5398                         STRLEN tmplen;
5399
5400                         to_utf8_fold(p, tmpbuf, &tmplen);
5401                         if (swash_fetch(sw, tmpbuf, do_utf8))
5402                             match = TRUE;
5403                     }
5404                 }
5405             }
5406         }
5407         if (match && lenp && *lenp == 0)
5408             *lenp = UNISKIP(NATIVE_TO_UNI(c));
5409     }
5410     if (!match && c < 256) {
5411         if (ANYOF_BITMAP_TEST(n, c))
5412             match = TRUE;
5413         else if (flags & ANYOF_FOLD) {
5414             U8 f;
5415
5416             if (flags & ANYOF_LOCALE) {
5417                 PL_reg_flags |= RF_tainted;
5418                 f = PL_fold_locale[c];
5419             }
5420             else
5421                 f = PL_fold[c];
5422             if (f != c && ANYOF_BITMAP_TEST(n, f))
5423                 match = TRUE;
5424         }
5425         
5426         if (!match && (flags & ANYOF_CLASS)) {
5427             PL_reg_flags |= RF_tainted;
5428             if (
5429                 (ANYOF_CLASS_TEST(n, ANYOF_ALNUM)   &&  isALNUM_LC(c))  ||
5430                 (ANYOF_CLASS_TEST(n, ANYOF_NALNUM)  && !isALNUM_LC(c))  ||
5431                 (ANYOF_CLASS_TEST(n, ANYOF_SPACE)   &&  isSPACE_LC(c))  ||
5432                 (ANYOF_CLASS_TEST(n, ANYOF_NSPACE)  && !isSPACE_LC(c))  ||
5433                 (ANYOF_CLASS_TEST(n, ANYOF_DIGIT)   &&  isDIGIT_LC(c))  ||
5434                 (ANYOF_CLASS_TEST(n, ANYOF_NDIGIT)  && !isDIGIT_LC(c))  ||
5435                 (ANYOF_CLASS_TEST(n, ANYOF_ALNUMC)  &&  isALNUMC_LC(c)) ||
5436                 (ANYOF_CLASS_TEST(n, ANYOF_NALNUMC) && !isALNUMC_LC(c)) ||
5437                 (ANYOF_CLASS_TEST(n, ANYOF_ALPHA)   &&  isALPHA_LC(c))  ||
5438                 (ANYOF_CLASS_TEST(n, ANYOF_NALPHA)  && !isALPHA_LC(c))  ||
5439                 (ANYOF_CLASS_TEST(n, ANYOF_ASCII)   &&  isASCII(c))     ||
5440                 (ANYOF_CLASS_TEST(n, ANYOF_NASCII)  && !isASCII(c))     ||
5441                 (ANYOF_CLASS_TEST(n, ANYOF_CNTRL)   &&  isCNTRL_LC(c))  ||
5442                 (ANYOF_CLASS_TEST(n, ANYOF_NCNTRL)  && !isCNTRL_LC(c))  ||
5443                 (ANYOF_CLASS_TEST(n, ANYOF_GRAPH)   &&  isGRAPH_LC(c))  ||
5444                 (ANYOF_CLASS_TEST(n, ANYOF_NGRAPH)  && !isGRAPH_LC(c))  ||
5445                 (ANYOF_CLASS_TEST(n, ANYOF_LOWER)   &&  isLOWER_LC(c))  ||
5446                 (ANYOF_CLASS_TEST(n, ANYOF_NLOWER)  && !isLOWER_LC(c))  ||
5447                 (ANYOF_CLASS_TEST(n, ANYOF_PRINT)   &&  isPRINT_LC(c))  ||
5448                 (ANYOF_CLASS_TEST(n, ANYOF_NPRINT)  && !isPRINT_LC(c))  ||
5449                 (ANYOF_CLASS_TEST(n, ANYOF_PUNCT)   &&  isPUNCT_LC(c))  ||
5450                 (ANYOF_CLASS_TEST(n, ANYOF_NPUNCT)  && !isPUNCT_LC(c))  ||
5451                 (ANYOF_CLASS_TEST(n, ANYOF_UPPER)   &&  isUPPER_LC(c))  ||
5452                 (ANYOF_CLASS_TEST(n, ANYOF_NUPPER)  && !isUPPER_LC(c))  ||
5453                 (ANYOF_CLASS_TEST(n, ANYOF_XDIGIT)  &&  isXDIGIT(c))    ||
5454                 (ANYOF_CLASS_TEST(n, ANYOF_NXDIGIT) && !isXDIGIT(c))    ||
5455                 (ANYOF_CLASS_TEST(n, ANYOF_PSXSPC)  &&  isPSXSPC(c))    ||
5456                 (ANYOF_CLASS_TEST(n, ANYOF_NPSXSPC) && !isPSXSPC(c))    ||
5457                 (ANYOF_CLASS_TEST(n, ANYOF_BLANK)   &&  isBLANK(c))     ||
5458                 (ANYOF_CLASS_TEST(n, ANYOF_NBLANK)  && !isBLANK(c))
5459                 ) /* How's that for a conditional? */
5460             {
5461                 match = TRUE;
5462             }
5463         }
5464     }
5465
5466     return (flags & ANYOF_INVERT) ? !match : match;
5467 }
5468
5469 STATIC U8 *
5470 S_reghop3(U8 *s, I32 off, const U8* lim)
5471 {
5472     dVAR;
5473     if (off >= 0) {
5474         while (off-- && s < lim) {
5475             /* XXX could check well-formedness here */
5476             s += UTF8SKIP(s);
5477         }
5478     }
5479     else {
5480         while (off++ && s > lim) {
5481             s--;
5482             if (UTF8_IS_CONTINUED(*s)) {
5483                 while (s > lim && UTF8_IS_CONTINUATION(*s))
5484                     s--;
5485             }
5486             /* XXX could check well-formedness here */
5487         }
5488     }
5489     return s;
5490 }
5491
5492 #ifdef XXX_dmq
5493 /* there are a bunch of places where we use two reghop3's that should
5494    be replaced with this routine. but since thats not done yet 
5495    we ifdef it out - dmq
5496 */
5497 STATIC U8 *
5498 S_reghop4(U8 *s, I32 off, const U8* llim, const U8* rlim)
5499 {
5500     dVAR;
5501     if (off >= 0) {
5502         while (off-- && s < rlim) {
5503             /* XXX could check well-formedness here */
5504             s += UTF8SKIP(s);
5505         }
5506     }
5507     else {
5508         while (off++ && s > llim) {
5509             s--;
5510             if (UTF8_IS_CONTINUED(*s)) {
5511                 while (s > llim && UTF8_IS_CONTINUATION(*s))
5512                     s--;
5513             }
5514             /* XXX could check well-formedness here */
5515         }
5516     }
5517     return s;
5518 }
5519 #endif
5520
5521 STATIC U8 *
5522 S_reghopmaybe3(U8* s, I32 off, const U8* lim)
5523 {
5524     dVAR;
5525     if (off >= 0) {
5526         while (off-- && s < lim) {
5527             /* XXX could check well-formedness here */
5528             s += UTF8SKIP(s);
5529         }
5530         if (off >= 0)
5531             return NULL;
5532     }
5533     else {
5534         while (off++ && s > lim) {
5535             s--;
5536             if (UTF8_IS_CONTINUED(*s)) {
5537                 while (s > lim && UTF8_IS_CONTINUATION(*s))
5538                     s--;
5539             }
5540             /* XXX could check well-formedness here */
5541         }
5542         if (off <= 0)
5543             return NULL;
5544     }
5545     return s;
5546 }
5547
5548 static void
5549 restore_pos(pTHX_ void *arg)
5550 {
5551     dVAR;
5552     regexp * const rex = (regexp *)arg;
5553     if (PL_reg_eval_set) {
5554         if (PL_reg_oldsaved) {
5555             rex->subbeg = PL_reg_oldsaved;
5556             rex->sublen = PL_reg_oldsavedlen;
5557 #ifdef PERL_OLD_COPY_ON_WRITE
5558             rex->saved_copy = PL_nrs;
5559 #endif
5560             RX_MATCH_COPIED_on(rex);
5561         }
5562         PL_reg_magic->mg_len = PL_reg_oldpos;
5563         PL_reg_eval_set = 0;
5564         PL_curpm = PL_reg_oldcurpm;
5565     }   
5566 }
5567
5568 STATIC void
5569 S_to_utf8_substr(pTHX_ register regexp *prog)
5570 {
5571     if (prog->float_substr && !prog->float_utf8) {
5572         SV* const sv = newSVsv(prog->float_substr);
5573         prog->float_utf8 = sv;
5574         sv_utf8_upgrade(sv);
5575         if (SvTAIL(prog->float_substr))
5576             SvTAIL_on(sv);
5577         if (prog->float_substr == prog->check_substr)
5578             prog->check_utf8 = sv;
5579     }
5580     if (prog->anchored_substr && !prog->anchored_utf8) {
5581         SV* const sv = newSVsv(prog->anchored_substr);
5582         prog->anchored_utf8 = sv;
5583         sv_utf8_upgrade(sv);
5584         if (SvTAIL(prog->anchored_substr))
5585             SvTAIL_on(sv);
5586         if (prog->anchored_substr == prog->check_substr)
5587             prog->check_utf8 = sv;
5588     }
5589 }
5590
5591 STATIC void
5592 S_to_byte_substr(pTHX_ register regexp *prog)
5593 {
5594     dVAR;
5595     if (prog->float_utf8 && !prog->float_substr) {
5596         SV* sv = newSVsv(prog->float_utf8);
5597         prog->float_substr = sv;
5598         if (sv_utf8_downgrade(sv, TRUE)) {
5599             if (SvTAIL(prog->float_utf8))
5600                 SvTAIL_on(sv);
5601         } else {
5602             SvREFCNT_dec(sv);
5603             prog->float_substr = sv = &PL_sv_undef;
5604         }
5605         if (prog->float_utf8 == prog->check_utf8)
5606             prog->check_substr = sv;
5607     }
5608     if (prog->anchored_utf8 && !prog->anchored_substr) {
5609         SV* sv = newSVsv(prog->anchored_utf8);
5610         prog->anchored_substr = sv;
5611         if (sv_utf8_downgrade(sv, TRUE)) {
5612             if (SvTAIL(prog->anchored_utf8))
5613                 SvTAIL_on(sv);
5614         } else {
5615             SvREFCNT_dec(sv);
5616             prog->anchored_substr = sv = &PL_sv_undef;
5617         }
5618         if (prog->anchored_utf8 == prog->check_utf8)
5619             prog->check_substr = sv;
5620     }
5621 }
5622
5623 /*
5624  * Local variables:
5625  * c-indentation-style: bsd
5626  * c-basic-offset: 4
5627  * indent-tabs-mode: t
5628  * End:
5629  *
5630  * ex: set ts=8 sts=4 sw=4 noet:
5631  */