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