This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
464ceaf9e33ef8ec4c3e4884b10d48ec6f4a5c09
[perl5.git] / regexec.c
1 /*    regexec.c
2  */
3
4 /*
5  * "One Ring to rule them all, One Ring to find them..."
6  */
7
8 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
9  * confused with the original package (see point 3 below).  Thanks, Henry!
10  */
11
12 /* Additional note: this code is very heavily munged from Henry's version
13  * in places.  In some spots I've traded clarity for efficiency, so don't
14  * blame Henry for some of the lack of readability.
15  */
16
17 /* The names of the functions have been changed from regcomp and
18  * regexec to  pregcomp and pregexec in order to avoid conflicts
19  * with the POSIX routines of the same names.
20 */
21
22 #ifdef PERL_EXT_RE_BUILD
23 /* need to replace pregcomp et al, so enable that */
24 #  ifndef PERL_IN_XSUB_RE
25 #    define PERL_IN_XSUB_RE
26 #  endif
27 /* need access to debugger hooks */
28 #  if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
29 #    define DEBUGGING
30 #  endif
31 #endif
32
33 #ifdef PERL_IN_XSUB_RE
34 /* We *really* need to overwrite these symbols: */
35 #  define Perl_regexec_flags my_regexec
36 #  define Perl_regdump my_regdump
37 #  define Perl_regprop my_regprop
38 #  define Perl_re_intuit_start my_re_intuit_start
39 /* *These* symbols are masked to allow static link. */
40 #  define Perl_pregexec my_pregexec
41 #  define Perl_reginitcolors my_reginitcolors
42 #  define Perl_regclass_swash my_regclass_swash
43
44 #  define PERL_NO_GET_CONTEXT
45 #endif
46
47 /*SUPPRESS 112*/
48 /*
49  * pregcomp and pregexec -- regsub and regerror are not used in perl
50  *
51  *      Copyright (c) 1986 by University of Toronto.
52  *      Written by Henry Spencer.  Not derived from licensed software.
53  *
54  *      Permission is granted to anyone to use this software for any
55  *      purpose on any computer system, and to redistribute it freely,
56  *      subject to the following restrictions:
57  *
58  *      1. The author is not responsible for the consequences of use of
59  *              this software, no matter how awful, even if they arise
60  *              from defects in it.
61  *
62  *      2. The origin of this software must not be misrepresented, either
63  *              by explicit claim or by omission.
64  *
65  *      3. Altered versions must be plainly marked as such, and must not
66  *              be misrepresented as being the original software.
67  *
68  ****    Alterations to Henry's code are...
69  ****
70  ****    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
71  ****    2000, 2001, 2002, 2003, by Larry Wall and others
72  ****
73  ****    You may distribute under the terms of either the GNU General Public
74  ****    License or the Artistic License, as specified in the README file.
75  *
76  * Beware that some of this code is subtly aware of the way operator
77  * precedence is structured in regular expressions.  Serious changes in
78  * regular-expression syntax might require a total rethink.
79  */
80 #include "EXTERN.h"
81 #define PERL_IN_REGEXEC_C
82 #include "perl.h"
83
84 #include "regcomp.h"
85
86 #define RF_tainted      1               /* tainted information used? */
87 #define RF_warned       2               /* warned about big count? */
88 #define RF_evaled       4               /* Did an EVAL with setting? */
89 #define RF_utf8         8               /* String contains multibyte chars? */
90 #define RF_false        16              /* odd number of nested negatives */
91
92 #define UTF ((PL_reg_flags & RF_utf8) != 0)
93
94 #define RS_init         1               /* eval environment created */
95 #define RS_set          2               /* replsv value is set */
96
97 #ifndef STATIC
98 #define STATIC  static
99 #endif
100
101 #define REGINCLASS(p,c)  (ANYOF_FLAGS(p) ? reginclass(p,c,0,0) : ANYOF_BITMAP_TEST(p,*(c)))
102
103 /*
104  * Forwards.
105  */
106
107 #define CHR_SVLEN(sv) (do_utf8 ? sv_len_utf8(sv) : SvCUR(sv))
108 #define CHR_DIST(a,b) (PL_reg_match_utf8 ? utf8_distance(a,b) : a - b)
109
110 #define reghop_c(pos,off) ((char*)reghop((U8*)pos, off))
111 #define reghopmaybe_c(pos,off) ((char*)reghopmaybe((U8*)pos, off))
112 #define HOP(pos,off) (PL_reg_match_utf8 ? reghop((U8*)pos, off) : (U8*)(pos + off))
113 #define HOPMAYBE(pos,off) (PL_reg_match_utf8 ? reghopmaybe((U8*)pos, off) : (U8*)(pos + off))
114 #define HOPc(pos,off) ((char*)HOP(pos,off))
115 #define HOPMAYBEc(pos,off) ((char*)HOPMAYBE(pos,off))
116
117 #define HOPBACK(pos, off) (             \
118     (PL_reg_match_utf8)                 \
119         ? reghopmaybe((U8*)pos, -off)   \
120     : (pos - off >= PL_bostr)           \
121         ? (U8*)(pos - off)              \
122     : (U8*)NULL                         \
123 )
124 #define HOPBACKc(pos, off) (char*)HOPBACK(pos, off)
125
126 #define reghop3_c(pos,off,lim) ((char*)reghop3((U8*)pos, off, (U8*)lim))
127 #define reghopmaybe3_c(pos,off,lim) ((char*)reghopmaybe3((U8*)pos, off, (U8*)lim))
128 #define HOP3(pos,off,lim) (PL_reg_match_utf8 ? reghop3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
129 #define HOPMAYBE3(pos,off,lim) (PL_reg_match_utf8 ? reghopmaybe3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
130 #define HOP3c(pos,off,lim) ((char*)HOP3(pos,off,lim))
131 #define HOPMAYBE3c(pos,off,lim) ((char*)HOPMAYBE3(pos,off,lim))
132
133 #define LOAD_UTF8_CHARCLASS(a,b) STMT_START { if (!CAT2(PL_utf8_,a)) { ENTER; save_re_context(); (void)CAT2(is_utf8_, a)((U8*)b); LEAVE; } } STMT_END
134
135 /* for use after a quantifier and before an EXACT-like node -- japhy */
136 #define JUMPABLE(rn) ( \
137     OP(rn) == OPEN || OP(rn) == CLOSE || OP(rn) == EVAL || \
138     OP(rn) == SUSPEND || OP(rn) == IFMATCH || \
139     OP(rn) == PLUS || OP(rn) == MINMOD || \
140     (PL_regkind[(U8)OP(rn)] == CURLY && ARG1(rn) > 0) \
141 )
142
143 #define HAS_TEXT(rn) ( \
144     PL_regkind[(U8)OP(rn)] == EXACT || PL_regkind[(U8)OP(rn)] == REF \
145 )
146
147 /*
148   Search for mandatory following text node; for lookahead, the text must
149   follow but for lookbehind (rn->flags != 0) we skip to the next step.
150 */
151 #define FIND_NEXT_IMPT(rn) STMT_START { \
152     while (JUMPABLE(rn)) \
153         if (OP(rn) == SUSPEND || PL_regkind[(U8)OP(rn)] == CURLY) \
154             rn = NEXTOPER(NEXTOPER(rn)); \
155         else if (OP(rn) == PLUS) \
156             rn = NEXTOPER(rn); \
157         else if (OP(rn) == IFMATCH) \
158             rn = (rn->flags == 0) ? NEXTOPER(NEXTOPER(rn)) : rn + ARG(rn); \
159         else rn += NEXT_OFF(rn); \
160 } STMT_END 
161
162 static void restore_pos(pTHX_ void *arg);
163
164 STATIC CHECKPOINT
165 S_regcppush(pTHX_ I32 parenfloor)
166 {
167     int retval = PL_savestack_ix;
168 #define REGCP_PAREN_ELEMS 4
169     int paren_elems_to_push = (PL_regsize - parenfloor) * REGCP_PAREN_ELEMS;
170     int p;
171
172     if (paren_elems_to_push < 0)
173         Perl_croak(aTHX_ "panic: paren_elems_to_push < 0");
174
175 #define REGCP_OTHER_ELEMS 6
176     SSGROW(paren_elems_to_push + REGCP_OTHER_ELEMS);
177     for (p = PL_regsize; p > parenfloor; p--) {
178 /* REGCP_PARENS_ELEMS are pushed per pairs of parentheses. */
179         SSPUSHINT(PL_regendp[p]);
180         SSPUSHINT(PL_regstartp[p]);
181         SSPUSHPTR(PL_reg_start_tmp[p]);
182         SSPUSHINT(p);
183     }
184 /* REGCP_OTHER_ELEMS are pushed in any case, parentheses or no. */
185     SSPUSHINT(PL_regsize);
186     SSPUSHINT(*PL_reglastparen);
187     SSPUSHINT(*PL_reglastcloseparen);
188     SSPUSHPTR(PL_reginput);
189 #define REGCP_FRAME_ELEMS 2
190 /* REGCP_FRAME_ELEMS are part of the REGCP_OTHER_ELEMS and
191  * are needed for the regexp context stack bookkeeping. */
192     SSPUSHINT(paren_elems_to_push + REGCP_OTHER_ELEMS - REGCP_FRAME_ELEMS);
193     SSPUSHINT(SAVEt_REGCONTEXT); /* Magic cookie. */
194
195     return retval;
196 }
197
198 /* These are needed since we do not localize EVAL nodes: */
199 #  define REGCP_SET(cp)  DEBUG_r(PerlIO_printf(Perl_debug_log,          \
200                              "  Setting an EVAL scope, savestack=%"IVdf"\n",    \
201                              (IV)PL_savestack_ix)); cp = PL_savestack_ix
202
203 #  define REGCP_UNWIND(cp)  DEBUG_r(cp != PL_savestack_ix ?             \
204                                 PerlIO_printf(Perl_debug_log,           \
205                                 "  Clearing an EVAL scope, savestack=%"IVdf"..%"IVdf"\n", \
206                                 (IV)(cp), (IV)PL_savestack_ix) : 0); regcpblow(cp)
207
208 STATIC char *
209 S_regcppop(pTHX)
210 {
211     I32 i;
212     U32 paren = 0;
213     char *input;
214     I32 tmps;
215
216     /* Pop REGCP_OTHER_ELEMS before the parentheses loop starts. */
217     i = SSPOPINT;
218     assert(i == SAVEt_REGCONTEXT); /* Check that the magic cookie is there. */
219     i = SSPOPINT; /* Parentheses elements to pop. */
220     input = (char *) SSPOPPTR;
221     *PL_reglastcloseparen = SSPOPINT;
222     *PL_reglastparen = SSPOPINT;
223     PL_regsize = SSPOPINT;
224
225     /* Now restore the parentheses context. */
226     for (i -= (REGCP_OTHER_ELEMS - REGCP_FRAME_ELEMS);
227          i > 0; i -= REGCP_PAREN_ELEMS) {
228         paren = (U32)SSPOPINT;
229         PL_reg_start_tmp[paren] = (char *) SSPOPPTR;
230         PL_regstartp[paren] = SSPOPINT;
231         tmps = SSPOPINT;
232         if (paren <= *PL_reglastparen)
233             PL_regendp[paren] = tmps;
234         DEBUG_r(
235             PerlIO_printf(Perl_debug_log,
236                           "     restoring \\%"UVuf" to %"IVdf"(%"IVdf")..%"IVdf"%s\n",
237                           (UV)paren, (IV)PL_regstartp[paren],
238                           (IV)(PL_reg_start_tmp[paren] - PL_bostr),
239                           (IV)PL_regendp[paren],
240                           (paren > *PL_reglastparen ? "(no)" : ""));
241         );
242     }
243     DEBUG_r(
244         if ((I32)(*PL_reglastparen + 1) <= PL_regnpar) {
245             PerlIO_printf(Perl_debug_log,
246                           "     restoring \\%"IVdf"..\\%"IVdf" to undef\n",
247                           (IV)(*PL_reglastparen + 1), (IV)PL_regnpar);
248         }
249     );
250 #if 1
251     /* It would seem that the similar code in regtry()
252      * already takes care of this, and in fact it is in
253      * a better location to since this code can #if 0-ed out
254      * but the code in regtry() is needed or otherwise tests
255      * requiring null fields (pat.t#187 and split.t#{13,14}
256      * (as of patchlevel 7877)  will fail.  Then again,
257      * this code seems to be necessary or otherwise
258      * building DynaLoader will fail:
259      * "Error: '*' not in typemap in DynaLoader.xs, line 164"
260      * --jhi */
261     for (paren = *PL_reglastparen + 1; (I32)paren <= PL_regnpar; paren++) {
262         if ((I32)paren > PL_regsize)
263             PL_regstartp[paren] = -1;
264         PL_regendp[paren] = -1;
265     }
266 #endif
267     return input;
268 }
269
270 STATIC char *
271 S_regcp_set_to(pTHX_ I32 ss)
272 {
273     I32 tmp = PL_savestack_ix;
274
275     PL_savestack_ix = ss;
276     regcppop();
277     PL_savestack_ix = tmp;
278     return Nullch;
279 }
280
281 typedef struct re_cc_state
282 {
283     I32 ss;
284     regnode *node;
285     struct re_cc_state *prev;
286     CURCUR *cc;
287     regexp *re;
288 } re_cc_state;
289
290 #define regcpblow(cp) LEAVE_SCOPE(cp)   /* Ignores regcppush()ed data. */
291
292 #define TRYPAREN(paren, n, input) {                             \
293     if (paren) {                                                \
294         if (n) {                                                \
295             PL_regstartp[paren] = HOPc(input, -1) - PL_bostr;   \
296             PL_regendp[paren] = input - PL_bostr;               \
297         }                                                       \
298         else                                                    \
299             PL_regendp[paren] = -1;                             \
300     }                                                           \
301     if (regmatch(next))                                         \
302         sayYES;                                                 \
303     if (paren && n)                                             \
304         PL_regendp[paren] = -1;                                 \
305 }
306
307
308 /*
309  * pregexec and friends
310  */
311
312 /*
313  - pregexec - match a regexp against a string
314  */
315 I32
316 Perl_pregexec(pTHX_ register regexp *prog, char *stringarg, register char *strend,
317          char *strbeg, I32 minend, SV *screamer, U32 nosave)
318 /* strend: pointer to null at end of string */
319 /* strbeg: real beginning of string */
320 /* minend: end of match must be >=minend after stringarg. */
321 /* nosave: For optimizations. */
322 {
323     return
324         regexec_flags(prog, stringarg, strend, strbeg, minend, screamer, NULL,
325                       nosave ? 0 : REXEC_COPY_STR);
326 }
327
328 STATIC void
329 S_cache_re(pTHX_ regexp *prog)
330 {
331     PL_regprecomp = prog->precomp;              /* Needed for FAIL. */
332 #ifdef DEBUGGING
333     PL_regprogram = prog->program;
334 #endif
335     PL_regnpar = prog->nparens;
336     PL_regdata = prog->data;
337     PL_reg_re = prog;
338 }
339
340 /*
341  * Need to implement the following flags for reg_anch:
342  *
343  * USE_INTUIT_NOML              - Useful to call re_intuit_start() first
344  * USE_INTUIT_ML
345  * INTUIT_AUTORITATIVE_NOML     - Can trust a positive answer
346  * INTUIT_AUTORITATIVE_ML
347  * INTUIT_ONCE_NOML             - Intuit can match in one location only.
348  * INTUIT_ONCE_ML
349  *
350  * Another flag for this function: SECOND_TIME (so that float substrs
351  * with giant delta may be not rechecked).
352  */
353
354 /* Assumptions: if ANCH_GPOS, then strpos is anchored. XXXX Check GPOS logic */
355
356 /* If SCREAM, then SvPVX(sv) should be compatible with strpos and strend.
357    Otherwise, only SvCUR(sv) is used to get strbeg. */
358
359 /* XXXX We assume that strpos is strbeg unless sv. */
360
361 /* XXXX Some places assume that there is a fixed substring.
362         An update may be needed if optimizer marks as "INTUITable"
363         RExen without fixed substrings.  Similarly, it is assumed that
364         lengths of all the strings are no more than minlen, thus they
365         cannot come from lookahead.
366         (Or minlen should take into account lookahead.) */
367
368 /* A failure to find a constant substring means that there is no need to make
369    an expensive call to REx engine, thus we celebrate a failure.  Similarly,
370    finding a substring too deep into the string means that less calls to
371    regtry() should be needed.
372
373    REx compiler's optimizer found 4 possible hints:
374         a) Anchored substring;
375         b) Fixed substring;
376         c) Whether we are anchored (beginning-of-line or \G);
377         d) First node (of those at offset 0) which may distingush positions;
378    We use a)b)d) and multiline-part of c), and try to find a position in the
379    string which does not contradict any of them.
380  */
381
382 /* Most of decisions we do here should have been done at compile time.
383    The nodes of the REx which we used for the search should have been
384    deleted from the finite automaton. */
385
386 char *
387 Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
388                      char *strend, U32 flags, re_scream_pos_data *data)
389 {
390     register I32 start_shift = 0;
391     /* Should be nonnegative! */
392     register I32 end_shift   = 0;
393     register char *s;
394     register SV *check;
395     char *strbeg;
396     char *t;
397     int do_utf8 = sv ? SvUTF8(sv) : 0;  /* if no sv we have to assume bytes */
398     I32 ml_anch;
399     register char *other_last = Nullch; /* other substr checked before this */
400     char *check_at = Nullch;            /* check substr found at this pos */
401 #ifdef DEBUGGING
402     char *i_strpos = strpos;
403     SV *dsv = PERL_DEBUG_PAD_ZERO(0);
404 #endif
405     RX_MATCH_UTF8_set(prog,do_utf8);
406
407     if (prog->reganch & ROPT_UTF8) {
408         DEBUG_r(PerlIO_printf(Perl_debug_log,
409                               "UTF-8 regex...\n"));
410         PL_reg_flags |= RF_utf8;
411     }
412
413     DEBUG_r({
414          char *s   = PL_reg_match_utf8 ?
415                          sv_uni_display(dsv, sv, 60, UNI_DISPLAY_REGEX) :
416                          strpos;
417          int   len = PL_reg_match_utf8 ?
418                          strlen(s) : strend - strpos;
419          if (!PL_colorset)
420               reginitcolors();
421          if (PL_reg_match_utf8)
422              DEBUG_r(PerlIO_printf(Perl_debug_log,
423                                    "UTF-8 target...\n"));
424          PerlIO_printf(Perl_debug_log,
425                        "%sGuessing start of match, REx%s `%s%.60s%s%s' against `%s%.*s%s%s'...\n",
426                        PL_colors[4],PL_colors[5],PL_colors[0],
427                        prog->precomp,
428                        PL_colors[1],
429                        (strlen(prog->precomp) > 60 ? "..." : ""),
430                        PL_colors[0],
431                        (int)(len > 60 ? 60 : len),
432                        s, PL_colors[1],
433                        (len > 60 ? "..." : "")
434               );
435     });
436
437     /* CHR_DIST() would be more correct here but it makes things slow. */
438     if (prog->minlen > strend - strpos) {
439         DEBUG_r(PerlIO_printf(Perl_debug_log,
440                               "String too short... [re_intuit_start]\n"));
441         goto fail;
442     }
443     strbeg = (sv && SvPOK(sv)) ? strend - SvCUR(sv) : strpos;
444     PL_regeol = strend;
445     if (do_utf8) {
446         if (!prog->check_utf8 && prog->check_substr)
447             to_utf8_substr(prog);
448         check = prog->check_utf8;
449     } else {
450         if (!prog->check_substr && prog->check_utf8)
451             to_byte_substr(prog);
452         check = prog->check_substr;
453     }
454    if (check == &PL_sv_undef) {
455         DEBUG_r(PerlIO_printf(Perl_debug_log,
456                 "Non-utf string cannot match utf check string\n"));
457         goto fail;
458     }
459     if (prog->reganch & ROPT_ANCH) {    /* Match at beg-of-str or after \n */
460         ml_anch = !( (prog->reganch & ROPT_ANCH_SINGLE)
461                      || ( (prog->reganch & ROPT_ANCH_BOL)
462                           && !PL_multiline ) ); /* Check after \n? */
463
464         if (!ml_anch) {
465           if ( !(prog->reganch & (ROPT_ANCH_GPOS /* Checked by the caller */
466                                   | ROPT_IMPLICIT)) /* not a real BOL */
467                /* SvCUR is not set on references: SvRV and SvPVX overlap */
468                && sv && !SvROK(sv)
469                && (strpos != strbeg)) {
470               DEBUG_r(PerlIO_printf(Perl_debug_log, "Not at start...\n"));
471               goto fail;
472           }
473           if (prog->check_offset_min == prog->check_offset_max &&
474               !(prog->reganch & ROPT_CANY_SEEN)) {
475             /* Substring at constant offset from beg-of-str... */
476             I32 slen;
477
478             s = HOP3c(strpos, prog->check_offset_min, strend);
479             if (SvTAIL(check)) {
480                 slen = SvCUR(check);    /* >= 1 */
481
482                 if ( strend - s > slen || strend - s < slen - 1
483                      || (strend - s == slen && strend[-1] != '\n')) {
484                     DEBUG_r(PerlIO_printf(Perl_debug_log, "String too long...\n"));
485                     goto fail_finish;
486                 }
487                 /* Now should match s[0..slen-2] */
488                 slen--;
489                 if (slen && (*SvPVX(check) != *s
490                              || (slen > 1
491                                  && memNE(SvPVX(check), s, slen)))) {
492                   report_neq:
493                     DEBUG_r(PerlIO_printf(Perl_debug_log, "String not equal...\n"));
494                     goto fail_finish;
495                 }
496             }
497             else if (*SvPVX(check) != *s
498                      || ((slen = SvCUR(check)) > 1
499                          && memNE(SvPVX(check), s, slen)))
500                 goto report_neq;
501             goto success_at_start;
502           }
503         }
504         /* Match is anchored, but substr is not anchored wrt beg-of-str. */
505         s = strpos;
506         start_shift = prog->check_offset_min; /* okay to underestimate on CC */
507         end_shift = prog->minlen - start_shift -
508             CHR_SVLEN(check) + (SvTAIL(check) != 0);
509         if (!ml_anch) {
510             I32 end = prog->check_offset_max + CHR_SVLEN(check)
511                                          - (SvTAIL(check) != 0);
512             I32 eshift = CHR_DIST((U8*)strend, (U8*)s) - end;
513
514             if (end_shift < eshift)
515                 end_shift = eshift;
516         }
517     }
518     else {                              /* Can match at random position */
519         ml_anch = 0;
520         s = strpos;
521         start_shift = prog->check_offset_min; /* okay to underestimate on CC */
522         /* Should be nonnegative! */
523         end_shift = prog->minlen - start_shift -
524             CHR_SVLEN(check) + (SvTAIL(check) != 0);
525     }
526
527 #ifdef DEBUGGING        /* 7/99: reports of failure (with the older version) */
528     if (end_shift < 0)
529         Perl_croak(aTHX_ "panic: end_shift");
530 #endif
531
532   restart:
533     /* Find a possible match in the region s..strend by looking for
534        the "check" substring in the region corrected by start/end_shift. */
535     if (flags & REXEC_SCREAM) {
536         I32 p = -1;                     /* Internal iterator of scream. */
537         I32 *pp = data ? data->scream_pos : &p;
538
539         if (PL_screamfirst[BmRARE(check)] >= 0
540             || ( BmRARE(check) == '\n'
541                  && (BmPREVIOUS(check) == SvCUR(check) - 1)
542                  && SvTAIL(check) ))
543             s = screaminstr(sv, check,
544                             start_shift + (s - strbeg), end_shift, pp, 0);
545         else
546             goto fail_finish;
547         /* we may be pointing at the wrong string */
548         if (s && RX_MATCH_COPIED(prog))
549             s = strbeg + (s - SvPVX(sv));
550         if (data)
551             *data->scream_olds = s;
552     }
553     else if (prog->reganch & ROPT_CANY_SEEN)
554         s = fbm_instr((U8*)(s + start_shift),
555                       (U8*)(strend - end_shift),
556                       check, PL_multiline ? FBMrf_MULTILINE : 0);
557     else
558         s = fbm_instr(HOP3(s, start_shift, strend),
559                       HOP3(strend, -end_shift, strbeg),
560                       check, PL_multiline ? FBMrf_MULTILINE : 0);
561
562     /* Update the count-of-usability, remove useless subpatterns,
563         unshift s.  */
564
565     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s %s substr `%s%.*s%s'%s%s",
566                           (s ? "Found" : "Did not find"),
567                           (check == (do_utf8 ? prog->anchored_utf8 : prog->anchored_substr) ? "anchored" : "floating"),
568                           PL_colors[0],
569                           (int)(SvCUR(check) - (SvTAIL(check)!=0)),
570                           SvPVX(check),
571                           PL_colors[1], (SvTAIL(check) ? "$" : ""),
572                           (s ? " at offset " : "...\n") ) );
573
574     if (!s)
575         goto fail_finish;
576
577     check_at = s;
578
579     /* Finish the diagnostic message */
580     DEBUG_r(PerlIO_printf(Perl_debug_log, "%ld...\n", (long)(s - i_strpos)) );
581
582     /* Got a candidate.  Check MBOL anchoring, and the *other* substr.
583        Start with the other substr.
584        XXXX no SCREAM optimization yet - and a very coarse implementation
585        XXXX /ttx+/ results in anchored=`ttx', floating=`x'.  floating will
586                 *always* match.  Probably should be marked during compile...
587        Probably it is right to do no SCREAM here...
588      */
589
590     if (do_utf8 ? (prog->float_utf8 && prog->anchored_utf8) : (prog->float_substr && prog->anchored_substr)) {
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 *last = HOP3c(s, -start_shift, strbeg), *last1, *last2;
599                 char *s1 = s;
600                 SV* must;
601
602                 t = s - prog->check_offset_max;
603                 if (s - strpos > prog->check_offset_max  /* signed-corrected t > strpos */
604                     && (!do_utf8
605                         || ((t = reghopmaybe3_c(s, -(prog->check_offset_max), strpos))
606                             && t > strpos)))
607                     /* EMPTY */;
608                 else
609                     t = strpos;
610                 t = HOP3c(t, prog->anchored_offset, strend);
611                 if (t < other_last)     /* These positions already checked */
612                     t = other_last;
613                 last2 = last1 = HOP3c(strend, -prog->minlen, strbeg);
614                 if (last < last1)
615                     last1 = last;
616  /* XXXX It is not documented what units *_offsets are in.  Assume bytes.  */
617                 /* On end-of-str: see comment below. */
618                 must = do_utf8 ? prog->anchored_utf8 : prog->anchored_substr;
619                 if (must == &PL_sv_undef) {
620                     s = (char*)NULL;
621                     DEBUG_r(must = prog->anchored_utf8);        /* for debug */
622                 }
623                 else
624                     s = fbm_instr(
625                         (unsigned char*)t,
626                         HOP3(HOP3(last1, prog->anchored_offset, strend)
627                                 + SvCUR(must), -(SvTAIL(must)!=0), strbeg),
628                         must,
629                         PL_multiline ? FBMrf_MULTILINE : 0
630                     );
631                 DEBUG_r(PerlIO_printf(Perl_debug_log,
632                         "%s anchored substr `%s%.*s%s'%s",
633                         (s ? "Found" : "Contradicts"),
634                         PL_colors[0],
635                           (int)(SvCUR(must)
636                           - (SvTAIL(must)!=0)),
637                           SvPVX(must),
638                           PL_colors[1], (SvTAIL(must) ? "$" : "")));
639                 if (!s) {
640                     if (last1 >= last2) {
641                         DEBUG_r(PerlIO_printf(Perl_debug_log,
642                                                 ", giving up...\n"));
643                         goto fail_finish;
644                     }
645                     DEBUG_r(PerlIO_printf(Perl_debug_log,
646                         ", trying floating at offset %ld...\n",
647                         (long)(HOP3c(s1, 1, strend) - i_strpos)));
648                     other_last = HOP3c(last1, prog->anchored_offset+1, strend);
649                     s = HOP3c(last, 1, strend);
650                     goto restart;
651                 }
652                 else {
653                     DEBUG_r(PerlIO_printf(Perl_debug_log, " at offset %ld...\n",
654                           (long)(s - i_strpos)));
655                     t = HOP3c(s, -prog->anchored_offset, strbeg);
656                     other_last = HOP3c(s, 1, strend);
657                     s = s1;
658                     if (t == strpos)
659                         goto try_at_start;
660                     goto try_at_offset;
661                 }
662             }
663         }
664         else {          /* Take into account the floating substring. */
665             char *last, *last1;
666             char *s1 = s;
667             SV* must;
668
669             t = HOP3c(s, -start_shift, strbeg);
670             last1 = last =
671                 HOP3c(strend, -prog->minlen + prog->float_min_offset, strbeg);
672             if (CHR_DIST((U8*)last, (U8*)t) > prog->float_max_offset)
673                 last = HOP3c(t, prog->float_max_offset, strend);
674             s = HOP3c(t, prog->float_min_offset, strend);
675             if (s < other_last)
676                 s = other_last;
677  /* XXXX It is not documented what units *_offsets are in.  Assume bytes.  */
678             must = do_utf8 ? prog->float_utf8 : prog->float_substr;
679             /* fbm_instr() takes into account exact value of end-of-str
680                if the check is SvTAIL(ed).  Since false positives are OK,
681                and end-of-str is not later than strend we are OK. */
682             if (must == &PL_sv_undef) {
683                 s = (char*)NULL;
684                 DEBUG_r(must = prog->float_utf8);       /* for debug message */
685             }
686             else
687                 s = fbm_instr((unsigned char*)s,
688                               (unsigned char*)last + SvCUR(must)
689                                   - (SvTAIL(must)!=0),
690                               must, PL_multiline ? FBMrf_MULTILINE : 0);
691             DEBUG_r(PerlIO_printf(Perl_debug_log, "%s floating substr `%s%.*s%s'%s",
692                     (s ? "Found" : "Contradicts"),
693                     PL_colors[0],
694                       (int)(SvCUR(must) - (SvTAIL(must)!=0)),
695                       SvPVX(must),
696                       PL_colors[1], (SvTAIL(must) ? "$" : "")));
697             if (!s) {
698                 if (last1 == last) {
699                     DEBUG_r(PerlIO_printf(Perl_debug_log,
700                                             ", giving up...\n"));
701                     goto fail_finish;
702                 }
703                 DEBUG_r(PerlIO_printf(Perl_debug_log,
704                     ", trying anchored starting at offset %ld...\n",
705                     (long)(s1 + 1 - i_strpos)));
706                 other_last = last;
707                 s = HOP3c(t, 1, strend);
708                 goto restart;
709             }
710             else {
711                 DEBUG_r(PerlIO_printf(Perl_debug_log, " at offset %ld...\n",
712                       (long)(s - i_strpos)));
713                 other_last = s; /* Fix this later. --Hugo */
714                 s = s1;
715                 if (t == strpos)
716                     goto try_at_start;
717                 goto try_at_offset;
718             }
719         }
720     }
721
722     t = s - prog->check_offset_max;
723     if (s - strpos > prog->check_offset_max  /* signed-corrected t > strpos */
724         && (!do_utf8
725             || ((t = reghopmaybe3_c(s, -prog->check_offset_max, strpos))
726                  && t > strpos))) {
727         /* Fixed substring is found far enough so that the match
728            cannot start at strpos. */
729       try_at_offset:
730         if (ml_anch && t[-1] != '\n') {
731             /* Eventually fbm_*() should handle this, but often
732                anchored_offset is not 0, so this check will not be wasted. */
733             /* XXXX In the code below we prefer to look for "^" even in
734                presence of anchored substrings.  And we search even
735                beyond the found float position.  These pessimizations
736                are historical artefacts only.  */
737           find_anchor:
738             while (t < strend - prog->minlen) {
739                 if (*t == '\n') {
740                     if (t < check_at - prog->check_offset_min) {
741                         if (do_utf8 ? prog->anchored_utf8 : prog->anchored_substr) {
742                             /* Since we moved from the found position,
743                                we definitely contradict the found anchored
744                                substr.  Due to the above check we do not
745                                contradict "check" substr.
746                                Thus we can arrive here only if check substr
747                                is float.  Redo checking for "other"=="fixed".
748                              */
749                             strpos = t + 1;                     
750                             DEBUG_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m at offset %ld, rescanning for anchored from offset %ld...\n",
751                                 PL_colors[0],PL_colors[1], (long)(strpos - i_strpos), (long)(strpos - i_strpos + prog->anchored_offset)));
752                             goto do_other_anchored;
753                         }
754                         /* We don't contradict the found floating substring. */
755                         /* XXXX Why not check for STCLASS? */
756                         s = t + 1;
757                         DEBUG_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m at offset %ld...\n",
758                             PL_colors[0],PL_colors[1], (long)(s - i_strpos)));
759                         goto set_useful;
760                     }
761                     /* Position contradicts check-string */
762                     /* XXXX probably better to look for check-string
763                        than for "\n", so one should lower the limit for t? */
764                     DEBUG_r(PerlIO_printf(Perl_debug_log, "Found /%s^%s/m, restarting lookup for check-string at offset %ld...\n",
765                         PL_colors[0],PL_colors[1], (long)(t + 1 - i_strpos)));
766                     other_last = strpos = s = t + 1;
767                     goto restart;
768                 }
769                 t++;
770             }
771             DEBUG_r(PerlIO_printf(Perl_debug_log, "Did not find /%s^%s/m...\n",
772                         PL_colors[0],PL_colors[1]));
773             goto fail_finish;
774         }
775         else {
776             DEBUG_r(PerlIO_printf(Perl_debug_log, "Starting position does not contradict /%s^%s/m...\n",
777                         PL_colors[0],PL_colors[1]));
778         }
779         s = t;
780       set_useful:
781         ++BmUSEFUL(do_utf8 ? prog->check_utf8 : prog->check_substr);    /* hooray/5 */
782     }
783     else {
784         /* The found string does not prohibit matching at strpos,
785            - no optimization of calling REx engine can be performed,
786            unless it was an MBOL and we are not after MBOL,
787            or a future STCLASS check will fail this. */
788       try_at_start:
789         /* Even in this situation we may use MBOL flag if strpos is offset
790            wrt the start of the string. */
791         if (ml_anch && sv && !SvROK(sv) /* See prev comment on SvROK */
792             && (strpos != strbeg) && strpos[-1] != '\n'
793             /* May be due to an implicit anchor of m{.*foo}  */
794             && !(prog->reganch & ROPT_IMPLICIT))
795         {
796             t = strpos;
797             goto find_anchor;
798         }
799         DEBUG_r( if (ml_anch)
800             PerlIO_printf(Perl_debug_log, "Position at offset %ld does not contradict /%s^%s/m...\n",
801                         (long)(strpos - i_strpos), PL_colors[0],PL_colors[1]);
802         );
803       success_at_start:
804         if (!(prog->reganch & ROPT_NAUGHTY)     /* XXXX If strpos moved? */
805             && (do_utf8 ? (
806                 prog->check_utf8                /* Could be deleted already */
807                 && --BmUSEFUL(prog->check_utf8) < 0
808                 && (prog->check_utf8 == prog->float_utf8)
809             ) : (
810                 prog->check_substr              /* Could be deleted already */
811                 && --BmUSEFUL(prog->check_substr) < 0
812                 && (prog->check_substr == prog->float_substr)
813             )))
814         {
815             /* If flags & SOMETHING - do not do it many times on the same match */
816             DEBUG_r(PerlIO_printf(Perl_debug_log, "... Disabling check substring...\n"));
817             SvREFCNT_dec(do_utf8 ? prog->check_utf8 : prog->check_substr);
818             if (do_utf8 ? prog->check_substr : prog->check_utf8)
819                 SvREFCNT_dec(do_utf8 ? prog->check_substr : prog->check_utf8);
820             prog->check_substr = prog->check_utf8 = Nullsv;     /* disable */
821             prog->float_substr = prog->float_utf8 = Nullsv;     /* clear */
822             check = Nullsv;                     /* abort */
823             s = strpos;
824             /* XXXX This is a remnant of the old implementation.  It
825                     looks wasteful, since now INTUIT can use many
826                     other heuristics. */
827             prog->reganch &= ~RE_USE_INTUIT;
828         }
829         else
830             s = strpos;
831     }
832
833     /* Last resort... */
834     /* XXXX BmUSEFUL already changed, maybe multiple change is meaningful... */
835     if (prog->regstclass) {
836         /* minlen == 0 is possible if regstclass is \b or \B,
837            and the fixed substr is ''$.
838            Since minlen is already taken into account, s+1 is before strend;
839            accidentally, minlen >= 1 guaranties no false positives at s + 1
840            even for \b or \B.  But (minlen? 1 : 0) below assumes that
841            regstclass does not come from lookahead...  */
842         /* If regstclass takes bytelength more than 1: If charlength==1, OK.
843            This leaves EXACTF only, which is dealt with in find_byclass().  */
844         U8* str = (U8*)STRING(prog->regstclass);
845         int cl_l = (PL_regkind[(U8)OP(prog->regstclass)] == EXACT
846                     ? CHR_DIST(str+STR_LEN(prog->regstclass), str)
847                     : 1);
848         char *endpos = (prog->anchored_substr || prog->anchored_utf8 || ml_anch)
849                 ? HOP3c(s, (prog->minlen ? cl_l : 0), strend)
850                 : (prog->float_substr || prog->float_utf8
851                    ? HOP3c(HOP3c(check_at, -start_shift, strbeg),
852                            cl_l, strend)
853                    : strend);
854         char *startpos = strbeg;
855
856         t = s;
857         cache_re(prog);
858         s = find_byclass(prog, prog->regstclass, s, endpos, startpos, 1);
859         if (!s) {
860 #ifdef DEBUGGING
861             char *what = 0;
862 #endif
863             if (endpos == strend) {
864                 DEBUG_r( PerlIO_printf(Perl_debug_log,
865                                 "Could not match STCLASS...\n") );
866                 goto fail;
867             }
868             DEBUG_r( PerlIO_printf(Perl_debug_log,
869                                    "This position contradicts STCLASS...\n") );
870             if ((prog->reganch & ROPT_ANCH) && !ml_anch)
871                 goto fail;
872             /* Contradict one of substrings */
873             if (prog->anchored_substr || prog->anchored_utf8) {
874                 if ((do_utf8 ? prog->anchored_utf8 : prog->anchored_substr) == check) {
875                     DEBUG_r( what = "anchored" );
876                   hop_and_restart:
877                     s = HOP3c(t, 1, strend);
878                     if (s + start_shift + end_shift > strend) {
879                         /* XXXX Should be taken into account earlier? */
880                         DEBUG_r( PerlIO_printf(Perl_debug_log,
881                                                "Could not match STCLASS...\n") );
882                         goto fail;
883                     }
884                     if (!check)
885                         goto giveup;
886                     DEBUG_r( PerlIO_printf(Perl_debug_log,
887                                 "Looking for %s substr starting at offset %ld...\n",
888                                  what, (long)(s + start_shift - i_strpos)) );
889                     goto restart;
890                 }
891                 /* Have both, check_string is floating */
892                 if (t + start_shift >= check_at) /* Contradicts floating=check */
893                     goto retry_floating_check;
894                 /* Recheck anchored substring, but not floating... */
895                 s = check_at;
896                 if (!check)
897                     goto giveup;
898                 DEBUG_r( PerlIO_printf(Perl_debug_log,
899                           "Looking for anchored substr starting at offset %ld...\n",
900                           (long)(other_last - i_strpos)) );
901                 goto do_other_anchored;
902             }
903             /* Another way we could have checked stclass at the
904                current position only: */
905             if (ml_anch) {
906                 s = t = t + 1;
907                 if (!check)
908                     goto giveup;
909                 DEBUG_r( PerlIO_printf(Perl_debug_log,
910                           "Looking for /%s^%s/m starting at offset %ld...\n",
911                           PL_colors[0],PL_colors[1], (long)(t - i_strpos)) );
912                 goto try_at_offset;
913             }
914             if (!(do_utf8 ? prog->float_utf8 : prog->float_substr))     /* Could have been deleted */
915                 goto fail;
916             /* Check is floating subtring. */
917           retry_floating_check:
918             t = check_at - start_shift;
919             DEBUG_r( what = "floating" );
920             goto hop_and_restart;
921         }
922         if (t != s) {
923             DEBUG_r(PerlIO_printf(Perl_debug_log,
924                         "By STCLASS: moving %ld --> %ld\n",
925                                   (long)(t - i_strpos), (long)(s - i_strpos))
926                    );
927         }
928         else {
929             DEBUG_r(PerlIO_printf(Perl_debug_log,
930                                   "Does not contradict STCLASS...\n"); 
931                    );
932         }
933     }
934   giveup:
935     DEBUG_r(PerlIO_printf(Perl_debug_log, "%s%s:%s match at offset %ld\n",
936                           PL_colors[4], (check ? "Guessed" : "Giving up"),
937                           PL_colors[5], (long)(s - i_strpos)) );
938     return s;
939
940   fail_finish:                          /* Substring not found */
941     if (prog->check_substr || prog->check_utf8)         /* could be removed already */
942         BmUSEFUL(do_utf8 ? prog->check_utf8 : prog->check_substr) += 5; /* hooray */
943   fail:
944     DEBUG_r(PerlIO_printf(Perl_debug_log, "%sMatch rejected by optimizer%s\n",
945                           PL_colors[4],PL_colors[5]));
946     return Nullch;
947 }
948
949 /* We know what class REx starts with.  Try to find this position... */
950 STATIC char *
951 S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *startpos, I32 norun)
952 {
953         I32 doevery = (prog->reganch & ROPT_SKIP) == 0;
954         char *m;
955         STRLEN ln;
956         STRLEN lnc;
957         unsigned int c1;
958         unsigned int c2;
959         char *e;
960         register I32 tmp = 1;   /* Scratch variable? */
961         register bool do_utf8 = PL_reg_match_utf8;
962
963         /* We know what class it must start with. */
964         switch (OP(c)) {
965         case ANYOF:
966             if (do_utf8) {
967                  while (s < strend) {
968                       if ((ANYOF_FLAGS(c) & ANYOF_UNICODE) ||
969                           !UTF8_IS_INVARIANT((U8)s[0]) ?
970                           reginclass(c, (U8*)s, 0, do_utf8) :
971                           REGINCLASS(c, (U8*)s)) {
972                            if (tmp && (norun || regtry(prog, s)))
973                                 goto got_it;
974                            else
975                                 tmp = doevery;
976                       }
977                       else 
978                            tmp = 1;
979                       s += UTF8SKIP(s);
980                  }
981             }
982             else {
983                  while (s < strend) {
984                       STRLEN skip = 1;
985
986                       if (REGINCLASS(c, (U8*)s) ||
987                           (ANYOF_FOLD_SHARP_S(c, s, strend) &&
988                            /* The assignment of 2 is intentional:
989                             * for the folded sharp s, the skip is 2. */
990                            (skip = SHARP_S_SKIP))) {
991                            if (tmp && (norun || regtry(prog, s)))
992                                 goto got_it;
993                            else
994                                 tmp = doevery;
995                       }
996                       else 
997                            tmp = 1;
998                       s += skip;
999                  }
1000             }
1001             break;
1002         case CANY:
1003             while (s < strend) {
1004                 if (tmp && (norun || regtry(prog, s)))
1005                     goto got_it;
1006                 else
1007                     tmp = doevery;
1008                 s++;
1009             }
1010             break;
1011         case EXACTF:
1012             m   = STRING(c);
1013             ln  = STR_LEN(c);   /* length to match in octets/bytes */
1014             lnc = (I32) ln;     /* length to match in characters */
1015             if (UTF) {
1016                 STRLEN ulen1, ulen2;
1017                 U8 *sm = (U8 *) m;
1018                 U8 tmpbuf1[UTF8_MAXLEN_UCLC+1];
1019                 U8 tmpbuf2[UTF8_MAXLEN_UCLC+1];
1020
1021                 to_utf8_lower((U8*)m, tmpbuf1, &ulen1);
1022                 to_utf8_upper((U8*)m, tmpbuf2, &ulen2);
1023
1024                 c1 = utf8n_to_uvchr(tmpbuf1, UTF8_MAXLEN_UCLC, 
1025                                     0, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
1026                 c2 = utf8n_to_uvchr(tmpbuf2, UTF8_MAXLEN_UCLC,
1027                                     0, ckWARN(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
1028                 lnc = 0;
1029                 while (sm < ((U8 *) m + ln)) {
1030                     lnc++;
1031                     sm += UTF8SKIP(sm);
1032                 }
1033             }
1034             else {
1035                 c1 = *(U8*)m;
1036                 c2 = PL_fold[c1];
1037             }
1038             goto do_exactf;
1039         case EXACTFL:
1040             m   = STRING(c);
1041             ln  = STR_LEN(c);
1042             lnc = (I32) ln;
1043             c1 = *(U8*)m;
1044             c2 = PL_fold_locale[c1];
1045           do_exactf:
1046             e = HOP3c(strend, -((I32)lnc), s);
1047
1048             if (norun && e < s)
1049                 e = s;                  /* Due to minlen logic of intuit() */
1050
1051             /* The idea in the EXACTF* cases is to first find the
1052              * first character of the EXACTF* node and then, if
1053              * necessary, case-insensitively compare the full
1054              * text of the node.  The c1 and c2 are the first
1055              * characters (though in Unicode it gets a bit
1056              * more complicated because there are more cases
1057              * than just upper and lower: one needs to use
1058              * the so-called folding case for case-insensitive
1059              * matching (called "loose matching" in Unicode).
1060              * ibcmp_utf8() will do just that. */
1061
1062             if (do_utf8) {
1063                 UV c, f;
1064                 U8 tmpbuf [UTF8_MAXLEN+1];
1065                 U8 foldbuf[UTF8_MAXLEN_FOLD+1];
1066                 STRLEN len, foldlen;
1067                 
1068                 if (c1 == c2) {
1069                     /* Upper and lower of 1st char are equal -
1070                      * probably not a "letter". */
1071                     while (s <= e) {
1072                         c = utf8n_to_uvchr((U8*)s, UTF8_MAXLEN, &len,
1073                                            ckWARN(WARN_UTF8) ?
1074                                            0 : UTF8_ALLOW_ANY);
1075                         if ( c == c1
1076                              && (ln == len ||
1077                                  ibcmp_utf8(s, (char **)0, 0,  do_utf8,
1078                                             m, (char **)0, ln, (bool)UTF))
1079                              && (norun || regtry(prog, s)) )
1080                             goto got_it;
1081                         else {
1082                              uvchr_to_utf8(tmpbuf, c);
1083                              f = to_utf8_fold(tmpbuf, foldbuf, &foldlen);
1084                              if ( f != c
1085                                   && (f == c1 || f == c2)
1086                                   && (ln == foldlen ||
1087                                       !ibcmp_utf8((char *) foldbuf,
1088                                                   (char **)0, foldlen, do_utf8,
1089                                                   m,
1090                                                   (char **)0, ln, (bool)UTF))
1091                                   && (norun || regtry(prog, s)) )
1092                                   goto got_it;
1093                         }
1094                         s += len;
1095                     }
1096                 }
1097                 else {
1098                     while (s <= e) {
1099                       c = utf8n_to_uvchr((U8*)s, UTF8_MAXLEN, &len,
1100                                            ckWARN(WARN_UTF8) ?
1101                                            0 : UTF8_ALLOW_ANY);
1102
1103                         /* Handle some of the three Greek sigmas cases.
1104                          * Note that not all the possible combinations
1105                          * are handled here: some of them are handled
1106                          * by the standard folding rules, and some of
1107                          * them (the character class or ANYOF cases)
1108                          * are handled during compiletime in
1109                          * regexec.c:S_regclass(). */
1110                         if (c == (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA ||
1111                             c == (UV)UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA)
1112                             c = (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA;
1113
1114                         if ( (c == c1 || c == c2)
1115                              && (ln == len ||
1116                                  ibcmp_utf8(s, (char **)0, 0,  do_utf8,
1117                                             m, (char **)0, ln, (bool)UTF))
1118                              && (norun || regtry(prog, s)) )
1119                             goto got_it;
1120                         else {
1121                              uvchr_to_utf8(tmpbuf, c);
1122                              f = to_utf8_fold(tmpbuf, foldbuf, &foldlen);
1123                              if ( f != c
1124                                   && (f == c1 || f == c2)
1125                                   && (ln == foldlen ||
1126                                       !ibcmp_utf8((char *) foldbuf,
1127                                                   (char **)0, foldlen, do_utf8,
1128                                                   m,
1129                                                   (char **)0, ln, (bool)UTF))
1130                                   && (norun || regtry(prog, s)) )
1131                                   goto got_it;
1132                         }
1133                         s += len;
1134                     }
1135                 }
1136             }
1137             else {
1138                 if (c1 == c2)
1139                     while (s <= e) {
1140                         if ( *(U8*)s == c1
1141                              && (ln == 1 || !(OP(c) == EXACTF
1142                                               ? ibcmp(s, m, ln)
1143                                               : ibcmp_locale(s, m, ln)))
1144                              && (norun || regtry(prog, s)) )
1145                             goto got_it;
1146                         s++;
1147                     }
1148                 else
1149                     while (s <= e) {
1150                         if ( (*(U8*)s == c1 || *(U8*)s == c2)
1151                              && (ln == 1 || !(OP(c) == EXACTF
1152                                               ? ibcmp(s, m, ln)
1153                                               : ibcmp_locale(s, m, ln)))
1154                              && (norun || regtry(prog, s)) )
1155                             goto got_it;
1156                         s++;
1157                     }
1158             }
1159             break;
1160         case BOUNDL:
1161             PL_reg_flags |= RF_tainted;
1162             /* FALL THROUGH */
1163         case BOUND:
1164             if (do_utf8) {
1165                 if (s == PL_bostr)
1166                     tmp = '\n';
1167                 else {
1168                     U8 *r = reghop3((U8*)s, -1, (U8*)PL_bostr);
1169                 
1170                     tmp = utf8n_to_uvchr(r, UTF8SKIP(r), 0, 0);
1171                 }
1172                 tmp = ((OP(c) == BOUND ?
1173                         isALNUM_uni(tmp) : isALNUM_LC_uvchr(UNI_TO_NATIVE(tmp))) != 0);
1174                 LOAD_UTF8_CHARCLASS(alnum,"a");
1175                 while (s < strend) {
1176                     if (tmp == !(OP(c) == BOUND ?
1177                                  swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
1178                                  isALNUM_LC_utf8((U8*)s)))
1179                     {
1180                         tmp = !tmp;
1181                         if ((norun || regtry(prog, s)))
1182                             goto got_it;
1183                     }
1184                     s += UTF8SKIP(s);
1185                 }
1186             }
1187             else {
1188                 tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
1189                 tmp = ((OP(c) == BOUND ? isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
1190                 while (s < strend) {
1191                     if (tmp ==
1192                         !(OP(c) == BOUND ? isALNUM(*s) : isALNUM_LC(*s))) {
1193                         tmp = !tmp;
1194                         if ((norun || regtry(prog, s)))
1195                             goto got_it;
1196                     }
1197                     s++;
1198                 }
1199             }
1200             if ((!prog->minlen && tmp) && (norun || regtry(prog, s)))
1201                 goto got_it;
1202             break;
1203         case NBOUNDL:
1204             PL_reg_flags |= RF_tainted;
1205             /* FALL THROUGH */
1206         case NBOUND:
1207             if (do_utf8) {
1208                 if (s == PL_bostr)
1209                     tmp = '\n';
1210                 else {
1211                     U8 *r = reghop3((U8*)s, -1, (U8*)PL_bostr);
1212                 
1213                     tmp = utf8n_to_uvchr(r, UTF8SKIP(r), 0, 0);
1214                 }
1215                 tmp = ((OP(c) == NBOUND ?
1216                         isALNUM_uni(tmp) : isALNUM_LC_uvchr(UNI_TO_NATIVE(tmp))) != 0);
1217                 LOAD_UTF8_CHARCLASS(alnum,"a");
1218                 while (s < strend) {
1219                     if (tmp == !(OP(c) == NBOUND ?
1220                                  swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
1221                                  isALNUM_LC_utf8((U8*)s)))
1222                         tmp = !tmp;
1223                     else if ((norun || regtry(prog, s)))
1224                         goto got_it;
1225                     s += UTF8SKIP(s);
1226                 }
1227             }
1228             else {
1229                 tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
1230                 tmp = ((OP(c) == NBOUND ?
1231                         isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
1232                 while (s < strend) {
1233                     if (tmp ==
1234                         !(OP(c) == NBOUND ? isALNUM(*s) : isALNUM_LC(*s)))
1235                         tmp = !tmp;
1236                     else if ((norun || regtry(prog, s)))
1237                         goto got_it;
1238                     s++;
1239                 }
1240             }
1241             if ((!prog->minlen && !tmp) && (norun || regtry(prog, s)))
1242                 goto got_it;
1243             break;
1244         case ALNUM:
1245             if (do_utf8) {
1246                 LOAD_UTF8_CHARCLASS(alnum,"a");
1247                 while (s < strend) {
1248                     if (swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8)) {
1249                         if (tmp && (norun || regtry(prog, s)))
1250                             goto got_it;
1251                         else
1252                             tmp = doevery;
1253                     }
1254                     else
1255                         tmp = 1;
1256                     s += UTF8SKIP(s);
1257                 }
1258             }
1259             else {
1260                 while (s < strend) {
1261                     if (isALNUM(*s)) {
1262                         if (tmp && (norun || regtry(prog, s)))
1263                             goto got_it;
1264                         else
1265                             tmp = doevery;
1266                     }
1267                     else
1268                         tmp = 1;
1269                     s++;
1270                 }
1271             }
1272             break;
1273         case ALNUML:
1274             PL_reg_flags |= RF_tainted;
1275             if (do_utf8) {
1276                 while (s < strend) {
1277                     if (isALNUM_LC_utf8((U8*)s)) {
1278                         if (tmp && (norun || regtry(prog, s)))
1279                             goto got_it;
1280                         else
1281                             tmp = doevery;
1282                     }
1283                     else
1284                         tmp = 1;
1285                     s += UTF8SKIP(s);
1286                 }
1287             }
1288             else {
1289                 while (s < strend) {
1290                     if (isALNUM_LC(*s)) {
1291                         if (tmp && (norun || regtry(prog, s)))
1292                             goto got_it;
1293                         else
1294                             tmp = doevery;
1295                     }
1296                     else
1297                         tmp = 1;
1298                     s++;
1299                 }
1300             }
1301             break;
1302         case NALNUM:
1303             if (do_utf8) {
1304                 LOAD_UTF8_CHARCLASS(alnum,"a");
1305                 while (s < strend) {
1306                     if (!swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8)) {
1307                         if (tmp && (norun || regtry(prog, s)))
1308                             goto got_it;
1309                         else
1310                             tmp = doevery;
1311                     }
1312                     else
1313                         tmp = 1;
1314                     s += UTF8SKIP(s);
1315                 }
1316             }
1317             else {
1318                 while (s < strend) {
1319                     if (!isALNUM(*s)) {
1320                         if (tmp && (norun || regtry(prog, s)))
1321                             goto got_it;
1322                         else
1323                             tmp = doevery;
1324                     }
1325                     else
1326                         tmp = 1;
1327                     s++;
1328                 }
1329             }
1330             break;
1331         case NALNUML:
1332             PL_reg_flags |= RF_tainted;
1333             if (do_utf8) {
1334                 while (s < strend) {
1335                     if (!isALNUM_LC_utf8((U8*)s)) {
1336                         if (tmp && (norun || regtry(prog, s)))
1337                             goto got_it;
1338                         else
1339                             tmp = doevery;
1340                     }
1341                     else
1342                         tmp = 1;
1343                     s += UTF8SKIP(s);
1344                 }
1345             }
1346             else {
1347                 while (s < strend) {
1348                     if (!isALNUM_LC(*s)) {
1349                         if (tmp && (norun || regtry(prog, s)))
1350                             goto got_it;
1351                         else
1352                             tmp = doevery;
1353                     }
1354                     else
1355                         tmp = 1;
1356                     s++;
1357                 }
1358             }
1359             break;
1360         case SPACE:
1361             if (do_utf8) {
1362                 LOAD_UTF8_CHARCLASS(space," ");
1363                 while (s < strend) {
1364                     if (*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s, do_utf8)) {
1365                         if (tmp && (norun || regtry(prog, s)))
1366                             goto got_it;
1367                         else
1368                             tmp = doevery;
1369                     }
1370                     else
1371                         tmp = 1;
1372                     s += UTF8SKIP(s);
1373                 }
1374             }
1375             else {
1376                 while (s < strend) {
1377                     if (isSPACE(*s)) {
1378                         if (tmp && (norun || regtry(prog, s)))
1379                             goto got_it;
1380                         else
1381                             tmp = doevery;
1382                     }
1383                     else
1384                         tmp = 1;
1385                     s++;
1386                 }
1387             }
1388             break;
1389         case SPACEL:
1390             PL_reg_flags |= RF_tainted;
1391             if (do_utf8) {
1392                 while (s < strend) {
1393                     if (*s == ' ' || isSPACE_LC_utf8((U8*)s)) {
1394                         if (tmp && (norun || regtry(prog, s)))
1395                             goto got_it;
1396                         else
1397                             tmp = doevery;
1398                     }
1399                     else
1400                         tmp = 1;
1401                     s += UTF8SKIP(s);
1402                 }
1403             }
1404             else {
1405                 while (s < strend) {
1406                     if (isSPACE_LC(*s)) {
1407                         if (tmp && (norun || regtry(prog, s)))
1408                             goto got_it;
1409                         else
1410                             tmp = doevery;
1411                     }
1412                     else
1413                         tmp = 1;
1414                     s++;
1415                 }
1416             }
1417             break;
1418         case NSPACE:
1419             if (do_utf8) {
1420                 LOAD_UTF8_CHARCLASS(space," ");
1421                 while (s < strend) {
1422                     if (!(*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s, do_utf8))) {
1423                         if (tmp && (norun || regtry(prog, s)))
1424                             goto got_it;
1425                         else
1426                             tmp = doevery;
1427                     }
1428                     else
1429                         tmp = 1;
1430                     s += UTF8SKIP(s);
1431                 }
1432             }
1433             else {
1434                 while (s < strend) {
1435                     if (!isSPACE(*s)) {
1436                         if (tmp && (norun || regtry(prog, s)))
1437                             goto got_it;
1438                         else
1439                             tmp = doevery;
1440                     }
1441                     else
1442                         tmp = 1;
1443                     s++;
1444                 }
1445             }
1446             break;
1447         case NSPACEL:
1448             PL_reg_flags |= RF_tainted;
1449             if (do_utf8) {
1450                 while (s < strend) {
1451                     if (!(*s == ' ' || isSPACE_LC_utf8((U8*)s))) {
1452                         if (tmp && (norun || regtry(prog, s)))
1453                             goto got_it;
1454                         else
1455                             tmp = doevery;
1456                     }
1457                     else
1458                         tmp = 1;
1459                     s += UTF8SKIP(s);
1460                 }
1461             }
1462             else {
1463                 while (s < strend) {
1464                     if (!isSPACE_LC(*s)) {
1465                         if (tmp && (norun || regtry(prog, s)))
1466                             goto got_it;
1467                         else
1468                             tmp = doevery;
1469                     }
1470                     else
1471                         tmp = 1;
1472                     s++;
1473                 }
1474             }
1475             break;
1476         case DIGIT:
1477             if (do_utf8) {
1478                 LOAD_UTF8_CHARCLASS(digit,"0");
1479                 while (s < strend) {
1480                     if (swash_fetch(PL_utf8_digit,(U8*)s, do_utf8)) {
1481                         if (tmp && (norun || regtry(prog, s)))
1482                             goto got_it;
1483                         else
1484                             tmp = doevery;
1485                     }
1486                     else
1487                         tmp = 1;
1488                     s += UTF8SKIP(s);
1489                 }
1490             }
1491             else {
1492                 while (s < strend) {
1493                     if (isDIGIT(*s)) {
1494                         if (tmp && (norun || regtry(prog, s)))
1495                             goto got_it;
1496                         else
1497                             tmp = doevery;
1498                     }
1499                     else
1500                         tmp = 1;
1501                     s++;
1502                 }
1503             }
1504             break;
1505         case DIGITL:
1506             PL_reg_flags |= RF_tainted;
1507             if (do_utf8) {
1508                 while (s < strend) {
1509                     if (isDIGIT_LC_utf8((U8*)s)) {
1510                         if (tmp && (norun || regtry(prog, s)))
1511                             goto got_it;
1512                         else
1513                             tmp = doevery;
1514                     }
1515                     else
1516                         tmp = 1;
1517                     s += UTF8SKIP(s);
1518                 }
1519             }
1520             else {
1521                 while (s < strend) {
1522                     if (isDIGIT_LC(*s)) {
1523                         if (tmp && (norun || regtry(prog, s)))
1524                             goto got_it;
1525                         else
1526                             tmp = doevery;
1527                     }
1528                     else
1529                         tmp = 1;
1530                     s++;
1531                 }
1532             }
1533             break;
1534         case NDIGIT:
1535             if (do_utf8) {
1536                 LOAD_UTF8_CHARCLASS(digit,"0");
1537                 while (s < strend) {
1538                     if (!swash_fetch(PL_utf8_digit,(U8*)s, do_utf8)) {
1539                         if (tmp && (norun || regtry(prog, s)))
1540                             goto got_it;
1541                         else
1542                             tmp = doevery;
1543                     }
1544                     else
1545                         tmp = 1;
1546                     s += UTF8SKIP(s);
1547                 }
1548             }
1549             else {
1550                 while (s < strend) {
1551                     if (!isDIGIT(*s)) {
1552                         if (tmp && (norun || regtry(prog, s)))
1553                             goto got_it;
1554                         else
1555                             tmp = doevery;
1556                     }
1557                     else
1558                         tmp = 1;
1559                     s++;
1560                 }
1561             }
1562             break;
1563         case NDIGITL:
1564             PL_reg_flags |= RF_tainted;
1565             if (do_utf8) {
1566                 while (s < strend) {
1567                     if (!isDIGIT_LC_utf8((U8*)s)) {
1568                         if (tmp && (norun || regtry(prog, s)))
1569                             goto got_it;
1570                         else
1571                             tmp = doevery;
1572                     }
1573                     else
1574                         tmp = 1;
1575                     s += UTF8SKIP(s);
1576                 }
1577             }
1578             else {
1579                 while (s < strend) {
1580                     if (!isDIGIT_LC(*s)) {
1581                         if (tmp && (norun || regtry(prog, s)))
1582                             goto got_it;
1583                         else
1584                             tmp = doevery;
1585                     }
1586                     else
1587                         tmp = 1;
1588                     s++;
1589                 }
1590             }
1591             break;
1592         default:
1593             Perl_croak(aTHX_ "panic: unknown regstclass %d", (int)OP(c));
1594             break;
1595         }
1596         return 0;
1597       got_it:
1598         return s;
1599 }
1600
1601 /*
1602  - regexec_flags - match a regexp against a string
1603  */
1604 I32
1605 Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *strend,
1606               char *strbeg, I32 minend, SV *sv, void *data, U32 flags)
1607 /* strend: pointer to null at end of string */
1608 /* strbeg: real beginning of string */
1609 /* minend: end of match must be >=minend after stringarg. */
1610 /* data: May be used for some additional optimizations. */
1611 /* nosave: For optimizations. */
1612 {
1613     register char *s;
1614     register regnode *c;
1615     register char *startpos = stringarg;
1616     I32 minlen;         /* must match at least this many chars */
1617     I32 dontbother = 0; /* how many characters not to try at end */
1618     /* I32 start_shift = 0; */          /* Offset of the start to find
1619                                          constant substr. */            /* CC */
1620     I32 end_shift = 0;                  /* Same for the end. */         /* CC */
1621     I32 scream_pos = -1;                /* Internal iterator of scream. */
1622     char *scream_olds;
1623     SV* oreplsv = GvSV(PL_replgv);
1624     bool do_utf8 = DO_UTF8(sv);
1625 #ifdef DEBUGGING
1626     SV *dsv0 = PERL_DEBUG_PAD_ZERO(0);
1627     SV *dsv1 = PERL_DEBUG_PAD_ZERO(1);
1628 #endif
1629     RX_MATCH_UTF8_set(prog,do_utf8);
1630
1631     PL_regcc = 0;
1632
1633     cache_re(prog);
1634 #ifdef DEBUGGING
1635     PL_regnarrate = DEBUG_r_TEST;
1636 #endif
1637
1638     /* Be paranoid... */
1639     if (prog == NULL || startpos == NULL) {
1640         Perl_croak(aTHX_ "NULL regexp parameter");
1641         return 0;
1642     }
1643
1644     minlen = prog->minlen;
1645     if (strend - startpos < minlen) {
1646         DEBUG_r(PerlIO_printf(Perl_debug_log,
1647                               "String too short [regexec_flags]...\n"));
1648         goto phooey;
1649     }
1650
1651     /* Check validity of program. */
1652     if (UCHARAT(prog->program) != REG_MAGIC) {
1653         Perl_croak(aTHX_ "corrupted regexp program");
1654     }
1655
1656     PL_reg_flags = 0;
1657     PL_reg_eval_set = 0;
1658     PL_reg_maxiter = 0;
1659
1660     if (prog->reganch & ROPT_UTF8)
1661         PL_reg_flags |= RF_utf8;
1662
1663     /* Mark beginning of line for ^ and lookbehind. */
1664     PL_regbol = startpos;
1665     PL_bostr  = strbeg;
1666     PL_reg_sv = sv;
1667
1668     /* Mark end of line for $ (and such) */
1669     PL_regeol = strend;
1670
1671     /* see how far we have to get to not match where we matched before */
1672     PL_regtill = startpos+minend;
1673
1674     /* We start without call_cc context.  */
1675     PL_reg_call_cc = 0;
1676
1677     /* If there is a "must appear" string, look for it. */
1678     s = startpos;
1679
1680     if (prog->reganch & ROPT_GPOS_SEEN) { /* Need to have PL_reg_ganch */
1681         MAGIC *mg;
1682
1683         if (flags & REXEC_IGNOREPOS)    /* Means: check only at start */
1684             PL_reg_ganch = startpos;
1685         else if (sv && SvTYPE(sv) >= SVt_PVMG
1686                   && SvMAGIC(sv)
1687                   && (mg = mg_find(sv, PERL_MAGIC_regex_global))
1688                   && mg->mg_len >= 0) {
1689             PL_reg_ganch = strbeg + mg->mg_len; /* Defined pos() */
1690             if (prog->reganch & ROPT_ANCH_GPOS) {
1691                 if (s > PL_reg_ganch)
1692                     goto phooey;
1693                 s = PL_reg_ganch;
1694             }
1695         }
1696         else                            /* pos() not defined */
1697             PL_reg_ganch = strbeg;
1698     }
1699
1700     if (!(flags & REXEC_CHECKED) && (prog->check_substr != Nullsv || prog->check_utf8 != Nullsv)) {
1701         re_scream_pos_data d;
1702
1703         d.scream_olds = &scream_olds;
1704         d.scream_pos = &scream_pos;
1705         s = re_intuit_start(prog, sv, s, strend, flags, &d);
1706         if (!s) {
1707             DEBUG_r(PerlIO_printf(Perl_debug_log, "Not present...\n"));
1708             goto phooey;        /* not present */
1709         }
1710     }
1711
1712     DEBUG_r({
1713          char *s0   = UTF ?
1714            pv_uni_display(dsv0, (U8*)prog->precomp, prog->prelen, 60,
1715                           UNI_DISPLAY_REGEX) :
1716            prog->precomp;
1717          int   len0 = UTF ? SvCUR(dsv0) : prog->prelen;
1718          char *s1   = do_utf8 ? sv_uni_display(dsv1, sv, 60,
1719                                                UNI_DISPLAY_REGEX) : startpos;
1720          int   len1 = do_utf8 ? SvCUR(dsv1) : strend - startpos;
1721          if (!PL_colorset)
1722              reginitcolors();
1723          PerlIO_printf(Perl_debug_log,
1724                        "%sMatching REx%s `%s%*.*s%s%s' against `%s%.*s%s%s'\n",
1725                        PL_colors[4],PL_colors[5],PL_colors[0],
1726                        len0, len0, s0,
1727                        PL_colors[1],
1728                        len0 > 60 ? "..." : "",
1729                        PL_colors[0],
1730                        (int)(len1 > 60 ? 60 : len1),
1731                        s1, PL_colors[1],
1732                        (len1 > 60 ? "..." : "")
1733               );
1734     });
1735
1736     /* Simplest case:  anchored match need be tried only once. */
1737     /*  [unless only anchor is BOL and multiline is set] */
1738     if (prog->reganch & (ROPT_ANCH & ~ROPT_ANCH_GPOS)) {
1739         if (s == startpos && regtry(prog, startpos))
1740             goto got_it;
1741         else if (PL_multiline || (prog->reganch & ROPT_IMPLICIT)
1742                  || (prog->reganch & ROPT_ANCH_MBOL)) /* XXXX SBOL? */
1743         {
1744             char *end;
1745
1746             if (minlen)
1747                 dontbother = minlen - 1;
1748             end = HOP3c(strend, -dontbother, strbeg) - 1;
1749             /* for multiline we only have to try after newlines */
1750             if (prog->check_substr || prog->check_utf8) {
1751                 if (s == startpos)
1752                     goto after_try;
1753                 while (1) {
1754                     if (regtry(prog, s))
1755                         goto got_it;
1756                   after_try:
1757                     if (s >= end)
1758                         goto phooey;
1759                     if (prog->reganch & RE_USE_INTUIT) {
1760                         s = re_intuit_start(prog, sv, s + 1, strend, flags, NULL);
1761                         if (!s)
1762                             goto phooey;
1763                     }
1764                     else
1765                         s++;
1766                 }               
1767             } else {
1768                 if (s > startpos)
1769                     s--;
1770                 while (s < end) {
1771                     if (*s++ == '\n') { /* don't need PL_utf8skip here */
1772                         if (regtry(prog, s))
1773                             goto got_it;
1774                     }
1775                 }               
1776             }
1777         }
1778         goto phooey;
1779     } else if (prog->reganch & ROPT_ANCH_GPOS) {
1780         if (regtry(prog, PL_reg_ganch))
1781             goto got_it;
1782         goto phooey;
1783     }
1784
1785     /* Messy cases:  unanchored match. */
1786     if ((prog->anchored_substr || prog->anchored_utf8) && prog->reganch & ROPT_SKIP) {
1787         /* we have /x+whatever/ */
1788         /* it must be a one character string (XXXX Except UTF?) */
1789         char ch;
1790 #ifdef DEBUGGING
1791         int did_match = 0;
1792 #endif
1793         if (!(do_utf8 ? prog->anchored_utf8 : prog->anchored_substr))
1794             do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1795         ch = SvPVX(do_utf8 ? prog->anchored_utf8 : prog->anchored_substr)[0];
1796
1797         if (do_utf8) {
1798             while (s < strend) {
1799                 if (*s == ch) {
1800                     DEBUG_r( did_match = 1 );
1801                     if (regtry(prog, s)) goto got_it;
1802                     s += UTF8SKIP(s);
1803                     while (s < strend && *s == ch)
1804                         s += UTF8SKIP(s);
1805                 }
1806                 s += UTF8SKIP(s);
1807             }
1808         }
1809         else {
1810             while (s < strend) {
1811                 if (*s == ch) {
1812                     DEBUG_r( did_match = 1 );
1813                     if (regtry(prog, s)) goto got_it;
1814                     s++;
1815                     while (s < strend && *s == ch)
1816                         s++;
1817                 }
1818                 s++;
1819             }
1820         }
1821         DEBUG_r(if (!did_match)
1822                 PerlIO_printf(Perl_debug_log,
1823                                   "Did not find anchored character...\n")
1824                );
1825     }
1826     /*SUPPRESS 560*/
1827     else if (prog->anchored_substr != Nullsv
1828               || prog->anchored_utf8 != Nullsv
1829               || ((prog->float_substr != Nullsv || prog->float_utf8 != Nullsv)
1830                   && prog->float_max_offset < strend - s)) {
1831         SV *must;
1832         I32 back_max;
1833         I32 back_min;
1834         char *last;
1835         char *last1;            /* Last position checked before */
1836 #ifdef DEBUGGING
1837         int did_match = 0;
1838 #endif
1839         if (prog->anchored_substr || prog->anchored_utf8) {
1840             if (!(do_utf8 ? prog->anchored_utf8 : prog->anchored_substr))
1841                 do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1842             must = do_utf8 ? prog->anchored_utf8 : prog->anchored_substr;
1843             back_max = back_min = prog->anchored_offset;
1844         } else {
1845             if (!(do_utf8 ? prog->float_utf8 : prog->float_substr))
1846                 do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1847             must = do_utf8 ? prog->float_utf8 : prog->float_substr;
1848             back_max = prog->float_max_offset;
1849             back_min = prog->float_min_offset;
1850         }
1851         if (must == &PL_sv_undef)
1852             /* could not downgrade utf8 check substring, so must fail */
1853             goto phooey;
1854
1855         last = HOP3c(strend,    /* Cannot start after this */
1856                           -(I32)(CHR_SVLEN(must)
1857                                  - (SvTAIL(must) != 0) + back_min), strbeg);
1858
1859         if (s > PL_bostr)
1860             last1 = HOPc(s, -1);
1861         else
1862             last1 = s - 1;      /* bogus */
1863
1864         /* XXXX check_substr already used to find `s', can optimize if
1865            check_substr==must. */
1866         scream_pos = -1;
1867         dontbother = end_shift;
1868         strend = HOPc(strend, -dontbother);
1869         while ( (s <= last) &&
1870                 ((flags & REXEC_SCREAM)
1871                  ? (s = screaminstr(sv, must, HOP3c(s, back_min, strend) - strbeg,
1872                                     end_shift, &scream_pos, 0))
1873                  : (s = fbm_instr((unsigned char*)HOP3(s, back_min, strend),
1874                                   (unsigned char*)strend, must,
1875                                   PL_multiline ? FBMrf_MULTILINE : 0))) ) {
1876             /* we may be pointing at the wrong string */
1877             if ((flags & REXEC_SCREAM) && RX_MATCH_COPIED(prog))
1878                 s = strbeg + (s - SvPVX(sv));
1879             DEBUG_r( did_match = 1 );
1880             if (HOPc(s, -back_max) > last1) {
1881                 last1 = HOPc(s, -back_min);
1882                 s = HOPc(s, -back_max);
1883             }
1884             else {
1885                 char *t = (last1 >= PL_bostr) ? HOPc(last1, 1) : last1 + 1;
1886
1887                 last1 = HOPc(s, -back_min);
1888                 s = t;          
1889             }
1890             if (do_utf8) {
1891                 while (s <= last1) {
1892                     if (regtry(prog, s))
1893                         goto got_it;
1894                     s += UTF8SKIP(s);
1895                 }
1896             }
1897             else {
1898                 while (s <= last1) {
1899                     if (regtry(prog, s))
1900                         goto got_it;
1901                     s++;
1902                 }
1903             }
1904         }
1905         DEBUG_r(if (!did_match)
1906                     PerlIO_printf(Perl_debug_log, 
1907                                   "Did not find %s substr `%s%.*s%s'%s...\n",
1908                               ((must == prog->anchored_substr || must == prog->anchored_utf8)
1909                                ? "anchored" : "floating"),
1910                               PL_colors[0],
1911                               (int)(SvCUR(must) - (SvTAIL(must)!=0)),
1912                               SvPVX(must),
1913                                   PL_colors[1], (SvTAIL(must) ? "$" : ""))
1914                );
1915         goto phooey;
1916     }
1917     else if ((c = prog->regstclass)) {
1918         if (minlen) {
1919             I32 op = (U8)OP(prog->regstclass);
1920             /* don't bother with what can't match */
1921             if (PL_regkind[op] != EXACT && op != CANY)
1922                 strend = HOPc(strend, -(minlen - 1));
1923         }
1924         DEBUG_r({
1925             SV *prop = sv_newmortal();
1926             char *s0;
1927             char *s1;
1928             int len0;
1929             int len1;
1930
1931             regprop(prop, c);
1932             s0 = UTF ?
1933               pv_uni_display(dsv0, (U8*)SvPVX(prop), SvCUR(prop), 60,
1934                              UNI_DISPLAY_REGEX) :
1935               SvPVX(prop);
1936             len0 = UTF ? SvCUR(dsv0) : SvCUR(prop);
1937             s1 = UTF ?
1938               sv_uni_display(dsv1, sv, 60, UNI_DISPLAY_REGEX) : s;
1939             len1 = UTF ? SvCUR(dsv1) : strend - s;
1940             PerlIO_printf(Perl_debug_log,
1941                           "Matching stclass `%*.*s' against `%*.*s'\n",
1942                           len0, len0, s0,
1943                           len1, len1, s1);
1944         });
1945         if (find_byclass(prog, c, s, strend, startpos, 0))
1946             goto got_it;
1947         DEBUG_r(PerlIO_printf(Perl_debug_log, "Contradicts stclass...\n"));
1948     }
1949     else {
1950         dontbother = 0;
1951         if (prog->float_substr != Nullsv || prog->float_utf8 != Nullsv) {
1952             /* Trim the end. */
1953             char *last;
1954             SV* float_real;
1955
1956             if (!(do_utf8 ? prog->float_utf8 : prog->float_substr))
1957                 do_utf8 ? to_utf8_substr(prog) : to_byte_substr(prog);
1958             float_real = do_utf8 ? prog->float_utf8 : prog->float_substr;
1959
1960             if (flags & REXEC_SCREAM) {
1961                 last = screaminstr(sv, float_real, s - strbeg,
1962                                    end_shift, &scream_pos, 1); /* last one */
1963                 if (!last)
1964                     last = scream_olds; /* Only one occurrence. */
1965                 /* we may be pointing at the wrong string */
1966                 else if (RX_MATCH_COPIED(prog))
1967                     s = strbeg + (s - SvPVX(sv));
1968             }
1969             else {
1970                 STRLEN len;
1971                 char *little = SvPV(float_real, len);
1972
1973                 if (SvTAIL(float_real)) {
1974                     if (memEQ(strend - len + 1, little, len - 1))
1975                         last = strend - len + 1;
1976                     else if (!PL_multiline)
1977                         last = memEQ(strend - len, little, len)
1978                             ? strend - len : Nullch;
1979                     else
1980                         goto find_last;
1981                 } else {
1982                   find_last:
1983                     if (len)
1984                         last = rninstr(s, strend, little, little + len);
1985                     else
1986                         last = strend;  /* matching `$' */
1987                 }
1988             }
1989             if (last == NULL) {
1990                 DEBUG_r(PerlIO_printf(Perl_debug_log,
1991                                       "%sCan't trim the tail, match fails (should not happen)%s\n",
1992                                       PL_colors[4],PL_colors[5]));
1993                 goto phooey; /* Should not happen! */
1994             }
1995             dontbother = strend - last + prog->float_min_offset;
1996         }
1997         if (minlen && (dontbother < minlen))
1998             dontbother = minlen - 1;
1999         strend -= dontbother;              /* this one's always in bytes! */
2000         /* We don't know much -- general case. */
2001         if (do_utf8) {
2002             for (;;) {
2003                 if (regtry(prog, s))
2004                     goto got_it;
2005                 if (s >= strend)
2006                     break;
2007                 s += UTF8SKIP(s);
2008             };
2009         }
2010         else {
2011             do {
2012                 if (regtry(prog, s))
2013                     goto got_it;
2014             } while (s++ < strend);
2015         }
2016     }
2017
2018     /* Failure. */
2019     goto phooey;
2020
2021 got_it:
2022     RX_MATCH_TAINTED_set(prog, PL_reg_flags & RF_tainted);
2023
2024     if (PL_reg_eval_set) {
2025         /* Preserve the current value of $^R */
2026         if (oreplsv != GvSV(PL_replgv))
2027             sv_setsv(oreplsv, GvSV(PL_replgv));/* So that when GvSV(replgv) is
2028                                                   restored, the value remains
2029                                                   the same. */
2030         restore_pos(aTHX_ 0);
2031     }
2032
2033     /* make sure $`, $&, $', and $digit will work later */
2034     if ( !(flags & REXEC_NOT_FIRST) ) {
2035         RX_MATCH_COPY_FREE(prog);
2036         if (flags & REXEC_COPY_STR) {
2037             I32 i = PL_regeol - startpos + (stringarg - strbeg);
2038 #ifdef PERL_COPY_ON_WRITE
2039             if ((SvIsCOW(sv)
2040                  || (SvFLAGS(sv) & CAN_COW_MASK) == CAN_COW_FLAGS)) {
2041                 if (DEBUG_C_TEST) {
2042                     PerlIO_printf(Perl_debug_log,
2043                                   "Copy on write: regexp capture, type %d\n",
2044                                   (int) SvTYPE(sv));
2045                 }
2046                 prog->saved_copy = sv_setsv_cow(prog->saved_copy, sv);
2047                 prog->subbeg = SvPVX(prog->saved_copy);
2048                 assert (SvPOKp(prog->saved_copy));
2049             } else
2050 #endif
2051             {
2052                 RX_MATCH_COPIED_on(prog);
2053                 s = savepvn(strbeg, i);
2054                 prog->subbeg = s;
2055             }
2056             prog->sublen = i;
2057         }
2058         else {
2059             prog->subbeg = strbeg;
2060             prog->sublen = PL_regeol - strbeg;  /* strend may have been modified */
2061         }
2062     }
2063
2064     return 1;
2065
2066 phooey:
2067     DEBUG_r(PerlIO_printf(Perl_debug_log, "%sMatch failed%s\n",
2068                           PL_colors[4],PL_colors[5]));
2069     if (PL_reg_eval_set)
2070         restore_pos(aTHX_ 0);
2071     return 0;
2072 }
2073
2074 /*
2075  - regtry - try match at specific point
2076  */
2077 STATIC I32                      /* 0 failure, 1 success */
2078 S_regtry(pTHX_ regexp *prog, char *startpos)
2079 {
2080     register I32 i;
2081     register I32 *sp;
2082     register I32 *ep;
2083     CHECKPOINT lastcp;
2084
2085 #ifdef DEBUGGING
2086     PL_regindent = 0;   /* XXXX Not good when matches are reenterable... */
2087 #endif
2088     if ((prog->reganch & ROPT_EVAL_SEEN) && !PL_reg_eval_set) {
2089         MAGIC *mg;
2090
2091         PL_reg_eval_set = RS_init;
2092         DEBUG_r(DEBUG_s(
2093             PerlIO_printf(Perl_debug_log, "  setting stack tmpbase at %"IVdf"\n",
2094                           (IV)(PL_stack_sp - PL_stack_base));
2095             ));
2096         SAVEI32(cxstack[cxstack_ix].blk_oldsp);
2097         cxstack[cxstack_ix].blk_oldsp = PL_stack_sp - PL_stack_base;
2098         /* Otherwise OP_NEXTSTATE will free whatever on stack now.  */
2099         SAVETMPS;
2100         /* Apparently this is not needed, judging by wantarray. */
2101         /* SAVEI8(cxstack[cxstack_ix].blk_gimme);
2102            cxstack[cxstack_ix].blk_gimme = G_SCALAR; */
2103
2104         if (PL_reg_sv) {
2105             /* Make $_ available to executed code. */
2106             if (PL_reg_sv != DEFSV) {
2107                 /* SAVE_DEFSV does *not* suffice here for USE_5005THREADS */
2108                 SAVESPTR(DEFSV);
2109                 DEFSV = PL_reg_sv;
2110             }
2111         
2112             if (!(SvTYPE(PL_reg_sv) >= SVt_PVMG && SvMAGIC(PL_reg_sv)
2113                   && (mg = mg_find(PL_reg_sv, PERL_MAGIC_regex_global)))) {
2114                 /* prepare for quick setting of pos */
2115                 sv_magic(PL_reg_sv, (SV*)0,
2116                         PERL_MAGIC_regex_global, Nullch, 0);
2117                 mg = mg_find(PL_reg_sv, PERL_MAGIC_regex_global);
2118                 mg->mg_len = -1;
2119             }
2120             PL_reg_magic    = mg;
2121             PL_reg_oldpos   = mg->mg_len;
2122             SAVEDESTRUCTOR_X(restore_pos, 0);
2123         }
2124         if (!PL_reg_curpm) {
2125             Newz(22,PL_reg_curpm, 1, PMOP);
2126 #ifdef USE_ITHREADS
2127             {
2128                 SV* repointer = newSViv(0);
2129                 /* so we know which PL_regex_padav element is PL_reg_curpm */
2130                 SvFLAGS(repointer) |= SVf_BREAK;
2131                 av_push(PL_regex_padav,repointer);
2132                 PL_reg_curpm->op_pmoffset = av_len(PL_regex_padav);
2133                 PL_regex_pad = AvARRAY(PL_regex_padav);
2134             }
2135 #endif      
2136         }
2137         PM_SETRE(PL_reg_curpm, prog);
2138         PL_reg_oldcurpm = PL_curpm;
2139         PL_curpm = PL_reg_curpm;
2140         if (RX_MATCH_COPIED(prog)) {
2141             /*  Here is a serious problem: we cannot rewrite subbeg,
2142                 since it may be needed if this match fails.  Thus
2143                 $` inside (?{}) could fail... */
2144             PL_reg_oldsaved = prog->subbeg;
2145             PL_reg_oldsavedlen = prog->sublen;
2146 #ifdef PERL_COPY_ON_WRITE
2147             PL_nrs = prog->saved_copy;
2148 #endif
2149             RX_MATCH_COPIED_off(prog);
2150         }
2151         else
2152             PL_reg_oldsaved = Nullch;
2153         prog->subbeg = PL_bostr;
2154         prog->sublen = PL_regeol - PL_bostr; /* strend may have been modified */
2155     }
2156     prog->startp[0] = startpos - PL_bostr;
2157     PL_reginput = startpos;
2158     PL_regstartp = prog->startp;
2159     PL_regendp = prog->endp;
2160     PL_reglastparen = &prog->lastparen;
2161     PL_reglastcloseparen = &prog->lastcloseparen;
2162     prog->lastparen = 0;
2163     prog->lastcloseparen = 0;
2164     PL_regsize = 0;
2165     DEBUG_r(PL_reg_starttry = startpos);
2166     if (PL_reg_start_tmpl <= prog->nparens) {
2167         PL_reg_start_tmpl = prog->nparens*3/2 + 3;
2168         if(PL_reg_start_tmp)
2169             Renew(PL_reg_start_tmp, PL_reg_start_tmpl, char*);
2170         else
2171             New(22,PL_reg_start_tmp, PL_reg_start_tmpl, char*);
2172     }
2173
2174     /* XXXX What this code is doing here?!!!  There should be no need
2175        to do this again and again, PL_reglastparen should take care of
2176        this!  --ilya*/
2177
2178     /* Tests pat.t#187 and split.t#{13,14} seem to depend on this code.
2179      * Actually, the code in regcppop() (which Ilya may be meaning by
2180      * PL_reglastparen), is not needed at all by the test suite
2181      * (op/regexp, op/pat, op/split), but that code is needed, oddly
2182      * enough, for building DynaLoader, or otherwise this
2183      * "Error: '*' not in typemap in DynaLoader.xs, line 164"
2184      * will happen.  Meanwhile, this code *is* needed for the
2185      * above-mentioned test suite tests to succeed.  The common theme
2186      * on those tests seems to be returning null fields from matches.
2187      * --jhi */
2188 #if 1
2189     sp = prog->startp;
2190     ep = prog->endp;
2191     if (prog->nparens) {
2192         for (i = prog->nparens; i > (I32)*PL_reglastparen; i--) {
2193             *++sp = -1;
2194             *++ep = -1;
2195         }
2196     }
2197 #endif
2198     REGCP_SET(lastcp);
2199     if (regmatch(prog->program + 1)) {
2200         prog->endp[0] = PL_reginput - PL_bostr;
2201         return 1;
2202     }
2203     REGCP_UNWIND(lastcp);
2204     return 0;
2205 }
2206
2207 #define RE_UNWIND_BRANCH        1
2208 #define RE_UNWIND_BRANCHJ       2
2209
2210 union re_unwind_t;
2211
2212 typedef struct {                /* XX: makes sense to enlarge it... */
2213     I32 type;
2214     I32 prev;
2215     CHECKPOINT lastcp;
2216 } re_unwind_generic_t;
2217
2218 typedef struct {
2219     I32 type;
2220     I32 prev;
2221     CHECKPOINT lastcp;
2222     I32 lastparen;
2223     regnode *next;
2224     char *locinput;
2225     I32 nextchr;
2226 #ifdef DEBUGGING
2227     int regindent;
2228 #endif
2229 } re_unwind_branch_t;
2230
2231 typedef union re_unwind_t {
2232     I32 type;
2233     re_unwind_generic_t generic;
2234     re_unwind_branch_t branch;
2235 } re_unwind_t;
2236
2237 #define sayYES goto yes
2238 #define sayNO goto no
2239 #define sayNO_ANYOF goto no_anyof
2240 #define sayYES_FINAL goto yes_final
2241 #define sayYES_LOUD  goto yes_loud
2242 #define sayNO_FINAL  goto no_final
2243 #define sayNO_SILENT goto do_no
2244 #define saySAME(x) if (x) goto yes; else goto no
2245
2246 #define REPORT_CODE_OFF 24
2247
2248 /*
2249  - regmatch - main matching routine
2250  *
2251  * Conceptually the strategy is simple:  check to see whether the current
2252  * node matches, call self recursively to see whether the rest matches,
2253  * and then act accordingly.  In practice we make some effort to avoid
2254  * recursion, in particular by going through "ordinary" nodes (that don't
2255  * need to know whether the rest of the match failed) by a loop instead of
2256  * by recursion.
2257  */
2258 /* [lwall] I've hoisted the register declarations to the outer block in order to
2259  * maybe save a little bit of pushing and popping on the stack.  It also takes
2260  * advantage of machines that use a register save mask on subroutine entry.
2261  */
2262 STATIC I32                      /* 0 failure, 1 success */
2263 S_regmatch(pTHX_ regnode *prog)
2264 {
2265     register regnode *scan;     /* Current node. */
2266     regnode *next;              /* Next node. */
2267     regnode *inner;             /* Next node in internal branch. */
2268     register I32 nextchr;       /* renamed nextchr - nextchar colides with
2269                                    function of same name */
2270     register I32 n;             /* no or next */
2271     register I32 ln = 0;        /* len or last */
2272     register char *s = Nullch;  /* operand or save */
2273     register char *locinput = PL_reginput;
2274     register I32 c1 = 0, c2 = 0, paren; /* case fold search, parenth */
2275     int minmod = 0, sw = 0, logical = 0;
2276     I32 unwind = 0;
2277 #if 0
2278     I32 firstcp = PL_savestack_ix;
2279 #endif
2280     register bool do_utf8 = PL_reg_match_utf8;
2281 #ifdef DEBUGGING
2282     SV *dsv0 = PERL_DEBUG_PAD_ZERO(0);
2283     SV *dsv1 = PERL_DEBUG_PAD_ZERO(1);
2284     SV *dsv2 = PERL_DEBUG_PAD_ZERO(2);
2285 #endif
2286
2287 #ifdef DEBUGGING
2288     PL_regindent++;
2289 #endif
2290
2291     /* Note that nextchr is a byte even in UTF */
2292     nextchr = UCHARAT(locinput);
2293     scan = prog;
2294     while (scan != NULL) {
2295
2296         DEBUG_r( {
2297             SV *prop = sv_newmortal();
2298             int docolor = *PL_colors[0];
2299             int taill = (docolor ? 10 : 7); /* 3 chars for "> <" */
2300             int l = (PL_regeol - locinput) > taill ? taill : (PL_regeol - locinput);
2301             /* The part of the string before starttry has one color
2302                (pref0_len chars), between starttry and current
2303                position another one (pref_len - pref0_len chars),
2304                after the current position the third one.
2305                We assume that pref0_len <= pref_len, otherwise we
2306                decrease pref0_len.  */
2307             int pref_len = (locinput - PL_bostr) > (5 + taill) - l
2308                 ? (5 + taill) - l : locinput - PL_bostr;
2309             int pref0_len;
2310
2311             while (do_utf8 && UTF8_IS_CONTINUATION(*(U8*)(locinput - pref_len)))
2312                 pref_len++;
2313             pref0_len = pref_len  - (locinput - PL_reg_starttry);
2314             if (l + pref_len < (5 + taill) && l < PL_regeol - locinput)
2315                 l = ( PL_regeol - locinput > (5 + taill) - pref_len
2316                       ? (5 + taill) - pref_len : PL_regeol - locinput);
2317             while (do_utf8 && UTF8_IS_CONTINUATION(*(U8*)(locinput + l)))
2318                 l--;
2319             if (pref0_len < 0)
2320                 pref0_len = 0;
2321             if (pref0_len > pref_len)
2322                 pref0_len = pref_len;
2323             regprop(prop, scan);
2324             {
2325               char *s0 =
2326                 do_utf8 && OP(scan) != CANY ?
2327                 pv_uni_display(dsv0, (U8*)(locinput - pref_len),
2328                                pref0_len, 60, UNI_DISPLAY_REGEX) :
2329                 locinput - pref_len;
2330               int len0 = do_utf8 ? strlen(s0) : pref0_len;
2331               char *s1 = do_utf8 && OP(scan) != CANY ?
2332                 pv_uni_display(dsv1, (U8*)(locinput - pref_len + pref0_len),
2333                                pref_len - pref0_len, 60, UNI_DISPLAY_REGEX) :
2334                 locinput - pref_len + pref0_len;
2335               int len1 = do_utf8 ? strlen(s1) : pref_len - pref0_len;
2336               char *s2 = do_utf8 && OP(scan) != CANY ?
2337                 pv_uni_display(dsv2, (U8*)locinput,
2338                                PL_regeol - locinput, 60, UNI_DISPLAY_REGEX) :
2339                 locinput;
2340               int len2 = do_utf8 ? strlen(s2) : l;
2341               PerlIO_printf(Perl_debug_log,
2342                             "%4"IVdf" <%s%.*s%s%s%.*s%s%s%s%.*s%s>%*s|%3"IVdf":%*s%s\n",
2343                             (IV)(locinput - PL_bostr),
2344                             PL_colors[4],
2345                             len0, s0,
2346                             PL_colors[5],
2347                             PL_colors[2],
2348                             len1, s1,
2349                             PL_colors[3],
2350                             (docolor ? "" : "> <"),
2351                             PL_colors[0],
2352                             len2, s2,
2353                             PL_colors[1],
2354                             15 - l - pref_len + 1,
2355                             "",
2356                             (IV)(scan - PL_regprogram), PL_regindent*2, "",
2357                             SvPVX(prop));
2358             }
2359         });
2360
2361         next = scan + NEXT_OFF(scan);
2362         if (next == scan)
2363             next = NULL;
2364
2365         switch (OP(scan)) {
2366         case BOL:
2367             if (locinput == PL_bostr || (PL_multiline &&
2368                 (nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
2369             {
2370                 /* regtill = regbol; */
2371                 break;
2372             }
2373             sayNO;
2374         case MBOL:
2375             if (locinput == PL_bostr ||
2376                 ((nextchr || locinput < PL_regeol) && locinput[-1] == '\n'))
2377             {
2378                 break;
2379             }
2380             sayNO;
2381         case SBOL:
2382             if (locinput == PL_bostr)
2383                 break;
2384             sayNO;
2385         case GPOS:
2386             if (locinput == PL_reg_ganch)
2387                 break;
2388             sayNO;
2389         case EOL:
2390             if (PL_multiline)
2391                 goto meol;
2392             else
2393                 goto seol;
2394         case MEOL:
2395           meol:
2396             if ((nextchr || locinput < PL_regeol) && nextchr != '\n')
2397                 sayNO;
2398             break;
2399         case SEOL:
2400           seol:
2401             if ((nextchr || locinput < PL_regeol) && nextchr != '\n')
2402                 sayNO;
2403             if (PL_regeol - locinput > 1)
2404                 sayNO;
2405             break;
2406         case EOS:
2407             if (PL_regeol != locinput)
2408                 sayNO;
2409             break;
2410         case SANY:
2411             if (!nextchr && locinput >= PL_regeol)
2412                 sayNO;
2413             if (do_utf8) {
2414                 locinput += PL_utf8skip[nextchr];
2415                 if (locinput > PL_regeol)
2416                     sayNO;
2417                 nextchr = UCHARAT(locinput);
2418             }
2419             else
2420                 nextchr = UCHARAT(++locinput);
2421             break;
2422         case CANY:
2423             if (!nextchr && locinput >= PL_regeol)
2424                 sayNO;
2425             nextchr = UCHARAT(++locinput);
2426             break;
2427         case REG_ANY:
2428             if ((!nextchr && locinput >= PL_regeol) || nextchr == '\n')
2429                 sayNO;
2430             if (do_utf8) {
2431                 locinput += PL_utf8skip[nextchr];
2432                 if (locinput > PL_regeol)
2433                     sayNO;
2434                 nextchr = UCHARAT(locinput);
2435             }
2436             else
2437                 nextchr = UCHARAT(++locinput);
2438             break;
2439         case EXACT:
2440             s = STRING(scan);
2441             ln = STR_LEN(scan);
2442             if (do_utf8 != UTF) {
2443                 /* The target and the pattern have differing utf8ness. */
2444                 char *l = locinput;
2445                 char *e = s + ln;
2446                 STRLEN ulen;
2447
2448                 if (do_utf8) {
2449                     /* The target is utf8, the pattern is not utf8. */
2450                     while (s < e) {
2451                         if (l >= PL_regeol)
2452                              sayNO;
2453                         if (NATIVE_TO_UNI(*(U8*)s) !=
2454                             utf8n_to_uvuni((U8*)l, UTF8_MAXLEN, &ulen,
2455                                            ckWARN(WARN_UTF8) ?
2456                                            0 : UTF8_ALLOW_ANY))
2457                              sayNO;
2458                         l += ulen;
2459                         s ++;
2460                     }
2461                 }
2462                 else {
2463                     /* The target is not utf8, the pattern is utf8. */
2464                     while (s < e) {
2465                         if (l >= PL_regeol)
2466                             sayNO;
2467                         if (NATIVE_TO_UNI(*((U8*)l)) !=
2468                             utf8n_to_uvuni((U8*)s, UTF8_MAXLEN, &ulen,
2469                                            ckWARN(WARN_UTF8) ?
2470                                            0 : UTF8_ALLOW_ANY))
2471                             sayNO;
2472                         s += ulen;
2473                         l ++;
2474                     }
2475                 }
2476                 locinput = l;
2477                 nextchr = UCHARAT(locinput);
2478                 break;
2479             }
2480             /* The target and the pattern have the same utf8ness. */
2481             /* Inline the first character, for speed. */
2482             if (UCHARAT(s) != nextchr)
2483                 sayNO;
2484             if (PL_regeol - locinput < ln)
2485                 sayNO;
2486             if (ln > 1 && memNE(s, locinput, ln))
2487                 sayNO;
2488             locinput += ln;
2489             nextchr = UCHARAT(locinput);
2490             break;
2491         case EXACTFL:
2492             PL_reg_flags |= RF_tainted;
2493             /* FALL THROUGH */
2494         case EXACTF:
2495             s = STRING(scan);
2496             ln = STR_LEN(scan);
2497
2498             if (do_utf8 || UTF) {
2499               /* Either target or the pattern are utf8. */
2500                 char *l = locinput;
2501                 char *e = PL_regeol;
2502
2503                 if (ibcmp_utf8(s, 0,  ln, (bool)UTF,
2504                                l, &e, 0,  do_utf8)) {
2505                      /* One more case for the sharp s:
2506                       * pack("U0U*", 0xDF) =~ /ss/i,
2507                       * the 0xC3 0x9F are the UTF-8
2508                       * byte sequence for the U+00DF. */
2509                      if (!(do_utf8 &&
2510                            toLOWER(s[0]) == 's' &&
2511                            ln >= 2 &&
2512                            toLOWER(s[1]) == 's' &&
2513                            (U8)l[0] == 0xC3 &&
2514                            e - l >= 2 &&
2515                            (U8)l[1] == 0x9F))
2516                           sayNO;
2517                 }
2518                 locinput = e;
2519                 nextchr = UCHARAT(locinput);
2520                 break;
2521             }
2522
2523             /* Neither the target and the pattern are utf8. */
2524
2525             /* Inline the first character, for speed. */
2526             if (UCHARAT(s) != nextchr &&
2527                 UCHARAT(s) != ((OP(scan) == EXACTF)
2528                                ? PL_fold : PL_fold_locale)[nextchr])
2529                 sayNO;
2530             if (PL_regeol - locinput < ln)
2531                 sayNO;
2532             if (ln > 1 && (OP(scan) == EXACTF
2533                            ? ibcmp(s, locinput, ln)
2534                            : ibcmp_locale(s, locinput, ln)))
2535                 sayNO;
2536             locinput += ln;
2537             nextchr = UCHARAT(locinput);
2538             break;
2539         case ANYOF:
2540             if (do_utf8) {
2541                 STRLEN inclasslen = PL_regeol - locinput;
2542
2543                 if (!reginclass(scan, (U8*)locinput, &inclasslen, do_utf8))
2544                     sayNO_ANYOF;
2545                 if (locinput >= PL_regeol)
2546                     sayNO;
2547                 locinput += inclasslen ? inclasslen : UTF8SKIP(locinput);
2548                 nextchr = UCHARAT(locinput);
2549                 break;
2550             }
2551             else {
2552                 if (nextchr < 0)
2553                     nextchr = UCHARAT(locinput);
2554                 if (!REGINCLASS(scan, (U8*)locinput))
2555                     sayNO_ANYOF;
2556                 if (!nextchr && locinput >= PL_regeol)
2557                     sayNO;
2558                 nextchr = UCHARAT(++locinput);
2559                 break;
2560             }
2561         no_anyof:
2562             /* If we might have the case of the German sharp s
2563              * in a casefolding Unicode character class. */
2564
2565             if (ANYOF_FOLD_SHARP_S(scan, locinput, PL_regeol)) {
2566                  locinput += SHARP_S_SKIP;
2567                  nextchr = UCHARAT(locinput);
2568             }
2569             else
2570                  sayNO;
2571             break;
2572         case ALNUML:
2573             PL_reg_flags |= RF_tainted;
2574             /* FALL THROUGH */
2575         case ALNUM:
2576             if (!nextchr)
2577                 sayNO;
2578             if (do_utf8) {
2579                 LOAD_UTF8_CHARCLASS(alnum,"a");
2580                 if (!(OP(scan) == ALNUM
2581                       ? swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
2582                       : isALNUM_LC_utf8((U8*)locinput)))
2583                 {
2584                     sayNO;
2585                 }
2586                 locinput += PL_utf8skip[nextchr];
2587                 nextchr = UCHARAT(locinput);
2588                 break;
2589             }
2590             if (!(OP(scan) == ALNUM
2591                   ? isALNUM(nextchr) : isALNUM_LC(nextchr)))
2592                 sayNO;
2593             nextchr = UCHARAT(++locinput);
2594             break;
2595         case NALNUML:
2596             PL_reg_flags |= RF_tainted;
2597             /* FALL THROUGH */
2598         case NALNUM:
2599             if (!nextchr && locinput >= PL_regeol)
2600                 sayNO;
2601             if (do_utf8) {
2602                 LOAD_UTF8_CHARCLASS(alnum,"a");
2603                 if (OP(scan) == NALNUM
2604                     ? swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
2605                     : isALNUM_LC_utf8((U8*)locinput))
2606                 {
2607                     sayNO;
2608                 }
2609                 locinput += PL_utf8skip[nextchr];
2610                 nextchr = UCHARAT(locinput);
2611                 break;
2612             }
2613             if (OP(scan) == NALNUM
2614                 ? isALNUM(nextchr) : isALNUM_LC(nextchr))
2615                 sayNO;
2616             nextchr = UCHARAT(++locinput);
2617             break;
2618         case BOUNDL:
2619         case NBOUNDL:
2620             PL_reg_flags |= RF_tainted;
2621             /* FALL THROUGH */
2622         case BOUND:
2623         case NBOUND:
2624             /* was last char in word? */
2625             if (do_utf8) {
2626                 if (locinput == PL_bostr)
2627                     ln = '\n';
2628                 else {
2629                     U8 *r = reghop3((U8*)locinput, -1, (U8*)PL_bostr);
2630                 
2631                     ln = utf8n_to_uvchr(r, UTF8SKIP(r), 0, 0);
2632                 }
2633                 if (OP(scan) == BOUND || OP(scan) == NBOUND) {
2634                     ln = isALNUM_uni(ln);
2635                     LOAD_UTF8_CHARCLASS(alnum,"a");
2636                     n = swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8);
2637                 }
2638                 else {
2639                     ln = isALNUM_LC_uvchr(UNI_TO_NATIVE(ln));
2640                     n = isALNUM_LC_utf8((U8*)locinput);
2641                 }
2642             }
2643             else {
2644                 ln = (locinput != PL_bostr) ?
2645                     UCHARAT(locinput - 1) : '\n';
2646                 if (OP(scan) == BOUND || OP(scan) == NBOUND) {
2647                     ln = isALNUM(ln);
2648                     n = isALNUM(nextchr);
2649                 }
2650                 else {
2651                     ln = isALNUM_LC(ln);
2652                     n = isALNUM_LC(nextchr);
2653                 }
2654             }
2655             if (((!ln) == (!n)) == (OP(scan) == BOUND ||
2656                                     OP(scan) == BOUNDL))
2657                     sayNO;
2658             break;
2659         case SPACEL:
2660             PL_reg_flags |= RF_tainted;
2661             /* FALL THROUGH */
2662         case SPACE:
2663             if (!nextchr)
2664                 sayNO;
2665             if (do_utf8) {
2666                 if (UTF8_IS_CONTINUED(nextchr)) {
2667                     LOAD_UTF8_CHARCLASS(space," ");
2668                     if (!(OP(scan) == SPACE
2669                           ? swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
2670                           : isSPACE_LC_utf8((U8*)locinput)))
2671                     {
2672                         sayNO;
2673                     }
2674                     locinput += PL_utf8skip[nextchr];
2675                     nextchr = UCHARAT(locinput);
2676                     break;
2677                 }
2678                 if (!(OP(scan) == SPACE
2679                       ? isSPACE(nextchr) : isSPACE_LC(nextchr)))
2680                     sayNO;
2681                 nextchr = UCHARAT(++locinput);
2682             }
2683             else {
2684                 if (!(OP(scan) == SPACE
2685                       ? isSPACE(nextchr) : isSPACE_LC(nextchr)))
2686                     sayNO;
2687                 nextchr = UCHARAT(++locinput);
2688             }
2689             break;
2690         case NSPACEL:
2691             PL_reg_flags |= RF_tainted;
2692             /* FALL THROUGH */
2693         case NSPACE:
2694             if (!nextchr && locinput >= PL_regeol)
2695                 sayNO;
2696             if (do_utf8) {
2697                 LOAD_UTF8_CHARCLASS(space," ");
2698                 if (OP(scan) == NSPACE
2699                     ? swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
2700                     : isSPACE_LC_utf8((U8*)locinput))
2701                 {
2702                     sayNO;
2703                 }
2704                 locinput += PL_utf8skip[nextchr];
2705                 nextchr = UCHARAT(locinput);
2706                 break;
2707             }
2708             if (OP(scan) == NSPACE
2709                 ? isSPACE(nextchr) : isSPACE_LC(nextchr))
2710                 sayNO;
2711             nextchr = UCHARAT(++locinput);
2712             break;
2713         case DIGITL:
2714             PL_reg_flags |= RF_tainted;
2715             /* FALL THROUGH */
2716         case DIGIT:
2717             if (!nextchr)
2718                 sayNO;
2719             if (do_utf8) {
2720                 LOAD_UTF8_CHARCLASS(digit,"0");
2721                 if (!(OP(scan) == DIGIT
2722                       ? swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
2723                       : isDIGIT_LC_utf8((U8*)locinput)))
2724                 {
2725                     sayNO;
2726                 }
2727                 locinput += PL_utf8skip[nextchr];
2728                 nextchr = UCHARAT(locinput);
2729                 break;
2730             }
2731             if (!(OP(scan) == DIGIT
2732                   ? isDIGIT(nextchr) : isDIGIT_LC(nextchr)))
2733                 sayNO;
2734             nextchr = UCHARAT(++locinput);
2735             break;
2736         case NDIGITL:
2737             PL_reg_flags |= RF_tainted;
2738             /* FALL THROUGH */
2739         case NDIGIT:
2740             if (!nextchr && locinput >= PL_regeol)
2741                 sayNO;
2742             if (do_utf8) {
2743                 LOAD_UTF8_CHARCLASS(digit,"0");
2744                 if (OP(scan) == NDIGIT
2745                     ? swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
2746                     : isDIGIT_LC_utf8((U8*)locinput))
2747                 {
2748                     sayNO;
2749                 }
2750                 locinput += PL_utf8skip[nextchr];
2751                 nextchr = UCHARAT(locinput);
2752                 break;
2753             }
2754             if (OP(scan) == NDIGIT
2755                 ? isDIGIT(nextchr) : isDIGIT_LC(nextchr))
2756                 sayNO;
2757             nextchr = UCHARAT(++locinput);
2758             break;
2759         case CLUMP:
2760             if (locinput >= PL_regeol)
2761                 sayNO;
2762             if  (do_utf8) {
2763                 LOAD_UTF8_CHARCLASS(mark,"~");
2764                 if (swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
2765                     sayNO;
2766                 locinput += PL_utf8skip[nextchr];
2767                 while (locinput < PL_regeol &&
2768                        swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
2769                     locinput += UTF8SKIP(locinput);
2770                 if (locinput > PL_regeol)
2771                     sayNO;
2772             } 
2773             else
2774                locinput++;
2775             nextchr = UCHARAT(locinput);
2776             break;
2777         case REFFL:
2778             PL_reg_flags |= RF_tainted;
2779             /* FALL THROUGH */
2780         case REF:
2781         case REFF:
2782             n = ARG(scan);  /* which paren pair */
2783             ln = PL_regstartp[n];
2784             PL_reg_leftiter = PL_reg_maxiter;           /* Void cache */
2785             if ((I32)*PL_reglastparen < n || ln == -1)
2786                 sayNO;                  /* Do not match unless seen CLOSEn. */
2787             if (ln == PL_regendp[n])
2788                 break;
2789
2790             s = PL_bostr + ln;
2791             if (do_utf8 && OP(scan) != REF) {   /* REF can do byte comparison */
2792                 char *l = locinput;
2793                 char *e = PL_bostr + PL_regendp[n];
2794                 /*
2795                  * Note that we can't do the "other character" lookup trick as
2796                  * in the 8-bit case (no pun intended) because in Unicode we
2797                  * have to map both upper and title case to lower case.
2798                  */
2799                 if (OP(scan) == REFF) {
2800                     STRLEN ulen1, ulen2;
2801                     U8 tmpbuf1[UTF8_MAXLEN_UCLC+1];
2802                     U8 tmpbuf2[UTF8_MAXLEN_UCLC+1];
2803                     while (s < e) {
2804                         if (l >= PL_regeol)
2805                             sayNO;
2806                         toLOWER_utf8((U8*)s, tmpbuf1, &ulen1);
2807                         toLOWER_utf8((U8*)l, tmpbuf2, &ulen2);
2808                         if (ulen1 != ulen2 || memNE((char *)tmpbuf1, (char *)tmpbuf2, ulen1))
2809                             sayNO;
2810                         s += ulen1;
2811                         l += ulen2;
2812                     }
2813                 }
2814                 locinput = l;
2815                 nextchr = UCHARAT(locinput);
2816                 break;
2817             }
2818
2819             /* Inline the first character, for speed. */
2820             if (UCHARAT(s) != nextchr &&
2821                 (OP(scan) == REF ||
2822                  (UCHARAT(s) != ((OP(scan) == REFF
2823                                   ? PL_fold : PL_fold_locale)[nextchr]))))
2824                 sayNO;
2825             ln = PL_regendp[n] - ln;
2826             if (locinput + ln > PL_regeol)
2827                 sayNO;
2828             if (ln > 1 && (OP(scan) == REF
2829                            ? memNE(s, locinput, ln)
2830                            : (OP(scan) == REFF
2831                               ? ibcmp(s, locinput, ln)
2832                               : ibcmp_locale(s, locinput, ln))))
2833                 sayNO;
2834             locinput += ln;
2835             nextchr = UCHARAT(locinput);
2836             break;
2837
2838         case NOTHING:
2839         case TAIL:
2840             break;
2841         case BACK:
2842             break;
2843         case EVAL:
2844         {
2845             dSP;
2846             OP_4tree *oop = PL_op;
2847             COP *ocurcop = PL_curcop;
2848             PAD *old_comppad;
2849             SV *ret;
2850             struct regexp *oreg = PL_reg_re;
2851         
2852             n = ARG(scan);
2853             PL_op = (OP_4tree*)PL_regdata->data[n];
2854             DEBUG_r( PerlIO_printf(Perl_debug_log, "  re_eval 0x%"UVxf"\n", PTR2UV(PL_op)) );
2855             PAD_SAVE_LOCAL(old_comppad, (PAD*)PL_regdata->data[n + 2]);
2856             PL_regendp[0] = PL_reg_magic->mg_len = locinput - PL_bostr;
2857
2858             {
2859                 SV **before = SP;
2860                 CALLRUNOPS(aTHX);                       /* Scalar context. */
2861                 SPAGAIN;
2862                 if (SP == before)
2863                     ret = &PL_sv_undef;   /* protect against empty (?{}) blocks. */
2864                 else {
2865                     ret = POPs;
2866                     PUTBACK;
2867                 }
2868             }
2869
2870             PL_op = oop;
2871             PAD_RESTORE_LOCAL(old_comppad);
2872             PL_curcop = ocurcop;
2873             if (logical) {
2874                 if (logical == 2) {     /* Postponed subexpression. */
2875                     regexp *re;
2876                     MAGIC *mg = Null(MAGIC*);
2877                     re_cc_state state;
2878                     CHECKPOINT cp, lastcp;
2879                     int toggleutf;
2880                     register SV *sv;
2881
2882                     if(SvROK(ret) && SvSMAGICAL(sv = SvRV(ret)))
2883                         mg = mg_find(sv, PERL_MAGIC_qr);
2884                     else if (SvSMAGICAL(ret)) {
2885                         if (SvGMAGICAL(ret))
2886                             sv_unmagic(ret, PERL_MAGIC_qr);
2887                         else
2888                             mg = mg_find(ret, PERL_MAGIC_qr);
2889                     }
2890
2891                     if (mg) {
2892                         re = (regexp *)mg->mg_obj;
2893                         (void)ReREFCNT_inc(re);
2894                     }
2895                     else {
2896                         STRLEN len;
2897                         char *t = SvPV(ret, len);
2898                         PMOP pm;
2899                         char *oprecomp = PL_regprecomp;
2900                         I32 osize = PL_regsize;
2901                         I32 onpar = PL_regnpar;
2902
2903                         Zero(&pm, 1, PMOP);
2904                         if (DO_UTF8(ret)) pm.op_pmdynflags |= PMdf_DYN_UTF8;
2905                         re = CALLREGCOMP(aTHX_ t, t + len, &pm);
2906                         if (!(SvFLAGS(ret)
2907                               & (SVs_TEMP | SVs_PADTMP | SVf_READONLY
2908                                 | SVs_GMG)))
2909                             sv_magic(ret,(SV*)ReREFCNT_inc(re),
2910                                         PERL_MAGIC_qr,0,0);
2911                         PL_regprecomp = oprecomp;
2912                         PL_regsize = osize;
2913                         PL_regnpar = onpar;
2914                     }
2915                     DEBUG_r(
2916                         PerlIO_printf(Perl_debug_log,
2917                                       "Entering embedded `%s%.60s%s%s'\n",
2918                                       PL_colors[0],
2919                                       re->precomp,
2920                                       PL_colors[1],
2921                                       (strlen(re->precomp) > 60 ? "..." : ""))
2922                         );
2923                     state.node = next;
2924                     state.prev = PL_reg_call_cc;
2925                     state.cc = PL_regcc;
2926                     state.re = PL_reg_re;
2927
2928                     PL_regcc = 0;
2929                 
2930                     cp = regcppush(0);  /* Save *all* the positions. */
2931                     REGCP_SET(lastcp);
2932                     cache_re(re);
2933                     state.ss = PL_savestack_ix;
2934                     *PL_reglastparen = 0;
2935                     *PL_reglastcloseparen = 0;
2936                     PL_reg_call_cc = &state;
2937                     PL_reginput = locinput;
2938                     toggleutf = ((PL_reg_flags & RF_utf8) != 0) ^
2939                                 ((re->reganch & ROPT_UTF8) != 0);
2940                     if (toggleutf) PL_reg_flags ^= RF_utf8;
2941
2942                     /* XXXX This is too dramatic a measure... */
2943                     PL_reg_maxiter = 0;
2944
2945                     if (regmatch(re->program + 1)) {
2946                         /* Even though we succeeded, we need to restore
2947                            global variables, since we may be wrapped inside
2948                            SUSPEND, thus the match may be not finished yet. */
2949
2950                         /* XXXX Do this only if SUSPENDed? */
2951                         PL_reg_call_cc = state.prev;
2952                         PL_regcc = state.cc;
2953                         PL_reg_re = state.re;
2954                         cache_re(PL_reg_re);
2955                         if (toggleutf) PL_reg_flags ^= RF_utf8;
2956
2957                         /* XXXX This is too dramatic a measure... */
2958                         PL_reg_maxiter = 0;
2959
2960                         /* These are needed even if not SUSPEND. */
2961                         ReREFCNT_dec(re);
2962                         regcpblow(cp);
2963                         sayYES;
2964                     }
2965                     ReREFCNT_dec(re);
2966                     REGCP_UNWIND(lastcp);
2967                     regcppop();
2968                     PL_reg_call_cc = state.prev;
2969                     PL_regcc = state.cc;
2970                     PL_reg_re = state.re;
2971                     cache_re(PL_reg_re);
2972                     if (toggleutf) PL_reg_flags ^= RF_utf8;
2973
2974                     /* XXXX This is too dramatic a measure... */
2975                     PL_reg_maxiter = 0;
2976
2977                     logical = 0;
2978                     sayNO;
2979                 }
2980                 sw = SvTRUE(ret);
2981                 logical = 0;
2982             }
2983             else {
2984                 sv_setsv(save_scalar(PL_replgv), ret);
2985                 cache_re(oreg);
2986             }
2987             break;
2988         }
2989         case OPEN:
2990             n = ARG(scan);  /* which paren pair */
2991             PL_reg_start_tmp[n] = locinput;
2992             if (n > PL_regsize)
2993                 PL_regsize = n;
2994             break;
2995         case CLOSE:
2996             n = ARG(scan);  /* which paren pair */
2997             PL_regstartp[n] = PL_reg_start_tmp[n] - PL_bostr;
2998             PL_regendp[n] = locinput - PL_bostr;
2999             if (n > (I32)*PL_reglastparen)
3000                 *PL_reglastparen = n;
3001             *PL_reglastcloseparen = n;
3002             break;
3003         case GROUPP:
3004             n = ARG(scan);  /* which paren pair */
3005             sw = ((I32)*PL_reglastparen >= n && PL_regendp[n] != -1);
3006             break;
3007         case IFTHEN:
3008             PL_reg_leftiter = PL_reg_maxiter;           /* Void cache */
3009             if (sw)
3010                 next = NEXTOPER(NEXTOPER(scan));
3011             else {
3012                 next = scan + ARG(scan);
3013                 if (OP(next) == IFTHEN) /* Fake one. */
3014                     next = NEXTOPER(NEXTOPER(next));
3015             }
3016             break;
3017         case LOGICAL:
3018             logical = scan->flags;
3019             break;
3020 /*******************************************************************
3021  PL_regcc contains infoblock about the innermost (...)* loop, and
3022  a pointer to the next outer infoblock.
3023
3024  Here is how Y(A)*Z is processed (if it is compiled into CURLYX/WHILEM):
3025
3026    1) After matching X, regnode for CURLYX is processed;
3027
3028    2) This regnode creates infoblock on the stack, and calls
3029       regmatch() recursively with the starting point at WHILEM node;
3030
3031    3) Each hit of WHILEM node tries to match A and Z (in the order
3032       depending on the current iteration, min/max of {min,max} and
3033       greediness).  The information about where are nodes for "A"
3034       and "Z" is read from the infoblock, as is info on how many times "A"
3035       was already matched, and greediness.
3036
3037    4) After A matches, the same WHILEM node is hit again.
3038
3039    5) Each time WHILEM is hit, PL_regcc is the infoblock created by CURLYX
3040       of the same pair.  Thus when WHILEM tries to match Z, it temporarily
3041       resets PL_regcc, since this Y(A)*Z can be a part of some other loop:
3042       as in (Y(A)*Z)*.  If Z matches, the automaton will hit the WHILEM node
3043       of the external loop.
3044
3045  Currently present infoblocks form a tree with a stem formed by PL_curcc
3046  and whatever it mentions via ->next, and additional attached trees
3047  corresponding to temporarily unset infoblocks as in "5" above.
3048
3049  In the following picture infoblocks for outer loop of
3050  (Y(A)*?Z)*?T are denoted O, for inner I.  NULL starting block
3051  is denoted by x.  The matched string is YAAZYAZT.  Temporarily postponed
3052  infoblocks are drawn below the "reset" infoblock.
3053
3054  In fact in the picture below we do not show failed matches for Z and T
3055  by WHILEM blocks.  [We illustrate minimal matches, since for them it is
3056  more obvious *why* one needs to *temporary* unset infoblocks.]
3057
3058   Matched       REx position    InfoBlocks      Comment
3059                 (Y(A)*?Z)*?T    x
3060                 Y(A)*?Z)*?T     x <- O
3061   Y             (A)*?Z)*?T      x <- O
3062   Y             A)*?Z)*?T       x <- O <- I
3063   YA            )*?Z)*?T        x <- O <- I
3064   YA            A)*?Z)*?T       x <- O <- I
3065   YAA           )*?Z)*?T        x <- O <- I
3066   YAA           Z)*?T           x <- O          # Temporary unset I
3067                                      I
3068
3069   YAAZ          Y(A)*?Z)*?T     x <- O
3070                                      I
3071
3072   YAAZY         (A)*?Z)*?T      x <- O
3073                                      I
3074
3075   YAAZY         A)*?Z)*?T       x <- O <- I
3076                                      I
3077
3078   YAAZYA        )*?Z)*?T        x <- O <- I     
3079                                      I
3080
3081   YAAZYA        Z)*?T           x <- O          # Temporary unset I
3082                                      I,I
3083
3084   YAAZYAZ       )*?T            x <- O
3085                                      I,I
3086
3087   YAAZYAZ       T               x               # Temporary unset O
3088                                 O
3089                                 I,I
3090
3091   YAAZYAZT                      x
3092                                 O
3093                                 I,I
3094  *******************************************************************/
3095         case CURLYX: {
3096                 CURCUR cc;
3097                 CHECKPOINT cp = PL_savestack_ix;
3098                 /* No need to save/restore up to this paren */
3099                 I32 parenfloor = scan->flags;
3100
3101                 if (OP(PREVOPER(next)) == NOTHING) /* LONGJMP */
3102                     next += ARG(next);
3103                 cc.oldcc = PL_regcc;
3104                 PL_regcc = &cc;
3105                 /* XXXX Probably it is better to teach regpush to support
3106                    parenfloor > PL_regsize... */
3107                 if (parenfloor > (I32)*PL_reglastparen)
3108                     parenfloor = *PL_reglastparen; /* Pessimization... */
3109                 cc.parenfloor = parenfloor;
3110                 cc.cur = -1;
3111                 cc.min = ARG1(scan);
3112                 cc.max  = ARG2(scan);
3113                 cc.scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
3114                 cc.next = next;
3115                 cc.minmod = minmod;
3116                 cc.lastloc = 0;
3117                 PL_reginput = locinput;
3118                 n = regmatch(PREVOPER(next));   /* start on the WHILEM */
3119                 regcpblow(cp);
3120                 PL_regcc = cc.oldcc;
3121                 saySAME(n);
3122             }
3123             /* NOT REACHED */
3124         case WHILEM: {
3125                 /*
3126                  * This is really hard to understand, because after we match
3127                  * what we're trying to match, we must make sure the rest of
3128                  * the REx is going to match for sure, and to do that we have
3129                  * to go back UP the parse tree by recursing ever deeper.  And
3130                  * if it fails, we have to reset our parent's current state
3131                  * that we can try again after backing off.
3132                  */
3133
3134                 CHECKPOINT cp, lastcp;
3135                 CURCUR* cc = PL_regcc;
3136                 char *lastloc = cc->lastloc; /* Detection of 0-len. */
3137                 
3138                 n = cc->cur + 1;        /* how many we know we matched */
3139                 PL_reginput = locinput;
3140
3141                 DEBUG_r(
3142                     PerlIO_printf(Perl_debug_log,
3143                                   "%*s  %ld out of %ld..%ld  cc=%"UVxf"\n",
3144                                   REPORT_CODE_OFF+PL_regindent*2, "",
3145                                   (long)n, (long)cc->min,
3146                                   (long)cc->max, PTR2UV(cc))
3147                     );
3148
3149                 /* If degenerate scan matches "", assume scan done. */
3150
3151                 if (locinput == cc->lastloc && n >= cc->min) {
3152                     PL_regcc = cc->oldcc;
3153                     if (PL_regcc)
3154                         ln = PL_regcc->cur;
3155                     DEBUG_r(
3156                         PerlIO_printf(Perl_debug_log,
3157                            "%*s  empty match detected, try continuation...\n",
3158                            REPORT_CODE_OFF+PL_regindent*2, "")
3159                         );
3160                     if (regmatch(cc->next))
3161                         sayYES;
3162                     if (PL_regcc)
3163                         PL_regcc->cur = ln;
3164                     PL_regcc = cc;
3165                     sayNO;
3166                 }
3167
3168                 /* First just match a string of min scans. */
3169
3170                 if (n < cc->min) {
3171                     cc->cur = n;
3172                     cc->lastloc = locinput;
3173                     if (regmatch(cc->scan))
3174                         sayYES;
3175                     cc->cur = n - 1;
3176                     cc->lastloc = lastloc;
3177                     sayNO;
3178                 }
3179
3180                 if (scan->flags) {
3181                     /* Check whether we already were at this position.
3182                         Postpone detection until we know the match is not
3183                         *that* much linear. */
3184                 if (!PL_reg_maxiter) {
3185                     PL_reg_maxiter = (PL_regeol - PL_bostr + 1) * (scan->flags>>4);
3186                     PL_reg_leftiter = PL_reg_maxiter;
3187                 }
3188                 if (PL_reg_leftiter-- == 0) {
3189                     I32 size = (PL_reg_maxiter + 7)/8;
3190                     if (PL_reg_poscache) {
3191                         if ((I32)PL_reg_poscache_size < size) {
3192                             Renew(PL_reg_poscache, size, char);
3193                             PL_reg_poscache_size = size;
3194                         }
3195                         Zero(PL_reg_poscache, size, char);
3196                     }
3197                     else {
3198                         PL_reg_poscache_size = size;
3199                         Newz(29, PL_reg_poscache, size, char);
3200                     }
3201                     DEBUG_r(
3202                         PerlIO_printf(Perl_debug_log,
3203               "%sDetected a super-linear match, switching on caching%s...\n",
3204                                       PL_colors[4], PL_colors[5])
3205                         );
3206                 }
3207                 if (PL_reg_leftiter < 0) {
3208                     I32 o = locinput - PL_bostr, b;
3209
3210                     o = (scan->flags & 0xf) - 1 + o * (scan->flags>>4);
3211                     b = o % 8;
3212                     o /= 8;
3213                     if (PL_reg_poscache[o] & (1<<b)) {
3214                     DEBUG_r(
3215                         PerlIO_printf(Perl_debug_log,
3216                                       "%*s  already tried at this position...\n",
3217                                       REPORT_CODE_OFF+PL_regindent*2, "")
3218                         );
3219                         if (PL_reg_flags & RF_false)
3220                             sayYES;
3221                         else
3222                             sayNO_SILENT;
3223                     }
3224                     PL_reg_poscache[o] |= (1<<b);
3225                 }
3226                 }
3227
3228                 /* Prefer next over scan for minimal matching. */
3229
3230                 if (cc->minmod) {
3231                     PL_regcc = cc->oldcc;
3232                     if (PL_regcc)
3233                         ln = PL_regcc->cur;
3234                     cp = regcppush(cc->parenfloor);
3235                     REGCP_SET(lastcp);
3236                     if (regmatch(cc->next)) {
3237                         regcpblow(cp);
3238                         sayYES; /* All done. */
3239                     }
3240                     REGCP_UNWIND(lastcp);
3241                     regcppop();
3242                     if (PL_regcc)
3243                         PL_regcc->cur = ln;
3244                     PL_regcc = cc;
3245
3246                     if (n >= cc->max) { /* Maximum greed exceeded? */
3247                         if (ckWARN(WARN_REGEXP) && n >= REG_INFTY
3248                             && !(PL_reg_flags & RF_warned)) {
3249                             PL_reg_flags |= RF_warned;
3250                             Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s limit (%d) exceeded",
3251                                  "Complex regular subexpression recursion",
3252                                  REG_INFTY - 1);
3253                         }
3254                         sayNO;
3255                     }
3256
3257                     DEBUG_r(
3258                         PerlIO_printf(Perl_debug_log,
3259                                       "%*s  trying longer...\n",
3260                                       REPORT_CODE_OFF+PL_regindent*2, "")
3261                         );
3262                     /* Try scanning more and see if it helps. */
3263                     PL_reginput = locinput;
3264                     cc->cur = n;
3265                     cc->lastloc = locinput;
3266                     cp = regcppush(cc->parenfloor);
3267                     REGCP_SET(lastcp);
3268                     if (regmatch(cc->scan)) {
3269                         regcpblow(cp);
3270                         sayYES;
3271                     }
3272                     REGCP_UNWIND(lastcp);
3273                     regcppop();
3274                     cc->cur = n - 1;
3275                     cc->lastloc = lastloc;
3276                     sayNO;
3277                 }
3278
3279                 /* Prefer scan over next for maximal matching. */
3280
3281                 if (n < cc->max) {      /* More greed allowed? */
3282                     cp = regcppush(cc->parenfloor);
3283                     cc->cur = n;
3284                     cc->lastloc = locinput;
3285                     REGCP_SET(lastcp);
3286                     if (regmatch(cc->scan)) {
3287                         regcpblow(cp);
3288                         sayYES;
3289                     }
3290                     REGCP_UNWIND(lastcp);
3291                     regcppop();         /* Restore some previous $<digit>s? */
3292                     PL_reginput = locinput;
3293                     DEBUG_r(
3294                         PerlIO_printf(Perl_debug_log,
3295                                       "%*s  failed, try continuation...\n",
3296                                       REPORT_CODE_OFF+PL_regindent*2, "")
3297                         );
3298                 }
3299                 if (ckWARN(WARN_REGEXP) && n >= REG_INFTY
3300                         && !(PL_reg_flags & RF_warned)) {
3301                     PL_reg_flags |= RF_warned;
3302                     Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s limit (%d) exceeded",
3303                          "Complex regular subexpression recursion",
3304                          REG_INFTY - 1);
3305                 }
3306
3307                 /* Failed deeper matches of scan, so see if this one works. */
3308                 PL_regcc = cc->oldcc;
3309                 if (PL_regcc)
3310                     ln = PL_regcc->cur;
3311                 if (regmatch(cc->next))
3312                     sayYES;
3313                 if (PL_regcc)
3314                     PL_regcc->cur = ln;
3315                 PL_regcc = cc;
3316                 cc->cur = n - 1;
3317                 cc->lastloc = lastloc;
3318                 sayNO;
3319             }
3320             /* NOT REACHED */
3321         case BRANCHJ:
3322             next = scan + ARG(scan);
3323             if (next == scan)
3324                 next = NULL;
3325             inner = NEXTOPER(NEXTOPER(scan));
3326             goto do_branch;
3327         case BRANCH:
3328             inner = NEXTOPER(scan);
3329           do_branch:
3330             {
3331                 c1 = OP(scan);
3332                 if (OP(next) != c1)     /* No choice. */
3333                     next = inner;       /* Avoid recursion. */
3334                 else {
3335                     I32 lastparen = *PL_reglastparen;
3336                     I32 unwind1;
3337                     re_unwind_branch_t *uw;
3338
3339                     /* Put unwinding data on stack */
3340                     unwind1 = SSNEWt(1,re_unwind_branch_t);
3341                     uw = SSPTRt(unwind1,re_unwind_branch_t);
3342                     uw->prev = unwind;
3343                     unwind = unwind1;
3344                     uw->type = ((c1 == BRANCH)
3345                                 ? RE_UNWIND_BRANCH
3346                                 : RE_UNWIND_BRANCHJ);
3347                     uw->lastparen = lastparen;
3348                     uw->next = next;
3349                     uw->locinput = locinput;
3350                     uw->nextchr = nextchr;
3351 #ifdef DEBUGGING
3352                     uw->regindent = ++PL_regindent;
3353 #endif
3354
3355                     REGCP_SET(uw->lastcp);
3356
3357                     /* Now go into the first branch */
3358                     next = inner;
3359                 }
3360             }
3361             break;
3362         case MINMOD:
3363             minmod = 1;
3364             break;
3365         case CURLYM:
3366         {
3367             I32 l = 0;
3368             CHECKPOINT lastcp;
3369         
3370             /* We suppose that the next guy does not need
3371                backtracking: in particular, it is of constant length,
3372                and has no parenths to influence future backrefs. */
3373             ln = ARG1(scan);  /* min to match */
3374             n  = ARG2(scan);  /* max to match */
3375             paren = scan->flags;
3376             if (paren) {
3377                 if (paren > PL_regsize)
3378                     PL_regsize = paren;
3379                 if (paren > (I32)*PL_reglastparen)
3380                     *PL_reglastparen = paren;
3381             }
3382             scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
3383             if (paren)
3384                 scan += NEXT_OFF(scan); /* Skip former OPEN. */
3385             PL_reginput = locinput;
3386             if (minmod) {
3387                 minmod = 0;
3388                 if (ln && regrepeat_hard(scan, ln, &l) < ln)
3389                     sayNO;
3390                 /* if we matched something zero-length we don't need to
3391                    backtrack - capturing parens are already defined, so
3392                    the caveat in the maximal case doesn't apply
3393
3394                    XXXX if ln == 0, we can redo this check first time
3395                    through the following loop
3396                 */
3397                 if (ln && l == 0)
3398                     n = ln;     /* don't backtrack */
3399                 locinput = PL_reginput;
3400                 if (HAS_TEXT(next) || JUMPABLE(next)) {
3401                     regnode *text_node = next;
3402
3403                     if (! HAS_TEXT(text_node)) FIND_NEXT_IMPT(text_node);
3404
3405                     if (! HAS_TEXT(text_node)) c1 = c2 = -1000;
3406                     else {
3407                         if (PL_regkind[(U8)OP(text_node)] == REF) {
3408                             c1 = c2 = -1000;
3409                             goto assume_ok_MM;
3410                         }
3411                         else { c1 = (U8)*STRING(text_node); }
3412                         if (OP(text_node) == EXACTF || OP(text_node) == REFF)
3413                             c2 = PL_fold[c1];
3414                         else if (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
3415                             c2 = PL_fold_locale[c1];
3416                         else
3417                             c2 = c1;
3418                     }
3419                 }
3420                 else
3421                     c1 = c2 = -1000;
3422             assume_ok_MM:
3423                 REGCP_SET(lastcp);
3424                 /* This may be improved if l == 0.  */
3425                 while (n >= ln || (n == REG_INFTY && ln > 0 && l)) { /* ln overflow ? */
3426                     /* If it could work, try it. */
3427                     if (c1 == -1000 ||
3428                         UCHARAT(PL_reginput) == c1 ||
3429                         UCHARAT(PL_reginput) == c2)
3430                     {
3431                         if (paren) {
3432                             if (ln) {
3433                                 PL_regstartp[paren] =
3434                                     HOPc(PL_reginput, -l) - PL_bostr;
3435                                 PL_regendp[paren] = PL_reginput - PL_bostr;
3436                             }
3437                             else
3438                                 PL_regendp[paren] = -1;
3439                         }
3440                         if (regmatch(next))
3441                             sayYES;
3442                         REGCP_UNWIND(lastcp);
3443                     }
3444                     /* Couldn't or didn't -- move forward. */
3445                     PL_reginput = locinput;
3446                     if (regrepeat_hard(scan, 1, &l)) {
3447                         ln++;
3448                         locinput = PL_reginput;
3449                     }
3450                     else
3451                         sayNO;
3452                 }
3453             }
3454             else {
3455                 n = regrepeat_hard(scan, n, &l);
3456                 /* if we matched something zero-length we don't need to
3457                    backtrack, unless the minimum count is zero and we
3458                    are capturing the result - in that case the capture
3459                    being defined or not may affect later execution
3460                 */
3461                 if (n != 0 && l == 0 && !(paren && ln == 0))
3462                     ln = n;     /* don't backtrack */
3463                 locinput = PL_reginput;
3464                 DEBUG_r(
3465                     PerlIO_printf(Perl_debug_log,
3466                                   "%*s  matched %"IVdf" times, len=%"IVdf"...\n",
3467                                   (int)(REPORT_CODE_OFF+PL_regindent*2), "",
3468                                   (IV) n, (IV)l)
3469                     );
3470                 if (n >= ln) {
3471                     if (HAS_TEXT(next) || JUMPABLE(next)) {
3472                         regnode *text_node = next;
3473
3474                         if (! HAS_TEXT(text_node)) FIND_NEXT_IMPT(text_node);
3475
3476                         if (! HAS_TEXT(text_node)) c1 = c2 = -1000;
3477                         else {
3478                             if (PL_regkind[(U8)OP(text_node)] == REF) {
3479                                 c1 = c2 = -1000;
3480                                 goto assume_ok_REG;
3481                             }
3482                             else { c1 = (U8)*STRING(text_node); }
3483
3484                             if (OP(text_node) == EXACTF || OP(text_node) == REFF)
3485                                 c2 = PL_fold[c1];
3486                             else if (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
3487                                 c2 = PL_fold_locale[c1];
3488                             else
3489                                 c2 = c1;
3490                         }
3491                     }
3492                     else
3493                         c1 = c2 = -1000;
3494                 }
3495             assume_ok_REG:
3496                 REGCP_SET(lastcp);
3497                 while (n >= ln) {
3498                     /* If it could work, try it. */
3499                     if (c1 == -1000 ||
3500                         UCHARAT(PL_reginput) == c1 ||
3501                         UCHARAT(PL_reginput) == c2)
3502                     {
3503                         DEBUG_r(
3504                                 PerlIO_printf(Perl_debug_log,
3505                                               "%*s  trying tail with n=%"IVdf"...\n",
3506                                               (int)(REPORT_CODE_OFF+PL_regindent*2), "", (IV)n)
3507                             );
3508                         if (paren) {
3509                             if (n) {
3510                                 PL_regstartp[paren] = HOPc(PL_reginput, -l) - PL_bostr;
3511                                 PL_regendp[paren] = PL_reginput - PL_bostr;
3512                             }
3513                             else
3514                                 PL_regendp[paren] = -1;
3515                         }
3516                         if (regmatch(next))
3517                             sayYES;
3518                         REGCP_UNWIND(lastcp);
3519                     }
3520                     /* Couldn't or didn't -- back up. */
3521                     n--;
3522                     locinput = HOPc(locinput, -l);
3523                     PL_reginput = locinput;
3524                 }
3525             }
3526             sayNO;
3527             break;
3528         }
3529         case CURLYN:
3530             paren = scan->flags;        /* Which paren to set */
3531             if (paren > PL_regsize)
3532                 PL_regsize = paren;
3533             if (paren > (I32)*PL_reglastparen)
3534                 *PL_reglastparen = paren;
3535             ln = ARG1(scan);  /* min to match */
3536             n  = ARG2(scan);  /* max to match */
3537             scan = regnext(NEXTOPER(scan) + NODE_STEP_REGNODE);
3538             goto repeat;
3539         case CURLY:
3540             paren = 0;
3541             ln = ARG1(scan);  /* min to match */
3542             n  = ARG2(scan);  /* max to match */
3543             scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
3544             goto repeat;
3545         case STAR:
3546             ln = 0;
3547             n = REG_INFTY;
3548             scan = NEXTOPER(scan);
3549             paren = 0;
3550             goto repeat;
3551         case PLUS:
3552             ln = 1;
3553             n = REG_INFTY;
3554             scan = NEXTOPER(scan);
3555             paren = 0;
3556           repeat:
3557             /*
3558             * Lookahead to avoid useless match attempts
3559             * when we know what character comes next.
3560             */
3561
3562             /*
3563             * Used to only do .*x and .*?x, but now it allows
3564             * for )'s, ('s and (?{ ... })'s to be in the way
3565             * of the quantifier and the EXACT-like node.  -- japhy
3566             */
3567
3568             if (HAS_TEXT(next) || JUMPABLE(next)) {
3569                 U8 *s;
3570                 regnode *text_node = next;
3571
3572                 if (! HAS_TEXT(text_node)) FIND_NEXT_IMPT(text_node);
3573
3574                 if (! HAS_TEXT(text_node)) c1 = c2 = -1000;
3575                 else {
3576                     if (PL_regkind[(U8)OP(text_node)] == REF) {
3577                         c1 = c2 = -1000;
3578                         goto assume_ok_easy;
3579                     }
3580                     else { s = (U8*)STRING(text_node); }
3581
3582                     if (!UTF) {
3583                         c2 = c1 = *s;
3584                         if (OP(text_node) == EXACTF || OP(text_node) == REFF)
3585                             c2 = PL_fold[c1];
3586                         else if (OP(text_node) == EXACTFL || OP(text_node) == REFFL)
3587                             c2 = PL_fold_locale[c1];
3588                     }
3589                     else { /* UTF */
3590                         if (OP(text_node) == EXACTF || OP(text_node) == REFF) {
3591                              STRLEN ulen1, ulen2;
3592                              U8 tmpbuf1[UTF8_MAXLEN_UCLC+1];
3593                              U8 tmpbuf2[UTF8_MAXLEN_UCLC+1];
3594
3595                              to_utf8_lower((U8*)s, tmpbuf1, &ulen1);
3596                              to_utf8_upper((U8*)s, tmpbuf2, &ulen2);
3597
3598                              c1 = utf8n_to_uvuni(tmpbuf1, UTF8_MAXLEN, 0,
3599                                                  ckWARN(WARN_UTF8) ?
3600                                                  0 : UTF8_ALLOW_ANY);
3601                              c2 = utf8n_to_uvuni(tmpbuf2, UTF8_MAXLEN, 0,
3602                                                  ckWARN(WARN_UTF8) ?
3603                                                  0 : UTF8_ALLOW_ANY);
3604                         }
3605                         else {
3606                             c2 = c1 = utf8n_to_uvchr(s, UTF8_MAXLEN, 0,
3607                                                      ckWARN(WARN_UTF8) ?
3608                                                      0 : UTF8_ALLOW_ANY);
3609                         }
3610                     }
3611                 }
3612             }
3613             else
3614                 c1 = c2 = -1000;
3615         assume_ok_easy:
3616             PL_reginput = locinput;
3617             if (minmod) {
3618                 CHECKPOINT lastcp;
3619                 minmod = 0;
3620                 if (ln && regrepeat(scan, ln) < ln)
3621                     sayNO;
3622                 locinput = PL_reginput;
3623                 REGCP_SET(lastcp);
3624                 if (c1 != -1000) {
3625                     char *e; /* Should not check after this */
3626                     char *old = locinput;
3627                     int count = 0;
3628
3629                     if  (n == REG_INFTY) {
3630                         e = PL_regeol - 1;
3631                         if (do_utf8)
3632                             while (UTF8_IS_CONTINUATION(*(U8*)e))
3633                                 e--;
3634                     }
3635                     else if (do_utf8) {
3636                         int m = n - ln;
3637                         for (e = locinput;
3638                              m >0 && e + UTF8SKIP(e) <= PL_regeol; m--)
3639                             e += UTF8SKIP(e);
3640                     }
3641                     else {
3642                         e = locinput + n - ln;
3643                         if (e >= PL_regeol)
3644                             e = PL_regeol - 1;
3645                     }
3646                     while (1) {
3647                         /* Find place 'next' could work */
3648                         if (!do_utf8) {
3649                             if (c1 == c2) {
3650                                 while (locinput <= e &&
3651                                        UCHARAT(locinput) != c1)
3652                                     locinput++;
3653                             } else {
3654                                 while (locinput <= e
3655                                        && UCHARAT(locinput) != c1
3656                                        && UCHARAT(locinput) != c2)
3657                                     locinput++;
3658                             }
3659                             count = locinput - old;
3660                         }
3661                         else {
3662                             STRLEN len;
3663                             if (c1 == c2) {
3664                                 /* count initialised to
3665                                  * utf8_distance(old, locinput) */
3666                                 while (locinput <= e &&
3667                                        utf8n_to_uvchr((U8*)locinput,
3668                                                       UTF8_MAXLEN, &len,
3669                                                       ckWARN(WARN_UTF8) ?
3670                                                       0 : UTF8_ALLOW_ANY) != (UV)c1) {
3671                                     locinput += len;
3672                                     count++;
3673                                 }
3674                             } else {
3675                                 /* count initialised to
3676                                  * utf8_distance(old, locinput) */
3677                                 while (locinput <= e) {
3678                                     UV c = utf8n_to_uvchr((U8*)locinput,
3679                                                           UTF8_MAXLEN, &len,
3680                                                           ckWARN(WARN_UTF8) ?
3681                                                           0 : UTF8_ALLOW_ANY);
3682                                     if (c == (UV)c1 || c == (UV)c2)
3683                                         break;
3684                                     locinput += len;
3685                                     count++;
3686                                 }
3687                             }
3688                         }
3689                         if (locinput > e)
3690                             sayNO;
3691                         /* PL_reginput == old now */
3692                         if (locinput != old) {
3693                             ln = 1;     /* Did some */
3694                             if (regrepeat(scan, count) < count)
3695                                 sayNO;
3696                         }
3697                         /* PL_reginput == locinput now */
3698                         TRYPAREN(paren, ln, locinput);
3699                         PL_reginput = locinput; /* Could be reset... */
3700                         REGCP_UNWIND(lastcp);
3701                         /* Couldn't or didn't -- move forward. */
3702                         old = locinput;
3703                         if (do_utf8)
3704                             locinput += UTF8SKIP(locinput);
3705                         else
3706                             locinput++;
3707                         count = 1;
3708                     }
3709                 }
3710                 else
3711                 while (n >= ln || (n == REG_INFTY && ln > 0)) { /* ln overflow ? */
3712                     UV c;
3713                     if (c1 != -1000) {
3714                         if (do_utf8)
3715                             c = utf8n_to_uvchr((U8*)PL_reginput,
3716                                                UTF8_MAXLEN, 0,
3717                                                ckWARN(WARN_UTF8) ?
3718                                                0 : UTF8_ALLOW_ANY);
3719                         else
3720                             c = UCHARAT(PL_reginput);
3721                         /* If it could work, try it. */
3722                         if (c == (UV)c1 || c == (UV)c2)
3723                         {
3724                             TRYPAREN(paren, ln, PL_reginput);
3725                             REGCP_UNWIND(lastcp);
3726                         }
3727                     }
3728                     /* If it could work, try it. */
3729                     else if (c1 == -1000)
3730                     {
3731                         TRYPAREN(paren, ln, PL_reginput);
3732                         REGCP_UNWIND(lastcp);
3733                     }
3734                     /* Couldn't or didn't -- move forward. */
3735                     PL_reginput = locinput;
3736                     if (regrepeat(scan, 1)) {
3737                         ln++;
3738                         locinput = PL_reginput;
3739                     }
3740                     else
3741                         sayNO;
3742                 }
3743             }
3744             else {
3745                 CHECKPOINT lastcp;
3746                 n = regrepeat(scan, n);
3747                 locinput = PL_reginput;
3748                 if (ln < n && PL_regkind[(U8)OP(next)] == EOL &&
3749                     ((!PL_multiline && OP(next) != MEOL) ||
3750                         OP(next) == SEOL || OP(next) == EOS))
3751                 {
3752                     ln = n;                     /* why back off? */
3753                     /* ...because $ and \Z can match before *and* after
3754                        newline at the end.  Consider "\n\n" =~ /\n+\Z\n/.
3755                        We should back off by one in this case. */
3756                     if (UCHARAT(PL_reginput - 1) == '\n' && OP(next) != EOS)
3757                         ln--;
3758                 }
3759                 REGCP_SET(lastcp);
3760                 if (paren) {
3761                     UV c = 0;
3762                     while (n >= ln) {
3763                         if (c1 != -1000) {
3764                             if (do_utf8)
3765                                 c = utf8n_to_uvchr((U8*)PL_reginput,
3766                                                    UTF8_MAXLEN, 0,
3767                                                    ckWARN(WARN_UTF8) ?
3768                                                    0 : UTF8_ALLOW_ANY);
3769                             else
3770                                 c = UCHARAT(PL_reginput);
3771                         }
3772                         /* If it could work, try it. */
3773                         if (c1 == -1000 || c == (UV)c1 || c == (UV)c2)
3774                             {
3775                                 TRYPAREN(paren, n, PL_reginput);
3776                                 REGCP_UNWIND(lastcp);
3777                             }
3778                         /* Couldn't or didn't -- back up. */
3779                         n--;
3780                         PL_reginput = locinput = HOPc(locinput, -1);
3781                     }
3782                 }
3783                 else {
3784                     UV c = 0;
3785                     while (n >= ln) {
3786                         if (c1 != -1000) {
3787                             if (do_utf8)
3788                                 c = utf8n_to_uvchr((U8*)PL_reginput,
3789                                                    UTF8_MAXLEN, 0,
3790                                                    ckWARN(WARN_UTF8) ?
3791                                                    0 : UTF8_ALLOW_ANY);
3792                             else
3793                                 c = UCHARAT(PL_reginput);
3794                         }
3795                         /* If it could work, try it. */
3796                         if (c1 == -1000 || c == (UV)c1 || c == (UV)c2)
3797                             {
3798                                 TRYPAREN(paren, n, PL_reginput);
3799                                 REGCP_UNWIND(lastcp);
3800                             }
3801                         /* Couldn't or didn't -- back up. */
3802                         n--;
3803                         PL_reginput = locinput = HOPc(locinput, -1);
3804                     }
3805                 }
3806             }
3807             sayNO;
3808             break;
3809         case END:
3810             if (PL_reg_call_cc) {
3811                 re_cc_state *cur_call_cc = PL_reg_call_cc;
3812                 CURCUR *cctmp = PL_regcc;
3813                 regexp *re = PL_reg_re;
3814                 CHECKPOINT cp, lastcp;
3815                 
3816                 cp = regcppush(0);      /* Save *all* the positions. */
3817                 REGCP_SET(lastcp);
3818                 regcp_set_to(PL_reg_call_cc->ss); /* Restore parens of
3819                                                     the caller. */
3820                 PL_reginput = locinput; /* Make position available to
3821                                            the callcc. */
3822                 cache_re(PL_reg_call_cc->re);
3823                 PL_regcc = PL_reg_call_cc->cc;
3824                 PL_reg_call_cc = PL_reg_call_cc->prev;
3825                 if (regmatch(cur_call_cc->node)) {
3826                     PL_reg_call_cc = cur_call_cc;
3827                     regcpblow(cp);
3828                     sayYES;
3829                 }
3830                 REGCP_UNWIND(lastcp);
3831                 regcppop();
3832                 PL_reg_call_cc = cur_call_cc;
3833                 PL_regcc = cctmp;
3834                 PL_reg_re = re;
3835                 cache_re(re);
3836
3837                 DEBUG_r(
3838                     PerlIO_printf(Perl_debug_log,
3839                                   "%*s  continuation failed...\n",
3840                                   REPORT_CODE_OFF+PL_regindent*2, "")
3841                     );
3842