]> git.vpit.fr Git - perl/modules/re-engine-Hooks.git/blob - src/5014004/regcomp.c
52071c634481692a97fa8440eef85a1609449a7a
[perl/modules/re-engine-Hooks.git] / src / 5014004 / regcomp.c
1 /*    regcomp.c
2  */
3
4 /*
5  * 'A fair jaw-cracker dwarf-language must be.'            --Samwise Gamgee
6  *
7  *     [p.285 of _The Lord of the Rings_, II/iii: "The Ring Goes South"]
8  */
9
10 /* This file contains functions for compiling a regular expression.  See
11  * also regexec.c which funnily enough, contains functions for executing
12  * a regular expression.
13  *
14  * This file is also copied at build time to ext/re/re_comp.c, where
15  * it's built with -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT.
16  * This causes the main functions to be compiled under new names and with
17  * debugging support added, which makes "use re 'debug'" work.
18  */
19
20 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
21  * confused with the original package (see point 3 below).  Thanks, Henry!
22  */
23
24 /* Additional note: this code is very heavily munged from Henry's version
25  * in places.  In some spots I've traded clarity for efficiency, so don't
26  * blame Henry for some of the lack of readability.
27  */
28
29 /* The names of the functions have been changed from regcomp and
30  * regexec to pregcomp and pregexec in order to avoid conflicts
31  * with the POSIX routines of the same names.
32 */
33
34 #ifdef PERL_EXT_RE_BUILD
35 #include "re_top.h"
36 #endif
37
38 /*
39  * pregcomp and pregexec -- regsub and regerror are not used in perl
40  *
41  * Copyright (c) 1986 by University of Toronto.
42  * Written by Henry Spencer.  Not derived from licensed software.
43  *
44  * Permission is granted to anyone to use this software for any
45  * purpose on any computer system, and to redistribute it freely,
46  * subject to the following restrictions:
47  *
48  * 1. The author is not responsible for the consequences of use of
49  *  this software, no matter how awful, even if they arise
50  *  from defects in it.
51  *
52  * 2. The origin of this software must not be misrepresented, either
53  *  by explicit claim or by omission.
54  *
55  * 3. Altered versions must be plainly marked as such, and must not
56  *  be misrepresented as being the original software.
57  *
58  *
59  ****    Alterations to Henry's code are...
60  ****
61  ****    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
62  ****    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
63  ****    by Larry Wall and others
64  ****
65  ****    You may distribute under the terms of either the GNU General Public
66  ****    License or the Artistic License, as specified in the README file.
67
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_REGCOMP_C
75 #include "perl.h"
76
77 #ifndef PERL_IN_XSUB_RE
78 #include "re_defs.h"
79 #endif
80
81 #define REG_COMP_C
82 #ifdef PERL_IN_XSUB_RE
83 #  include "re_comp.h"
84 #else
85 #  include "regcomp.h"
86 #endif
87
88 #include "dquote_static.c"
89
90 #ifdef op
91 #undef op
92 #endif /* op */
93
94 #ifdef MSDOS
95 #  if defined(BUGGY_MSC6)
96  /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
97 #    pragma optimize("a",off)
98  /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
99 #    pragma optimize("w",on )
100 #  endif /* BUGGY_MSC6 */
101 #endif /* MSDOS */
102
103 #ifndef STATIC
104 #define STATIC static
105 #endif
106
107 typedef struct RExC_state_t {
108  U32  flags;   /* are we folding, multilining? */
109  char *precomp;  /* uncompiled string. */
110  REGEXP *rx_sv;   /* The SV that is the regexp. */
111  regexp *rx;                    /* perl core regexp structure */
112  regexp_internal *rxi;           /* internal data for regexp object pprivate field */
113  char *start;   /* Start of input for compile */
114  char *end;   /* End of input for compile */
115  char *parse;   /* Input-scan pointer. */
116  I32  whilem_seen;  /* number of WHILEM in this expr */
117  regnode *emit_start;  /* Start of emitted-code area */
118  regnode *emit_bound;  /* First regnode outside of the allocated space */
119  regnode *emit;   /* Code-emit pointer; &regdummy = don't = compiling */
120  I32  naughty;  /* How bad is this pattern? */
121  I32  sawback;  /* Did we see \1, ...? */
122  U32  seen;
123  I32  size;   /* Code size. */
124  I32  npar;   /* Capture buffer count, (OPEN). */
125  I32  cpar;   /* Capture buffer count, (CLOSE). */
126  I32  nestroot;  /* root parens we are in - used by accept */
127  I32  extralen;
128  I32  seen_zerolen;
129  I32  seen_evals;
130  regnode **open_parens;  /* pointers to open parens */
131  regnode **close_parens;  /* pointers to close parens */
132  regnode *opend;   /* END node in program */
133  I32  utf8;  /* whether the pattern is utf8 or not */
134  I32  orig_utf8; /* whether the pattern was originally in utf8 */
135         /* XXX use this for future optimisation of case
136         * where pattern must be upgraded to utf8. */
137  I32  uni_semantics; /* If a d charset modifier should use unicode
138         rules, even if the pattern is not in
139         utf8 */
140  HV  *paren_names;  /* Paren names */
141
142  regnode **recurse;  /* Recurse regops */
143  I32  recurse_count;  /* Number of recurse regops */
144  I32  in_lookbehind;
145  I32  contains_locale;
146  I32  override_recoding;
147 #if ADD_TO_REGEXEC
148  char  *starttry;  /* -Dr: where regtry was called. */
149 #define RExC_starttry (pRExC_state->starttry)
150 #endif
151 #ifdef DEBUGGING
152  const char  *lastparse;
153  I32         lastnum;
154  AV          *paren_name_list;       /* idx -> name */
155 #define RExC_lastparse (pRExC_state->lastparse)
156 #define RExC_lastnum (pRExC_state->lastnum)
157 #define RExC_paren_name_list    (pRExC_state->paren_name_list)
158 #endif
159 } RExC_state_t;
160
161 #define RExC_flags (pRExC_state->flags)
162 #define RExC_precomp (pRExC_state->precomp)
163 #define RExC_rx_sv (pRExC_state->rx_sv)
164 #define RExC_rx  (pRExC_state->rx)
165 #define RExC_rxi (pRExC_state->rxi)
166 #define RExC_start (pRExC_state->start)
167 #define RExC_end (pRExC_state->end)
168 #define RExC_parse (pRExC_state->parse)
169 #define RExC_whilem_seen (pRExC_state->whilem_seen)
170 #ifdef RE_TRACK_PATTERN_OFFSETS
171 #define RExC_offsets (pRExC_state->rxi->u.offsets) /* I am not like the others */
172 #endif
173 #define RExC_emit (pRExC_state->emit)
174 #define RExC_emit_start (pRExC_state->emit_start)
175 #define RExC_emit_bound (pRExC_state->emit_bound)
176 #define RExC_naughty (pRExC_state->naughty)
177 #define RExC_sawback (pRExC_state->sawback)
178 #define RExC_seen (pRExC_state->seen)
179 #define RExC_size (pRExC_state->size)
180 #define RExC_npar (pRExC_state->npar)
181 #define RExC_nestroot   (pRExC_state->nestroot)
182 #define RExC_extralen (pRExC_state->extralen)
183 #define RExC_seen_zerolen (pRExC_state->seen_zerolen)
184 #define RExC_seen_evals (pRExC_state->seen_evals)
185 #define RExC_utf8 (pRExC_state->utf8)
186 #define RExC_uni_semantics (pRExC_state->uni_semantics)
187 #define RExC_orig_utf8 (pRExC_state->orig_utf8)
188 #define RExC_open_parens (pRExC_state->open_parens)
189 #define RExC_close_parens (pRExC_state->close_parens)
190 #define RExC_opend (pRExC_state->opend)
191 #define RExC_paren_names (pRExC_state->paren_names)
192 #define RExC_recurse (pRExC_state->recurse)
193 #define RExC_recurse_count (pRExC_state->recurse_count)
194 #define RExC_in_lookbehind (pRExC_state->in_lookbehind)
195 #define RExC_contains_locale (pRExC_state->contains_locale)
196 #define RExC_override_recoding (pRExC_state->override_recoding)
197
198
199 #define ISMULT1(c) ((c) == '*' || (c) == '+' || (c) == '?')
200 #define ISMULT2(s) ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
201   ((*s) == '{' && regcurly(s)))
202
203 #ifdef SPSTART
204 #undef SPSTART  /* dratted cpp namespace... */
205 #endif
206 /*
207  * Flags to be passed up and down.
208  */
209 #define WORST  0 /* Worst case. */
210 #define HASWIDTH 0x01 /* Known to match non-null strings. */
211
212 /* Simple enough to be STAR/PLUS operand, in an EXACT node must be a single
213  * character, and if utf8, must be invariant.  Note that this is not the same thing as REGNODE_SIMPLE */
214 #define SIMPLE  0x02
215 #define SPSTART  0x04 /* Starts with * or +. */
216 #define TRYAGAIN 0x08 /* Weeded out a declaration. */
217 #define POSTPONED 0x10    /* (?1),(?&name), (??{...}) or similar */
218
219 #define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1)
220
221 /* whether trie related optimizations are enabled */
222 #if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION
223 #define TRIE_STUDY_OPT
224 #define FULL_TRIE_STUDY
225 #define TRIE_STCLASS
226 #endif
227
228
229
230 #define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3]
231 #define PBITVAL(paren) (1 << ((paren) & 7))
232 #define PAREN_TEST(u8str,paren) ( PBYTE(u8str,paren) & PBITVAL(paren))
233 #define PAREN_SET(u8str,paren) PBYTE(u8str,paren) |= PBITVAL(paren)
234 #define PAREN_UNSET(u8str,paren) PBYTE(u8str,paren) &= (~PBITVAL(paren))
235
236 /* If not already in utf8, do a longjmp back to the beginning */
237 #define UTF8_LONGJMP 42 /* Choose a value not likely to ever conflict */
238 #define REQUIRE_UTF8 STMT_START {                                       \
239          if (! UTF) JMPENV_JUMP(UTF8_LONGJMP); \
240       } STMT_END
241
242 /* About scan_data_t.
243
244   During optimisation we recurse through the regexp program performing
245   various inplace (keyhole style) optimisations. In addition study_chunk
246   and scan_commit populate this data structure with information about
247   what strings MUST appear in the pattern. We look for the longest
248   string that must appear at a fixed location, and we look for the
249   longest string that may appear at a floating location. So for instance
250   in the pattern:
251
252  /FOO[xX]A.*B[xX]BAR/
253
254   Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating
255   strings (because they follow a .* construct). study_chunk will identify
256   both FOO and BAR as being the longest fixed and floating strings respectively.
257
258   The strings can be composites, for instance
259
260  /(f)(o)(o)/
261
262   will result in a composite fixed substring 'foo'.
263
264   For each string some basic information is maintained:
265
266   - offset or min_offset
267  This is the position the string must appear at, or not before.
268  It also implicitly (when combined with minlenp) tells us how many
269  characters must match before the string we are searching for.
270  Likewise when combined with minlenp and the length of the string it
271  tells us how many characters must appear after the string we have
272  found.
273
274   - max_offset
275  Only used for floating strings. This is the rightmost point that
276  the string can appear at. If set to I32 max it indicates that the
277  string can occur infinitely far to the right.
278
279   - minlenp
280  A pointer to the minimum length of the pattern that the string
281  was found inside. This is important as in the case of positive
282  lookahead or positive lookbehind we can have multiple patterns
283  involved. Consider
284
285  /(?=FOO).*F/
286
287  The minimum length of the pattern overall is 3, the minimum length
288  of the lookahead part is 3, but the minimum length of the part that
289  will actually match is 1. So 'FOO's minimum length is 3, but the
290  minimum length for the F is 1. This is important as the minimum length
291  is used to determine offsets in front of and behind the string being
292  looked for.  Since strings can be composites this is the length of the
293  pattern at the time it was committed with a scan_commit. Note that
294  the length is calculated by study_chunk, so that the minimum lengths
295  are not known until the full pattern has been compiled, thus the
296  pointer to the value.
297
298   - lookbehind
299
300  In the case of lookbehind the string being searched for can be
301  offset past the start point of the final matching string.
302  If this value was just blithely removed from the min_offset it would
303  invalidate some of the calculations for how many chars must match
304  before or after (as they are derived from min_offset and minlen and
305  the length of the string being searched for).
306  When the final pattern is compiled and the data is moved from the
307  scan_data_t structure into the regexp structure the information
308  about lookbehind is factored in, with the information that would
309  have been lost precalculated in the end_shift field for the
310  associated string.
311
312   The fields pos_min and pos_delta are used to store the minimum offset
313   and the delta to the maximum offset at the current point in the pattern.
314
315 */
316
317 typedef struct scan_data_t {
318  /*I32 len_min;      unused */
319  /*I32 len_delta;    unused */
320  I32 pos_min;
321  I32 pos_delta;
322  SV *last_found;
323  I32 last_end;     /* min value, <0 unless valid. */
324  I32 last_start_min;
325  I32 last_start_max;
326  SV **longest;     /* Either &l_fixed, or &l_float. */
327  SV *longest_fixed;      /* longest fixed string found in pattern */
328  I32 offset_fixed;       /* offset where it starts */
329  I32 *minlen_fixed;      /* pointer to the minlen relevant to the string */
330  I32 lookbehind_fixed;   /* is the position of the string modfied by LB */
331  SV *longest_float;      /* longest floating string found in pattern */
332  I32 offset_float_min;   /* earliest point in string it can appear */
333  I32 offset_float_max;   /* latest point in string it can appear */
334  I32 *minlen_float;      /* pointer to the minlen relevant to the string */
335  I32 lookbehind_float;   /* is the position of the string modified by LB */
336  I32 flags;
337  I32 whilem_c;
338  I32 *last_closep;
339  struct regnode_charclass_class *start_class;
340 } scan_data_t;
341
342 /*
343  * Forward declarations for pregcomp()'s friends.
344  */
345
346 static const scan_data_t zero_scan_data =
347   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
348
349 #define SF_BEFORE_EOL  (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
350 #define SF_BEFORE_SEOL  0x0001
351 #define SF_BEFORE_MEOL  0x0002
352 #define SF_FIX_BEFORE_EOL (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
353 #define SF_FL_BEFORE_EOL (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
354
355 #ifdef NO_UNARY_PLUS
356 #  define SF_FIX_SHIFT_EOL (0+2)
357 #  define SF_FL_SHIFT_EOL  (0+4)
358 #else
359 #  define SF_FIX_SHIFT_EOL (+2)
360 #  define SF_FL_SHIFT_EOL  (+4)
361 #endif
362
363 #define SF_FIX_BEFORE_SEOL (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
364 #define SF_FIX_BEFORE_MEOL (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
365
366 #define SF_FL_BEFORE_SEOL (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
367 #define SF_FL_BEFORE_MEOL (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
368 #define SF_IS_INF  0x0040
369 #define SF_HAS_PAR  0x0080
370 #define SF_IN_PAR  0x0100
371 #define SF_HAS_EVAL  0x0200
372 #define SCF_DO_SUBSTR  0x0400
373 #define SCF_DO_STCLASS_AND 0x0800
374 #define SCF_DO_STCLASS_OR 0x1000
375 #define SCF_DO_STCLASS  (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
376 #define SCF_WHILEM_VISITED_POS 0x2000
377
378 #define SCF_TRIE_RESTUDY        0x4000 /* Do restudy? */
379 #define SCF_SEEN_ACCEPT         0x8000
380
381 #define UTF cBOOL(RExC_utf8)
382 #define LOC (get_regex_charset(RExC_flags) == REGEX_LOCALE_CHARSET)
383 #define UNI_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_UNICODE_CHARSET)
384 #define DEPENDS_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_DEPENDS_CHARSET)
385 #define AT_LEAST_UNI_SEMANTICS (get_regex_charset(RExC_flags) >= REGEX_UNICODE_CHARSET)
386 #define ASCII_RESTRICTED (get_regex_charset(RExC_flags) == REGEX_ASCII_RESTRICTED_CHARSET)
387 #define MORE_ASCII_RESTRICTED (get_regex_charset(RExC_flags) == REGEX_ASCII_MORE_RESTRICTED_CHARSET)
388 #define AT_LEAST_ASCII_RESTRICTED (get_regex_charset(RExC_flags) >= REGEX_ASCII_RESTRICTED_CHARSET)
389
390 #define FOLD cBOOL(RExC_flags & RXf_PMf_FOLD)
391
392 #define OOB_UNICODE  12345678
393 #define OOB_NAMEDCLASS  -1
394
395 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
396 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
397
398
399 /* length of regex to show in messages that don't mark a position within */
400 #define RegexLengthToShowInErrorMessages 127
401
402 /*
403  * If MARKER[12] are adjusted, be sure to adjust the constants at the top
404  * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
405  * op/pragma/warn/regcomp.
406  */
407 #define MARKER1 "<-- HERE"    /* marker as it appears in the description */
408 #define MARKER2 " <-- HERE "  /* marker as it appears within the regex */
409
410 #define REPORT_LOCATION " in regex; marked by " MARKER1 " in m/%.*s" MARKER2 "%s/"
411
412 /*
413  * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
414  * arg. Show regex, up to a maximum length. If it's too long, chop and add
415  * "...".
416  */
417 #define _FAIL(code) STMT_START {     \
418  const char *ellipses = "";      \
419  IV len = RExC_end - RExC_precomp;     \
420                   \
421  if (!SIZE_ONLY)       \
422   SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx_sv);   \
423  if (len > RegexLengthToShowInErrorMessages) {   \
424   /* chop 10 shorter than the max, to ensure meaning of "..." */ \
425   len = RegexLengthToShowInErrorMessages - 10;   \
426   ellipses = "...";      \
427  }         \
428  code;                                                               \
429 } STMT_END
430
431 #define FAIL(msg) _FAIL(       \
432  Perl_croak(aTHX_ "%s in regex m/%.*s%s/",     \
433    msg, (int)len, RExC_precomp, ellipses))
434
435 #define FAIL2(msg,arg) _FAIL(       \
436  Perl_croak(aTHX_ msg " in regex m/%.*s%s/",     \
437    arg, (int)len, RExC_precomp, ellipses))
438
439 /*
440  * Simple_vFAIL -- like FAIL, but marks the current location in the scan
441  */
442 #define Simple_vFAIL(m) STMT_START {     \
443  const IV offset = RExC_parse - RExC_precomp;   \
444  Perl_croak(aTHX_ "%s" REPORT_LOCATION,    \
445    m, (int)offset, RExC_precomp, RExC_precomp + offset); \
446 } STMT_END
447
448 /*
449  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
450  */
451 #define vFAIL(m) STMT_START {    \
452  if (!SIZE_ONLY)     \
453   SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx_sv); \
454  Simple_vFAIL(m);     \
455 } STMT_END
456
457 /*
458  * Like Simple_vFAIL(), but accepts two arguments.
459  */
460 #define Simple_vFAIL2(m,a1) STMT_START {   \
461  const IV offset = RExC_parse - RExC_precomp;   \
462  S_re_croak2(aTHX_ m, REPORT_LOCATION, a1,   \
463    (int)offset, RExC_precomp, RExC_precomp + offset); \
464 } STMT_END
465
466 /*
467  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
468  */
469 #define vFAIL2(m,a1) STMT_START {   \
470  if (!SIZE_ONLY)     \
471   SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx_sv); \
472  Simple_vFAIL2(m, a1);    \
473 } STMT_END
474
475
476 /*
477  * Like Simple_vFAIL(), but accepts three arguments.
478  */
479 #define Simple_vFAIL3(m, a1, a2) STMT_START {   \
480  const IV offset = RExC_parse - RExC_precomp;  \
481  S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2,  \
482    (int)offset, RExC_precomp, RExC_precomp + offset); \
483 } STMT_END
484
485 /*
486  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
487  */
488 #define vFAIL3(m,a1,a2) STMT_START {   \
489  if (!SIZE_ONLY)     \
490   SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx_sv); \
491  Simple_vFAIL3(m, a1, a2);    \
492 } STMT_END
493
494 /*
495  * Like Simple_vFAIL(), but accepts four arguments.
496  */
497 #define Simple_vFAIL4(m, a1, a2, a3) STMT_START {  \
498  const IV offset = RExC_parse - RExC_precomp;  \
499  S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3,  \
500    (int)offset, RExC_precomp, RExC_precomp + offset); \
501 } STMT_END
502
503 #define ckWARNreg(loc,m) STMT_START {     \
504  const IV offset = loc - RExC_precomp;    \
505  Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
506    (int)offset, RExC_precomp, RExC_precomp + offset);  \
507 } STMT_END
508
509 #define ckWARNregdep(loc,m) STMT_START {    \
510  const IV offset = loc - RExC_precomp;    \
511  Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP), \
512    m REPORT_LOCATION,      \
513    (int)offset, RExC_precomp, RExC_precomp + offset);  \
514 } STMT_END
515
516 #define ckWARN2regdep(loc,m, a1) STMT_START {    \
517  const IV offset = loc - RExC_precomp;    \
518  Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP), \
519    m REPORT_LOCATION,      \
520    a1, (int)offset, RExC_precomp, RExC_precomp + offset); \
521 } STMT_END
522
523 #define ckWARN2reg(loc, m, a1) STMT_START {    \
524  const IV offset = loc - RExC_precomp;    \
525  Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
526    a1, (int)offset, RExC_precomp, RExC_precomp + offset); \
527 } STMT_END
528
529 #define vWARN3(loc, m, a1, a2) STMT_START {    \
530  const IV offset = loc - RExC_precomp;    \
531  Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,  \
532    a1, a2, (int)offset, RExC_precomp, RExC_precomp + offset); \
533 } STMT_END
534
535 #define ckWARN3reg(loc, m, a1, a2) STMT_START {    \
536  const IV offset = loc - RExC_precomp;    \
537  Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
538    a1, a2, (int)offset, RExC_precomp, RExC_precomp + offset); \
539 } STMT_END
540
541 #define vWARN4(loc, m, a1, a2, a3) STMT_START {    \
542  const IV offset = loc - RExC_precomp;    \
543  Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,  \
544    a1, a2, a3, (int)offset, RExC_precomp, RExC_precomp + offset); \
545 } STMT_END
546
547 #define ckWARN4reg(loc, m, a1, a2, a3) STMT_START {   \
548  const IV offset = loc - RExC_precomp;    \
549  Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION, \
550    a1, a2, a3, (int)offset, RExC_precomp, RExC_precomp + offset); \
551 } STMT_END
552
553 #define vWARN5(loc, m, a1, a2, a3, a4) STMT_START {   \
554  const IV offset = loc - RExC_precomp;    \
555  Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,  \
556    a1, a2, a3, a4, (int)offset, RExC_precomp, RExC_precomp + offset); \
557 } STMT_END
558
559
560 /* Allow for side effects in s */
561 #define REGC(c,s) STMT_START {   \
562  if (!SIZE_ONLY) *(s) = (c); else (void)(s); \
563 } STMT_END
564
565 /* Macros for recording node offsets.   20001227 mjd@plover.com
566  * Nodes are numbered 1, 2, 3, 4.  Node #n's position is recorded in
567  * element 2*n-1 of the array.  Element #2n holds the byte length node #n.
568  * Element 0 holds the number n.
569  * Position is 1 indexed.
570  */
571 #ifndef RE_TRACK_PATTERN_OFFSETS
572 #define Set_Node_Offset_To_R(node,byte)
573 #define Set_Node_Offset(node,byte)
574 #define Set_Cur_Node_Offset
575 #define Set_Node_Length_To_R(node,len)
576 #define Set_Node_Length(node,len)
577 #define Set_Node_Cur_Length(node)
578 #define Node_Offset(n)
579 #define Node_Length(n)
580 #define Set_Node_Offset_Length(node,offset,len)
581 #define ProgLen(ri) ri->u.proglen
582 #define SetProgLen(ri,x) ri->u.proglen = x
583 #else
584 #define ProgLen(ri) ri->u.offsets[0]
585 #define SetProgLen(ri,x) ri->u.offsets[0] = x
586 #define Set_Node_Offset_To_R(node,byte) STMT_START {   \
587  if (! SIZE_ONLY) {       \
588   MJD_OFFSET_DEBUG(("** (%d) offset of node %d is %d.\n",  \
589      __LINE__, (int)(node), (int)(byte)));  \
590   if((node) < 0) {      \
591    Perl_croak(aTHX_ "value of node is %d in Offset macro", (int)(node)); \
592   } else {       \
593    RExC_offsets[2*(node)-1] = (byte);    \
594   }        \
595  }         \
596 } STMT_END
597
598 #define Set_Node_Offset(node,byte) \
599  Set_Node_Offset_To_R((node)-RExC_emit_start, (byte)-RExC_start)
600 #define Set_Cur_Node_Offset Set_Node_Offset(RExC_emit, RExC_parse)
601
602 #define Set_Node_Length_To_R(node,len) STMT_START {   \
603  if (! SIZE_ONLY) {       \
604   MJD_OFFSET_DEBUG(("** (%d) size of node %d is %d.\n",  \
605     __LINE__, (int)(node), (int)(len)));   \
606   if((node) < 0) {      \
607    Perl_croak(aTHX_ "value of node is %d in Length macro", (int)(node)); \
608   } else {       \
609    RExC_offsets[2*(node)] = (len);    \
610   }        \
611  }         \
612 } STMT_END
613
614 #define Set_Node_Length(node,len) \
615  Set_Node_Length_To_R((node)-RExC_emit_start, len)
616 #define Set_Cur_Node_Length(len) Set_Node_Length(RExC_emit, len)
617 #define Set_Node_Cur_Length(node) \
618  Set_Node_Length(node, RExC_parse - parse_start)
619
620 /* Get offsets and lengths */
621 #define Node_Offset(n) (RExC_offsets[2*((n)-RExC_emit_start)-1])
622 #define Node_Length(n) (RExC_offsets[2*((n)-RExC_emit_start)])
623
624 #define Set_Node_Offset_Length(node,offset,len) STMT_START { \
625  Set_Node_Offset_To_R((node)-RExC_emit_start, (offset)); \
626  Set_Node_Length_To_R((node)-RExC_emit_start, (len)); \
627 } STMT_END
628 #endif
629
630 #if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS
631 #define EXPERIMENTAL_INPLACESCAN
632 #endif /*PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS*/
633
634 #define DEBUG_STUDYDATA(str,data,depth)                              \
635 DEBUG_OPTIMISE_MORE_r(if(data){                                      \
636  PerlIO_printf(Perl_debug_log,                                    \
637   "%*s" str "Pos:%"IVdf"/%"IVdf                                \
638   " Flags: 0x%"UVXf" Whilem_c: %"IVdf" Lcp: %"IVdf" %s",       \
639   (int)(depth)*2, "",                                          \
640   (IV)((data)->pos_min),                                       \
641   (IV)((data)->pos_delta),                                     \
642   (UV)((data)->flags),                                         \
643   (IV)((data)->whilem_c),                                      \
644   (IV)((data)->last_closep ? *((data)->last_closep) : -1),     \
645   is_inf ? "INF " : ""                                         \
646  );                                                               \
647  if ((data)->last_found)                                          \
648   PerlIO_printf(Perl_debug_log,                                \
649    "Last:'%s' %"IVdf":%"IVdf"/%"IVdf" %sFixed:'%s' @ %"IVdf \
650    " %sFloat: '%s' @ %"IVdf"/%"IVdf"",                      \
651    SvPVX_const((data)->last_found),                         \
652    (IV)((data)->last_end),                                  \
653    (IV)((data)->last_start_min),                            \
654    (IV)((data)->last_start_max),                            \
655    ((data)->longest &&                                      \
656    (data)->longest==&((data)->longest_fixed)) ? "*" : "",  \
657    SvPVX_const((data)->longest_fixed),                      \
658    (IV)((data)->offset_fixed),                              \
659    ((data)->longest &&                                      \
660    (data)->longest==&((data)->longest_float)) ? "*" : "",  \
661    SvPVX_const((data)->longest_float),                      \
662    (IV)((data)->offset_float_min),                          \
663    (IV)((data)->offset_float_max)                           \
664   );                                                           \
665  PerlIO_printf(Perl_debug_log,"\n");                              \
666 });
667
668 static void clear_re(pTHX_ void *r);
669
670 /* Mark that we cannot extend a found fixed substring at this point.
671    Update the longest found anchored substring and the longest found
672    floating substrings if needed. */
673
674 STATIC void
675 S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data, I32 *minlenp, int is_inf)
676 {
677  const STRLEN l = CHR_SVLEN(data->last_found);
678  const STRLEN old_l = CHR_SVLEN(*data->longest);
679  GET_RE_DEBUG_FLAGS_DECL;
680
681  PERL_ARGS_ASSERT_SCAN_COMMIT;
682
683  if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
684   SvSetMagicSV(*data->longest, data->last_found);
685   if (*data->longest == data->longest_fixed) {
686    data->offset_fixed = l ? data->last_start_min : data->pos_min;
687    if (data->flags & SF_BEFORE_EOL)
688     data->flags
689      |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
690    else
691     data->flags &= ~SF_FIX_BEFORE_EOL;
692    data->minlen_fixed=minlenp;
693    data->lookbehind_fixed=0;
694   }
695   else { /* *data->longest == data->longest_float */
696    data->offset_float_min = l ? data->last_start_min : data->pos_min;
697    data->offset_float_max = (l
698          ? data->last_start_max
699          : data->pos_min + data->pos_delta);
700    if (is_inf || (U32)data->offset_float_max > (U32)I32_MAX)
701     data->offset_float_max = I32_MAX;
702    if (data->flags & SF_BEFORE_EOL)
703     data->flags
704      |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
705    else
706     data->flags &= ~SF_FL_BEFORE_EOL;
707    data->minlen_float=minlenp;
708    data->lookbehind_float=0;
709   }
710  }
711  SvCUR_set(data->last_found, 0);
712  {
713   SV * const sv = data->last_found;
714   if (SvUTF8(sv) && SvMAGICAL(sv)) {
715    MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8);
716    if (mg)
717     mg->mg_len = 0;
718   }
719  }
720  data->last_end = -1;
721  data->flags &= ~SF_BEFORE_EOL;
722  DEBUG_STUDYDATA("commit: ",data,0);
723 }
724
725 /* Can match anything (initialization) */
726 STATIC void
727 S_cl_anything(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
728 {
729  PERL_ARGS_ASSERT_CL_ANYTHING;
730
731  ANYOF_BITMAP_SETALL(cl);
732  cl->flags = ANYOF_CLASS|ANYOF_EOS|ANYOF_UNICODE_ALL
733     |ANYOF_LOC_NONBITMAP_FOLD|ANYOF_NON_UTF8_LATIN1_ALL;
734
735  /* If any portion of the regex is to operate under locale rules,
736  * initialization includes it.  The reason this isn't done for all regexes
737  * is that the optimizer was written under the assumption that locale was
738  * all-or-nothing.  Given the complexity and lack of documentation in the
739  * optimizer, and that there are inadequate test cases for locale, so many
740  * parts of it may not work properly, it is safest to avoid locale unless
741  * necessary. */
742  if (RExC_contains_locale) {
743   ANYOF_CLASS_SETALL(cl);     /* /l uses class */
744   cl->flags |= ANYOF_LOCALE;
745  }
746  else {
747   ANYOF_CLASS_ZERO(cl);     /* Only /l uses class now */
748  }
749 }
750
751 /* Can match anything (initialization) */
752 STATIC int
753 S_cl_is_anything(const struct regnode_charclass_class *cl)
754 {
755  int value;
756
757  PERL_ARGS_ASSERT_CL_IS_ANYTHING;
758
759  for (value = 0; value <= ANYOF_MAX; value += 2)
760   if (ANYOF_CLASS_TEST(cl, value) && ANYOF_CLASS_TEST(cl, value + 1))
761    return 1;
762  if (!(cl->flags & ANYOF_UNICODE_ALL))
763   return 0;
764  if (!ANYOF_BITMAP_TESTALLSET((const void*)cl))
765   return 0;
766  return 1;
767 }
768
769 /* Can match anything (initialization) */
770 STATIC void
771 S_cl_init(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
772 {
773  PERL_ARGS_ASSERT_CL_INIT;
774
775  Zero(cl, 1, struct regnode_charclass_class);
776  cl->type = ANYOF;
777  cl_anything(pRExC_state, cl);
778  ARG_SET(cl, ANYOF_NONBITMAP_EMPTY);
779 }
780
781 /* These two functions currently do the exact same thing */
782 #define cl_init_zero  S_cl_init
783
784 /* 'AND' a given class with another one.  Can create false positives.  'cl'
785  * should not be inverted.  'and_with->flags & ANYOF_CLASS' should be 0 if
786  * 'and_with' is a regnode_charclass instead of a regnode_charclass_class. */
787 STATIC void
788 S_cl_and(struct regnode_charclass_class *cl,
789   const struct regnode_charclass_class *and_with)
790 {
791  PERL_ARGS_ASSERT_CL_AND;
792
793  assert(and_with->type == ANYOF);
794
795  /* I (khw) am not sure all these restrictions are necessary XXX */
796  if (!(ANYOF_CLASS_TEST_ANY_SET(and_with))
797   && !(ANYOF_CLASS_TEST_ANY_SET(cl))
798   && (and_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
799   && !(and_with->flags & ANYOF_LOC_NONBITMAP_FOLD)
800   && !(cl->flags & ANYOF_LOC_NONBITMAP_FOLD)) {
801   int i;
802
803   if (and_with->flags & ANYOF_INVERT)
804    for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
805     cl->bitmap[i] &= ~and_with->bitmap[i];
806   else
807    for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
808     cl->bitmap[i] &= and_with->bitmap[i];
809  } /* XXXX: logic is complicated otherwise, leave it along for a moment. */
810
811  if (and_with->flags & ANYOF_INVERT) {
812
813   /* Here, the and'ed node is inverted.  Get the AND of the flags that
814   * aren't affected by the inversion.  Those that are affected are
815   * handled individually below */
816   U8 affected_flags = cl->flags & ~INVERSION_UNAFFECTED_FLAGS;
817   cl->flags &= (and_with->flags & INVERSION_UNAFFECTED_FLAGS);
818   cl->flags |= affected_flags;
819
820   /* We currently don't know how to deal with things that aren't in the
821   * bitmap, but we know that the intersection is no greater than what
822   * is already in cl, so let there be false positives that get sorted
823   * out after the synthetic start class succeeds, and the node is
824   * matched for real. */
825
826   /* The inversion of these two flags indicate that the resulting
827   * intersection doesn't have them */
828   if (and_with->flags & ANYOF_UNICODE_ALL) {
829    cl->flags &= ~ANYOF_UNICODE_ALL;
830   }
831   if (and_with->flags & ANYOF_NON_UTF8_LATIN1_ALL) {
832    cl->flags &= ~ANYOF_NON_UTF8_LATIN1_ALL;
833   }
834  }
835  else {   /* and'd node is not inverted */
836   U8 outside_bitmap_but_not_utf8; /* Temp variable */
837
838   if (! ANYOF_NONBITMAP(and_with)) {
839
840    /* Here 'and_with' doesn't match anything outside the bitmap
841    * (except possibly ANYOF_UNICODE_ALL), which means the
842    * intersection can't either, except for ANYOF_UNICODE_ALL, in
843    * which case we don't know what the intersection is, but it's no
844    * greater than what cl already has, so can just leave it alone,
845    * with possible false positives */
846    if (! (and_with->flags & ANYOF_UNICODE_ALL)) {
847     ARG_SET(cl, ANYOF_NONBITMAP_EMPTY);
848     cl->flags &= ~ANYOF_NONBITMAP_NON_UTF8;
849    }
850   }
851   else if (! ANYOF_NONBITMAP(cl)) {
852
853    /* Here, 'and_with' does match something outside the bitmap, and cl
854    * doesn't have a list of things to match outside the bitmap.  If
855    * cl can match all code points above 255, the intersection will
856    * be those above-255 code points that 'and_with' matches.  If cl
857    * can't match all Unicode code points, it means that it can't
858    * match anything outside the bitmap (since the 'if' that got us
859    * into this block tested for that), so we leave the bitmap empty.
860    */
861    if (cl->flags & ANYOF_UNICODE_ALL) {
862     ARG_SET(cl, ARG(and_with));
863
864     /* and_with's ARG may match things that don't require UTF8.
865     * And now cl's will too, in spite of this being an 'and'.  See
866     * the comments below about the kludge */
867     cl->flags |= and_with->flags & ANYOF_NONBITMAP_NON_UTF8;
868    }
869   }
870   else {
871    /* Here, both 'and_with' and cl match something outside the
872    * bitmap.  Currently we do not do the intersection, so just match
873    * whatever cl had at the beginning.  */
874   }
875
876
877   /* Take the intersection of the two sets of flags.  However, the
878   * ANYOF_NONBITMAP_NON_UTF8 flag is treated as an 'or'.  This is a
879   * kludge around the fact that this flag is not treated like the others
880   * which are initialized in cl_anything().  The way the optimizer works
881   * is that the synthetic start class (SSC) is initialized to match
882   * anything, and then the first time a real node is encountered, its
883   * values are AND'd with the SSC's with the result being the values of
884   * the real node.  However, there are paths through the optimizer where
885   * the AND never gets called, so those initialized bits are set
886   * inappropriately, which is not usually a big deal, as they just cause
887   * false positives in the SSC, which will just mean a probably
888   * imperceptible slow down in execution.  However this bit has a
889   * higher false positive consequence in that it can cause utf8.pm,
890   * utf8_heavy.pl ... to be loaded when not necessary, which is a much
891   * bigger slowdown and also causes significant extra memory to be used.
892   * In order to prevent this, the code now takes a different tack.  The
893   * bit isn't set unless some part of the regular expression needs it,
894   * but once set it won't get cleared.  This means that these extra
895   * modules won't get loaded unless there was some path through the
896   * pattern that would have required them anyway, and  so any false
897   * positives that occur by not ANDing them out when they could be
898   * aren't as severe as they would be if we treated this bit like all
899   * the others */
900   outside_bitmap_but_not_utf8 = (cl->flags | and_with->flags)
901          & ANYOF_NONBITMAP_NON_UTF8;
902   cl->flags &= and_with->flags;
903   cl->flags |= outside_bitmap_but_not_utf8;
904  }
905 }
906
907 /* 'OR' a given class with another one.  Can create false positives.  'cl'
908  * should not be inverted.  'or_with->flags & ANYOF_CLASS' should be 0 if
909  * 'or_with' is a regnode_charclass instead of a regnode_charclass_class. */
910 STATIC void
911 S_cl_or(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl, const struct regnode_charclass_class *or_with)
912 {
913  PERL_ARGS_ASSERT_CL_OR;
914
915  if (or_with->flags & ANYOF_INVERT) {
916
917   /* Here, the or'd node is to be inverted.  This means we take the
918   * complement of everything not in the bitmap, but currently we don't
919   * know what that is, so give up and match anything */
920   if (ANYOF_NONBITMAP(or_with)) {
921    cl_anything(pRExC_state, cl);
922   }
923   /* We do not use
924   * (B1 | CL1) | (!B2 & !CL2) = (B1 | !B2 & !CL2) | (CL1 | (!B2 & !CL2))
925   *   <= (B1 | !B2) | (CL1 | !CL2)
926   * which is wasteful if CL2 is small, but we ignore CL2:
927   *   (B1 | CL1) | (!B2 & !CL2) <= (B1 | CL1) | !B2 = (B1 | !B2) | CL1
928   * XXXX Can we handle case-fold?  Unclear:
929   *   (OK1(i) | OK1(i')) | !(OK1(i) | OK1(i')) =
930   *   (OK1(i) | OK1(i')) | (!OK1(i) & !OK1(i'))
931   */
932   else if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
933    && !(or_with->flags & ANYOF_LOC_NONBITMAP_FOLD)
934    && !(cl->flags & ANYOF_LOC_NONBITMAP_FOLD) ) {
935    int i;
936
937    for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
938     cl->bitmap[i] |= ~or_with->bitmap[i];
939   } /* XXXX: logic is complicated otherwise */
940   else {
941    cl_anything(pRExC_state, cl);
942   }
943
944   /* And, we can just take the union of the flags that aren't affected
945   * by the inversion */
946   cl->flags |= or_with->flags & INVERSION_UNAFFECTED_FLAGS;
947
948   /* For the remaining flags:
949    ANYOF_UNICODE_ALL and inverted means to not match anything above
950      255, which means that the union with cl should just be
951      what cl has in it, so can ignore this flag
952    ANYOF_NON_UTF8_LATIN1_ALL and inverted means if not utf8 and ord
953      is 127-255 to match them, but then invert that, so the
954      union with cl should just be what cl has in it, so can
955      ignore this flag
956   */
957  } else {    /* 'or_with' is not inverted */
958   /* (B1 | CL1) | (B2 | CL2) = (B1 | B2) | (CL1 | CL2)) */
959   if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
960    && (!(or_with->flags & ANYOF_LOC_NONBITMAP_FOLD)
961     || (cl->flags & ANYOF_LOC_NONBITMAP_FOLD)) ) {
962    int i;
963
964    /* OR char bitmap and class bitmap separately */
965    for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
966     cl->bitmap[i] |= or_with->bitmap[i];
967    if (ANYOF_CLASS_TEST_ANY_SET(or_with)) {
968     for (i = 0; i < ANYOF_CLASSBITMAP_SIZE; i++)
969      cl->classflags[i] |= or_with->classflags[i];
970     cl->flags |= ANYOF_CLASS;
971    }
972   }
973   else { /* XXXX: logic is complicated, leave it along for a moment. */
974    cl_anything(pRExC_state, cl);
975   }
976
977   if (ANYOF_NONBITMAP(or_with)) {
978
979    /* Use the added node's outside-the-bit-map match if there isn't a
980    * conflict.  If there is a conflict (both nodes match something
981    * outside the bitmap, but what they match outside is not the same
982    * pointer, and hence not easily compared until XXX we extend
983    * inversion lists this far), give up and allow the start class to
984    * match everything outside the bitmap.  If that stuff is all above
985    * 255, can just set UNICODE_ALL, otherwise caould be anything. */
986    if (! ANYOF_NONBITMAP(cl)) {
987     ARG_SET(cl, ARG(or_with));
988    }
989    else if (ARG(cl) != ARG(or_with)) {
990
991     if ((or_with->flags & ANYOF_NONBITMAP_NON_UTF8)) {
992      cl_anything(pRExC_state, cl);
993     }
994     else {
995      cl->flags |= ANYOF_UNICODE_ALL;
996     }
997    }
998   }
999
1000   /* Take the union */
1001   cl->flags |= or_with->flags;
1002  }
1003 }
1004
1005 #define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ]
1006 #define TRIE_LIST_CUR(state)  ( TRIE_LIST_ITEM( state, 0 ).forid )
1007 #define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate )
1008 #define TRIE_LIST_USED(idx)  ( trie->states[state].trans.list ? (TRIE_LIST_CUR( idx ) - 1) : 0 )
1009
1010
1011 #ifdef DEBUGGING
1012 /*
1013    dump_trie(trie,widecharmap,revcharmap)
1014    dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc)
1015    dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc)
1016
1017    These routines dump out a trie in a somewhat readable format.
1018    The _interim_ variants are used for debugging the interim
1019    tables that are used to generate the final compressed
1020    representation which is what dump_trie expects.
1021
1022    Part of the reason for their existence is to provide a form
1023    of documentation as to how the different representations function.
1024
1025 */
1026
1027 /*
1028   Dumps the final compressed table form of the trie to Perl_debug_log.
1029   Used for debugging make_trie().
1030 */
1031
1032 STATIC void
1033 S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap,
1034    AV *revcharmap, U32 depth)
1035 {
1036  U32 state;
1037  SV *sv=sv_newmortal();
1038  int colwidth= widecharmap ? 6 : 4;
1039  U16 word;
1040  GET_RE_DEBUG_FLAGS_DECL;
1041
1042  PERL_ARGS_ASSERT_DUMP_TRIE;
1043
1044  PerlIO_printf( Perl_debug_log, "%*sChar : %-6s%-6s%-4s ",
1045   (int)depth * 2 + 2,"",
1046   "Match","Base","Ofs" );
1047
1048  for( state = 0 ; state < trie->uniquecharcount ; state++ ) {
1049   SV ** const tmp = av_fetch( revcharmap, state, 0);
1050   if ( tmp ) {
1051    PerlIO_printf( Perl_debug_log, "%*s",
1052     colwidth,
1053     pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1054        PL_colors[0], PL_colors[1],
1055        (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1056        PERL_PV_ESCAPE_FIRSTCHAR
1057     )
1058    );
1059   }
1060  }
1061  PerlIO_printf( Perl_debug_log, "\n%*sState|-----------------------",
1062   (int)depth * 2 + 2,"");
1063
1064  for( state = 0 ; state < trie->uniquecharcount ; state++ )
1065   PerlIO_printf( Perl_debug_log, "%.*s", colwidth, "--------");
1066  PerlIO_printf( Perl_debug_log, "\n");
1067
1068  for( state = 1 ; state < trie->statecount ; state++ ) {
1069   const U32 base = trie->states[ state ].trans.base;
1070
1071   PerlIO_printf( Perl_debug_log, "%*s#%4"UVXf"|", (int)depth * 2 + 2,"", (UV)state);
1072
1073   if ( trie->states[ state ].wordnum ) {
1074    PerlIO_printf( Perl_debug_log, " W%4X", trie->states[ state ].wordnum );
1075   } else {
1076    PerlIO_printf( Perl_debug_log, "%6s", "" );
1077   }
1078
1079   PerlIO_printf( Perl_debug_log, " @%4"UVXf" ", (UV)base );
1080
1081   if ( base ) {
1082    U32 ofs = 0;
1083
1084    while( ( base + ofs  < trie->uniquecharcount ) ||
1085     ( base + ofs - trie->uniquecharcount < trie->lasttrans
1086      && trie->trans[ base + ofs - trie->uniquecharcount ].check != state))
1087      ofs++;
1088
1089    PerlIO_printf( Perl_debug_log, "+%2"UVXf"[ ", (UV)ofs);
1090
1091    for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
1092     if ( ( base + ofs >= trie->uniquecharcount ) &&
1093      ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
1094      trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
1095     {
1096     PerlIO_printf( Perl_debug_log, "%*"UVXf,
1097      colwidth,
1098      (UV)trie->trans[ base + ofs - trie->uniquecharcount ].next );
1099     } else {
1100      PerlIO_printf( Perl_debug_log, "%*s",colwidth,"   ." );
1101     }
1102    }
1103
1104    PerlIO_printf( Perl_debug_log, "]");
1105
1106   }
1107   PerlIO_printf( Perl_debug_log, "\n" );
1108  }
1109  PerlIO_printf(Perl_debug_log, "%*sword_info N:(prev,len)=", (int)depth*2, "");
1110  for (word=1; word <= trie->wordcount; word++) {
1111   PerlIO_printf(Perl_debug_log, " %d:(%d,%d)",
1112    (int)word, (int)(trie->wordinfo[word].prev),
1113    (int)(trie->wordinfo[word].len));
1114  }
1115  PerlIO_printf(Perl_debug_log, "\n" );
1116 }
1117 /*
1118   Dumps a fully constructed but uncompressed trie in list form.
1119   List tries normally only are used for construction when the number of
1120   possible chars (trie->uniquecharcount) is very high.
1121   Used for debugging make_trie().
1122 */
1123 STATIC void
1124 S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie,
1125       HV *widecharmap, AV *revcharmap, U32 next_alloc,
1126       U32 depth)
1127 {
1128  U32 state;
1129  SV *sv=sv_newmortal();
1130  int colwidth= widecharmap ? 6 : 4;
1131  GET_RE_DEBUG_FLAGS_DECL;
1132
1133  PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST;
1134
1135  /* print out the table precompression.  */
1136  PerlIO_printf( Perl_debug_log, "%*sState :Word | Transition Data\n%*s%s",
1137   (int)depth * 2 + 2,"", (int)depth * 2 + 2,"",
1138   "------:-----+-----------------\n" );
1139
1140  for( state=1 ; state < next_alloc ; state ++ ) {
1141   U16 charid;
1142
1143   PerlIO_printf( Perl_debug_log, "%*s %4"UVXf" :",
1144    (int)depth * 2 + 2,"", (UV)state  );
1145   if ( ! trie->states[ state ].wordnum ) {
1146    PerlIO_printf( Perl_debug_log, "%5s| ","");
1147   } else {
1148    PerlIO_printf( Perl_debug_log, "W%4x| ",
1149     trie->states[ state ].wordnum
1150    );
1151   }
1152   for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) {
1153    SV ** const tmp = av_fetch( revcharmap, TRIE_LIST_ITEM(state,charid).forid, 0);
1154    if ( tmp ) {
1155     PerlIO_printf( Perl_debug_log, "%*s:%3X=%4"UVXf" | ",
1156      colwidth,
1157      pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1158        PL_colors[0], PL_colors[1],
1159        (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1160        PERL_PV_ESCAPE_FIRSTCHAR
1161      ) ,
1162      TRIE_LIST_ITEM(state,charid).forid,
1163      (UV)TRIE_LIST_ITEM(state,charid).newstate
1164     );
1165     if (!(charid % 10))
1166      PerlIO_printf(Perl_debug_log, "\n%*s| ",
1167       (int)((depth * 2) + 14), "");
1168    }
1169   }
1170   PerlIO_printf( Perl_debug_log, "\n");
1171  }
1172 }
1173
1174 /*
1175   Dumps a fully constructed but uncompressed trie in table form.
1176   This is the normal DFA style state transition table, with a few
1177   twists to facilitate compression later.
1178   Used for debugging make_trie().
1179 */
1180 STATIC void
1181 S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie,
1182       HV *widecharmap, AV *revcharmap, U32 next_alloc,
1183       U32 depth)
1184 {
1185  U32 state;
1186  U16 charid;
1187  SV *sv=sv_newmortal();
1188  int colwidth= widecharmap ? 6 : 4;
1189  GET_RE_DEBUG_FLAGS_DECL;
1190
1191  PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE;
1192
1193  /*
1194  print out the table precompression so that we can do a visual check
1195  that they are identical.
1196  */
1197
1198  PerlIO_printf( Perl_debug_log, "%*sChar : ",(int)depth * 2 + 2,"" );
1199
1200  for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1201   SV ** const tmp = av_fetch( revcharmap, charid, 0);
1202   if ( tmp ) {
1203    PerlIO_printf( Perl_debug_log, "%*s",
1204     colwidth,
1205     pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth,
1206        PL_colors[0], PL_colors[1],
1207        (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1208        PERL_PV_ESCAPE_FIRSTCHAR
1209     )
1210    );
1211   }
1212  }
1213
1214  PerlIO_printf( Perl_debug_log, "\n%*sState+-",(int)depth * 2 + 2,"" );
1215
1216  for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) {
1217   PerlIO_printf( Perl_debug_log, "%.*s", colwidth,"--------");
1218  }
1219
1220  PerlIO_printf( Perl_debug_log, "\n" );
1221
1222  for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) {
1223
1224   PerlIO_printf( Perl_debug_log, "%*s%4"UVXf" : ",
1225    (int)depth * 2 + 2,"",
1226    (UV)TRIE_NODENUM( state ) );
1227
1228   for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1229    UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next );
1230    if (v)
1231     PerlIO_printf( Perl_debug_log, "%*"UVXf, colwidth, v );
1232    else
1233     PerlIO_printf( Perl_debug_log, "%*s", colwidth, "." );
1234   }
1235   if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) {
1236    PerlIO_printf( Perl_debug_log, " (%4"UVXf")\n", (UV)trie->trans[ state ].check );
1237   } else {
1238    PerlIO_printf( Perl_debug_log, " (%4"UVXf") W%4X\n", (UV)trie->trans[ state ].check,
1239    trie->states[ TRIE_NODENUM( state ) ].wordnum );
1240   }
1241  }
1242 }
1243
1244 #endif
1245
1246
1247 /* make_trie(startbranch,first,last,tail,word_count,flags,depth)
1248   startbranch: the first branch in the whole branch sequence
1249   first      : start branch of sequence of branch-exact nodes.
1250    May be the same as startbranch
1251   last       : Thing following the last branch.
1252    May be the same as tail.
1253   tail       : item following the branch sequence
1254   count      : words in the sequence
1255   flags      : currently the OP() type we will be building one of /EXACT(|F|Fl)/
1256   depth      : indent depth
1257
1258 Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node.
1259
1260 A trie is an N'ary tree where the branches are determined by digital
1261 decomposition of the key. IE, at the root node you look up the 1st character and
1262 follow that branch repeat until you find the end of the branches. Nodes can be
1263 marked as "accepting" meaning they represent a complete word. Eg:
1264
1265   /he|she|his|hers/
1266
1267 would convert into the following structure. Numbers represent states, letters
1268 following numbers represent valid transitions on the letter from that state, if
1269 the number is in square brackets it represents an accepting state, otherwise it
1270 will be in parenthesis.
1271
1272  +-h->+-e->[3]-+-r->(8)-+-s->[9]
1273  |    |
1274  |   (2)
1275  |    |
1276  (1)   +-i->(6)-+-s->[7]
1277  |
1278  +-s->(3)-+-h->(4)-+-e->[5]
1279
1280  Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers)
1281
1282 This shows that when matching against the string 'hers' we will begin at state 1
1283 read 'h' and move to state 2, read 'e' and move to state 3 which is accepting,
1284 then read 'r' and go to state 8 followed by 's' which takes us to state 9 which
1285 is also accepting. Thus we know that we can match both 'he' and 'hers' with a
1286 single traverse. We store a mapping from accepting to state to which word was
1287 matched, and then when we have multiple possibilities we try to complete the
1288 rest of the regex in the order in which they occured in the alternation.
1289
1290 The only prior NFA like behaviour that would be changed by the TRIE support is
1291 the silent ignoring of duplicate alternations which are of the form:
1292
1293  / (DUPE|DUPE) X? (?{ ... }) Y /x
1294
1295 Thus EVAL blocks following a trie may be called a different number of times with
1296 and without the optimisation. With the optimisations dupes will be silently
1297 ignored. This inconsistent behaviour of EVAL type nodes is well established as
1298 the following demonstrates:
1299
1300  'words'=~/(word|word|word)(?{ print $1 })[xyz]/
1301
1302 which prints out 'word' three times, but
1303
1304  'words'=~/(word|word|word)(?{ print $1 })S/
1305
1306 which doesnt print it out at all. This is due to other optimisations kicking in.
1307
1308 Example of what happens on a structural level:
1309
1310 The regexp /(ac|ad|ab)+/ will produce the following debug output:
1311
1312    1: CURLYM[1] {1,32767}(18)
1313    5:   BRANCH(8)
1314    6:     EXACT <ac>(16)
1315    8:   BRANCH(11)
1316    9:     EXACT <ad>(16)
1317   11:   BRANCH(14)
1318   12:     EXACT <ab>(16)
1319   16:   SUCCEED(0)
1320   17:   NOTHING(18)
1321   18: END(0)
1322
1323 This would be optimizable with startbranch=5, first=5, last=16, tail=16
1324 and should turn into:
1325
1326    1: CURLYM[1] {1,32767}(18)
1327    5:   TRIE(16)
1328   [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1]
1329   <ac>
1330   <ad>
1331   <ab>
1332   16:   SUCCEED(0)
1333   17:   NOTHING(18)
1334   18: END(0)
1335
1336 Cases where tail != last would be like /(?foo|bar)baz/:
1337
1338    1: BRANCH(4)
1339    2:   EXACT <foo>(8)
1340    4: BRANCH(7)
1341    5:   EXACT <bar>(8)
1342    7: TAIL(8)
1343    8: EXACT <baz>(10)
1344   10: END(0)
1345
1346 which would be optimizable with startbranch=1, first=1, last=7, tail=8
1347 and would end up looking like:
1348
1349  1: TRIE(8)
1350  [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1]
1351   <foo>
1352   <bar>
1353    7: TAIL(8)
1354    8: EXACT <baz>(10)
1355   10: END(0)
1356
1357  d = uvuni_to_utf8_flags(d, uv, 0);
1358
1359 is the recommended Unicode-aware way of saying
1360
1361  *(d++) = uv;
1362 */
1363
1364 #define TRIE_STORE_REVCHAR                                                 \
1365  STMT_START {                                                           \
1366   if (UTF) {          \
1367    SV *zlopp = newSV(2);        \
1368    unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp);    \
1369    unsigned const char *const kapow = uvuni_to_utf8(flrbbbbb, uvc & 0xFF); \
1370    SvCUR_set(zlopp, kapow - flrbbbbb);       \
1371    SvPOK_on(zlopp);         \
1372    SvUTF8_on(zlopp);         \
1373    av_push(revcharmap, zlopp);        \
1374   } else {          \
1375    char ooooff = (char)uvc;            \
1376    av_push(revcharmap, newSVpvn(&ooooff, 1));      \
1377   }           \
1378   } STMT_END
1379
1380 #define TRIE_READ_CHAR STMT_START {                                           \
1381  wordlen++;                                                                \
1382  if ( UTF ) {                                                              \
1383   if ( folder ) {                                                       \
1384    if ( foldlen > 0 ) {                                              \
1385    uvc = utf8n_to_uvuni( scan, UTF8_MAXLEN, &len, uniflags );     \
1386    foldlen -= len;                                                \
1387    scan += len;                                                   \
1388    len = 0;                                                       \
1389    } else {                                                          \
1390     uvc = utf8n_to_uvuni( (const U8*)uc, UTF8_MAXLEN, &len, uniflags);\
1391     uvc = to_uni_fold( uvc, foldbuf, &foldlen );                  \
1392     foldlen -= UNISKIP( uvc );                                    \
1393     scan = foldbuf + UNISKIP( uvc );                              \
1394    }                                                                 \
1395   } else {                                                              \
1396    uvc = utf8n_to_uvuni( (const U8*)uc, UTF8_MAXLEN, &len, uniflags);\
1397   }                                                                     \
1398  } else {                                                                  \
1399   uvc = (U32)*uc;                                                       \
1400   len = 1;                                                              \
1401  }                                                                         \
1402 } STMT_END
1403
1404
1405
1406 #define TRIE_LIST_PUSH(state,fid,ns) STMT_START {               \
1407  if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) {    \
1408   U32 ging = TRIE_LIST_LEN( state ) *= 2;                 \
1409   Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \
1410  }                                                           \
1411  TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid;     \
1412  TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns;   \
1413  TRIE_LIST_CUR( state )++;                                   \
1414 } STMT_END
1415
1416 #define TRIE_LIST_NEW(state) STMT_START {                       \
1417  Newxz( trie->states[ state ].trans.list,               \
1418   4, reg_trie_trans_le );                                 \
1419  TRIE_LIST_CUR( state ) = 1;                                \
1420  TRIE_LIST_LEN( state ) = 4;                                \
1421 } STMT_END
1422
1423 #define TRIE_HANDLE_WORD(state) STMT_START {                    \
1424  U16 dupe= trie->states[ state ].wordnum;                    \
1425  regnode * const noper_next = regnext( noper );              \
1426                 \
1427  DEBUG_r({                                                   \
1428   /* store the word for dumping */                        \
1429   SV* tmp;                                                \
1430   if (OP(noper) != NOTHING)                               \
1431    tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF); \
1432   else                                                    \
1433    tmp = newSVpvn_utf8( "", 0, UTF );   \
1434   av_push( trie_words, tmp );                             \
1435  });                                                         \
1436                 \
1437  curword++;                                                  \
1438  trie->wordinfo[curword].prev   = 0;                         \
1439  trie->wordinfo[curword].len    = wordlen;                   \
1440  trie->wordinfo[curword].accept = state;                     \
1441                 \
1442  if ( noper_next < tail ) {                                  \
1443   if (!trie->jump)                                        \
1444    trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, sizeof(U16) ); \
1445   trie->jump[curword] = (U16)(noper_next - convert);      \
1446   if (!jumper)                                            \
1447    jumper = noper_next;                                \
1448   if (!nextbranch)                                        \
1449    nextbranch= regnext(cur);                           \
1450  }                                                           \
1451                 \
1452  if ( dupe ) {                                               \
1453   /* It's a dupe. Pre-insert into the wordinfo[].prev   */\
1454   /* chain, so that when the bits of chain are later    */\
1455   /* linked together, the dups appear in the chain      */\
1456   trie->wordinfo[curword].prev = trie->wordinfo[dupe].prev; \
1457   trie->wordinfo[dupe].prev = curword;                    \
1458  } else {                                                    \
1459   /* we haven't inserted this word yet.                */ \
1460   trie->states[ state ].wordnum = curword;                \
1461  }                                                           \
1462 } STMT_END
1463
1464
1465 #define TRIE_TRANS_STATE(state,base,ucharcount,charid,special)  \
1466  ( ( base + charid >=  ucharcount     \
1467   && base + charid < ubound     \
1468   && state == trie->trans[ base - ucharcount + charid ].check \
1469   && trie->trans[ base - ucharcount + charid ].next )  \
1470   ? trie->trans[ base - ucharcount + charid ].next  \
1471   : ( state==1 ? special : 0 )     \
1472  )
1473
1474 #define MADE_TRIE       1
1475 #define MADE_JUMP_TRIE  2
1476 #define MADE_EXACT_TRIE 4
1477
1478 STATIC I32
1479 S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth)
1480 {
1481  dVAR;
1482  /* first pass, loop through and scan words */
1483  reg_trie_data *trie;
1484  HV *widecharmap = NULL;
1485  AV *revcharmap = newAV();
1486  regnode *cur;
1487  const U32 uniflags = UTF8_ALLOW_DEFAULT;
1488  STRLEN len = 0;
1489  UV uvc = 0;
1490  U16 curword = 0;
1491  U32 next_alloc = 0;
1492  regnode *jumper = NULL;
1493  regnode *nextbranch = NULL;
1494  regnode *convert = NULL;
1495  U32 *prev_states; /* temp array mapping each state to previous one */
1496  /* we just use folder as a flag in utf8 */
1497  const U8 * folder = NULL;
1498
1499 #ifdef DEBUGGING
1500  const U32 data_slot = add_data( pRExC_state, 4, "tuuu" );
1501  AV *trie_words = NULL;
1502  /* along with revcharmap, this only used during construction but both are
1503  * useful during debugging so we store them in the struct when debugging.
1504  */
1505 #else
1506  const U32 data_slot = add_data( pRExC_state, 2, "tu" );
1507  STRLEN trie_charcount=0;
1508 #endif
1509  SV *re_trie_maxbuff;
1510  GET_RE_DEBUG_FLAGS_DECL;
1511
1512  PERL_ARGS_ASSERT_MAKE_TRIE;
1513 #ifndef DEBUGGING
1514  PERL_UNUSED_ARG(depth);
1515 #endif
1516
1517  switch (flags) {
1518   case EXACTFA:
1519   case EXACTFU: folder = PL_fold_latin1; break;
1520   case EXACTF:  folder = PL_fold; break;
1521   case EXACTFL: folder = PL_fold_locale; break;
1522  }
1523
1524  trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) );
1525  trie->refcount = 1;
1526  trie->startstate = 1;
1527  trie->wordcount = word_count;
1528  RExC_rxi->data->data[ data_slot ] = (void*)trie;
1529  trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) );
1530  if (!(UTF && folder))
1531   trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 );
1532  trie->wordinfo = (reg_trie_wordinfo *) PerlMemShared_calloc(
1533      trie->wordcount+1, sizeof(reg_trie_wordinfo));
1534
1535  DEBUG_r({
1536   trie_words = newAV();
1537  });
1538
1539  re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
1540  if (!SvIOK(re_trie_maxbuff)) {
1541   sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
1542  }
1543  DEBUG_OPTIMISE_r({
1544     PerlIO_printf( Perl_debug_log,
1545     "%*smake_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n",
1546     (int)depth * 2 + 2, "",
1547     REG_NODE_NUM(startbranch),REG_NODE_NUM(first),
1548     REG_NODE_NUM(last), REG_NODE_NUM(tail),
1549     (int)depth);
1550  });
1551
1552    /* Find the node we are going to overwrite */
1553  if ( first == startbranch && OP( last ) != BRANCH ) {
1554   /* whole branch chain */
1555   convert = first;
1556  } else {
1557   /* branch sub-chain */
1558   convert = NEXTOPER( first );
1559  }
1560
1561  /*  -- First loop and Setup --
1562
1563  We first traverse the branches and scan each word to determine if it
1564  contains widechars, and how many unique chars there are, this is
1565  important as we have to build a table with at least as many columns as we
1566  have unique chars.
1567
1568  We use an array of integers to represent the character codes 0..255
1569  (trie->charmap) and we use a an HV* to store Unicode characters. We use the
1570  native representation of the character value as the key and IV's for the
1571  coded index.
1572
1573  *TODO* If we keep track of how many times each character is used we can
1574  remap the columns so that the table compression later on is more
1575  efficient in terms of memory by ensuring the most common value is in the
1576  middle and the least common are on the outside.  IMO this would be better
1577  than a most to least common mapping as theres a decent chance the most
1578  common letter will share a node with the least common, meaning the node
1579  will not be compressible. With a middle is most common approach the worst
1580  case is when we have the least common nodes twice.
1581
1582  */
1583
1584  for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
1585   regnode * const noper = NEXTOPER( cur );
1586   const U8 *uc = (U8*)STRING( noper );
1587   const U8 * const e  = uc + STR_LEN( noper );
1588   STRLEN foldlen = 0;
1589   U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1590   const U8 *scan = (U8*)NULL;
1591   U32 wordlen      = 0;         /* required init */
1592   STRLEN chars = 0;
1593   bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the bitmap?*/
1594
1595   if (OP(noper) == NOTHING) {
1596    trie->minlen= 0;
1597    continue;
1598   }
1599   if ( set_bit ) /* bitmap only alloced when !(UTF&&Folding) */
1600    TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte
1601           regardless of encoding */
1602
1603   for ( ; uc < e ; uc += len ) {
1604    TRIE_CHARCOUNT(trie)++;
1605    TRIE_READ_CHAR;
1606    chars++;
1607    if ( uvc < 256 ) {
1608     if ( !trie->charmap[ uvc ] ) {
1609      trie->charmap[ uvc ]=( ++trie->uniquecharcount );
1610      if ( folder )
1611       trie->charmap[ folder[ uvc ] ] = trie->charmap[ uvc ];
1612      TRIE_STORE_REVCHAR;
1613     }
1614     if ( set_bit ) {
1615      /* store the codepoint in the bitmap, and its folded
1616      * equivalent. */
1617      TRIE_BITMAP_SET(trie,uvc);
1618
1619      /* store the folded codepoint */
1620      if ( folder ) TRIE_BITMAP_SET(trie,folder[ uvc ]);
1621
1622      if ( !UTF ) {
1623       /* store first byte of utf8 representation of
1624       variant codepoints */
1625       if (! UNI_IS_INVARIANT(uvc)) {
1626        TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(uvc));
1627       }
1628      }
1629      set_bit = 0; /* We've done our bit :-) */
1630     }
1631    } else {
1632     SV** svpp;
1633     if ( !widecharmap )
1634      widecharmap = newHV();
1635
1636     svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 );
1637
1638     if ( !svpp )
1639      Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%"UVXf, uvc );
1640
1641     if ( !SvTRUE( *svpp ) ) {
1642      sv_setiv( *svpp, ++trie->uniquecharcount );
1643      TRIE_STORE_REVCHAR;
1644     }
1645    }
1646   }
1647   if( cur == first ) {
1648    trie->minlen=chars;
1649    trie->maxlen=chars;
1650   } else if (chars < trie->minlen) {
1651    trie->minlen=chars;
1652   } else if (chars > trie->maxlen) {
1653    trie->maxlen=chars;
1654   }
1655
1656  } /* end first pass */
1657  DEBUG_TRIE_COMPILE_r(
1658   PerlIO_printf( Perl_debug_log, "%*sTRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n",
1659     (int)depth * 2 + 2,"",
1660     ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count,
1661     (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount,
1662     (int)trie->minlen, (int)trie->maxlen )
1663  );
1664
1665  /*
1666   We now know what we are dealing with in terms of unique chars and
1667   string sizes so we can calculate how much memory a naive
1668   representation using a flat table  will take. If it's over a reasonable
1669   limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory
1670   conservative but potentially much slower representation using an array
1671   of lists.
1672
1673   At the end we convert both representations into the same compressed
1674   form that will be used in regexec.c for matching with. The latter
1675   is a form that cannot be used to construct with but has memory
1676   properties similar to the list form and access properties similar
1677   to the table form making it both suitable for fast searches and
1678   small enough that its feasable to store for the duration of a program.
1679
1680   See the comment in the code where the compressed table is produced
1681   inplace from the flat tabe representation for an explanation of how
1682   the compression works.
1683
1684  */
1685
1686
1687  Newx(prev_states, TRIE_CHARCOUNT(trie) + 2, U32);
1688  prev_states[1] = 0;
1689
1690  if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1) > SvIV(re_trie_maxbuff) ) {
1691   /*
1692    Second Pass -- Array Of Lists Representation
1693
1694    Each state will be represented by a list of charid:state records
1695    (reg_trie_trans_le) the first such element holds the CUR and LEN
1696    points of the allocated array. (See defines above).
1697
1698    We build the initial structure using the lists, and then convert
1699    it into the compressed table form which allows faster lookups
1700    (but cant be modified once converted).
1701   */
1702
1703   STRLEN transcount = 1;
1704
1705   DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log,
1706    "%*sCompiling trie using list compiler\n",
1707    (int)depth * 2 + 2, ""));
1708
1709   trie->states = (reg_trie_state *)
1710    PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
1711         sizeof(reg_trie_state) );
1712   TRIE_LIST_NEW(1);
1713   next_alloc = 2;
1714
1715   for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
1716
1717    regnode * const noper = NEXTOPER( cur );
1718    U8 *uc           = (U8*)STRING( noper );
1719    const U8 * const e = uc + STR_LEN( noper );
1720    U32 state        = 1;         /* required init */
1721    U16 charid       = 0;         /* sanity init */
1722    U8 *scan         = (U8*)NULL; /* sanity init */
1723    STRLEN foldlen   = 0;         /* required init */
1724    U32 wordlen      = 0;         /* required init */
1725    U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1726
1727    if (OP(noper) != NOTHING) {
1728     for ( ; uc < e ; uc += len ) {
1729
1730      TRIE_READ_CHAR;
1731
1732      if ( uvc < 256 ) {
1733       charid = trie->charmap[ uvc ];
1734      } else {
1735       SV** const svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 0);
1736       if ( !svpp ) {
1737        charid = 0;
1738       } else {
1739        charid=(U16)SvIV( *svpp );
1740       }
1741      }
1742      /* charid is now 0 if we dont know the char read, or nonzero if we do */
1743      if ( charid ) {
1744
1745       U16 check;
1746       U32 newstate = 0;
1747
1748       charid--;
1749       if ( !trie->states[ state ].trans.list ) {
1750        TRIE_LIST_NEW( state );
1751       }
1752       for ( check = 1; check <= TRIE_LIST_USED( state ); check++ ) {
1753        if ( TRIE_LIST_ITEM( state, check ).forid == charid ) {
1754         newstate = TRIE_LIST_ITEM( state, check ).newstate;
1755         break;
1756        }
1757       }
1758       if ( ! newstate ) {
1759        newstate = next_alloc++;
1760        prev_states[newstate] = state;
1761        TRIE_LIST_PUSH( state, charid, newstate );
1762        transcount++;
1763       }
1764       state = newstate;
1765      } else {
1766       Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
1767      }
1768     }
1769    }
1770    TRIE_HANDLE_WORD(state);
1771
1772   } /* end second pass */
1773
1774   /* next alloc is the NEXT state to be allocated */
1775   trie->statecount = next_alloc;
1776   trie->states = (reg_trie_state *)
1777    PerlMemShared_realloc( trie->states,
1778         next_alloc
1779         * sizeof(reg_trie_state) );
1780
1781   /* and now dump it out before we compress it */
1782   DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap,
1783               revcharmap, next_alloc,
1784               depth+1)
1785   );
1786
1787   trie->trans = (reg_trie_trans *)
1788    PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) );
1789   {
1790    U32 state;
1791    U32 tp = 0;
1792    U32 zp = 0;
1793
1794
1795    for( state=1 ; state < next_alloc ; state ++ ) {
1796     U32 base=0;
1797
1798     /*
1799     DEBUG_TRIE_COMPILE_MORE_r(
1800      PerlIO_printf( Perl_debug_log, "tp: %d zp: %d ",tp,zp)
1801     );
1802     */
1803
1804     if (trie->states[state].trans.list) {
1805      U16 minid=TRIE_LIST_ITEM( state, 1).forid;
1806      U16 maxid=minid;
1807      U16 idx;
1808
1809      for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
1810       const U16 forid = TRIE_LIST_ITEM( state, idx).forid;
1811       if ( forid < minid ) {
1812        minid=forid;
1813       } else if ( forid > maxid ) {
1814        maxid=forid;
1815       }
1816      }
1817      if ( transcount < tp + maxid - minid + 1) {
1818       transcount *= 2;
1819       trie->trans = (reg_trie_trans *)
1820        PerlMemShared_realloc( trie->trans,
1821              transcount
1822              * sizeof(reg_trie_trans) );
1823       Zero( trie->trans + (transcount / 2), transcount / 2 , reg_trie_trans );
1824      }
1825      base = trie->uniquecharcount + tp - minid;
1826      if ( maxid == minid ) {
1827       U32 set = 0;
1828       for ( ; zp < tp ; zp++ ) {
1829        if ( ! trie->trans[ zp ].next ) {
1830         base = trie->uniquecharcount + zp - minid;
1831         trie->trans[ zp ].next = TRIE_LIST_ITEM( state, 1).newstate;
1832         trie->trans[ zp ].check = state;
1833         set = 1;
1834         break;
1835        }
1836       }
1837       if ( !set ) {
1838        trie->trans[ tp ].next = TRIE_LIST_ITEM( state, 1).newstate;
1839        trie->trans[ tp ].check = state;
1840        tp++;
1841        zp = tp;
1842       }
1843      } else {
1844       for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
1845        const U32 tid = base -  trie->uniquecharcount + TRIE_LIST_ITEM( state, idx ).forid;
1846        trie->trans[ tid ].next = TRIE_LIST_ITEM( state, idx ).newstate;
1847        trie->trans[ tid ].check = state;
1848       }
1849       tp += ( maxid - minid + 1 );
1850      }
1851      Safefree(trie->states[ state ].trans.list);
1852     }
1853     /*
1854     DEBUG_TRIE_COMPILE_MORE_r(
1855      PerlIO_printf( Perl_debug_log, " base: %d\n",base);
1856     );
1857     */
1858     trie->states[ state ].trans.base=base;
1859    }
1860    trie->lasttrans = tp + 1;
1861   }
1862  } else {
1863   /*
1864   Second Pass -- Flat Table Representation.
1865
1866   we dont use the 0 slot of either trans[] or states[] so we add 1 to each.
1867   We know that we will need Charcount+1 trans at most to store the data
1868   (one row per char at worst case) So we preallocate both structures
1869   assuming worst case.
1870
1871   We then construct the trie using only the .next slots of the entry
1872   structs.
1873
1874   We use the .check field of the first entry of the node temporarily to
1875   make compression both faster and easier by keeping track of how many non
1876   zero fields are in the node.
1877
1878   Since trans are numbered from 1 any 0 pointer in the table is a FAIL
1879   transition.
1880
1881   There are two terms at use here: state as a TRIE_NODEIDX() which is a
1882   number representing the first entry of the node, and state as a
1883   TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1) and
1884   TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3) if there
1885   are 2 entrys per node. eg:
1886
1887    A B       A B
1888   1. 2 4    1. 3 7
1889   2. 0 3    3. 0 5
1890   3. 0 0    5. 0 0
1891   4. 0 0    7. 0 0
1892
1893   The table is internally in the right hand, idx form. However as we also
1894   have to deal with the states array which is indexed by nodenum we have to
1895   use TRIE_NODENUM() to convert.
1896
1897   */
1898   DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log,
1899    "%*sCompiling trie using table compiler\n",
1900    (int)depth * 2 + 2, ""));
1901
1902   trie->trans = (reg_trie_trans *)
1903    PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 )
1904         * trie->uniquecharcount + 1,
1905         sizeof(reg_trie_trans) );
1906   trie->states = (reg_trie_state *)
1907    PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
1908         sizeof(reg_trie_state) );
1909   next_alloc = trie->uniquecharcount + 1;
1910
1911
1912   for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
1913
1914    regnode * const noper   = NEXTOPER( cur );
1915    const U8 *uc     = (U8*)STRING( noper );
1916    const U8 * const e = uc + STR_LEN( noper );
1917
1918    U32 state        = 1;         /* required init */
1919
1920    U16 charid       = 0;         /* sanity init */
1921    U32 accept_state = 0;         /* sanity init */
1922    U8 *scan         = (U8*)NULL; /* sanity init */
1923
1924    STRLEN foldlen   = 0;         /* required init */
1925    U32 wordlen      = 0;         /* required init */
1926    U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1927
1928    if ( OP(noper) != NOTHING ) {
1929     for ( ; uc < e ; uc += len ) {
1930
1931      TRIE_READ_CHAR;
1932
1933      if ( uvc < 256 ) {
1934       charid = trie->charmap[ uvc ];
1935      } else {
1936       SV* const * const svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 0);
1937       charid = svpp ? (U16)SvIV(*svpp) : 0;
1938      }
1939      if ( charid ) {
1940       charid--;
1941       if ( !trie->trans[ state + charid ].next ) {
1942        trie->trans[ state + charid ].next = next_alloc;
1943        trie->trans[ state ].check++;
1944        prev_states[TRIE_NODENUM(next_alloc)]
1945          = TRIE_NODENUM(state);
1946        next_alloc += trie->uniquecharcount;
1947       }
1948       state = trie->trans[ state + charid ].next;
1949      } else {
1950       Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
1951      }
1952      /* charid is now 0 if we dont know the char read, or nonzero if we do */
1953     }
1954    }
1955    accept_state = TRIE_NODENUM( state );
1956    TRIE_HANDLE_WORD(accept_state);
1957
1958   } /* end second pass */
1959
1960   /* and now dump it out before we compress it */
1961   DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap,
1962               revcharmap,
1963               next_alloc, depth+1));
1964
1965   {
1966   /*
1967   * Inplace compress the table.*
1968
1969   For sparse data sets the table constructed by the trie algorithm will
1970   be mostly 0/FAIL transitions or to put it another way mostly empty.
1971   (Note that leaf nodes will not contain any transitions.)
1972
1973   This algorithm compresses the tables by eliminating most such
1974   transitions, at the cost of a modest bit of extra work during lookup:
1975
1976   - Each states[] entry contains a .base field which indicates the
1977   index in the state[] array wheres its transition data is stored.
1978
1979   - If .base is 0 there are no valid transitions from that node.
1980
1981   - If .base is nonzero then charid is added to it to find an entry in
1982   the trans array.
1983
1984   -If trans[states[state].base+charid].check!=state then the
1985   transition is taken to be a 0/Fail transition. Thus if there are fail
1986   transitions at the front of the node then the .base offset will point
1987   somewhere inside the previous nodes data (or maybe even into a node
1988   even earlier), but the .check field determines if the transition is
1989   valid.
1990
1991   XXX - wrong maybe?
1992   The following process inplace converts the table to the compressed
1993   table: We first do not compress the root node 1,and mark all its
1994   .check pointers as 1 and set its .base pointer as 1 as well. This
1995   allows us to do a DFA construction from the compressed table later,
1996   and ensures that any .base pointers we calculate later are greater
1997   than 0.
1998
1999   - We set 'pos' to indicate the first entry of the second node.
2000
2001   - We then iterate over the columns of the node, finding the first and
2002   last used entry at l and m. We then copy l..m into pos..(pos+m-l),
2003   and set the .check pointers accordingly, and advance pos
2004   appropriately and repreat for the next node. Note that when we copy
2005   the next pointers we have to convert them from the original
2006   NODEIDX form to NODENUM form as the former is not valid post
2007   compression.
2008
2009   - If a node has no transitions used we mark its base as 0 and do not
2010   advance the pos pointer.
2011
2012   - If a node only has one transition we use a second pointer into the
2013   structure to fill in allocated fail transitions from other states.
2014   This pointer is independent of the main pointer and scans forward
2015   looking for null transitions that are allocated to a state. When it
2016   finds one it writes the single transition into the "hole".  If the
2017   pointer doesnt find one the single transition is appended as normal.
2018
2019   - Once compressed we can Renew/realloc the structures to release the
2020   excess space.
2021
2022   See "Table-Compression Methods" in sec 3.9 of the Red Dragon,
2023   specifically Fig 3.47 and the associated pseudocode.
2024
2025   demq
2026   */
2027   const U32 laststate = TRIE_NODENUM( next_alloc );
2028   U32 state, charid;
2029   U32 pos = 0, zp=0;
2030   trie->statecount = laststate;
2031
2032   for ( state = 1 ; state < laststate ; state++ ) {
2033    U8 flag = 0;
2034    const U32 stateidx = TRIE_NODEIDX( state );
2035    const U32 o_used = trie->trans[ stateidx ].check;
2036    U32 used = trie->trans[ stateidx ].check;
2037    trie->trans[ stateidx ].check = 0;
2038
2039    for ( charid = 0 ; used && charid < trie->uniquecharcount ; charid++ ) {
2040     if ( flag || trie->trans[ stateidx + charid ].next ) {
2041      if ( trie->trans[ stateidx + charid ].next ) {
2042       if (o_used == 1) {
2043        for ( ; zp < pos ; zp++ ) {
2044         if ( ! trie->trans[ zp ].next ) {
2045          break;
2046         }
2047        }
2048        trie->states[ state ].trans.base = zp + trie->uniquecharcount - charid ;
2049        trie->trans[ zp ].next = SAFE_TRIE_NODENUM( trie->trans[ stateidx + charid ].next );
2050        trie->trans[ zp ].check = state;
2051        if ( ++zp > pos ) pos = zp;
2052        break;
2053       }
2054       used--;
2055      }
2056      if ( !flag ) {
2057       flag = 1;
2058       trie->states[ state ].trans.base = pos + trie->uniquecharcount - charid ;
2059      }
2060      trie->trans[ pos ].next = SAFE_TRIE_NODENUM( trie->trans[ stateidx + charid ].next );
2061      trie->trans[ pos ].check = state;
2062      pos++;
2063     }
2064    }
2065   }
2066   trie->lasttrans = pos + 1;
2067   trie->states = (reg_trie_state *)
2068    PerlMemShared_realloc( trie->states, laststate
2069         * sizeof(reg_trie_state) );
2070   DEBUG_TRIE_COMPILE_MORE_r(
2071     PerlIO_printf( Perl_debug_log,
2072      "%*sAlloc: %d Orig: %"IVdf" elements, Final:%"IVdf". Savings of %%%5.2f\n",
2073      (int)depth * 2 + 2,"",
2074      (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1 ),
2075      (IV)next_alloc,
2076      (IV)pos,
2077      ( ( next_alloc - pos ) * 100 ) / (double)next_alloc );
2078    );
2079
2080   } /* end table compress */
2081  }
2082  DEBUG_TRIE_COMPILE_MORE_r(
2083    PerlIO_printf(Perl_debug_log, "%*sStatecount:%"UVxf" Lasttrans:%"UVxf"\n",
2084     (int)depth * 2 + 2, "",
2085     (UV)trie->statecount,
2086     (UV)trie->lasttrans)
2087  );
2088  /* resize the trans array to remove unused space */
2089  trie->trans = (reg_trie_trans *)
2090   PerlMemShared_realloc( trie->trans, trie->lasttrans
2091        * sizeof(reg_trie_trans) );
2092
2093  {   /* Modify the program and insert the new TRIE node */
2094   U8 nodetype =(U8)(flags & 0xFF);
2095   char *str=NULL;
2096
2097 #ifdef DEBUGGING
2098   regnode *optimize = NULL;
2099 #ifdef RE_TRACK_PATTERN_OFFSETS
2100
2101   U32 mjd_offset = 0;
2102   U32 mjd_nodelen = 0;
2103 #endif /* RE_TRACK_PATTERN_OFFSETS */
2104 #endif /* DEBUGGING */
2105   /*
2106   This means we convert either the first branch or the first Exact,
2107   depending on whether the thing following (in 'last') is a branch
2108   or not and whther first is the startbranch (ie is it a sub part of
2109   the alternation or is it the whole thing.)
2110   Assuming its a sub part we convert the EXACT otherwise we convert
2111   the whole branch sequence, including the first.
2112   */
2113   /* Find the node we are going to overwrite */
2114   if ( first != startbranch || OP( last ) == BRANCH ) {
2115    /* branch sub-chain */
2116    NEXT_OFF( first ) = (U16)(last - first);
2117 #ifdef RE_TRACK_PATTERN_OFFSETS
2118    DEBUG_r({
2119     mjd_offset= Node_Offset((convert));
2120     mjd_nodelen= Node_Length((convert));
2121    });
2122 #endif
2123    /* whole branch chain */
2124   }
2125 #ifdef RE_TRACK_PATTERN_OFFSETS
2126   else {
2127    DEBUG_r({
2128     const  regnode *nop = NEXTOPER( convert );
2129     mjd_offset= Node_Offset((nop));
2130     mjd_nodelen= Node_Length((nop));
2131    });
2132   }
2133   DEBUG_OPTIMISE_r(
2134    PerlIO_printf(Perl_debug_log, "%*sMJD offset:%"UVuf" MJD length:%"UVuf"\n",
2135     (int)depth * 2 + 2, "",
2136     (UV)mjd_offset, (UV)mjd_nodelen)
2137   );
2138 #endif
2139   /* But first we check to see if there is a common prefix we can
2140   split out as an EXACT and put in front of the TRIE node.  */
2141   trie->startstate= 1;
2142   if ( trie->bitmap && !widecharmap && !trie->jump  ) {
2143    U32 state;
2144    for ( state = 1 ; state < trie->statecount-1 ; state++ ) {
2145     U32 ofs = 0;
2146     I32 idx = -1;
2147     U32 count = 0;
2148     const U32 base = trie->states[ state ].trans.base;
2149
2150     if ( trie->states[state].wordnum )
2151       count = 1;
2152
2153     for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
2154      if ( ( base + ofs >= trie->uniquecharcount ) &&
2155       ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
2156       trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
2157      {
2158       if ( ++count > 1 ) {
2159        SV **tmp = av_fetch( revcharmap, ofs, 0);
2160        const U8 *ch = (U8*)SvPV_nolen_const( *tmp );
2161        if ( state == 1 ) break;
2162        if ( count == 2 ) {
2163         Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char);
2164         DEBUG_OPTIMISE_r(
2165          PerlIO_printf(Perl_debug_log,
2166           "%*sNew Start State=%"UVuf" Class: [",
2167           (int)depth * 2 + 2, "",
2168           (UV)state));
2169         if (idx >= 0) {
2170          SV ** const tmp = av_fetch( revcharmap, idx, 0);
2171          const U8 * const ch = (U8*)SvPV_nolen_const( *tmp );
2172
2173          TRIE_BITMAP_SET(trie,*ch);
2174          if ( folder )
2175           TRIE_BITMAP_SET(trie, folder[ *ch ]);
2176          DEBUG_OPTIMISE_r(
2177           PerlIO_printf(Perl_debug_log, "%s", (char*)ch)
2178          );
2179         }
2180        }
2181        TRIE_BITMAP_SET(trie,*ch);
2182        if ( folder )
2183         TRIE_BITMAP_SET(trie,folder[ *ch ]);
2184        DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"%s", ch));
2185       }
2186       idx = ofs;
2187      }
2188     }
2189     if ( count == 1 ) {
2190      SV **tmp = av_fetch( revcharmap, idx, 0);
2191      STRLEN len;
2192      char *ch = SvPV( *tmp, len );
2193      DEBUG_OPTIMISE_r({
2194       SV *sv=sv_newmortal();
2195       PerlIO_printf( Perl_debug_log,
2196        "%*sPrefix State: %"UVuf" Idx:%"UVuf" Char='%s'\n",
2197        (int)depth * 2 + 2, "",
2198        (UV)state, (UV)idx,
2199        pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6,
2200         PL_colors[0], PL_colors[1],
2201         (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
2202         PERL_PV_ESCAPE_FIRSTCHAR
2203        )
2204       );
2205      });
2206      if ( state==1 ) {
2207       OP( convert ) = nodetype;
2208       str=STRING(convert);
2209       STR_LEN(convert)=0;
2210      }
2211      STR_LEN(convert) += len;
2212      while (len--)
2213       *str++ = *ch++;
2214     } else {
2215 #ifdef DEBUGGING
2216      if (state>1)
2217       DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"]\n"));
2218 #endif
2219      break;
2220     }
2221    }
2222    trie->prefixlen = (state-1);
2223    if (str) {
2224     regnode *n = convert+NODE_SZ_STR(convert);
2225     NEXT_OFF(convert) = NODE_SZ_STR(convert);
2226     trie->startstate = state;
2227     trie->minlen -= (state - 1);
2228     trie->maxlen -= (state - 1);
2229 #ifdef DEBUGGING
2230    /* At least the UNICOS C compiler choked on this
2231     * being argument to DEBUG_r(), so let's just have
2232     * it right here. */
2233    if (
2234 #ifdef PERL_EXT_RE_BUILD
2235     1
2236 #else
2237     DEBUG_r_TEST
2238 #endif
2239     ) {
2240     regnode *fix = convert;
2241     U32 word = trie->wordcount;
2242     mjd_nodelen++;
2243     Set_Node_Offset_Length(convert, mjd_offset, state - 1);
2244     while( ++fix < n ) {
2245      Set_Node_Offset_Length(fix, 0, 0);
2246     }
2247     while (word--) {
2248      SV ** const tmp = av_fetch( trie_words, word, 0 );
2249      if (tmp) {
2250       if ( STR_LEN(convert) <= SvCUR(*tmp) )
2251        sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert));
2252       else
2253        sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp));
2254      }
2255     }
2256    }
2257 #endif
2258     if (trie->maxlen) {
2259      convert = n;
2260     } else {
2261      NEXT_OFF(convert) = (U16)(tail - convert);
2262      DEBUG_r(optimize= n);
2263     }
2264    }
2265   }
2266   if (!jumper)
2267    jumper = last;
2268   if ( trie->maxlen ) {
2269    NEXT_OFF( convert ) = (U16)(tail - convert);
2270    ARG_SET( convert, data_slot );
2271    /* Store the offset to the first unabsorbed branch in
2272    jump[0], which is otherwise unused by the jump logic.
2273    We use this when dumping a trie and during optimisation. */
2274    if (trie->jump)
2275     trie->jump[0] = (U16)(nextbranch - convert);
2276
2277    /* If the start state is not accepting (meaning there is no empty string/NOTHING)
2278    *   and there is a bitmap
2279    *   and the first "jump target" node we found leaves enough room
2280    * then convert the TRIE node into a TRIEC node, with the bitmap
2281    * embedded inline in the opcode - this is hypothetically faster.
2282    */
2283    if ( !trie->states[trie->startstate].wordnum
2284     && trie->bitmap
2285     && ( (char *)jumper - (char *)convert) >= (int)sizeof(struct regnode_charclass) )
2286    {
2287     OP( convert ) = TRIEC;
2288     Copy(trie->bitmap, ((struct regnode_charclass *)convert)->bitmap, ANYOF_BITMAP_SIZE, char);
2289     PerlMemShared_free(trie->bitmap);
2290     trie->bitmap= NULL;
2291    } else
2292     OP( convert ) = TRIE;
2293
2294    /* store the type in the flags */
2295    convert->flags = nodetype;
2296    DEBUG_r({
2297    optimize = convert
2298      + NODE_STEP_REGNODE
2299      + regarglen[ OP( convert ) ];
2300    });
2301    /* XXX We really should free up the resource in trie now,
2302     as we won't use them - (which resources?) dmq */
2303   }
2304   /* needed for dumping*/
2305   DEBUG_r(if (optimize) {
2306    regnode *opt = convert;
2307
2308    while ( ++opt < optimize) {
2309     Set_Node_Offset_Length(opt,0,0);
2310    }
2311    /*
2312     Try to clean up some of the debris left after the
2313     optimisation.
2314    */
2315    while( optimize < jumper ) {
2316     mjd_nodelen += Node_Length((optimize));
2317     OP( optimize ) = OPTIMIZED;
2318     Set_Node_Offset_Length(optimize,0,0);
2319     optimize++;
2320    }
2321    Set_Node_Offset_Length(convert,mjd_offset,mjd_nodelen);
2322   });
2323  } /* end node insert */
2324  REH_CALL_COMP_NODE_HOOK(pRExC_state->rx, convert);
2325
2326  /*  Finish populating the prev field of the wordinfo array.  Walk back
2327  *  from each accept state until we find another accept state, and if
2328  *  so, point the first word's .prev field at the second word. If the
2329  *  second already has a .prev field set, stop now. This will be the
2330  *  case either if we've already processed that word's accept state,
2331  *  or that state had multiple words, and the overspill words were
2332  *  already linked up earlier.
2333  */
2334  {
2335   U16 word;
2336   U32 state;
2337   U16 prev;
2338
2339   for (word=1; word <= trie->wordcount; word++) {
2340    prev = 0;
2341    if (trie->wordinfo[word].prev)
2342     continue;
2343    state = trie->wordinfo[word].accept;
2344    while (state) {
2345     state = prev_states[state];
2346     if (!state)
2347      break;
2348     prev = trie->states[state].wordnum;
2349     if (prev)
2350      break;
2351    }
2352    trie->wordinfo[word].prev = prev;
2353   }
2354   Safefree(prev_states);
2355  }
2356
2357
2358  /* and now dump out the compressed format */
2359  DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1));
2360
2361  RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap;
2362 #ifdef DEBUGGING
2363  RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words;
2364  RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap;
2365 #else
2366  SvREFCNT_dec(revcharmap);
2367 #endif
2368  return trie->jump
2369   ? MADE_JUMP_TRIE
2370   : trie->startstate>1
2371    ? MADE_EXACT_TRIE
2372    : MADE_TRIE;
2373 }
2374
2375 STATIC void
2376 S_make_trie_failtable(pTHX_ RExC_state_t *pRExC_state, regnode *source,  regnode *stclass, U32 depth)
2377 {
2378 /* The Trie is constructed and compressed now so we can build a fail array if it's needed
2379
2380    This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and 3.32 in the
2381    "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi, Ullman 1985/88
2382    ISBN 0-201-10088-6
2383
2384    We find the fail state for each state in the trie, this state is the longest proper
2385    suffix of the current state's 'word' that is also a proper prefix of another word in our
2386    trie. State 1 represents the word '' and is thus the default fail state. This allows
2387    the DFA not to have to restart after its tried and failed a word at a given point, it
2388    simply continues as though it had been matching the other word in the first place.
2389    Consider
2390  'abcdgu'=~/abcdefg|cdgu/
2391    When we get to 'd' we are still matching the first word, we would encounter 'g' which would
2392    fail, which would bring us to the state representing 'd' in the second word where we would
2393    try 'g' and succeed, proceeding to match 'cdgu'.
2394  */
2395  /* add a fail transition */
2396  const U32 trie_offset = ARG(source);
2397  reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset];
2398  U32 *q;
2399  const U32 ucharcount = trie->uniquecharcount;
2400  const U32 numstates = trie->statecount;
2401  const U32 ubound = trie->lasttrans + ucharcount;
2402  U32 q_read = 0;
2403  U32 q_write = 0;
2404  U32 charid;
2405  U32 base = trie->states[ 1 ].trans.base;
2406  U32 *fail;
2407  reg_ac_data *aho;
2408  const U32 data_slot = add_data( pRExC_state, 1, "T" );
2409  GET_RE_DEBUG_FLAGS_DECL;
2410
2411  PERL_ARGS_ASSERT_MAKE_TRIE_FAILTABLE;
2412 #ifndef DEBUGGING
2413  PERL_UNUSED_ARG(depth);
2414 #endif
2415
2416
2417  ARG_SET( stclass, data_slot );
2418  aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) );
2419  RExC_rxi->data->data[ data_slot ] = (void*)aho;
2420  aho->trie=trie_offset;
2421  aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) );
2422  Copy( trie->states, aho->states, numstates, reg_trie_state );
2423  Newxz( q, numstates, U32);
2424  aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) );
2425  aho->refcount = 1;
2426  fail = aho->fail;
2427  /* initialize fail[0..1] to be 1 so that we always have
2428  a valid final fail state */
2429  fail[ 0 ] = fail[ 1 ] = 1;
2430
2431  for ( charid = 0; charid < ucharcount ; charid++ ) {
2432   const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 );
2433   if ( newstate ) {
2434    q[ q_write ] = newstate;
2435    /* set to point at the root */
2436    fail[ q[ q_write++ ] ]=1;
2437   }
2438  }
2439  while ( q_read < q_write) {
2440   const U32 cur = q[ q_read++ % numstates ];
2441   base = trie->states[ cur ].trans.base;
2442
2443   for ( charid = 0 ; charid < ucharcount ; charid++ ) {
2444    const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 );
2445    if (ch_state) {
2446     U32 fail_state = cur;
2447     U32 fail_base;
2448     do {
2449      fail_state = fail[ fail_state ];
2450      fail_base = aho->states[ fail_state ].trans.base;
2451     } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) );
2452
2453     fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 );
2454     fail[ ch_state ] = fail_state;
2455     if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum )
2456     {
2457       aho->states[ ch_state ].wordnum =  aho->states[ fail_state ].wordnum;
2458     }
2459     q[ q_write++ % numstates] = ch_state;
2460    }
2461   }
2462  }
2463  /* restore fail[0..1] to 0 so that we "fall out" of the AC loop
2464  when we fail in state 1, this allows us to use the
2465  charclass scan to find a valid start char. This is based on the principle
2466  that theres a good chance the string being searched contains lots of stuff
2467  that cant be a start char.
2468  */
2469  fail[ 0 ] = fail[ 1 ] = 0;
2470  DEBUG_TRIE_COMPILE_r({
2471   PerlIO_printf(Perl_debug_log,
2472      "%*sStclass Failtable (%"UVuf" states): 0",
2473      (int)(depth * 2), "", (UV)numstates
2474   );
2475   for( q_read=1; q_read<numstates; q_read++ ) {
2476    PerlIO_printf(Perl_debug_log, ", %"UVuf, (UV)fail[q_read]);
2477   }
2478   PerlIO_printf(Perl_debug_log, "\n");
2479  });
2480  Safefree(q);
2481  /*RExC_seen |= REG_SEEN_TRIEDFA;*/
2482 }
2483
2484
2485 /*
2486  * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
2487  * These need to be revisited when a newer toolchain becomes available.
2488  */
2489 #if defined(__sparc64__) && defined(__GNUC__)
2490 #   if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
2491 #       undef  SPARC64_GCC_WORKAROUND
2492 #       define SPARC64_GCC_WORKAROUND 1
2493 #   endif
2494 #endif
2495
2496 #define DEBUG_PEEP(str,scan,depth) \
2497  DEBUG_OPTIMISE_r({if (scan){ \
2498  SV * const mysv=sv_newmortal(); \
2499  regnode *Next = regnext(scan); \
2500  regprop(RExC_rx, mysv, scan); \
2501  PerlIO_printf(Perl_debug_log, "%*s" str ">%3d: %s (%d)\n", \
2502  (int)depth*2, "", REG_NODE_NUM(scan), SvPV_nolen_const(mysv),\
2503  Next ? (REG_NODE_NUM(Next)) : 0 ); \
2504    }});
2505
2506
2507
2508
2509
2510 #define JOIN_EXACT(scan,min,flags) \
2511  if (PL_regkind[OP(scan)] == EXACT) \
2512   join_exact(pRExC_state,(scan),(min),(flags),NULL,depth+1)
2513
2514 STATIC U32
2515 S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, I32 *min, U32 flags,regnode *val, U32 depth) {
2516  /* Merge several consecutive EXACTish nodes into one. */
2517  regnode *n = regnext(scan);
2518  U32 stringok = 1;
2519  regnode *next = scan + NODE_SZ_STR(scan);
2520  U32 merged = 0;
2521  U32 stopnow = 0;
2522 #ifdef DEBUGGING
2523  regnode *stop = scan;
2524  GET_RE_DEBUG_FLAGS_DECL;
2525 #else
2526  PERL_UNUSED_ARG(depth);
2527 #endif
2528
2529  PERL_ARGS_ASSERT_JOIN_EXACT;
2530 #ifndef EXPERIMENTAL_INPLACESCAN
2531  PERL_UNUSED_ARG(flags);
2532  PERL_UNUSED_ARG(val);
2533 #endif
2534  DEBUG_PEEP("join",scan,depth);
2535
2536  /* Skip NOTHING, merge EXACT*. */
2537  while (n &&
2538   ( PL_regkind[OP(n)] == NOTHING ||
2539    (stringok && (OP(n) == OP(scan))))
2540   && NEXT_OFF(n)
2541   && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) {
2542
2543   if (OP(n) == TAIL || n > next)
2544    stringok = 0;
2545   if (PL_regkind[OP(n)] == NOTHING) {
2546    DEBUG_PEEP("skip:",n,depth);
2547    NEXT_OFF(scan) += NEXT_OFF(n);
2548    next = n + NODE_STEP_REGNODE;
2549 #ifdef DEBUGGING
2550    if (stringok)
2551     stop = n;
2552 #endif
2553    n = regnext(n);
2554   }
2555   else if (stringok) {
2556    const unsigned int oldl = STR_LEN(scan);
2557    regnode * const nnext = regnext(n);
2558
2559    DEBUG_PEEP("merg",n,depth);
2560
2561    merged++;
2562    if (oldl + STR_LEN(n) > U8_MAX)
2563     break;
2564    NEXT_OFF(scan) += NEXT_OFF(n);
2565    STR_LEN(scan) += STR_LEN(n);
2566    next = n + NODE_SZ_STR(n);
2567    /* Now we can overwrite *n : */
2568    Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char);
2569 #ifdef DEBUGGING
2570    stop = next - 1;
2571 #endif
2572    n = nnext;
2573    if (stopnow) break;
2574   }
2575
2576 #ifdef EXPERIMENTAL_INPLACESCAN
2577   if (flags && !NEXT_OFF(n)) {
2578    DEBUG_PEEP("atch", val, depth);
2579    if (reg_off_by_arg[OP(n)]) {
2580     ARG_SET(n, val - n);
2581    }
2582    else {
2583     NEXT_OFF(n) = val - n;
2584    }
2585    stopnow = 1;
2586   }
2587 #endif
2588  }
2589 #define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS   0x0390
2590 #define IOTA_D_T GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS
2591 #define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS 0x03B0
2592 #define UPSILON_D_T GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS
2593
2594  if (UTF
2595   && ( OP(scan) == EXACTF || OP(scan) == EXACTFU || OP(scan) == EXACTFA)
2596   && ( STR_LEN(scan) >= 6 ) )
2597  {
2598  /*
2599  Two problematic code points in Unicode casefolding of EXACT nodes:
2600
2601  U+0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
2602  U+03B0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
2603
2604  which casefold to
2605
2606  Unicode                      UTF-8
2607
2608  U+03B9 U+0308 U+0301         0xCE 0xB9 0xCC 0x88 0xCC 0x81
2609  U+03C5 U+0308 U+0301         0xCF 0x85 0xCC 0x88 0xCC 0x81
2610
2611  This means that in case-insensitive matching (or "loose matching",
2612  as Unicode calls it), an EXACTF of length six (the UTF-8 encoded byte
2613  length of the above casefolded versions) can match a target string
2614  of length two (the byte length of UTF-8 encoded U+0390 or U+03B0).
2615  This would rather mess up the minimum length computation.
2616
2617  What we'll do is to look for the tail four bytes, and then peek
2618  at the preceding two bytes to see whether we need to decrease
2619  the minimum length by four (six minus two).
2620
2621  Thanks to the design of UTF-8, there cannot be false matches:
2622  A sequence of valid UTF-8 bytes cannot be a subsequence of
2623  another valid sequence of UTF-8 bytes.
2624
2625  */
2626   char * const s0 = STRING(scan), *s, *t;
2627   char * const s1 = s0 + STR_LEN(scan) - 1;
2628   char * const s2 = s1 - 4;
2629 #ifdef EBCDIC /* RD tunifold greek 0390 and 03B0 */
2630   const char t0[] = "\xaf\x49\xaf\x42";
2631 #else
2632   const char t0[] = "\xcc\x88\xcc\x81";
2633 #endif
2634   const char * const t1 = t0 + 3;
2635
2636   for (s = s0 + 2;
2637    s < s2 && (t = ninstr(s, s1, t0, t1));
2638    s = t + 4) {
2639 #ifdef EBCDIC
2640    if (((U8)t[-1] == 0x68 && (U8)t[-2] == 0xB4) ||
2641     ((U8)t[-1] == 0x46 && (U8)t[-2] == 0xB5))
2642 #else
2643    if (((U8)t[-1] == 0xB9 && (U8)t[-2] == 0xCE) ||
2644     ((U8)t[-1] == 0x85 && (U8)t[-2] == 0xCF))
2645 #endif
2646     *min -= 4;
2647   }
2648  }
2649
2650 #ifdef DEBUGGING
2651  /* Allow dumping but overwriting the collection of skipped
2652  * ops and/or strings with fake optimized ops */
2653  n = scan + NODE_SZ_STR(scan);
2654  while (n <= stop) {
2655   OP(n) = OPTIMIZED;
2656   FLAGS(n) = 0;
2657   NEXT_OFF(n) = 0;
2658   n++;
2659  }
2660 #endif
2661  DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl",scan,depth)});
2662  return stopnow;
2663 }
2664
2665 /* REx optimizer.  Converts nodes into quicker variants "in place".
2666    Finds fixed substrings.  */
2667
2668 /* Stops at toplevel WHILEM as well as at "last". At end *scanp is set
2669    to the position after last scanned or to NULL. */
2670
2671 #define INIT_AND_WITHP \
2672  assert(!and_withp); \
2673  Newx(and_withp,1,struct regnode_charclass_class); \
2674  SAVEFREEPV(and_withp)
2675
2676 /* this is a chain of data about sub patterns we are processing that
2677    need to be handled separately/specially in study_chunk. Its so
2678    we can simulate recursion without losing state.  */
2679 struct scan_frame;
2680 typedef struct scan_frame {
2681  regnode *last;  /* last node to process in this frame */
2682  regnode *next;  /* next node to process when last is reached */
2683  struct scan_frame *prev; /*previous frame*/
2684  I32 stop; /* what stopparen do we use */
2685 } scan_frame;
2686
2687
2688 #define SCAN_COMMIT(s, data, m) scan_commit(s, data, m, is_inf)
2689
2690 #define CASE_SYNST_FNC(nAmE)                                       \
2691 case nAmE:                                                         \
2692  if (flags & SCF_DO_STCLASS_AND) {                              \
2693    for (value = 0; value < 256; value++)                  \
2694     if (!is_ ## nAmE ## _cp(value))                       \
2695      ANYOF_BITMAP_CLEAR(data->start_class, value);  \
2696  }                                                              \
2697  else {                                                         \
2698    for (value = 0; value < 256; value++)                  \
2699     if (is_ ## nAmE ## _cp(value))                        \
2700      ANYOF_BITMAP_SET(data->start_class, value);    \
2701  }                                                              \
2702  break;                                                         \
2703 case N ## nAmE:                                                    \
2704  if (flags & SCF_DO_STCLASS_AND) {                              \
2705    for (value = 0; value < 256; value++)                   \
2706     if (is_ ## nAmE ## _cp(value))                         \
2707      ANYOF_BITMAP_CLEAR(data->start_class, value);   \
2708  }                                                               \
2709  else {                                                          \
2710    for (value = 0; value < 256; value++)                   \
2711     if (!is_ ## nAmE ## _cp(value))                        \
2712      ANYOF_BITMAP_SET(data->start_class, value);     \
2713  }                                                               \
2714  break
2715
2716
2717
2718 STATIC I32
2719 S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
2720       I32 *minlenp, I32 *deltap,
2721       regnode *last,
2722       scan_data_t *data,
2723       I32 stopparen,
2724       U8* recursed,
2725       struct regnode_charclass_class *and_withp,
2726       U32 flags, U32 depth)
2727       /* scanp: Start here (read-write). */
2728       /* deltap: Write maxlen-minlen here. */
2729       /* last: Stop before this one. */
2730       /* data: string data about the pattern */
2731       /* stopparen: treat close N as END */
2732       /* recursed: which subroutines have we recursed into */
2733       /* and_withp: Valid if flags & SCF_DO_STCLASS_OR */
2734 {
2735  dVAR;
2736  I32 min = 0, pars = 0, code;
2737  regnode *scan = *scanp, *next;
2738  I32 delta = 0;
2739  int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
2740  int is_inf_internal = 0;  /* The studied chunk is infinite */
2741  I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
2742  scan_data_t data_fake;
2743  SV *re_trie_maxbuff = NULL;
2744  regnode *first_non_open = scan;
2745  I32 stopmin = I32_MAX;
2746  scan_frame *frame = NULL;
2747  GET_RE_DEBUG_FLAGS_DECL;
2748
2749  PERL_ARGS_ASSERT_STUDY_CHUNK;
2750
2751 #ifdef DEBUGGING
2752  StructCopy(&zero_scan_data, &data_fake, scan_data_t);
2753 #endif
2754
2755  if ( depth == 0 ) {
2756   while (first_non_open && OP(first_non_open) == OPEN)
2757    first_non_open=regnext(first_non_open);
2758  }
2759
2760
2761   fake_study_recurse:
2762  while ( scan && OP(scan) != END && scan < last ){
2763   /* Peephole optimizer: */
2764   DEBUG_STUDYDATA("Peep:", data,depth);
2765   DEBUG_PEEP("Peep",scan,depth);
2766   JOIN_EXACT(scan,&min,0);
2767
2768   /* Follow the next-chain of the current node and optimize
2769   away all the NOTHINGs from it.  */
2770   if (OP(scan) != CURLYX) {
2771    const int max = (reg_off_by_arg[OP(scan)]
2772      ? I32_MAX
2773      /* I32 may be smaller than U16 on CRAYs! */
2774      : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
2775    int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
2776    int noff;
2777    regnode *n = scan;
2778
2779    /* Skip NOTHING and LONGJMP. */
2780    while ((n = regnext(n))
2781     && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
2782      || ((OP(n) == LONGJMP) && (noff = ARG(n))))
2783     && off + noff < max)
2784     off += noff;
2785    if (reg_off_by_arg[OP(scan)])
2786     ARG(scan) = off;
2787    else
2788     NEXT_OFF(scan) = off;
2789   }
2790
2791
2792
2793   /* The principal pseudo-switch.  Cannot be a switch, since we
2794   look into several different things.  */
2795   if (OP(scan) == BRANCH || OP(scan) == BRANCHJ
2796     || OP(scan) == IFTHEN) {
2797    next = regnext(scan);
2798    code = OP(scan);
2799    /* demq: the op(next)==code check is to see if we have "branch-branch" AFAICT */
2800
2801    if (OP(next) == code || code == IFTHEN) {
2802     /* NOTE - There is similar code to this block below for handling
2803     TRIE nodes on a re-study.  If you change stuff here check there
2804     too. */
2805     I32 max1 = 0, min1 = I32_MAX, num = 0;
2806     struct regnode_charclass_class accum;
2807     regnode * const startbranch=scan;
2808
2809     if (flags & SCF_DO_SUBSTR)
2810      SCAN_COMMIT(pRExC_state, data, minlenp); /* Cannot merge strings after this. */
2811     if (flags & SCF_DO_STCLASS)
2812      cl_init_zero(pRExC_state, &accum);
2813
2814     while (OP(scan) == code) {
2815      I32 deltanext, minnext, f = 0, fake;
2816      struct regnode_charclass_class this_class;
2817
2818      num++;
2819      data_fake.flags = 0;
2820      if (data) {
2821       data_fake.whilem_c = data->whilem_c;
2822       data_fake.last_closep = data->last_closep;
2823      }
2824      else
2825       data_fake.last_closep = &fake;
2826
2827      data_fake.pos_delta = delta;
2828      next = regnext(scan);
2829      scan = NEXTOPER(scan);
2830      if (code != BRANCH)
2831       scan = NEXTOPER(scan);
2832      if (flags & SCF_DO_STCLASS) {
2833       cl_init(pRExC_state, &this_class);
2834       data_fake.start_class = &this_class;
2835       f = SCF_DO_STCLASS_AND;
2836      }
2837      if (flags & SCF_WHILEM_VISITED_POS)
2838       f |= SCF_WHILEM_VISITED_POS;
2839
2840      /* we suppose the run is continuous, last=next...*/
2841      minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext,
2842           next, &data_fake,
2843           stopparen, recursed, NULL, f,depth+1);
2844      if (min1 > minnext)
2845       min1 = minnext;
2846      if (max1 < minnext + deltanext)
2847       max1 = minnext + deltanext;
2848      if (deltanext == I32_MAX)
2849       is_inf = is_inf_internal = 1;
2850      scan = next;
2851      if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
2852       pars++;
2853      if (data_fake.flags & SCF_SEEN_ACCEPT) {
2854       if ( stopmin > minnext)
2855        stopmin = min + min1;
2856       flags &= ~SCF_DO_SUBSTR;
2857       if (data)
2858        data->flags |= SCF_SEEN_ACCEPT;
2859      }
2860      if (data) {
2861       if (data_fake.flags & SF_HAS_EVAL)
2862        data->flags |= SF_HAS_EVAL;
2863       data->whilem_c = data_fake.whilem_c;
2864      }
2865      if (flags & SCF_DO_STCLASS)
2866       cl_or(pRExC_state, &accum, &this_class);
2867     }
2868     if (code == IFTHEN && num < 2) /* Empty ELSE branch */
2869      min1 = 0;
2870     if (flags & SCF_DO_SUBSTR) {
2871      data->pos_min += min1;
2872      data->pos_delta += max1 - min1;
2873      if (max1 != min1 || is_inf)
2874       data->longest = &(data->longest_float);
2875     }
2876     min += min1;
2877     delta += max1 - min1;
2878     if (flags & SCF_DO_STCLASS_OR) {
2879      cl_or(pRExC_state, data->start_class, &accum);
2880      if (min1) {
2881       cl_and(data->start_class, and_withp);
2882       flags &= ~SCF_DO_STCLASS;
2883      }
2884     }
2885     else if (flags & SCF_DO_STCLASS_AND) {
2886      if (min1) {
2887       cl_and(data->start_class, &accum);
2888       flags &= ~SCF_DO_STCLASS;
2889      }
2890      else {
2891       /* Switch to OR mode: cache the old value of
2892       * data->start_class */
2893       INIT_AND_WITHP;
2894       StructCopy(data->start_class, and_withp,
2895         struct regnode_charclass_class);
2896       flags &= ~SCF_DO_STCLASS_AND;
2897       StructCopy(&accum, data->start_class,
2898         struct regnode_charclass_class);
2899       flags |= SCF_DO_STCLASS_OR;
2900       data->start_class->flags |= ANYOF_EOS;
2901      }
2902     }
2903
2904     if (PERL_ENABLE_TRIE_OPTIMISATION && OP( startbranch ) == BRANCH ) {
2905     /* demq.
2906
2907     Assuming this was/is a branch we are dealing with: 'scan' now
2908     points at the item that follows the branch sequence, whatever
2909     it is. We now start at the beginning of the sequence and look
2910     for subsequences of
2911
2912     BRANCH->EXACT=>x1
2913     BRANCH->EXACT=>x2
2914     tail
2915
2916     which would be constructed from a pattern like /A|LIST|OF|WORDS/
2917
2918     If we can find such a subsequence we need to turn the first
2919     element into a trie and then add the subsequent branch exact
2920     strings to the trie.
2921
2922     We have two cases
2923
2924      1. patterns where the whole set of branches can be converted.
2925
2926      2. patterns where only a subset can be converted.
2927
2928     In case 1 we can replace the whole set with a single regop
2929     for the trie. In case 2 we need to keep the start and end
2930     branches so
2931
2932      'BRANCH EXACT; BRANCH EXACT; BRANCH X'
2933      becomes BRANCH TRIE; BRANCH X;
2934
2935     There is an additional case, that being where there is a
2936     common prefix, which gets split out into an EXACT like node
2937     preceding the TRIE node.
2938
2939     If x(1..n)==tail then we can do a simple trie, if not we make
2940     a "jump" trie, such that when we match the appropriate word
2941     we "jump" to the appropriate tail node. Essentially we turn
2942     a nested if into a case structure of sorts.
2943
2944     */
2945
2946      int made=0;
2947      if (!re_trie_maxbuff) {
2948       re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
2949       if (!SvIOK(re_trie_maxbuff))
2950        sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
2951      }
2952      if ( SvIV(re_trie_maxbuff)>=0  ) {
2953       regnode *cur;
2954       regnode *first = (regnode *)NULL;
2955       regnode *last = (regnode *)NULL;
2956       regnode *tail = scan;
2957       U8 optype = 0;
2958       U32 count=0;
2959
2960 #ifdef DEBUGGING
2961       SV * const mysv = sv_newmortal();       /* for dumping */
2962 #endif
2963       /* var tail is used because there may be a TAIL
2964       regop in the way. Ie, the exacts will point to the
2965       thing following the TAIL, but the last branch will
2966       point at the TAIL. So we advance tail. If we
2967       have nested (?:) we may have to move through several
2968       tails.
2969       */
2970
2971       while ( OP( tail ) == TAIL ) {
2972        /* this is the TAIL generated by (?:) */
2973        tail = regnext( tail );
2974       }
2975
2976
2977       DEBUG_OPTIMISE_r({
2978        regprop(RExC_rx, mysv, tail );
2979        PerlIO_printf( Perl_debug_log, "%*s%s%s\n",
2980         (int)depth * 2 + 2, "",
2981         "Looking for TRIE'able sequences. Tail node is: ",
2982         SvPV_nolen_const( mysv )
2983        );
2984       });
2985
2986       /*
2987
2988       step through the branches, cur represents each
2989       branch, noper is the first thing to be matched
2990       as part of that branch and noper_next is the
2991       regnext() of that node. if noper is an EXACT
2992       and noper_next is the same as scan (our current
2993       position in the regex) then the EXACT branch is
2994       a possible optimization target. Once we have
2995       two or more consecutive such branches we can
2996       create a trie of the EXACT's contents and stich
2997       it in place. If the sequence represents all of
2998       the branches we eliminate the whole thing and
2999       replace it with a single TRIE. If it is a
3000       subsequence then we need to stitch it in. This
3001       means the first branch has to remain, and needs
3002       to be repointed at the item on the branch chain
3003       following the last branch optimized. This could
3004       be either a BRANCH, in which case the
3005       subsequence is internal, or it could be the
3006       item following the branch sequence in which
3007       case the subsequence is at the end.
3008
3009       */
3010
3011       /* dont use tail as the end marker for this traverse */
3012       for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) {
3013        regnode * const noper = NEXTOPER( cur );
3014 #if defined(DEBUGGING) || defined(NOJUMPTRIE)
3015        regnode * const noper_next = regnext( noper );
3016 #endif
3017
3018        DEBUG_OPTIMISE_r({
3019         regprop(RExC_rx, mysv, cur);
3020         PerlIO_printf( Perl_debug_log, "%*s- %s (%d)",
3021         (int)depth * 2 + 2,"", SvPV_nolen_const( mysv ), REG_NODE_NUM(cur) );
3022
3023         regprop(RExC_rx, mysv, noper);
3024         PerlIO_printf( Perl_debug_log, " -> %s",
3025          SvPV_nolen_const(mysv));
3026
3027         if ( noper_next ) {
3028         regprop(RExC_rx, mysv, noper_next );
3029         PerlIO_printf( Perl_debug_log,"\t=> %s\t",
3030          SvPV_nolen_const(mysv));
3031         }
3032         PerlIO_printf( Perl_debug_log, "(First==%d,Last==%d,Cur==%d)\n",
3033         REG_NODE_NUM(first), REG_NODE_NUM(last), REG_NODE_NUM(cur) );
3034        });
3035        if ( (((first && optype!=NOTHING) ? OP( noper ) == optype
3036           : PL_regkind[ OP( noper ) ] == EXACT )
3037         || OP(noper) == NOTHING )
3038 #ifdef NOJUMPTRIE
3039         && noper_next == tail
3040 #endif
3041         && count < U16_MAX)
3042        {
3043         count++;
3044         if ( !first || optype == NOTHING ) {
3045          if (!first) first = cur;
3046          optype = OP( noper );
3047         } else {
3048          last = cur;
3049         }
3050        } else {
3051 /*
3052  Currently the trie logic handles case insensitive matching properly only
3053  when the pattern is UTF-8 and the node is EXACTFU (thus forcing unicode
3054  semantics).
3055
3056  If/when this is fixed the following define can be swapped
3057  in below to fully enable trie logic.
3058
3059 #define TRIE_TYPE_IS_SAFE 1
3060
3061 */
3062 #define TRIE_TYPE_IS_SAFE ((UTF && optype == EXACTFU) || optype==EXACT)
3063
3064         if ( last && TRIE_TYPE_IS_SAFE ) {
3065          make_trie( pRExC_state,
3066            startbranch, first, cur, tail, count,
3067            optype, depth+1 );
3068         }
3069         if ( PL_regkind[ OP( noper ) ] == EXACT
3070 #ifdef NOJUMPTRIE
3071          && noper_next == tail
3072 #endif
3073         ){
3074          count = 1;
3075          first = cur;
3076          optype = OP( noper );
3077         } else {
3078          count = 0;
3079          first = NULL;
3080          optype = 0;
3081         }
3082         last = NULL;
3083        }
3084       }
3085       DEBUG_OPTIMISE_r({
3086        regprop(RExC_rx, mysv, cur);
3087        PerlIO_printf( Perl_debug_log,
3088        "%*s- %s (%d) <SCAN FINISHED>\n", (int)depth * 2 + 2,
3089        "", SvPV_nolen_const( mysv ),REG_NODE_NUM(cur));
3090
3091       });
3092
3093       if ( last && TRIE_TYPE_IS_SAFE ) {
3094        made= make_trie( pRExC_state, startbranch, first, scan, tail, count, optype, depth+1 );
3095 #ifdef TRIE_STUDY_OPT
3096        if ( ((made == MADE_EXACT_TRIE &&
3097         startbranch == first)
3098         || ( first_non_open == first )) &&
3099         depth==0 ) {
3100         flags |= SCF_TRIE_RESTUDY;
3101         if ( startbranch == first
3102          && scan == tail )
3103         {
3104          RExC_seen &=~REG_TOP_LEVEL_BRANCHES;
3105         }
3106        }
3107 #endif
3108       }
3109      }
3110
3111     } /* do trie */
3112
3113    }
3114    else if ( code == BRANCHJ ) {  /* single branch is optimized. */
3115     scan = NEXTOPER(NEXTOPER(scan));
3116    } else   /* single branch is optimized. */
3117     scan = NEXTOPER(scan);
3118    continue;
3119   } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB || OP(scan) == GOSTART) {
3120    scan_frame *newframe = NULL;
3121    I32 paren;
3122    regnode *start;
3123    regnode *end;
3124
3125    if (OP(scan) != SUSPEND) {
3126    /* set the pointer */
3127     if (OP(scan) == GOSUB) {
3128      paren = ARG(scan);
3129      RExC_recurse[ARG2L(scan)] = scan;
3130      start = RExC_open_parens[paren-1];
3131      end   = RExC_close_parens[paren-1];
3132     } else {
3133      paren = 0;
3134      start = RExC_rxi->program + 1;
3135      end   = RExC_opend;
3136     }
3137     if (!recursed) {
3138      Newxz(recursed, (((RExC_npar)>>3) +1), U8);
3139      SAVEFREEPV(recursed);
3140     }
3141     if (!PAREN_TEST(recursed,paren+1)) {
3142      PAREN_SET(recursed,paren+1);
3143      Newx(newframe,1,scan_frame);
3144     } else {
3145      if (flags & SCF_DO_SUBSTR) {
3146       SCAN_COMMIT(pRExC_state,data,minlenp);
3147       data->longest = &(data->longest_float);
3148      }
3149      is_inf = is_inf_internal = 1;
3150      if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
3151       cl_anything(pRExC_state, data->start_class);
3152      flags &= ~SCF_DO_STCLASS;
3153     }
3154    } else {
3155     Newx(newframe,1,scan_frame);
3156     paren = stopparen;
3157     start = scan+2;
3158     end = regnext(scan);
3159    }
3160    if (newframe) {
3161     assert(start);
3162     assert(end);
3163     SAVEFREEPV(newframe);
3164     newframe->next = regnext(scan);
3165     newframe->last = last;
3166     newframe->stop = stopparen;
3167     newframe->prev = frame;
3168
3169     frame = newframe;
3170     scan =  start;
3171     stopparen = paren;
3172     last = end;
3173
3174     continue;
3175    }
3176   }
3177   else if (OP(scan) == EXACT) {
3178    I32 l = STR_LEN(scan);
3179    UV uc;
3180    if (UTF) {
3181     const U8 * const s = (U8*)STRING(scan);
3182     l = utf8_length(s, s + l);
3183     uc = utf8_to_uvchr(s, NULL);
3184    } else {
3185     uc = *((U8*)STRING(scan));
3186    }
3187    min += l;
3188    if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
3189     /* The code below prefers earlier match for fixed
3190     offset, later match for variable offset.  */
3191     if (data->last_end == -1) { /* Update the start info. */
3192      data->last_start_min = data->pos_min;
3193      data->last_start_max = is_inf
3194       ? I32_MAX : data->pos_min + data->pos_delta;
3195     }
3196     sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
3197     if (UTF)
3198      SvUTF8_on(data->last_found);
3199     {
3200      SV * const sv = data->last_found;
3201      MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
3202       mg_find(sv, PERL_MAGIC_utf8) : NULL;
3203      if (mg && mg->mg_len >= 0)
3204       mg->mg_len += utf8_length((U8*)STRING(scan),
3205             (U8*)STRING(scan)+STR_LEN(scan));
3206     }
3207     data->last_end = data->pos_min + l;
3208     data->pos_min += l; /* As in the first entry. */
3209     data->flags &= ~SF_BEFORE_EOL;
3210    }
3211    if (flags & SCF_DO_STCLASS_AND) {
3212     /* Check whether it is compatible with what we know already! */
3213     int compat = 1;
3214
3215
3216     /* If compatible, we or it in below.  It is compatible if is
3217     * in the bitmp and either 1) its bit or its fold is set, or 2)
3218     * it's for a locale.  Even if there isn't unicode semantics
3219     * here, at runtime there may be because of matching against a
3220     * utf8 string, so accept a possible false positive for
3221     * latin1-range folds */
3222     if (uc >= 0x100 ||
3223      (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
3224      && !ANYOF_BITMAP_TEST(data->start_class, uc)
3225      && (!(data->start_class->flags & ANYOF_LOC_NONBITMAP_FOLD)
3226       || !ANYOF_BITMAP_TEST(data->start_class, PL_fold_latin1[uc])))
3227      )
3228     {
3229      compat = 0;
3230     }
3231     ANYOF_CLASS_ZERO(data->start_class);
3232     ANYOF_BITMAP_ZERO(data->start_class);
3233     if (compat)
3234      ANYOF_BITMAP_SET(data->start_class, uc);
3235     else if (uc >= 0x100) {
3236      int i;
3237
3238      /* Some Unicode code points fold to the Latin1 range; as
3239      * XXX temporary code, instead of figuring out if this is
3240      * one, just assume it is and set all the start class bits
3241      * that could be some such above 255 code point's fold
3242      * which will generate fals positives.  As the code
3243      * elsewhere that does compute the fold settles down, it
3244      * can be extracted out and re-used here */
3245      for (i = 0; i < 256; i++){
3246       if (_HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(i)) {
3247        ANYOF_BITMAP_SET(data->start_class, i);
3248       }
3249      }
3250     }
3251     data->start_class->flags &= ~ANYOF_EOS;
3252     if (uc < 0x100)
3253     data->start_class->flags &= ~ANYOF_UNICODE_ALL;
3254    }
3255    else if (flags & SCF_DO_STCLASS_OR) {
3256     /* false positive possible if the class is case-folded */
3257     if (uc < 0x100)
3258      ANYOF_BITMAP_SET(data->start_class, uc);
3259     else
3260      data->start_class->flags |= ANYOF_UNICODE_ALL;
3261     data->start_class->flags &= ~ANYOF_EOS;
3262     cl_and(data->start_class, and_withp);
3263    }
3264    flags &= ~SCF_DO_STCLASS;
3265   }
3266   else if (PL_regkind[OP(scan)] == EXACT) { /* But OP != EXACT! */
3267    I32 l = STR_LEN(scan);
3268    UV uc = *((U8*)STRING(scan));
3269
3270    /* Search for fixed substrings supports EXACT only. */
3271    if (flags & SCF_DO_SUBSTR) {
3272     assert(data);
3273     SCAN_COMMIT(pRExC_state, data, minlenp);
3274    }
3275    if (UTF) {
3276     const U8 * const s = (U8 *)STRING(scan);
3277     l = utf8_length(s, s + l);
3278     uc = utf8_to_uvchr(s, NULL);
3279    }
3280    min += l;
3281    if (flags & SCF_DO_SUBSTR)
3282     data->pos_min += l;
3283    if (flags & SCF_DO_STCLASS_AND) {
3284     /* Check whether it is compatible with what we know already! */
3285     int compat = 1;
3286     if (uc >= 0x100 ||
3287     (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
3288     && !ANYOF_BITMAP_TEST(data->start_class, uc)
3289     && !ANYOF_BITMAP_TEST(data->start_class, PL_fold_latin1[uc])))
3290     {
3291      compat = 0;
3292     }
3293     ANYOF_CLASS_ZERO(data->start_class);
3294     ANYOF_BITMAP_ZERO(data->start_class);
3295     if (compat) {
3296      ANYOF_BITMAP_SET(data->start_class, uc);
3297      data->start_class->flags &= ~ANYOF_EOS;
3298      data->start_class->flags |= ANYOF_LOC_NONBITMAP_FOLD;
3299      if (OP(scan) == EXACTFL) {
3300       /* XXX This set is probably no longer necessary, and
3301       * probably wrong as LOCALE now is on in the initial
3302       * state */
3303       data->start_class->flags |= ANYOF_LOCALE;
3304      }
3305      else {
3306
3307       /* Also set the other member of the fold pair.  In case
3308       * that unicode semantics is called for at runtime, use
3309       * the full latin1 fold.  (Can't do this for locale,
3310       * because not known until runtime */
3311       ANYOF_BITMAP_SET(data->start_class, PL_fold_latin1[uc]);
3312      }
3313     }
3314     else if (uc >= 0x100) {
3315      int i;
3316      for (i = 0; i < 256; i++){
3317       if (_HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(i)) {
3318        ANYOF_BITMAP_SET(data->start_class, i);
3319       }
3320      }
3321     }
3322    }
3323    else if (flags & SCF_DO_STCLASS_OR) {
3324     if (data->start_class->flags & ANYOF_LOC_NONBITMAP_FOLD) {
3325      /* false positive possible if the class is case-folded.
3326      Assume that the locale settings are the same... */
3327      if (uc < 0x100) {
3328       ANYOF_BITMAP_SET(data->start_class, uc);
3329       if (OP(scan) != EXACTFL) {
3330
3331        /* And set the other member of the fold pair, but
3332        * can't do that in locale because not known until
3333        * run-time */
3334        ANYOF_BITMAP_SET(data->start_class,
3335            PL_fold_latin1[uc]);
3336       }
3337      }
3338      data->start_class->flags &= ~ANYOF_EOS;
3339     }
3340     cl_and(data->start_class, and_withp);
3341    }
3342    flags &= ~SCF_DO_STCLASS;
3343   }
3344   else if (REGNODE_VARIES(OP(scan))) {
3345    I32 mincount, maxcount, minnext, deltanext, fl = 0;
3346    I32 f = flags, pos_before = 0;
3347    regnode * const oscan = scan;
3348    struct regnode_charclass_class this_class;
3349    struct regnode_charclass_class *oclass = NULL;
3350    I32 next_is_eval = 0;
3351
3352    switch (PL_regkind[OP(scan)]) {
3353    case WHILEM:  /* End of (?:...)* . */
3354     scan = NEXTOPER(scan);
3355     goto finish;
3356    case PLUS:
3357     if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
3358      next = NEXTOPER(scan);
3359      if (OP(next) == EXACT || (flags & SCF_DO_STCLASS)) {
3360       mincount = 1;
3361       maxcount = REG_INFTY;
3362       next = regnext(scan);
3363       scan = NEXTOPER(scan);
3364       goto do_curly;
3365      }
3366     }
3367     if (flags & SCF_DO_SUBSTR)
3368      data->pos_min++;
3369     min++;
3370     /* Fall through. */
3371    case STAR:
3372     if (flags & SCF_DO_STCLASS) {
3373      mincount = 0;
3374      maxcount = REG_INFTY;
3375      next = regnext(scan);
3376      scan = NEXTOPER(scan);
3377      goto do_curly;
3378     }
3379     is_inf = is_inf_internal = 1;
3380     scan = regnext(scan);
3381     if (flags & SCF_DO_SUBSTR) {
3382      SCAN_COMMIT(pRExC_state, data, minlenp); /* Cannot extend fixed substrings */
3383      data->longest = &(data->longest_float);
3384     }
3385     goto optimize_curly_tail;
3386    case CURLY:
3387     if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM)
3388      && (scan->flags == stopparen))
3389     {
3390      mincount = 1;
3391      maxcount = 1;
3392     } else {
3393      mincount = ARG1(scan);
3394      maxcount = ARG2(scan);
3395     }
3396     next = regnext(scan);
3397     if (OP(scan) == CURLYX) {
3398      I32 lp = (data ? *(data->last_closep) : 0);
3399      scan->flags = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX);
3400     }
3401     scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
3402     next_is_eval = (OP(scan) == EVAL);
3403    do_curly:
3404     if (flags & SCF_DO_SUBSTR) {
3405      if (mincount == 0) SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot extend fixed substrings */
3406      pos_before = data->pos_min;
3407     }
3408     if (data) {
3409      fl = data->flags;
3410      data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
3411      if (is_inf)
3412       data->flags |= SF_IS_INF;
3413     }
3414     if (flags & SCF_DO_STCLASS) {
3415      cl_init(pRExC_state, &this_class);
3416      oclass = data->start_class;
3417      data->start_class = &this_class;
3418      f |= SCF_DO_STCLASS_AND;
3419      f &= ~SCF_DO_STCLASS_OR;
3420     }
3421     /* Exclude from super-linear cache processing any {n,m}
3422     regops for which the combination of input pos and regex
3423     pos is not enough information to determine if a match
3424     will be possible.
3425
3426     For example, in the regex /foo(bar\s*){4,8}baz/ with the
3427     regex pos at the \s*, the prospects for a match depend not
3428     only on the input position but also on how many (bar\s*)
3429     repeats into the {4,8} we are. */
3430    if ((mincount > 1) || (maxcount > 1 && maxcount != REG_INFTY))
3431      f &= ~SCF_WHILEM_VISITED_POS;
3432
3433     /* This will finish on WHILEM, setting scan, or on NULL: */
3434     minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext,
3435          last, data, stopparen, recursed, NULL,
3436          (mincount == 0
3437           ? (f & ~SCF_DO_SUBSTR) : f),depth+1);
3438
3439     if (flags & SCF_DO_STCLASS)
3440      data->start_class = oclass;
3441     if (mincount == 0 || minnext == 0) {
3442      if (flags & SCF_DO_STCLASS_OR) {
3443       cl_or(pRExC_state, data->start_class, &this_class);
3444      }
3445      else if (flags & SCF_DO_STCLASS_AND) {
3446       /* Switch to OR mode: cache the old value of
3447       * data->start_class */
3448       INIT_AND_WITHP;
3449       StructCopy(data->start_class, and_withp,
3450         struct regnode_charclass_class);
3451       flags &= ~SCF_DO_STCLASS_AND;
3452       StructCopy(&this_class, data->start_class,
3453         struct regnode_charclass_class);
3454       flags |= SCF_DO_STCLASS_OR;
3455       data->start_class->flags |= ANYOF_EOS;
3456      }
3457     } else {  /* Non-zero len */
3458      if (flags & SCF_DO_STCLASS_OR) {
3459       cl_or(pRExC_state, data->start_class, &this_class);
3460       cl_and(data->start_class, and_withp);
3461      }
3462      else if (flags & SCF_DO_STCLASS_AND)
3463       cl_and(data->start_class, &this_class);
3464      flags &= ~SCF_DO_STCLASS;
3465     }
3466     if (!scan)   /* It was not CURLYX, but CURLY. */
3467      scan = next;
3468     if ( /* ? quantifier ok, except for (?{ ... }) */
3469      (next_is_eval || !(mincount == 0 && maxcount == 1))
3470      && (minnext == 0) && (deltanext == 0)
3471      && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
3472      && maxcount <= REG_INFTY/3) /* Complement check for big count */
3473     {
3474      ckWARNreg(RExC_parse,
3475        "Quantifier unexpected on zero-length expression");
3476     }
3477
3478     min += minnext * mincount;
3479     is_inf_internal |= ((maxcount == REG_INFTY
3480          && (minnext + deltanext) > 0)
3481          || deltanext == I32_MAX);
3482     is_inf |= is_inf_internal;
3483     delta += (minnext + deltanext) * maxcount - minnext * mincount;
3484
3485     /* Try powerful optimization CURLYX => CURLYN. */
3486     if (  OP(oscan) == CURLYX && data
3487      && data->flags & SF_IN_PAR
3488      && !(data->flags & SF_HAS_EVAL)
3489      && !deltanext && minnext == 1 ) {
3490      /* Try to optimize to CURLYN.  */
3491      regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
3492      regnode * const nxt1 = nxt;
3493 #ifdef DEBUGGING
3494      regnode *nxt2;
3495 #endif
3496
3497      /* Skip open. */
3498      nxt = regnext(nxt);
3499      if (!REGNODE_SIMPLE(OP(nxt))
3500       && !(PL_regkind[OP(nxt)] == EXACT
3501        && STR_LEN(nxt) == 1))
3502       goto nogo;
3503 #ifdef DEBUGGING
3504      nxt2 = nxt;
3505 #endif
3506      nxt = regnext(nxt);
3507      if (OP(nxt) != CLOSE)
3508       goto nogo;
3509      if (RExC_open_parens) {
3510       RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
3511       RExC_close_parens[ARG(nxt1)-1]=nxt+2; /*close->while*/
3512      }
3513      /* Now we know that nxt2 is the only contents: */
3514      oscan->flags = (U8)ARG(nxt);
3515      OP(oscan) = CURLYN;
3516      OP(nxt1) = NOTHING; /* was OPEN. */
3517
3518 #ifdef DEBUGGING
3519      OP(nxt1 + 1) = OPTIMIZED; /* was count. */
3520      NEXT_OFF(nxt1+ 1) = 0; /* just for consistency. */
3521      NEXT_OFF(nxt2) = 0; /* just for consistency with CURLY. */
3522      OP(nxt) = OPTIMIZED; /* was CLOSE. */
3523      OP(nxt + 1) = OPTIMIZED; /* was count. */
3524      NEXT_OFF(nxt+ 1) = 0; /* just for consistency. */
3525 #endif
3526     }
3527    nogo:
3528
3529     /* Try optimization CURLYX => CURLYM. */
3530     if (  OP(oscan) == CURLYX && data
3531      && !(data->flags & SF_HAS_PAR)
3532      && !(data->flags & SF_HAS_EVAL)
3533      && !deltanext /* atom is fixed width */
3534      && minnext != 0 /* CURLYM can't handle zero width */
3535     ) {
3536      /* XXXX How to optimize if data == 0? */
3537      /* Optimize to a simpler form.  */
3538      regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
3539      regnode *nxt2;
3540
3541      OP(oscan) = CURLYM;
3542      while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
3543        && (OP(nxt2) != WHILEM))
3544       nxt = nxt2;
3545      OP(nxt2)  = SUCCEED; /* Whas WHILEM */
3546      /* Need to optimize away parenths. */
3547      if ((data->flags & SF_IN_PAR) && OP(nxt) == CLOSE) {
3548       /* Set the parenth number.  */
3549       regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
3550
3551       oscan->flags = (U8)ARG(nxt);
3552       if (RExC_open_parens) {
3553        RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
3554        RExC_close_parens[ARG(nxt1)-1]=nxt2+1; /*close->NOTHING*/
3555       }
3556       OP(nxt1) = OPTIMIZED; /* was OPEN. */
3557       OP(nxt) = OPTIMIZED; /* was CLOSE. */
3558
3559 #ifdef DEBUGGING
3560       OP(nxt1 + 1) = OPTIMIZED; /* was count. */
3561       OP(nxt + 1) = OPTIMIZED; /* was count. */
3562       NEXT_OFF(nxt1 + 1) = 0; /* just for consistency. */
3563       NEXT_OFF(nxt + 1) = 0; /* just for consistency. */
3564 #endif
3565 #if 0
3566       while ( nxt1 && (OP(nxt1) != WHILEM)) {
3567        regnode *nnxt = regnext(nxt1);
3568        if (nnxt == nxt) {
3569         if (reg_off_by_arg[OP(nxt1)])
3570          ARG_SET(nxt1, nxt2 - nxt1);
3571         else if (nxt2 - nxt1 < U16_MAX)
3572          NEXT_OFF(nxt1) = nxt2 - nxt1;
3573         else
3574          OP(nxt) = NOTHING; /* Cannot beautify */
3575        }
3576        nxt1 = nnxt;
3577       }
3578 #endif
3579       /* Optimize again: */
3580       study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
3581          NULL, stopparen, recursed, NULL, 0,depth+1);
3582      }
3583      else
3584       oscan->flags = 0;
3585     }
3586     else if ((OP(oscan) == CURLYX)
3587       && (flags & SCF_WHILEM_VISITED_POS)
3588       /* See the comment on a similar expression above.
3589        However, this time it's not a subexpression
3590        we care about, but the expression itself. */
3591       && (maxcount == REG_INFTY)
3592       && data && ++data->whilem_c < 16) {
3593      /* This stays as CURLYX, we can put the count/of pair. */
3594      /* Find WHILEM (as in regexec.c) */
3595      regnode *nxt = oscan + NEXT_OFF(oscan);
3596
3597      if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
3598       nxt += ARG(nxt);
3599      PREVOPER(nxt)->flags = (U8)(data->whilem_c
3600       | (RExC_whilem_seen << 4)); /* On WHILEM */
3601     }
3602     if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
3603      pars++;
3604     if (flags & SCF_DO_SUBSTR) {
3605      SV *last_str = NULL;
3606      int counted = mincount != 0;
3607
3608      if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
3609 #if defined(SPARC64_GCC_WORKAROUND)
3610       I32 b = 0;
3611       STRLEN l = 0;
3612       const char *s = NULL;
3613       I32 old = 0;
3614
3615       if (pos_before >= data->last_start_min)
3616        b = pos_before;
3617       else
3618        b = data->last_start_min;
3619
3620       l = 0;
3621       s = SvPV_const(data->last_found, l);
3622       old = b - data->last_start_min;
3623
3624 #else
3625       I32 b = pos_before >= data->last_start_min
3626        ? pos_before : data->last_start_min;
3627       STRLEN l;
3628       const char * const s = SvPV_const(data->last_found, l);
3629       I32 old = b - data->last_start_min;
3630 #endif
3631
3632       if (UTF)
3633        old = utf8_hop((U8*)s, old) - (U8*)s;
3634       l -= old;
3635       /* Get the added string: */
3636       last_str = newSVpvn_utf8(s  + old, l, UTF);
3637       if (deltanext == 0 && pos_before == b) {
3638        /* What was added is a constant string */
3639        if (mincount > 1) {
3640         SvGROW(last_str, (mincount * l) + 1);
3641         repeatcpy(SvPVX(last_str) + l,
3642           SvPVX_const(last_str), l, mincount - 1);
3643         SvCUR_set(last_str, SvCUR(last_str) * mincount);
3644         /* Add additional parts. */
3645         SvCUR_set(data->last_found,
3646           SvCUR(data->last_found) - l);
3647         sv_catsv(data->last_found, last_str);
3648         {
3649          SV * sv = data->last_found;
3650          MAGIC *mg =
3651           SvUTF8(sv) && SvMAGICAL(sv) ?
3652           mg_find(sv, PERL_MAGIC_utf8) : NULL;
3653          if (mg && mg->mg_len >= 0)
3654           mg->mg_len += CHR_SVLEN(last_str) - l;
3655         }
3656         data->last_end += l * (mincount - 1);
3657        }
3658       } else {
3659        /* start offset must point into the last copy */
3660        data->last_start_min += minnext * (mincount - 1);
3661        data->last_start_max += is_inf ? I32_MAX
3662         : (maxcount - 1) * (minnext + data->pos_delta);
3663       }
3664      }
3665      /* It is counted once already... */
3666      data->pos_min += minnext * (mincount - counted);
3667      data->pos_delta += - counted * deltanext +
3668       (minnext + deltanext) * maxcount - minnext * mincount;
3669      if (mincount != maxcount) {
3670       /* Cannot extend fixed substrings found inside
3671        the group.  */
3672       SCAN_COMMIT(pRExC_state,data,minlenp);
3673       if (mincount && last_str) {
3674        SV * const sv = data->last_found;
3675        MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
3676         mg_find(sv, PERL_MAGIC_utf8) : NULL;
3677
3678        if (mg)
3679         mg->mg_len = -1;
3680        sv_setsv(sv, last_str);
3681        data->last_end = data->pos_min;
3682        data->last_start_min =
3683         data->pos_min - CHR_SVLEN(last_str);
3684        data->last_start_max = is_inf
3685         ? I32_MAX
3686         : data->pos_min + data->pos_delta
3687         - CHR_SVLEN(last_str);
3688       }
3689       data->longest = &(data->longest_float);
3690      }
3691      SvREFCNT_dec(last_str);
3692     }
3693     if (data && (fl & SF_HAS_EVAL))
3694      data->flags |= SF_HAS_EVAL;
3695    optimize_curly_tail:
3696     if (OP(oscan) != CURLYX) {
3697      while (PL_regkind[OP(next = regnext(oscan))] == NOTHING
3698       && NEXT_OFF(next))
3699       NEXT_OFF(oscan) += NEXT_OFF(next);
3700     }
3701     continue;
3702    default:   /* REF, ANYOFV, and CLUMP only? */
3703     if (flags & SCF_DO_SUBSTR) {
3704      SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot expect anything... */
3705      data->longest = &(data->longest_float);
3706     }
3707     is_inf = is_inf_internal = 1;
3708     if (flags & SCF_DO_STCLASS_OR)
3709      cl_anything(pRExC_state, data->start_class);
3710     flags &= ~SCF_DO_STCLASS;
3711     break;
3712    }
3713   }
3714   else if (OP(scan) == LNBREAK) {
3715    if (flags & SCF_DO_STCLASS) {
3716     int value = 0;
3717     data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
3718      if (flags & SCF_DO_STCLASS_AND) {
3719      for (value = 0; value < 256; value++)
3720       if (!is_VERTWS_cp(value))
3721        ANYOF_BITMAP_CLEAR(data->start_class, value);
3722     }
3723     else {
3724      for (value = 0; value < 256; value++)
3725       if (is_VERTWS_cp(value))
3726        ANYOF_BITMAP_SET(data->start_class, value);
3727     }
3728     if (flags & SCF_DO_STCLASS_OR)
3729      cl_and(data->start_class, and_withp);
3730     flags &= ~SCF_DO_STCLASS;
3731    }
3732    min += 1;
3733    delta += 1;
3734    if (flags & SCF_DO_SUBSTR) {
3735      SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot expect anything... */
3736      data->pos_min += 1;
3737     data->pos_delta += 1;
3738     data->longest = &(data->longest_float);
3739     }
3740   }
3741   else if (OP(scan) == FOLDCHAR) {
3742    int d = ARG(scan) == LATIN_SMALL_LETTER_SHARP_S ? 1 : 2;
3743    flags &= ~SCF_DO_STCLASS;
3744    min += 1;
3745    delta += d;
3746    if (flags & SCF_DO_SUBSTR) {
3747     SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot expect anything... */
3748     data->pos_min += 1;
3749     data->pos_delta += d;
3750     data->longest = &(data->longest_float);
3751    }
3752   }
3753   else if (REGNODE_SIMPLE(OP(scan))) {
3754    int value = 0;
3755
3756    if (flags & SCF_DO_SUBSTR) {
3757     SCAN_COMMIT(pRExC_state,data,minlenp);
3758     data->pos_min++;
3759    }
3760    min++;
3761    if (flags & SCF_DO_STCLASS) {
3762     data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
3763
3764     /* Some of the logic below assumes that switching
3765     locale on will only add false positives. */
3766     switch (PL_regkind[OP(scan)]) {
3767     case SANY:
3768     default:
3769     do_default:
3770      /* Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", OP(scan)); */
3771      if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
3772       cl_anything(pRExC_state, data->start_class);
3773      break;
3774     case REG_ANY:
3775      if (OP(scan) == SANY)
3776       goto do_default;
3777      if (flags & SCF_DO_STCLASS_OR) { /* Everything but \n */
3778       value = (ANYOF_BITMAP_TEST(data->start_class,'\n')
3779         || ANYOF_CLASS_TEST_ANY_SET(data->start_class));
3780       cl_anything(pRExC_state, data->start_class);
3781      }
3782      if (flags & SCF_DO_STCLASS_AND || !value)
3783       ANYOF_BITMAP_CLEAR(data->start_class,'\n');
3784      break;
3785     case ANYOF:
3786      if (flags & SCF_DO_STCLASS_AND)
3787       cl_and(data->start_class,
3788        (struct regnode_charclass_class*)scan);
3789      else
3790       cl_or(pRExC_state, data->start_class,
3791        (struct regnode_charclass_class*)scan);
3792      break;
3793     case ALNUM:
3794      if (flags & SCF_DO_STCLASS_AND) {
3795       if (!(data->start_class->flags & ANYOF_LOCALE)) {
3796        ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
3797        if (OP(scan) == ALNUMU) {
3798         for (value = 0; value < 256; value++) {
3799          if (!isWORDCHAR_L1(value)) {
3800           ANYOF_BITMAP_CLEAR(data->start_class, value);
3801          }
3802         }
3803        } else {
3804         for (value = 0; value < 256; value++) {
3805          if (!isALNUM(value)) {
3806           ANYOF_BITMAP_CLEAR(data->start_class, value);
3807          }
3808         }
3809        }
3810       }
3811      }
3812      else {
3813       if (data->start_class->flags & ANYOF_LOCALE)
3814        ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
3815
3816       /* Even if under locale, set the bits for non-locale
3817       * in case it isn't a true locale-node.  This will
3818       * create false positives if it truly is locale */
3819       if (OP(scan) == ALNUMU) {
3820        for (value = 0; value < 256; value++) {
3821         if (isWORDCHAR_L1(value)) {
3822          ANYOF_BITMAP_SET(data->start_class, value);
3823         }
3824        }
3825       } else {
3826        for (value = 0; value < 256; value++) {
3827         if (isALNUM(value)) {
3828          ANYOF_BITMAP_SET(data->start_class, value);
3829         }
3830        }
3831       }
3832      }
3833      break;
3834     case NALNUM:
3835      if (flags & SCF_DO_STCLASS_AND) {
3836       if (!(data->start_class->flags & ANYOF_LOCALE)) {
3837        ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
3838        if (OP(scan) == NALNUMU) {
3839         for (value = 0; value < 256; value++) {
3840          if (isWORDCHAR_L1(value)) {
3841           ANYOF_BITMAP_CLEAR(data->start_class, value);
3842          }
3843         }
3844        } else {
3845         for (value = 0; value < 256; value++) {
3846          if (isALNUM(value)) {
3847           ANYOF_BITMAP_CLEAR(data->start_class, value);
3848          }
3849         }
3850        }
3851       }
3852      }
3853      else {
3854       if (data->start_class->flags & ANYOF_LOCALE)
3855        ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
3856
3857       /* Even if under locale, set the bits for non-locale in
3858       * case it isn't a true locale-node.  This will create
3859       * false positives if it truly is locale */
3860       if (OP(scan) == NALNUMU) {
3861        for (value = 0; value < 256; value++) {
3862         if (! isWORDCHAR_L1(value)) {
3863          ANYOF_BITMAP_SET(data->start_class, value);
3864         }
3865        }
3866       } else {
3867        for (value = 0; value < 256; value++) {
3868         if (! isALNUM(value)) {
3869          ANYOF_BITMAP_SET(data->start_class, value);
3870         }
3871        }
3872       }
3873      }
3874      break;
3875     case SPACE:
3876      if (flags & SCF_DO_STCLASS_AND) {
3877       if (!(data->start_class->flags & ANYOF_LOCALE)) {
3878        ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
3879        if (OP(scan) == SPACEU) {
3880         for (value = 0; value < 256; value++) {
3881          if (!isSPACE_L1(value)) {
3882           ANYOF_BITMAP_CLEAR(data->start_class, value);
3883          }
3884         }
3885        } else {
3886         for (value = 0; value < 256; value++) {
3887          if (!isSPACE(value)) {
3888           ANYOF_BITMAP_CLEAR(data->start_class, value);
3889          }
3890         }
3891        }
3892       }
3893      }
3894      else {
3895       if (data->start_class->flags & ANYOF_LOCALE) {
3896        ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
3897       }
3898       if (OP(scan) == SPACEU) {
3899        for (value = 0; value < 256; value++) {
3900         if (isSPACE_L1(value)) {
3901          ANYOF_BITMAP_SET(data->start_class, value);
3902         }
3903        }
3904       } else {
3905        for (value = 0; value < 256; value++) {
3906         if (isSPACE(value)) {
3907          ANYOF_BITMAP_SET(data->start_class, value);
3908         }
3909        }
3910       }
3911      }
3912      break;
3913     case NSPACE:
3914      if (flags & SCF_DO_STCLASS_AND) {
3915       if (!(data->start_class->flags & ANYOF_LOCALE)) {
3916        ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
3917        if (OP(scan) == NSPACEU) {
3918         for (value = 0; value < 256; value++) {
3919          if (isSPACE_L1(value)) {
3920           ANYOF_BITMAP_CLEAR(data->start_class, value);
3921          }
3922         }
3923        } else {
3924         for (value = 0; value < 256; value++) {
3925          if (isSPACE(value)) {
3926           ANYOF_BITMAP_CLEAR(data->start_class, value);
3927          }
3928         }
3929        }
3930       }
3931      }
3932      else {
3933       if (data->start_class->flags & ANYOF_LOCALE)
3934        ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
3935       if (OP(scan) == NSPACEU) {
3936        for (value = 0; value < 256; value++) {
3937         if (!isSPACE_L1(value)) {
3938          ANYOF_BITMAP_SET(data->start_class, value);
3939         }
3940        }
3941       }
3942       else {
3943        for (value = 0; value < 256; value++) {
3944         if (!isSPACE(value)) {
3945          ANYOF_BITMAP_SET(data->start_class, value);
3946         }
3947        }
3948       }
3949      }
3950      break;
3951     case DIGIT:
3952      if (flags & SCF_DO_STCLASS_AND) {
3953       if (!(data->start_class->flags & ANYOF_LOCALE)) {
3954        ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NDIGIT);
3955        for (value = 0; value < 256; value++)
3956         if (!isDIGIT(value))
3957          ANYOF_BITMAP_CLEAR(data->start_class, value);
3958       }
3959      }
3960      else {
3961       if (data->start_class->flags & ANYOF_LOCALE)
3962        ANYOF_CLASS_SET(data->start_class,ANYOF_DIGIT);
3963       for (value = 0; value < 256; value++)
3964        if (isDIGIT(value))
3965         ANYOF_BITMAP_SET(data->start_class, value);
3966      }
3967      break;
3968     case NDIGIT:
3969      if (flags & SCF_DO_STCLASS_AND) {
3970       if (!(data->start_class->flags & ANYOF_LOCALE))
3971        ANYOF_CLASS_CLEAR(data->start_class,ANYOF_DIGIT);
3972       for (value = 0; value < 256; value++)
3973        if (isDIGIT(value))
3974         ANYOF_BITMAP_CLEAR(data->start_class, value);
3975      }
3976      else {
3977       if (data->start_class->flags & ANYOF_LOCALE)
3978        ANYOF_CLASS_SET(data->start_class,ANYOF_NDIGIT);
3979       for (value = 0; value < 256; value++)
3980        if (!isDIGIT(value))
3981         ANYOF_BITMAP_SET(data->start_class, value);
3982      }
3983      break;
3984     CASE_SYNST_FNC(VERTWS);
3985     CASE_SYNST_FNC(HORIZWS);
3986
3987     }
3988     if (flags & SCF_DO_STCLASS_OR)
3989      cl_and(data->start_class, and_withp);
3990     flags &= ~SCF_DO_STCLASS;
3991    }
3992   }
3993   else if (PL_regkind[OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
3994    data->flags |= (OP(scan) == MEOL
3995        ? SF_BEFORE_MEOL
3996        : SF_BEFORE_SEOL);
3997   }
3998   else if (  PL_regkind[OP(scan)] == BRANCHJ
3999     /* Lookbehind, or need to calculate parens/evals/stclass: */
4000     && (scan->flags || data || (flags & SCF_DO_STCLASS))
4001     && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
4002    if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY
4003     || OP(scan) == UNLESSM )
4004    {
4005     /* Negative Lookahead/lookbehind
4006     In this case we can't do fixed string optimisation.
4007     */
4008
4009     I32 deltanext, minnext, fake = 0;
4010     regnode *nscan;
4011     struct regnode_charclass_class intrnl;
4012     int f = 0;
4013
4014     data_fake.flags = 0;
4015     if (data) {
4016      data_fake.whilem_c = data->whilem_c;
4017      data_fake.last_closep = data->last_closep;
4018     }
4019     else
4020      data_fake.last_closep = &fake;
4021     data_fake.pos_delta = delta;
4022     if ( flags & SCF_DO_STCLASS && !scan->flags
4023      && OP(scan) == IFMATCH ) { /* Lookahead */
4024      cl_init(pRExC_state, &intrnl);
4025      data_fake.start_class = &intrnl;
4026      f |= SCF_DO_STCLASS_AND;
4027     }
4028     if (flags & SCF_WHILEM_VISITED_POS)
4029      f |= SCF_WHILEM_VISITED_POS;
4030     next = regnext(scan);
4031     nscan = NEXTOPER(NEXTOPER(scan));
4032     minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext,
4033      last, &data_fake, stopparen, recursed, NULL, f, depth+1);
4034     if (scan->flags) {
4035      if (deltanext) {
4036       FAIL("Variable length lookbehind not implemented");
4037      }
4038      else if (minnext > (I32)U8_MAX) {
4039       FAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
4040      }
4041      scan->flags = (U8)minnext;
4042     }
4043     if (data) {
4044      if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
4045       pars++;
4046      if (data_fake.flags & SF_HAS_EVAL)
4047       data->flags |= SF_HAS_EVAL;
4048      data->whilem_c = data_fake.whilem_c;
4049     }
4050     if (f & SCF_DO_STCLASS_AND) {
4051      if (flags & SCF_DO_STCLASS_OR) {
4052       /* OR before, AND after: ideally we would recurse with
4053       * data_fake to get the AND applied by study of the
4054       * remainder of the pattern, and then derecurse;
4055       * *** HACK *** for now just treat as "no information".
4056       * See [perl #56690].
4057       */
4058       cl_init(pRExC_state, data->start_class);
4059      }  else {
4060       /* AND before and after: combine and continue */
4061       const int was = (data->start_class->flags & ANYOF_EOS);
4062
4063       cl_and(data->start_class, &intrnl);
4064       if (was)
4065        data->start_class->flags |= ANYOF_EOS;
4066      }
4067     }
4068    }
4069 #if PERL_ENABLE_POSITIVE_ASSERTION_STUDY
4070    else {
4071     /* Positive Lookahead/lookbehind
4072     In this case we can do fixed string optimisation,
4073     but we must be careful about it. Note in the case of
4074     lookbehind the positions will be offset by the minimum
4075     length of the pattern, something we won't know about
4076     until after the recurse.
4077     */
4078     I32 deltanext, fake = 0;
4079     regnode *nscan;
4080     struct regnode_charclass_class intrnl;
4081     int f = 0;
4082     /* We use SAVEFREEPV so that when the full compile
4083      is finished perl will clean up the allocated
4084      minlens when it's all done. This way we don't
4085      have to worry about freeing them when we know
4086      they wont be used, which would be a pain.
4087     */
4088     I32 *minnextp;
4089     Newx( minnextp, 1, I32 );
4090     SAVEFREEPV(minnextp);
4091
4092     if (data) {
4093      StructCopy(data, &data_fake, scan_data_t);
4094      if ((flags & SCF_DO_SUBSTR) && data->last_found) {
4095       f |= SCF_DO_SUBSTR;
4096       if (scan->flags)
4097        SCAN_COMMIT(pRExC_state, &data_fake,minlenp);
4098       data_fake.last_found=newSVsv(data->last_found);
4099      }
4100     }
4101     else
4102      data_fake.last_closep = &fake;
4103     data_fake.flags = 0;
4104     data_fake.pos_delta = delta;
4105     if (is_inf)
4106      data_fake.flags |= SF_IS_INF;
4107     if ( flags & SCF_DO_STCLASS && !scan->flags
4108      && OP(scan) == IFMATCH ) { /* Lookahead */
4109      cl_init(pRExC_state, &intrnl);
4110      data_fake.start_class = &intrnl;
4111      f |= SCF_DO_STCLASS_AND;
4112     }
4113     if (flags & SCF_WHILEM_VISITED_POS)
4114      f |= SCF_WHILEM_VISITED_POS;
4115     next = regnext(scan);
4116     nscan = NEXTOPER(NEXTOPER(scan));
4117
4118     *minnextp = study_chunk(pRExC_state, &nscan, minnextp, &deltanext,
4119      last, &data_fake, stopparen, recursed, NULL, f,depth+1);
4120     if (scan->flags) {
4121      if (deltanext) {
4122       FAIL("Variable length lookbehind not implemented");
4123      }
4124      else if (*minnextp > (I32)U8_MAX) {
4125       FAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
4126      }
4127      scan->flags = (U8)*minnextp;
4128     }
4129
4130     *minnextp += min;
4131
4132     if (f & SCF_DO_STCLASS_AND) {
4133      const int was = (data->start_class->flags & ANYOF_EOS);
4134
4135      cl_and(data->start_class, &intrnl);
4136      if (was)
4137       data->start_class->flags |= ANYOF_EOS;
4138     }
4139     if (data) {
4140      if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
4141       pars++;
4142      if (data_fake.flags & SF_HAS_EVAL)
4143       data->flags |= SF_HAS_EVAL;
4144      data->whilem_c = data_fake.whilem_c;
4145      if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) {
4146       if (RExC_rx->minlen<*minnextp)
4147        RExC_rx->minlen=*minnextp;
4148       SCAN_COMMIT(pRExC_state, &data_fake, minnextp);
4149       SvREFCNT_dec(data_fake.last_found);
4150
4151       if ( data_fake.minlen_fixed != minlenp )
4152       {
4153        data->offset_fixed= data_fake.offset_fixed;
4154        data->minlen_fixed= data_fake.minlen_fixed;
4155        data->lookbehind_fixed+= scan->flags;
4156       }
4157       if ( data_fake.minlen_float != minlenp )
4158       {
4159        data->minlen_float= data_fake.minlen_float;
4160        data->offset_float_min=data_fake.offset_float_min;
4161        data->offset_float_max=data_fake.offset_float_max;
4162        data->lookbehind_float+= scan->flags;
4163       }
4164      }
4165     }
4166
4167
4168    }
4169 #endif
4170   }
4171   else if (OP(scan) == OPEN) {
4172    if (stopparen != (I32)ARG(scan))
4173     pars++;
4174   }
4175   else if (OP(scan) == CLOSE) {
4176    if (stopparen == (I32)ARG(scan)) {
4177     break;
4178    }
4179    if ((I32)ARG(scan) == is_par) {
4180     next = regnext(scan);
4181
4182     if ( next && (OP(next) != WHILEM) && next < last)
4183      is_par = 0;  /* Disable optimization */
4184    }
4185    if (data)
4186     *(data->last_closep) = ARG(scan);
4187   }
4188   else if (OP(scan) == EVAL) {
4189     if (data)
4190      data->flags |= SF_HAS_EVAL;
4191   }
4192   else if ( PL_regkind[OP(scan)] == ENDLIKE ) {
4193    if (flags & SCF_DO_SUBSTR) {
4194     SCAN_COMMIT(pRExC_state,data,minlenp);
4195     flags &= ~SCF_DO_SUBSTR;
4196    }
4197    if (data && OP(scan)==ACCEPT) {
4198     data->flags |= SCF_SEEN_ACCEPT;
4199     if (stopmin > min)
4200      stopmin = min;
4201    }
4202   }
4203   else if (OP(scan) == LOGICAL && scan->flags == 2) /* Embedded follows */
4204   {
4205     if (flags & SCF_DO_SUBSTR) {
4206      SCAN_COMMIT(pRExC_state,data,minlenp);
4207      data->longest = &(data->longest_float);
4208     }
4209     is_inf = is_inf_internal = 1;
4210     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
4211      cl_anything(pRExC_state, data->start_class);
4212     flags &= ~SCF_DO_STCLASS;
4213   }
4214   else if (OP(scan) == GPOS) {
4215    if (!(RExC_rx->extflags & RXf_GPOS_FLOAT) &&
4216     !(delta || is_inf || (data && data->pos_delta)))
4217    {
4218     if (!(RExC_rx->extflags & RXf_ANCH) && (flags & SCF_DO_SUBSTR))
4219      RExC_rx->extflags |= RXf_ANCH_GPOS;
4220     if (RExC_rx->gofs < (U32)min)
4221      RExC_rx->gofs = min;
4222    } else {
4223     RExC_rx->extflags |= RXf_GPOS_FLOAT;
4224     RExC_rx->gofs = 0;
4225    }
4226   }
4227 #ifdef TRIE_STUDY_OPT
4228 #ifdef FULL_TRIE_STUDY
4229   else if (PL_regkind[OP(scan)] == TRIE) {
4230    /* NOTE - There is similar code to this block above for handling
4231    BRANCH nodes on the initial study.  If you change stuff here
4232    check there too. */
4233    regnode *trie_node= scan;
4234    regnode *tail= regnext(scan);
4235    reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
4236    I32 max1 = 0, min1 = I32_MAX;
4237    struct regnode_charclass_class accum;
4238
4239    if (flags & SCF_DO_SUBSTR) /* XXXX Add !SUSPEND? */
4240     SCAN_COMMIT(pRExC_state, data,minlenp); /* Cannot merge strings after this. */
4241    if (flags & SCF_DO_STCLASS)
4242     cl_init_zero(pRExC_state, &accum);
4243
4244    if (!trie->jump) {
4245     min1= trie->minlen;
4246     max1= trie->maxlen;
4247    } else {
4248     const regnode *nextbranch= NULL;
4249     U32 word;
4250
4251     for ( word=1 ; word <= trie->wordcount ; word++)
4252     {
4253      I32 deltanext=0, minnext=0, f = 0, fake;
4254      struct regnode_charclass_class this_class;
4255
4256      data_fake.flags = 0;
4257      if (data) {
4258       data_fake.whilem_c = data->whilem_c;
4259       data_fake.last_closep = data->last_closep;
4260      }
4261      else
4262       data_fake.last_closep = &fake;
4263      data_fake.pos_delta = delta;
4264      if (flags & SCF_DO_STCLASS) {
4265       cl_init(pRExC_state, &this_class);
4266       data_fake.start_class = &this_class;
4267       f = SCF_DO_STCLASS_AND;
4268      }
4269      if (flags & SCF_WHILEM_VISITED_POS)
4270       f |= SCF_WHILEM_VISITED_POS;
4271
4272      if (trie->jump[word]) {
4273       if (!nextbranch)
4274        nextbranch = trie_node + trie->jump[0];
4275       scan= trie_node + trie->jump[word];
4276       /* We go from the jump point to the branch that follows
4277       it. Note this means we need the vestigal unused branches
4278       even though they arent otherwise used.
4279       */
4280       minnext = study_chunk(pRExC_state, &scan, minlenp,
4281        &deltanext, (regnode *)nextbranch, &data_fake,
4282        stopparen, recursed, NULL, f,depth+1);
4283      }
4284      if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
4285       nextbranch= regnext((regnode*)nextbranch);
4286
4287      if (min1 > (I32)(minnext + trie->minlen))
4288       min1 = minnext + trie->minlen;
4289      if (max1 < (I32)(minnext + deltanext + trie->maxlen))
4290       max1 = minnext + deltanext + trie->maxlen;
4291      if (deltanext == I32_MAX)
4292       is_inf = is_inf_internal = 1;
4293
4294      if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
4295       pars++;
4296      if (data_fake.flags & SCF_SEEN_ACCEPT) {
4297       if ( stopmin > min + min1)
4298        stopmin = min + min1;
4299       flags &= ~SCF_DO_SUBSTR;
4300       if (data)
4301        data->flags |= SCF_SEEN_ACCEPT;
4302      }
4303      if (data) {
4304       if (data_fake.flags & SF_HAS_EVAL)
4305        data->flags |= SF_HAS_EVAL;
4306       data->whilem_c = data_fake.whilem_c;
4307      }
4308      if (flags & SCF_DO_STCLASS)
4309       cl_or(pRExC_state, &accum, &this_class);
4310     }
4311    }
4312    if (flags & SCF_DO_SUBSTR) {
4313     data->pos_min += min1;
4314     data->pos_delta += max1 - min1;
4315     if (max1 != min1 || is_inf)
4316      data->longest = &(data->longest_float);
4317    }
4318    min += min1;
4319    delta += max1 - min1;
4320    if (flags & SCF_DO_STCLASS_OR) {
4321     cl_or(pRExC_state, data->start_class, &accum);
4322     if (min1) {
4323      cl_and(data->start_class, and_withp);
4324      flags &= ~SCF_DO_STCLASS;
4325     }
4326    }
4327    else if (flags & SCF_DO_STCLASS_AND) {
4328     if (min1) {
4329      cl_and(data->start_class, &accum);
4330      flags &= ~SCF_DO_STCLASS;
4331     }
4332     else {
4333      /* Switch to OR mode: cache the old value of
4334      * data->start_class */
4335      INIT_AND_WITHP;
4336      StructCopy(data->start_class, and_withp,
4337        struct regnode_charclass_class);
4338      flags &= ~SCF_DO_STCLASS_AND;
4339      StructCopy(&accum, data->start_class,
4340        struct regnode_charclass_class);
4341      flags |= SCF_DO_STCLASS_OR;
4342      data->start_class->flags |= ANYOF_EOS;
4343     }
4344    }
4345    scan= tail;
4346    continue;
4347   }
4348 #else
4349   else if (PL_regkind[OP(scan)] == TRIE) {
4350    reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
4351    U8*bang=NULL;
4352
4353    min += trie->minlen;
4354    delta += (trie->maxlen - trie->minlen);
4355    flags &= ~SCF_DO_STCLASS; /* xxx */
4356    if (flags & SCF_DO_SUBSTR) {
4357      SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot expect anything... */
4358      data->pos_min += trie->minlen;
4359      data->pos_delta += (trie->maxlen - trie->minlen);
4360     if (trie->maxlen != trie->minlen)
4361      data->longest = &(data->longest_float);
4362     }
4363     if (trie->jump) /* no more substrings -- for now /grr*/
4364      flags &= ~SCF_DO_SUBSTR;
4365   }
4366 #endif /* old or new */
4367 #endif /* TRIE_STUDY_OPT */
4368
4369   /* Else: zero-length, ignore. */
4370   scan = regnext(scan);
4371  }
4372  if (frame) {
4373   last = frame->last;
4374   scan = frame->next;
4375   stopparen = frame->stop;
4376   frame = frame->prev;
4377   goto fake_study_recurse;
4378  }
4379
4380   finish:
4381  assert(!frame);
4382  DEBUG_STUDYDATA("pre-fin:",data,depth);
4383
4384  *scanp = scan;
4385  *deltap = is_inf_internal ? I32_MAX : delta;
4386  if (flags & SCF_DO_SUBSTR && is_inf)
4387   data->pos_delta = I32_MAX - data->pos_min;
4388  if (is_par > (I32)U8_MAX)
4389   is_par = 0;
4390  if (is_par && pars==1 && data) {
4391   data->flags |= SF_IN_PAR;
4392   data->flags &= ~SF_HAS_PAR;
4393  }
4394  else if (pars && data) {
4395   data->flags |= SF_HAS_PAR;
4396   data->flags &= ~SF_IN_PAR;
4397  }
4398  if (flags & SCF_DO_STCLASS_OR)
4399   cl_and(data->start_class, and_withp);
4400  if (flags & SCF_TRIE_RESTUDY)
4401   data->flags |=  SCF_TRIE_RESTUDY;
4402
4403  DEBUG_STUDYDATA("post-fin:",data,depth);
4404
4405  return min < stopmin ? min : stopmin;
4406 }
4407
4408 STATIC U32
4409 S_add_data(RExC_state_t *pRExC_state, U32 n, const char *s)
4410 {
4411  U32 count = RExC_rxi->data ? RExC_rxi->data->count : 0;
4412
4413  PERL_ARGS_ASSERT_ADD_DATA;
4414
4415  Renewc(RExC_rxi->data,
4416   sizeof(*RExC_rxi->data) + sizeof(void*) * (count + n - 1),
4417   char, struct reg_data);
4418  if(count)
4419   Renew(RExC_rxi->data->what, count + n, U8);
4420  else
4421   Newx(RExC_rxi->data->what, n, U8);
4422  RExC_rxi->data->count = count + n;
4423  Copy(s, RExC_rxi->data->what + count, n, U8);
4424  return count;
4425 }
4426
4427 /*XXX: todo make this not included in a non debugging perl */
4428 #ifndef PERL_IN_XSUB_RE
4429 void
4430 Perl_reginitcolors(pTHX)
4431 {
4432  dVAR;
4433  const char * const s = PerlEnv_getenv("PERL_RE_COLORS");
4434  if (s) {
4435   char *t = savepv(s);
4436   int i = 0;
4437   PL_colors[0] = t;
4438   while (++i < 6) {
4439    t = strchr(t, '\t');
4440    if (t) {
4441     *t = '\0';
4442     PL_colors[i] = ++t;
4443    }
4444    else
4445     PL_colors[i] = t = (char *)"";
4446   }
4447  } else {
4448   int i = 0;
4449   while (i < 6)
4450    PL_colors[i++] = (char *)"";
4451  }
4452  PL_colorset = 1;
4453 }
4454 #endif
4455
4456
4457 #ifdef TRIE_STUDY_OPT
4458 #define CHECK_RESTUDY_GOTO                                  \
4459   if (                                                \
4460    (data.flags & SCF_TRIE_RESTUDY)               \
4461    && ! restudied++                              \
4462   )     goto reStudy
4463 #else
4464 #define CHECK_RESTUDY_GOTO
4465 #endif
4466
4467 /*
4468  - pregcomp - compile a regular expression into internal code
4469  *
4470  * We can't allocate space until we know how big the compiled form will be,
4471  * but we can't compile it (and thus know how big it is) until we've got a
4472  * place to put the code.  So we cheat:  we compile it twice, once with code
4473  * generation turned off and size counting turned on, and once "for real".
4474  * This also means that we don't allocate space until we are sure that the
4475  * thing really will compile successfully, and we never have to move the
4476  * code and thus invalidate pointers into it.  (Note that it has to be in
4477  * one piece because free() must be able to free it all.) [NB: not true in perl]
4478  *
4479  * Beware that the optimization-preparation code in here knows about some
4480  * of the structure of the compiled regexp.  [I'll say.]
4481  */
4482
4483
4484
4485 #ifndef PERL_IN_XSUB_RE
4486 #define RE_ENGINE_PTR &reh_regexp_engine
4487 #else
4488 extern const struct regexp_engine my_reg_engine;
4489 #define RE_ENGINE_PTR &my_reg_engine
4490 #endif
4491
4492 #ifndef PERL_IN_XSUB_RE
4493 REGEXP *
4494 Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags)
4495 {
4496  dVAR;
4497  HV * const table = GvHV(PL_hintgv);
4498
4499  PERL_ARGS_ASSERT_PREGCOMP;
4500
4501  /* Dispatch a request to compile a regexp to correct
4502  regexp engine. */
4503  if (table) {
4504   SV **ptr= hv_fetchs(table, "regcomp", FALSE);
4505   GET_RE_DEBUG_FLAGS_DECL;
4506   if (ptr && SvIOK(*ptr) && SvIV(*ptr)) {
4507    const regexp_engine *eng=INT2PTR(regexp_engine*,SvIV(*ptr));
4508    DEBUG_COMPILE_r({
4509     PerlIO_printf(Perl_debug_log, "Using engine %"UVxf"\n",
4510      SvIV(*ptr));
4511    });
4512    return CALLREGCOMP_ENG(eng, pattern, flags);
4513   }
4514  }
4515  return Perl_re_compile(aTHX_ pattern, flags);
4516 }
4517 #endif
4518
4519 REGEXP *
4520 Perl_re_compile(pTHX_ SV * const pattern, U32 orig_pm_flags)
4521 {
4522  dVAR;
4523  REGEXP *rx;
4524  struct regexp *r;
4525  register regexp_internal *ri;
4526  STRLEN plen;
4527  char  *exp;
4528  char* xend;
4529  regnode *scan;
4530  I32 flags;
4531  I32 minlen = 0;
4532  U32 pm_flags;
4533
4534  /* these are all flags - maybe they should be turned
4535  * into a single int with different bit masks */
4536  I32 sawlookahead = 0;
4537  I32 sawplus = 0;
4538  I32 sawopen = 0;
4539  bool used_setjump = FALSE;
4540  regex_charset initial_charset = get_regex_charset(orig_pm_flags);
4541
4542  U8 jump_ret = 0;
4543  dJMPENV;
4544  scan_data_t data;
4545  RExC_state_t RExC_state;
4546  RExC_state_t * const pRExC_state = &RExC_state;
4547 #ifdef TRIE_STUDY_OPT
4548  int restudied;
4549  RExC_state_t copyRExC_state;
4550 #endif
4551  GET_RE_DEBUG_FLAGS_DECL;
4552
4553  PERL_ARGS_ASSERT_RE_COMPILE;
4554
4555  DEBUG_r(if (!PL_colorset) reginitcolors());
4556
4557  RExC_utf8 = RExC_orig_utf8 = SvUTF8(pattern);
4558  RExC_uni_semantics = 0;
4559  RExC_contains_locale = 0;
4560
4561  /****************** LONG JUMP TARGET HERE***********************/
4562  /* Longjmp back to here if have to switch in midstream to utf8 */
4563  if (! RExC_orig_utf8) {
4564   JMPENV_PUSH(jump_ret);
4565   used_setjump = TRUE;
4566  }
4567
4568  if (jump_ret == 0) {    /* First time through */
4569   exp = SvPV(pattern, plen);
4570   xend = exp + plen;
4571   /* ignore the utf8ness if the pattern is 0 length */
4572   if (plen == 0) {
4573    RExC_utf8 = RExC_orig_utf8 = 0;
4574   }
4575
4576   DEBUG_COMPILE_r({
4577    SV *dsv= sv_newmortal();
4578    RE_PV_QUOTED_DECL(s, RExC_utf8,
4579     dsv, exp, plen, 60);
4580    PerlIO_printf(Perl_debug_log, "%sCompiling REx%s %s\n",
4581       PL_colors[4],PL_colors[5],s);
4582   });
4583  }
4584  else {  /* longjumped back */
4585   STRLEN len = plen;
4586
4587   /* If the cause for the longjmp was other than changing to utf8, pop
4588   * our own setjmp, and longjmp to the correct handler */
4589   if (jump_ret != UTF8_LONGJMP) {
4590    JMPENV_POP;
4591    JMPENV_JUMP(jump_ret);
4592   }
4593
4594   GET_RE_DEBUG_FLAGS;
4595
4596   /* It's possible to write a regexp in ascii that represents Unicode
4597   codepoints outside of the byte range, such as via \x{100}. If we
4598   detect such a sequence we have to convert the entire pattern to utf8
4599   and then recompile, as our sizing calculation will have been based
4600   on 1 byte == 1 character, but we will need to use utf8 to encode
4601   at least some part of the pattern, and therefore must convert the whole
4602   thing.
4603   -- dmq */
4604   DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log,
4605    "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
4606   exp = (char*)Perl_bytes_to_utf8(aTHX_ (U8*)SvPV(pattern, plen), &len);
4607   xend = exp + len;
4608   RExC_orig_utf8 = RExC_utf8 = 1;
4609   SAVEFREEPV(exp);
4610  }
4611
4612 #ifdef TRIE_STUDY_OPT
4613  restudied = 0;
4614 #endif
4615
4616  pm_flags = orig_pm_flags;
4617
4618  if (initial_charset == REGEX_LOCALE_CHARSET) {
4619   RExC_contains_locale = 1;
4620  }
4621  else if (RExC_utf8 && initial_charset == REGEX_DEPENDS_CHARSET) {
4622
4623   /* Set to use unicode semantics if the pattern is in utf8 and has the
4624   * 'depends' charset specified, as it means unicode when utf8  */
4625   set_regex_charset(&pm_flags, REGEX_UNICODE_CHARSET);
4626  }
4627
4628  RExC_precomp = exp;
4629  RExC_flags = pm_flags;
4630  RExC_sawback = 0;
4631
4632  RExC_seen = 0;
4633  RExC_in_lookbehind = 0;
4634  RExC_seen_zerolen = *exp == '^' ? -1 : 0;
4635  RExC_seen_evals = 0;
4636  RExC_extralen = 0;
4637  RExC_override_recoding = 0;
4638
4639  /* First pass: determine size, legality. */
4640  RExC_parse = exp;
4641  RExC_start = exp;
4642  RExC_end = xend;
4643  RExC_naughty = 0;
4644  RExC_npar = 1;
4645  RExC_nestroot = 0;
4646  RExC_size = 0L;
4647  RExC_emit = &PL_regdummy;
4648  RExC_whilem_seen = 0;
4649  RExC_open_parens = NULL;
4650  RExC_close_parens = NULL;
4651  RExC_opend = NULL;
4652  RExC_paren_names = NULL;
4653 #ifdef DEBUGGING
4654  RExC_paren_name_list = NULL;
4655 #endif
4656  RExC_recurse = NULL;
4657  RExC_recurse_count = 0;
4658
4659 #if 0 /* REGC() is (currently) a NOP at the first pass.
4660  * Clever compilers notice this and complain. --jhi */
4661  REGC((U8)REG_MAGIC, (char*)RExC_emit);
4662 #endif
4663  DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "Starting first pass (sizing)\n"));
4664  if (reg(pRExC_state, 0, &flags,1) == NULL) {
4665   RExC_precomp = NULL;
4666   return(NULL);
4667  }
4668
4669  /* Here, finished first pass.  Get rid of any added setjmp */
4670  if (used_setjump) {
4671   JMPENV_POP;
4672  }
4673
4674  DEBUG_PARSE_r({
4675   PerlIO_printf(Perl_debug_log,
4676    "Required size %"IVdf" nodes\n"
4677    "Starting second pass (creation)\n",
4678    (IV)RExC_size);
4679   RExC_lastnum=0;
4680   RExC_lastparse=NULL;
4681  });
4682
4683  /* The first pass could have found things that force Unicode semantics */
4684  if ((RExC_utf8 || RExC_uni_semantics)
4685   && get_regex_charset(pm_flags) == REGEX_DEPENDS_CHARSET)
4686  {
4687   set_regex_charset(&pm_flags, REGEX_UNICODE_CHARSET);
4688  }
4689
4690  /* Small enough for pointer-storage convention?
4691  If extralen==0, this means that we will not need long jumps. */
4692  if (RExC_size >= 0x10000L && RExC_extralen)
4693   RExC_size += RExC_extralen;
4694  else
4695   RExC_extralen = 0;
4696  if (RExC_whilem_seen > 15)
4697   RExC_whilem_seen = 15;
4698
4699  /* Allocate space and zero-initialize. Note, the two step process
4700  of zeroing when in debug mode, thus anything assigned has to
4701  happen after that */
4702  rx = (REGEXP*) newSV_type(SVt_REGEXP);
4703  r = (struct regexp*)SvANY(rx);
4704  Newxc(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode),
4705   char, regexp_internal);
4706  if ( r == NULL || ri == NULL )
4707   FAIL("Regexp out of space");
4708 #ifdef DEBUGGING
4709  /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
4710  Zero(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode), char);
4711 #else
4712  /* bulk initialize base fields with 0. */
4713  Zero(ri, sizeof(regexp_internal), char);
4714 #endif
4715
4716  /* non-zero initialization begins here */
4717  RXi_SET( r, ri );
4718  r->engine= RE_ENGINE_PTR;
4719  r->extflags = pm_flags;
4720  {
4721   bool has_p     = ((r->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY);
4722   bool has_charset = (get_regex_charset(r->extflags) != REGEX_DEPENDS_CHARSET);
4723
4724   /* The caret is output if there are any defaults: if not all the STD
4725   * flags are set, or if no character set specifier is needed */
4726   bool has_default =
4727      (((r->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD)
4728      || ! has_charset);
4729   bool has_runon = ((RExC_seen & REG_SEEN_RUN_ON_COMMENT)==REG_SEEN_RUN_ON_COMMENT);
4730   U16 reganch = (U16)((r->extflags & RXf_PMf_STD_PMMOD)
4731        >> RXf_PMf_STD_PMMOD_SHIFT);
4732   const char *fptr = STD_PAT_MODS;        /*"msix"*/
4733   char *p;
4734   /* Allocate for the worst case, which is all the std flags are turned
4735   * on.  If more precision is desired, we could do a population count of
4736   * the flags set.  This could be done with a small lookup table, or by
4737   * shifting, masking and adding, or even, when available, assembly
4738   * language for a machine-language population count.
4739   * We never output a minus, as all those are defaults, so are
4740   * covered by the caret */
4741   const STRLEN wraplen = plen + has_p + has_runon
4742    + has_default       /* If needs a caret */
4743
4744     /* If needs a character set specifier */
4745    + ((has_charset) ? MAX_CHARSET_NAME_LENGTH : 0)
4746    + (sizeof(STD_PAT_MODS) - 1)
4747    + (sizeof("(?:)") - 1);
4748
4749   p = sv_grow(MUTABLE_SV(rx), wraplen + 1); /* +1 for the ending NUL */
4750   SvPOK_on(rx);
4751   SvFLAGS(rx) |= SvUTF8(pattern);
4752   *p++='('; *p++='?';
4753
4754   /* If a default, cover it using the caret */
4755   if (has_default) {
4756    *p++= DEFAULT_PAT_MOD;
4757   }
4758   if (has_charset) {
4759    STRLEN len;
4760    const char* const name = get_regex_charset_name(r->extflags, &len);
4761    Copy(name, p, len, char);
4762    p += len;
4763   }
4764   if (has_p)
4765    *p++ = KEEPCOPY_PAT_MOD; /*'p'*/
4766   {
4767    char ch;
4768    while((ch = *fptr++)) {
4769     if(reganch & 1)
4770      *p++ = ch;
4771     reganch >>= 1;
4772    }
4773   }
4774
4775   *p++ = ':';
4776   Copy(RExC_precomp, p, plen, char);
4777   assert ((RX_WRAPPED(rx) - p) < 16);
4778   r->pre_prefix = p - RX_WRAPPED(rx);
4779   p += plen;
4780   if (has_runon)
4781    *p++ = '\n';
4782   *p++ = ')';
4783   *p = 0;
4784   SvCUR_set(rx, p - SvPVX_const(rx));
4785  }
4786
4787  r->intflags = 0;
4788  r->nparens = RExC_npar - 1; /* set early to validate backrefs */
4789
4790  if (RExC_seen & REG_SEEN_RECURSE) {
4791   Newxz(RExC_open_parens, RExC_npar,regnode *);
4792   SAVEFREEPV(RExC_open_parens);
4793   Newxz(RExC_close_parens,RExC_npar,regnode *);
4794   SAVEFREEPV(RExC_close_parens);
4795  }
4796
4797  /* Useful during FAIL. */
4798 #ifdef RE_TRACK_PATTERN_OFFSETS
4799  Newxz(ri->u.offsets, 2*RExC_size+1, U32); /* MJD 20001228 */
4800  DEBUG_OFFSETS_r(PerlIO_printf(Perl_debug_log,
4801       "%s %"UVuf" bytes for offset annotations.\n",
4802       ri->u.offsets ? "Got" : "Couldn't get",
4803       (UV)((2*RExC_size+1) * sizeof(U32))));
4804 #endif
4805  SetProgLen(ri,RExC_size);
4806  RExC_rx_sv = rx;
4807  RExC_rx = r;
4808  RExC_rxi = ri;
4809  REH_CALL_COMP_BEGIN_HOOK(pRExC_state->rx);
4810
4811  /* Second pass: emit code. */
4812  RExC_flags = pm_flags; /* don't let top level (?i) bleed */
4813  RExC_parse = exp;
4814  RExC_end = xend;
4815  RExC_naughty = 0;
4816  RExC_npar = 1;
4817  RExC_emit_start = ri->program;
4818  RExC_emit = ri->program;
4819  RExC_emit_bound = ri->program + RExC_size + 1;
4820
4821  /* Store the count of eval-groups for security checks: */
4822  RExC_rx->seen_evals = RExC_seen_evals;
4823  REGC((U8)REG_MAGIC, (char*) RExC_emit++);
4824  if (reg(pRExC_state, 0, &flags,1) == NULL) {
4825   ReREFCNT_dec(rx);
4826   return(NULL);
4827  }
4828  /* XXXX To minimize changes to RE engine we always allocate
4829  3-units-long substrs field. */
4830  Newx(r->substrs, 1, struct reg_substr_data);
4831  if (RExC_recurse_count) {
4832   Newxz(RExC_recurse,RExC_recurse_count,regnode *);
4833   SAVEFREEPV(RExC_recurse);
4834  }
4835
4836 reStudy:
4837  r->minlen = minlen = sawlookahead = sawplus = sawopen = 0;
4838  Zero(r->substrs, 1, struct reg_substr_data);
4839
4840 #ifdef TRIE_STUDY_OPT
4841  if (!restudied) {
4842   StructCopy(&zero_scan_data, &data, scan_data_t);
4843   copyRExC_state = RExC_state;
4844  } else {
4845   U32 seen=RExC_seen;
4846   DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log,"Restudying\n"));
4847
4848   RExC_state = copyRExC_state;
4849   if (seen & REG_TOP_LEVEL_BRANCHES)
4850    RExC_seen |= REG_TOP_LEVEL_BRANCHES;
4851   else
4852    RExC_seen &= ~REG_TOP_LEVEL_BRANCHES;
4853   if (data.last_found) {
4854    SvREFCNT_dec(data.longest_fixed);
4855    SvREFCNT_dec(data.longest_float);
4856    SvREFCNT_dec(data.last_found);
4857   }
4858   StructCopy(&zero_scan_data, &data, scan_data_t);
4859  }
4860 #else
4861  StructCopy(&zero_scan_data, &data, scan_data_t);
4862 #endif
4863
4864  /* Dig out information for optimizations. */
4865  r->extflags = RExC_flags; /* was pm_op */
4866  /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */
4867
4868  if (UTF)
4869   SvUTF8_on(rx); /* Unicode in it? */
4870  ri->regstclass = NULL;
4871  if (RExC_naughty >= 10) /* Probably an expensive pattern. */
4872   r->intflags |= PREGf_NAUGHTY;
4873  scan = ri->program + 1;  /* First BRANCH. */
4874
4875  /* testing for BRANCH here tells us whether there is "must appear"
4876  data in the pattern. If there is then we can use it for optimisations */
4877  if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES)) { /*  Only one top-level choice. */
4878   I32 fake;
4879   STRLEN longest_float_length, longest_fixed_length;
4880   struct regnode_charclass_class ch_class; /* pointed to by data */
4881   int stclass_flag;
4882   I32 last_close = 0; /* pointed to by data */
4883   regnode *first= scan;
4884   regnode *first_next= regnext(first);
4885   /*
4886   * Skip introductions and multiplicators >= 1
4887   * so that we can extract the 'meat' of the pattern that must
4888   * match in the large if() sequence following.
4889   * NOTE that EXACT is NOT covered here, as it is normally
4890   * picked up by the optimiser separately.
4891   *
4892   * This is unfortunate as the optimiser isnt handling lookahead
4893   * properly currently.
4894   *
4895   */
4896   while ((OP(first) == OPEN && (sawopen = 1)) ||
4897    /* An OR of *one* alternative - should not happen now. */
4898    (OP(first) == BRANCH && OP(first_next) != BRANCH) ||
4899    /* for now we can't handle lookbehind IFMATCH*/
4900    (OP(first) == IFMATCH && !first->flags && (sawlookahead = 1)) ||
4901    (OP(first) == PLUS) ||
4902    (OP(first) == MINMOD) ||
4903    /* An {n,m} with n>0 */
4904    (PL_regkind[OP(first)] == CURLY && ARG1(first) > 0) ||
4905    (OP(first) == NOTHING && PL_regkind[OP(first_next)] != END ))
4906   {
4907     /*
4908     * the only op that could be a regnode is PLUS, all the rest
4909     * will be regnode_1 or regnode_2.
4910     *
4911     */
4912     if (OP(first) == PLUS)
4913      sawplus = 1;
4914     else
4915      first += regarglen[OP(first)];
4916
4917     first = NEXTOPER(first);
4918     first_next= regnext(first);
4919   }
4920
4921   /* Starting-point info. */
4922  again:
4923   DEBUG_PEEP("first:",first,0);
4924   /* Ignore EXACT as we deal with it later. */
4925   if (PL_regkind[OP(first)] == EXACT) {
4926    if (OP(first) == EXACT)
4927     NOOP; /* Empty, get anchored substr later. */
4928    else
4929     ri->regstclass = first;
4930   }
4931 #ifdef TRIE_STCLASS
4932   else if (PL_regkind[OP(first)] == TRIE &&
4933     ((reg_trie_data *)ri->data->data[ ARG(first) ])->minlen>0)
4934   {
4935    regnode *trie_op;
4936    /* this can happen only on restudy */
4937    if ( OP(first) == TRIE ) {
4938     struct regnode_1 *trieop = (struct regnode_1 *)
4939      PerlMemShared_calloc(1, sizeof(struct regnode_1));
4940     StructCopy(first,trieop,struct regnode_1);
4941     trie_op=(regnode *)trieop;
4942    } else {
4943     struct regnode_charclass *trieop = (struct regnode_charclass *)
4944      PerlMemShared_calloc(1, sizeof(struct regnode_charclass));
4945     StructCopy(first,trieop,struct regnode_charclass);
4946     trie_op=(regnode *)trieop;
4947    }
4948    OP(trie_op)+=2;
4949    make_trie_failtable(pRExC_state, (regnode *)first, trie_op, 0);
4950    ri->regstclass = trie_op;
4951   }
4952 #endif
4953   else if (REGNODE_SIMPLE(OP(first)))
4954    ri->regstclass = first;
4955   else if (PL_regkind[OP(first)] == BOUND ||
4956     PL_regkind[OP(first)] == NBOUND)
4957    ri->regstclass = first;
4958   else if (PL_regkind[OP(first)] == BOL) {
4959    r->extflags |= (OP(first) == MBOL
4960       ? RXf_ANCH_MBOL
4961       : (OP(first) == SBOL
4962        ? RXf_ANCH_SBOL
4963        : RXf_ANCH_BOL));
4964    first = NEXTOPER(first);
4965    goto again;
4966   }
4967   else if (OP(first) == GPOS) {
4968    r->extflags |= RXf_ANCH_GPOS;
4969    first = NEXTOPER(first);
4970    goto again;
4971   }
4972   else if ((!sawopen || !RExC_sawback) &&
4973    (OP(first) == STAR &&
4974    PL_regkind[OP(NEXTOPER(first))] == REG_ANY) &&
4975    !(r->extflags & RXf_ANCH) && !(RExC_seen & REG_SEEN_EVAL))
4976   {
4977    /* turn .* into ^.* with an implied $*=1 */
4978    const int type =
4979     (OP(NEXTOPER(first)) == REG_ANY)
4980      ? RXf_ANCH_MBOL
4981      : RXf_ANCH_SBOL;
4982    r->extflags |= type;
4983    r->intflags |= PREGf_IMPLICIT;
4984    first = NEXTOPER(first);
4985    goto again;
4986   }
4987   if (sawplus && !sawlookahead && (!sawopen || !RExC_sawback)
4988    && !(RExC_seen & REG_SEEN_EVAL)) /* May examine pos and $& */
4989    /* x+ must match at the 1st pos of run of x's */
4990    r->intflags |= PREGf_SKIP;
4991
4992   /* Scan is after the zeroth branch, first is atomic matcher. */
4993 #ifdef TRIE_STUDY_OPT
4994   DEBUG_PARSE_r(
4995    if (!restudied)
4996     PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
4997        (IV)(first - scan + 1))
4998   );
4999 #else
5000   DEBUG_PARSE_r(
5001    PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
5002     (IV)(first - scan + 1))
5003   );
5004 #endif
5005
5006
5007   /*
5008   * If there's something expensive in the r.e., find the
5009   * longest literal string that must appear and make it the
5010   * regmust.  Resolve ties in favor of later strings, since
5011   * the regstart check works with the beginning of the r.e.
5012   * and avoiding duplication strengthens checking.  Not a
5013   * strong reason, but sufficient in the absence of others.
5014   * [Now we resolve ties in favor of the earlier string if
5015   * it happens that c_offset_min has been invalidated, since the
5016   * earlier string may buy us something the later one won't.]
5017   */
5018
5019   data.longest_fixed = newSVpvs("");
5020   data.longest_float = newSVpvs("");
5021   data.last_found = newSVpvs("");
5022   data.longest = &(data.longest_fixed);
5023   first = scan;
5024   if (!ri->regstclass) {
5025    cl_init(pRExC_state, &ch_class);
5026    data.start_class = &ch_class;
5027    stclass_flag = SCF_DO_STCLASS_AND;
5028   } else    /* XXXX Check for BOUND? */
5029    stclass_flag = 0;
5030   data.last_closep = &last_close;
5031
5032   minlen = study_chunk(pRExC_state, &first, &minlen, &fake, scan + RExC_size, /* Up to end */
5033    &data, -1, NULL, NULL,
5034    SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag,0);
5035
5036
5037   CHECK_RESTUDY_GOTO;
5038
5039
5040   if ( RExC_npar == 1 && data.longest == &(data.longest_fixed)
5041    && data.last_start_min == 0 && data.last_end > 0
5042    && !RExC_seen_zerolen
5043    && !(RExC_seen & REG_SEEN_VERBARG)
5044    && (!(RExC_seen & REG_SEEN_GPOS) || (r->extflags & RXf_ANCH_GPOS)))
5045    r->extflags |= RXf_CHECK_ALL;
5046   scan_commit(pRExC_state, &data,&minlen,0);
5047   SvREFCNT_dec(data.last_found);
5048
5049   /* Note that code very similar to this but for anchored string
5050   follows immediately below, changes may need to be made to both.
5051   Be careful.
5052   */
5053   longest_float_length = CHR_SVLEN(data.longest_float);
5054   if (longest_float_length
5055    || (data.flags & SF_FL_BEFORE_EOL
5056     && (!(data.flags & SF_FL_BEFORE_MEOL)
5057      || (RExC_flags & RXf_PMf_MULTILINE))))
5058   {
5059    I32 t,ml;
5060
5061    if (SvCUR(data.longest_fixed)  /* ok to leave SvCUR */
5062     && data.offset_fixed == data.offset_float_min
5063     && SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
5064      goto remove_float;  /* As in (a)+. */
5065
5066    /* copy the information about the longest float from the reg_scan_data
5067    over to the program. */
5068    if (SvUTF8(data.longest_float)) {
5069     r->float_utf8 = data.longest_float;
5070     r->float_substr = NULL;
5071    } else {
5072     r->float_substr = data.longest_float;
5073     r->float_utf8 = NULL;
5074    }
5075    /* float_end_shift is how many chars that must be matched that
5076    follow this item. We calculate it ahead of time as once the
5077    lookbehind offset is added in we lose the ability to correctly
5078    calculate it.*/
5079    ml = data.minlen_float ? *(data.minlen_float)
5080         : (I32)longest_float_length;
5081    r->float_end_shift = ml - data.offset_float_min
5082     - longest_float_length + (SvTAIL(data.longest_float) != 0)
5083     + data.lookbehind_float;
5084    r->float_min_offset = data.offset_float_min - data.lookbehind_float;
5085    r->float_max_offset = data.offset_float_max;
5086    if (data.offset_float_max < I32_MAX) /* Don't offset infinity */
5087     r->float_max_offset -= data.lookbehind_float;
5088
5089    t = (data.flags & SF_FL_BEFORE_EOL /* Can't have SEOL and MULTI */
5090      && (!(data.flags & SF_FL_BEFORE_MEOL)
5091       || (RExC_flags & RXf_PMf_MULTILINE)));
5092    fbm_compile(data.longest_float, t ? FBMcf_TAIL : 0);
5093   }
5094   else {
5095   remove_float:
5096    r->float_substr = r->float_utf8 = NULL;
5097    SvREFCNT_dec(data.longest_float);
5098    longest_float_length = 0;
5099   }
5100
5101   /* Note that code very similar to this but for floating string
5102   is immediately above, changes may need to be made to both.
5103   Be careful.
5104   */
5105   longest_fixed_length = CHR_SVLEN(data.longest_fixed);
5106   if (longest_fixed_length
5107    || (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
5108     && (!(data.flags & SF_FIX_BEFORE_MEOL)
5109      || (RExC_flags & RXf_PMf_MULTILINE))))
5110   {
5111    I32 t,ml;
5112
5113    /* copy the information about the longest fixed
5114    from the reg_scan_data over to the program. */
5115    if (SvUTF8(data.longest_fixed)) {
5116     r->anchored_utf8 = data.longest_fixed;
5117     r->anchored_substr = NULL;
5118    } else {
5119     r->anchored_substr = data.longest_fixed;
5120     r->anchored_utf8 = NULL;
5121    }
5122    /* fixed_end_shift is how many chars that must be matched that
5123    follow this item. We calculate it ahead of time as once the
5124    lookbehind offset is added in we lose the ability to correctly
5125    calculate it.*/
5126    ml = data.minlen_fixed ? *(data.minlen_fixed)
5127         : (I32)longest_fixed_length;
5128    r->anchored_end_shift = ml - data.offset_fixed
5129     - longest_fixed_length + (SvTAIL(data.longest_fixed) != 0)
5130     + data.lookbehind_fixed;
5131    r->anchored_offset = data.offset_fixed - data.lookbehind_fixed;
5132
5133    t = (data.flags & SF_FIX_BEFORE_EOL /* Can't have SEOL and MULTI */
5134     && (!(data.flags & SF_FIX_BEFORE_MEOL)
5135      || (RExC_flags & RXf_PMf_MULTILINE)));
5136    fbm_compile(data.longest_fixed, t ? FBMcf_TAIL : 0);
5137   }
5138   else {
5139    r->anchored_substr = r->anchored_utf8 = NULL;
5140    SvREFCNT_dec(data.longest_fixed);
5141    longest_fixed_length = 0;
5142   }
5143   if (ri->regstclass
5144    && (OP(ri->regstclass) == REG_ANY || OP(ri->regstclass) == SANY))
5145    ri->regstclass = NULL;
5146
5147   if ((!(r->anchored_substr || r->anchored_utf8) || r->anchored_offset)
5148    && stclass_flag
5149    && !(data.start_class->flags & ANYOF_EOS)
5150    && !cl_is_anything(data.start_class))
5151   {
5152    const U32 n = add_data(pRExC_state, 1, "f");
5153    data.start_class->flags |= ANYOF_IS_SYNTHETIC;
5154
5155    Newx(RExC_rxi->data->data[n], 1,
5156     struct regnode_charclass_class);
5157    StructCopy(data.start_class,
5158      (struct regnode_charclass_class*)RExC_rxi->data->data[n],
5159      struct regnode_charclass_class);
5160    ri->regstclass = (regnode*)RExC_rxi->data->data[n];
5161    r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
5162    DEBUG_COMPILE_r({ SV *sv = sv_newmortal();
5163      regprop(r, sv, (regnode*)data.start_class);
5164      PerlIO_printf(Perl_debug_log,
5165          "synthetic stclass \"%s\".\n",
5166          SvPVX_const(sv));});
5167   }
5168
5169   /* A temporary algorithm prefers floated substr to fixed one to dig more info. */
5170   if (longest_fixed_length > longest_float_length) {
5171    r->check_end_shift = r->anchored_end_shift;
5172    r->check_substr = r->anchored_substr;
5173    r->check_utf8 = r->anchored_utf8;
5174    r->check_offset_min = r->check_offset_max = r->anchored_offset;
5175    if (r->extflags & RXf_ANCH_SINGLE)
5176     r->extflags |= RXf_NOSCAN;
5177   }
5178   else {
5179    r->check_end_shift = r->float_end_shift;
5180    r->check_substr = r->float_substr;
5181    r->check_utf8 = r->float_utf8;
5182    r->check_offset_min = r->float_min_offset;
5183    r->check_offset_max = r->float_max_offset;
5184   }
5185   /* XXXX Currently intuiting is not compatible with ANCH_GPOS.
5186   This should be changed ASAP!  */
5187   if ((r->check_substr || r->check_utf8) && !(r->extflags & RXf_ANCH_GPOS)) {
5188    r->extflags |= RXf_USE_INTUIT;
5189    if (SvTAIL(r->check_substr ? r->check_substr : r->check_utf8))
5190     r->extflags |= RXf_INTUIT_TAIL;
5191   }
5192   /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere)
5193   if ( (STRLEN)minlen < longest_float_length )
5194    minlen= longest_float_length;
5195   if ( (STRLEN)minlen < longest_fixed_length )
5196    minlen= longest_fixed_length;
5197   */
5198  }
5199  else {
5200   /* Several toplevels. Best we can is to set minlen. */
5201   I32 fake;
5202   struct regnode_charclass_class ch_class;
5203   I32 last_close = 0;
5204
5205   DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "\nMulti Top Level\n"));
5206
5207   scan = ri->program + 1;
5208   cl_init(pRExC_state, &ch_class);
5209   data.start_class = &ch_class;
5210   data.last_closep = &last_close;
5211
5212
5213   minlen = study_chunk(pRExC_state, &scan, &minlen, &fake, scan + RExC_size,
5214    &data, -1, NULL, NULL, SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS,0);
5215
5216   CHECK_RESTUDY_GOTO;
5217
5218   r->check_substr = r->check_utf8 = r->anchored_substr = r->anchored_utf8
5219     = r->float_substr = r->float_utf8 = NULL;
5220
5221   if (!(data.start_class->flags & ANYOF_EOS)
5222    && !cl_is_anything(data.start_class))
5223   {
5224    const U32 n = add_data(pRExC_state, 1, "f");
5225    data.start_class->flags |= ANYOF_IS_SYNTHETIC;
5226
5227    Newx(RExC_rxi->data->data[n], 1,
5228     struct regnode_charclass_class);
5229    StructCopy(data.start_class,
5230      (struct regnode_charclass_class*)RExC_rxi->data->data[n],
5231      struct regnode_charclass_class);
5232    ri->regstclass = (regnode*)RExC_rxi->data->data[n];
5233    r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
5234    DEBUG_COMPILE_r({ SV* sv = sv_newmortal();
5235      regprop(r, sv, (regnode*)data.start_class);
5236      PerlIO_printf(Perl_debug_log,
5237          "synthetic stclass \"%s\".\n",
5238          SvPVX_const(sv));});
5239   }
5240  }
5241
5242  /* Guard against an embedded (?=) or (?<=) with a longer minlen than
5243  the "real" pattern. */
5244  DEBUG_OPTIMISE_r({
5245   PerlIO_printf(Perl_debug_log,"minlen: %"IVdf" r->minlen:%"IVdf"\n",
5246      (IV)minlen, (IV)r->minlen);
5247  });
5248  r->minlenret = minlen;
5249  if (r->minlen < minlen)
5250   r->minlen = minlen;
5251
5252  if (RExC_seen & REG_SEEN_GPOS)
5253   r->extflags |= RXf_GPOS_SEEN;
5254  if (RExC_seen & REG_SEEN_LOOKBEHIND)
5255   r->extflags |= RXf_LOOKBEHIND_SEEN;
5256  if (RExC_seen & REG_SEEN_EVAL)
5257   r->extflags |= RXf_EVAL_SEEN;
5258  if (RExC_seen & REG_SEEN_CANY)
5259   r->extflags |= RXf_CANY_SEEN;
5260  if (RExC_seen & REG_SEEN_VERBARG)
5261   r->intflags |= PREGf_VERBARG_SEEN;
5262  if (RExC_seen & REG_SEEN_CUTGROUP)
5263   r->intflags |= PREGf_CUTGROUP_SEEN;
5264  if (RExC_paren_names)
5265   RXp_PAREN_NAMES(r) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names));
5266  else
5267   RXp_PAREN_NAMES(r) = NULL;
5268
5269 #ifdef STUPID_PATTERN_CHECKS
5270  if (RX_PRELEN(rx) == 0)
5271   r->extflags |= RXf_NULL;
5272  if (r->extflags & RXf_SPLIT && RX_PRELEN(rx) == 1 && RX_PRECOMP(rx)[0] == ' ')
5273   /* XXX: this should happen BEFORE we compile */
5274   r->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
5275  else if (RX_PRELEN(rx) == 3 && memEQ("\\s+", RX_PRECOMP(rx), 3))
5276   r->extflags |= RXf_WHITE;
5277  else if (RX_PRELEN(rx) == 1 && RXp_PRECOMP(rx)[0] == '^')
5278   r->extflags |= RXf_START_ONLY;
5279 #else
5280  if (r->extflags & RXf_SPLIT && RX_PRELEN(rx) == 1 && RX_PRECOMP(rx)[0] == ' ')
5281    /* XXX: this should happen BEFORE we compile */
5282    r->extflags |= (RXf_SKIPWHITE|RXf_WHITE);
5283  else {
5284   regnode *first = ri->program + 1;
5285   U8 fop = OP(first);
5286
5287   if (PL_regkind[fop] == NOTHING && OP(NEXTOPER(first)) == END)
5288    r->extflags |= RXf_NULL;
5289   else if (PL_regkind[fop] == BOL && OP(NEXTOPER(first)) == END)
5290    r->extflags |= RXf_START_ONLY;
5291   else if (fop == PLUS && OP(NEXTOPER(first)) == SPACE
5292        && OP(regnext(first)) == END)
5293    r->extflags |= RXf_WHITE;
5294  }
5295 #endif
5296 #ifdef DEBUGGING
5297  if (RExC_paren_names) {
5298   ri->name_list_idx = add_data( pRExC_state, 1, "a" );
5299   ri->data->data[ri->name_list_idx] = (void*)SvREFCNT_inc(RExC_paren_name_list);
5300  } else
5301 #endif
5302   ri->name_list_idx = 0;
5303
5304  if (RExC_recurse_count) {
5305   for ( ; RExC_recurse_count ; RExC_recurse_count-- ) {
5306    const regnode *scan = RExC_recurse[RExC_recurse_count-1];
5307    ARG2L_SET( scan, RExC_open_parens[ARG(scan)-1] - scan );
5308   }
5309  }
5310  Newxz(r->offs, RExC_npar, regexp_paren_pair);
5311  /* assume we don't need to swap parens around before we match */
5312
5313  DEBUG_DUMP_r({
5314   PerlIO_printf(Perl_debug_log,"Final program:\n");
5315   regdump(r);
5316  });
5317 #ifdef RE_TRACK_PATTERN_OFFSETS
5318  DEBUG_OFFSETS_r(if (ri->u.offsets) {
5319   const U32 len = ri->u.offsets[0];
5320   U32 i;
5321   GET_RE_DEBUG_FLAGS_DECL;
5322   PerlIO_printf(Perl_debug_log, "Offsets: [%"UVuf"]\n\t", (UV)ri->u.offsets[0]);
5323   for (i = 1; i <= len; i++) {
5324    if (ri->u.offsets[i*2-1] || ri->u.offsets[i*2])
5325     PerlIO_printf(Perl_debug_log, "%"UVuf":%"UVuf"[%"UVuf"] ",
5326     (UV)i, (UV)ri->u.offsets[i*2-1], (UV)ri->u.offsets[i*2]);
5327    }
5328   PerlIO_printf(Perl_debug_log, "\n");
5329  });
5330 #endif
5331  return rx;
5332 }
5333
5334 #undef RE_ENGINE_PTR
5335
5336
5337 SV*
5338 Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value,
5339      const U32 flags)
5340 {
5341  PERL_ARGS_ASSERT_REG_NAMED_BUFF;
5342
5343  PERL_UNUSED_ARG(value);
5344
5345  if (flags & RXapif_FETCH) {
5346   return reg_named_buff_fetch(rx, key, flags);
5347  } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) {
5348   Perl_croak_no_modify(aTHX);
5349   return NULL;
5350  } else if (flags & RXapif_EXISTS) {
5351   return reg_named_buff_exists(rx, key, flags)
5352    ? &PL_sv_yes
5353    : &PL_sv_no;
5354  } else if (flags & RXapif_REGNAMES) {
5355   return reg_named_buff_all(rx, flags);
5356  } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) {
5357   return reg_named_buff_scalar(rx, flags);
5358  } else {
5359   Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags);
5360   return NULL;
5361  }
5362 }
5363
5364 SV*
5365 Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey,
5366       const U32 flags)
5367 {
5368  PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER;
5369  PERL_UNUSED_ARG(lastkey);
5370
5371  if (flags & RXapif_FIRSTKEY)
5372   return reg_named_buff_firstkey(rx, flags);
5373  else if (flags & RXapif_NEXTKEY)
5374   return reg_named_buff_nextkey(rx, flags);
5375  else {
5376   Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter", (int)flags);
5377   return NULL;
5378  }
5379 }
5380
5381 SV*
5382 Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv,
5383       const U32 flags)
5384 {
5385  AV *retarray = NULL;
5386  SV *ret;
5387  struct regexp *const rx = (struct regexp *)SvANY(r);
5388
5389  PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH;
5390
5391  if (flags & RXapif_ALL)
5392   retarray=newAV();
5393
5394  if (rx && RXp_PAREN_NAMES(rx)) {
5395   HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 );
5396   if (he_str) {
5397    IV i;
5398    SV* sv_dat=HeVAL(he_str);
5399    I32 *nums=(I32*)SvPVX(sv_dat);
5400    for ( i=0; i<SvIVX(sv_dat); i++ ) {
5401     if ((I32)(rx->nparens) >= nums[i]
5402      && rx->offs[nums[i]].start != -1
5403      && rx->offs[nums[i]].end != -1)
5404     {
5405      ret = newSVpvs("");
5406      CALLREG_NUMBUF_FETCH(r,nums[i],ret);
5407      if (!retarray)
5408       return ret;
5409     } else {
5410      ret = newSVsv(&PL_sv_undef);
5411     }
5412     if (retarray)
5413      av_push(retarray, ret);
5414    }
5415    if (retarray)
5416     return newRV_noinc(MUTABLE_SV(retarray));
5417   }
5418  }
5419  return NULL;
5420 }
5421
5422 bool
5423 Perl_reg_named_buff_exists(pTHX_ REGEXP * const r, SV * const key,
5424       const U32 flags)
5425 {
5426  struct regexp *const rx = (struct regexp *)SvANY(r);
5427
5428  PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS;
5429
5430  if (rx && RXp_PAREN_NAMES(rx)) {
5431   if (flags & RXapif_ALL) {
5432    return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0);
5433   } else {
5434    SV *sv = CALLREG_NAMED_BUFF_FETCH(r, key, flags);
5435    if (sv) {
5436     SvREFCNT_dec(sv);
5437     return TRUE;
5438    } else {
5439     return FALSE;
5440    }
5441   }
5442  } else {
5443   return FALSE;
5444  }
5445 }
5446
5447 SV*
5448 Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const r, const U32 flags)
5449 {
5450  struct regexp *const rx = (struct regexp *)SvANY(r);
5451
5452  PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY;
5453
5454  if ( rx && RXp_PAREN_NAMES(rx) ) {
5455   (void)hv_iterinit(RXp_PAREN_NAMES(rx));
5456
5457   return CALLREG_NAMED_BUFF_NEXTKEY(r, NULL, flags & ~RXapif_FIRSTKEY);
5458  } else {
5459   return FALSE;
5460  }
5461 }
5462
5463 SV*
5464 Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const r, const U32 flags)
5465 {
5466  struct regexp *const rx = (struct regexp *)SvANY(r);
5467  GET_RE_DEBUG_FLAGS_DECL;
5468
5469  PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY;
5470
5471  if (rx && RXp_PAREN_NAMES(rx)) {
5472   HV *hv = RXp_PAREN_NAMES(rx);
5473   HE *temphe;
5474   while ( (temphe = hv_iternext_flags(hv,0)) ) {
5475    IV i;
5476    IV parno = 0;
5477    SV* sv_dat = HeVAL(temphe);
5478    I32 *nums = (I32*)SvPVX(sv_dat);
5479    for ( i = 0; i < SvIVX(sv_dat); i++ ) {
5480     if ((I32)(rx->lastparen) >= nums[i] &&
5481      rx->offs[nums[i]].start != -1 &&
5482      rx->offs[nums[i]].end != -1)
5483     {
5484      parno = nums[i];
5485      break;
5486     }
5487    }
5488    if (parno || flags & RXapif_ALL) {
5489     return newSVhek(HeKEY_hek(temphe));
5490    }
5491   }
5492  }
5493  return NULL;
5494 }
5495
5496 SV*
5497 Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags)
5498 {
5499  SV *ret;
5500  AV *av;
5501  I32 length;
5502  struct regexp *const rx = (struct regexp *)SvANY(r);
5503
5504  PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR;
5505
5506  if (rx && RXp_PAREN_NAMES(rx)) {
5507   if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) {
5508    return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx)));
5509   } else if (flags & RXapif_ONE) {
5510    ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES));
5511    av = MUTABLE_AV(SvRV(ret));
5512    length = av_len(av);
5513    SvREFCNT_dec(ret);
5514    return newSViv(length + 1);
5515   } else {
5516    Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar", (int)flags);
5517    return NULL;
5518   }
5519  }
5520  return &PL_sv_undef;
5521 }
5522
5523 SV*
5524 Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags)
5525 {
5526  struct regexp *const rx = (struct regexp *)SvANY(r);
5527  AV *av = newAV();
5528
5529  PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL;
5530
5531  if (rx && RXp_PAREN_NAMES(rx)) {
5532   HV *hv= RXp_PAREN_NAMES(rx);
5533   HE *temphe;
5534   (void)hv_iterinit(hv);
5535   while ( (temphe = hv_iternext_flags(hv,0)) ) {
5536    IV i;
5537    IV parno = 0;
5538    SV* sv_dat = HeVAL(temphe);
5539    I32 *nums = (I32*)SvPVX(sv_dat);
5540    for ( i = 0; i < SvIVX(sv_dat); i++ ) {
5541     if ((I32)(rx->lastparen) >= nums[i] &&
5542      rx->offs[nums[i]].start != -1 &&
5543      rx->offs[nums[i]].end != -1)
5544     {
5545      parno = nums[i];
5546      break;
5547     }
5548    }
5549    if (parno || flags & RXapif_ALL) {
5550     av_push(av, newSVhek(HeKEY_hek(temphe)));
5551    }
5552   }
5553  }
5554
5555  return newRV_noinc(MUTABLE_SV(av));
5556 }
5557
5558 void
5559 Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const r, const I32 paren,
5560        SV * const sv)
5561 {
5562  struct regexp *const rx = (struct regexp *)SvANY(r);
5563  char *s = NULL;
5564  I32 i = 0;
5565  I32 s1, t1;
5566
5567  PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH;
5568
5569  if (!rx->subbeg) {
5570   sv_setsv(sv,&PL_sv_undef);
5571   return;
5572  }
5573  else
5574  if (paren == RX_BUFF_IDX_PREMATCH && rx->offs[0].start != -1) {
5575   /* $` */
5576   i = rx->offs[0].start;
5577   s = rx->subbeg;
5578  }
5579  else
5580  if (paren == RX_BUFF_IDX_POSTMATCH && rx->offs[0].end != -1) {
5581   /* $' */
5582   s = rx->subbeg + rx->offs[0].end;
5583   i = rx->sublen - rx->offs[0].end;
5584  }
5585  else
5586  if ( 0 <= paren && paren <= (I32)rx->nparens &&
5587   (s1 = rx->offs[paren].start) != -1 &&
5588   (t1 = rx->offs[paren].end) != -1)
5589  {
5590   /* $& $1 ... */
5591   i = t1 - s1;
5592   s = rx->subbeg + s1;
5593  } else {
5594   sv_setsv(sv,&PL_sv_undef);
5595   return;
5596  }
5597  assert(rx->sublen >= (s - rx->subbeg) + i );
5598  if (i >= 0) {
5599   const int oldtainted = PL_tainted;
5600   TAINT_NOT;
5601   sv_setpvn(sv, s, i);
5602   PL_tainted = oldtainted;
5603   if ( (rx->extflags & RXf_CANY_SEEN)
5604    ? (RXp_MATCH_UTF8(rx)
5605       && (!i || is_utf8_string((U8*)s, i)))
5606    : (RXp_MATCH_UTF8(rx)) )
5607   {
5608    SvUTF8_on(sv);
5609   }
5610   else
5611    SvUTF8_off(sv);
5612   if (PL_tainting) {
5613    if (RXp_MATCH_TAINTED(rx)) {
5614     if (SvTYPE(sv) >= SVt_PVMG) {
5615      MAGIC* const mg = SvMAGIC(sv);
5616      MAGIC* mgt;
5617      PL_tainted = 1;
5618      SvMAGIC_set(sv, mg->mg_moremagic);
5619      SvTAINT(sv);
5620      if ((mgt = SvMAGIC(sv))) {
5621       mg->mg_moremagic = mgt;
5622       SvMAGIC_set(sv, mg);
5623      }
5624     } else {
5625      PL_tainted = 1;
5626      SvTAINT(sv);
5627     }
5628    } else
5629     SvTAINTED_off(sv);
5630   }
5631  } else {
5632   sv_setsv(sv,&PL_sv_undef);
5633   return;
5634  }
5635 }
5636
5637 void
5638 Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
5639               SV const * const value)
5640 {
5641  PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE;
5642
5643  PERL_UNUSED_ARG(rx);
5644  PERL_UNUSED_ARG(paren);
5645  PERL_UNUSED_ARG(value);
5646
5647  if (!PL_localizing)
5648   Perl_croak_no_modify(aTHX);
5649 }
5650
5651 I32
5652 Perl_reg_numbered_buff_length(pTHX_ REGEXP * const r, const SV * const sv,
5653        const I32 paren)
5654 {
5655  struct regexp *const rx = (struct regexp *)SvANY(r);
5656  I32 i;
5657  I32 s1, t1;
5658
5659  PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH;
5660
5661  /* Some of this code was originally in C<Perl_magic_len> in F<mg.c> */
5662   switch (paren) {
5663  /* $` / ${^PREMATCH} */
5664  case RX_BUFF_IDX_PREMATCH:
5665   if (rx->offs[0].start != -1) {
5666       i = rx->offs[0].start;
5667       if (i > 0) {
5668         s1 = 0;
5669         t1 = i;
5670         goto getlen;
5671       }
5672    }
5673   return 0;
5674  /* $' / ${^POSTMATCH} */
5675  case RX_BUFF_IDX_POSTMATCH:
5676    if (rx->offs[0].end != -1) {
5677       i = rx->sublen - rx->offs[0].end;
5678       if (i > 0) {
5679         s1 = rx->offs[0].end;
5680         t1 = rx->sublen;
5681         goto getlen;
5682       }
5683    }
5684   return 0;
5685  /* $& / ${^MATCH}, $1, $2, ... */
5686  default:
5687    if (paren <= (I32)rx->nparens &&
5688    (s1 = rx->offs[paren].start) != -1 &&
5689    (t1 = rx->offs[paren].end) != -1)
5690    {
5691    i = t1 - s1;
5692    goto getlen;
5693   } else {
5694    if (ckWARN(WARN_UNINITIALIZED))
5695     report_uninit((const SV *)sv);
5696    return 0;
5697   }
5698  }
5699   getlen:
5700  if (i > 0 && RXp_MATCH_UTF8(rx)) {
5701   const char * const s = rx->subbeg + s1;
5702   const U8 *ep;
5703   STRLEN el;
5704
5705   i = t1 - s1;
5706   if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
5707       i = el;
5708  }
5709  return i;
5710 }
5711
5712 SV*
5713 Perl_reg_qr_package(pTHX_ REGEXP * const rx)
5714 {
5715  PERL_ARGS_ASSERT_REG_QR_PACKAGE;
5716   PERL_UNUSED_ARG(rx);
5717   if (0)
5718    return NULL;
5719   else
5720    return newSVpvs("Regexp");
5721 }
5722
5723 /* Scans the name of a named buffer from the pattern.
5724  * If flags is REG_RSN_RETURN_NULL returns null.
5725  * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
5726  * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
5727  * to the parsed name as looked up in the RExC_paren_names hash.
5728  * If there is an error throws a vFAIL().. type exception.
5729  */
5730
5731 #define REG_RSN_RETURN_NULL    0
5732 #define REG_RSN_RETURN_NAME    1
5733 #define REG_RSN_RETURN_DATA    2
5734
5735 STATIC SV*
5736 S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags)
5737 {
5738  char *name_start = RExC_parse;
5739
5740  PERL_ARGS_ASSERT_REG_SCAN_NAME;
5741
5742  if (isIDFIRST_lazy_if(RExC_parse, UTF)) {
5743   /* skip IDFIRST by using do...while */
5744   if (UTF)
5745    do {
5746     RExC_parse += UTF8SKIP(RExC_parse);
5747    } while (isALNUM_utf8((U8*)RExC_parse));
5748   else
5749    do {
5750     RExC_parse++;
5751    } while (isALNUM(*RExC_parse));
5752  }
5753
5754  if ( flags ) {
5755   SV* sv_name
5756    = newSVpvn_flags(name_start, (int)(RExC_parse - name_start),
5757        SVs_TEMP | (UTF ? SVf_UTF8 : 0));
5758   if ( flags == REG_RSN_RETURN_NAME)
5759    return sv_name;
5760   else if (flags==REG_RSN_RETURN_DATA) {
5761    HE *he_str = NULL;
5762    SV *sv_dat = NULL;
5763    if ( ! sv_name )      /* should not happen*/
5764     Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
5765    if (RExC_paren_names)
5766     he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
5767    if ( he_str )
5768     sv_dat = HeVAL(he_str);
5769    if ( ! sv_dat )
5770     vFAIL("Reference to nonexistent named group");
5771    return sv_dat;
5772   }
5773   else {
5774    Perl_croak(aTHX_ "panic: bad flag in reg_scan_name");
5775   }
5776   /* NOT REACHED */
5777  }
5778  return NULL;
5779 }
5780
5781 #define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
5782  int rem=(int)(RExC_end - RExC_parse);                       \
5783  int cut;                                                    \
5784  int num;                                                    \
5785  int iscut=0;                                                \
5786  if (rem>10) {                                               \
5787   rem=10;                                                 \
5788   iscut=1;                                                \
5789  }                                                           \
5790  cut=10-rem;                                                 \
5791  if (RExC_lastparse!=RExC_parse)                             \
5792   PerlIO_printf(Perl_debug_log," >%.*s%-*s",              \
5793    rem, RExC_parse,                                    \
5794    cut + 4,                                            \
5795    iscut ? "..." : "<"                                 \
5796   );                                                      \
5797  else                                                        \
5798   PerlIO_printf(Perl_debug_log,"%16s","");                \
5799                 \
5800  if (SIZE_ONLY)                                              \
5801  num = RExC_size + 1;                                     \
5802  else                                                        \
5803  num=REG_NODE_NUM(RExC_emit);                             \
5804  if (RExC_lastnum!=num)                                      \
5805  PerlIO_printf(Perl_debug_log,"|%4d",num);                \
5806  else                                                        \
5807  PerlIO_printf(Perl_debug_log,"|%4s","");                 \
5808  PerlIO_printf(Perl_debug_log,"|%*s%-4s",                    \
5809   (int)((depth*2)), "",                                   \
5810   (funcname)                                              \
5811  );                                                          \
5812  RExC_lastnum=num;                                           \
5813  RExC_lastparse=RExC_parse;                                  \
5814 })
5815
5816
5817
5818 #define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
5819  DEBUG_PARSE_MSG((funcname));                            \
5820  PerlIO_printf(Perl_debug_log,"%4s","\n");               \
5821 })
5822 #define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({           \
5823  DEBUG_PARSE_MSG((funcname));                            \
5824  PerlIO_printf(Perl_debug_log,fmt "\n",args);               \
5825 })
5826
5827 /* This section of code defines the inversion list object and its methods.  The
5828  * interfaces are highly subject to change, so as much as possible is static to
5829  * this file.  An inversion list is here implemented as a malloc'd C array with
5830  * some added info.  More will be coming when functionality is added later.
5831  *
5832  * It is currently implemented as an HV to the outside world, but is actually
5833  * an SV pointing to an array of UVs that the SV thinks are bytes.  This allows
5834  * us to have an array of UV whose memory management is automatically handled
5835  * by the existing facilities for SV's.
5836  *
5837  * Some of the methods should always be private to the implementation, and some
5838  * should eventually be made public */
5839
5840 #define INVLIST_INITIAL_LEN 10
5841
5842 PERL_STATIC_INLINE UV*
5843 S_invlist_array(pTHX_ HV* const invlist)
5844 {
5845  /* Returns the pointer to the inversion list's array.  Every time the
5846  * length changes, this needs to be called in case malloc or realloc moved
5847  * it */
5848
5849  PERL_ARGS_ASSERT_INVLIST_ARRAY;
5850
5851  return (UV *) SvPVX(invlist);
5852 }
5853
5854 PERL_STATIC_INLINE UV
5855 S_invlist_len(pTHX_ HV* const invlist)
5856 {
5857  /* Returns the current number of elements in the inversion list's array */
5858
5859  PERL_ARGS_ASSERT_INVLIST_LEN;
5860
5861  return SvCUR(invlist) / sizeof(UV);
5862 }
5863
5864 PERL_STATIC_INLINE UV
5865 S_invlist_max(pTHX_ HV* const invlist)
5866 {
5867  /* Returns the maximum number of elements storable in the inversion list's
5868  * array, without having to realloc() */
5869
5870  PERL_ARGS_ASSERT_INVLIST_MAX;
5871
5872  return SvLEN(invlist) / sizeof(UV);
5873 }
5874
5875 PERL_STATIC_INLINE void
5876 S_invlist_set_len(pTHX_ HV* const invlist, const UV len)
5877 {
5878  /* Sets the current number of elements stored in the inversion list */
5879
5880  PERL_ARGS_ASSERT_INVLIST_SET_LEN;
5881
5882  SvCUR_set(invlist, len * sizeof(UV));
5883 }
5884
5885 PERL_STATIC_INLINE void
5886 S_invlist_set_max(pTHX_ HV* const invlist, const UV max)
5887 {
5888
5889  /* Sets the maximum number of elements storable in the inversion list
5890  * without having to realloc() */
5891
5892  PERL_ARGS_ASSERT_INVLIST_SET_MAX;
5893
5894  if (max < invlist_len(invlist)) {
5895   Perl_croak(aTHX_ "panic: Can't make max size '%"UVuf"' less than current length %"UVuf" in inversion list", invlist_max(invlist), invlist_len(invlist));
5896  }
5897
5898  SvLEN_set(invlist, max * sizeof(UV));
5899 }
5900
5901 #ifndef PERL_IN_XSUB_RE
5902 HV*
5903 Perl__new_invlist(pTHX_ IV initial_size)
5904 {
5905
5906  /* Return a pointer to a newly constructed inversion list, with enough
5907  * space to store 'initial_size' elements.  If that number is negative, a
5908  * system default is used instead */
5909
5910  if (initial_size < 0) {
5911   initial_size = INVLIST_INITIAL_LEN;
5912  }
5913
5914  /* Allocate the initial space */
5915  return (HV *) newSV(initial_size * sizeof(UV));
5916 }
5917 #endif
5918
5919 PERL_STATIC_INLINE void
5920 S_invlist_destroy(pTHX_ HV* const invlist)
5921 {
5922    /* Inversion list destructor */
5923
5924  PERL_ARGS_ASSERT_INVLIST_DESTROY;
5925
5926  SvREFCNT_dec(invlist);
5927 }
5928
5929 STATIC void
5930 S_invlist_extend(pTHX_ HV* const invlist, const UV new_max)
5931 {
5932  /* Grow the maximum size of an inversion list */
5933
5934  PERL_ARGS_ASSERT_INVLIST_EXTEND;
5935
5936  SvGROW((SV *)invlist, new_max * sizeof(UV));
5937 }
5938
5939 PERL_STATIC_INLINE void
5940 S_invlist_trim(pTHX_ HV* const invlist)
5941 {
5942  PERL_ARGS_ASSERT_INVLIST_TRIM;
5943
5944  /* Change the length of the inversion list to how many entries it currently
5945  * has */
5946
5947  SvPV_shrink_to_cur((SV *) invlist);
5948 }
5949
5950 /* An element is in an inversion list iff its index is even numbered: 0, 2, 4,
5951  * etc */
5952
5953 #define ELEMENT_IN_INVLIST_SET(i) (! ((i) & 1))
5954
5955 #ifndef PERL_IN_XSUB_RE
5956 void
5957 Perl__append_range_to_invlist(pTHX_ HV* const invlist, const UV start, const UV end)
5958 {
5959    /* Subject to change or removal.  Append the range from 'start' to 'end' at
5960  * the end of the inversion list.  The range must be above any existing
5961  * ones. */
5962
5963  UV* array = invlist_array(invlist);
5964  UV max = invlist_max(invlist);
5965  UV len = invlist_len(invlist);
5966
5967  PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST;
5968
5969  if (len > 0) {
5970
5971   /* Here, the existing list is non-empty. The current max entry in the
5972   * list is generally the first value not in the set, except when the
5973   * set extends to the end of permissible values, in which case it is
5974   * the first entry in that final set, and so this call is an attempt to
5975   * append out-of-order */
5976
5977   UV final_element = len - 1;
5978   if (array[final_element] > start
5979    || ELEMENT_IN_INVLIST_SET(final_element))
5980   {
5981    Perl_croak(aTHX_ "panic: attempting to append to an inversion list, but wasn't at the end of the list");
5982   }
5983
5984   /* Here, it is a legal append.  If the new range begins with the first
5985   * value not in the set, it is extending the set, so the new first
5986   * value not in the set is one greater than the newly extended range.
5987   * */
5988   if (array[final_element] == start) {
5989    if (end != UV_MAX) {
5990     array[final_element] = end + 1;
5991    }
5992    else {
5993     /* But if the end is the maximum representable on the machine,
5994     * just let the range that this would extend have no end */
5995     invlist_set_len(invlist, len - 1);
5996    }
5997    return;
5998   }
5999  }
6000
6001  /* Here the new range doesn't extend any existing set.  Add it */
6002
6003  len += 2; /* Includes an element each for the start and end of range */
6004
6005  /* If overflows the existing space, extend, which may cause the array to be
6006  * moved */
6007  if (max < len) {
6008   invlist_extend(invlist, len);
6009   array = invlist_array(invlist);
6010  }
6011
6012  invlist_set_len(invlist, len);
6013
6014  /* The next item on the list starts the range, the one after that is
6015  * one past the new range.  */
6016  array[len - 2] = start;
6017  if (end != UV_MAX) {
6018   array[len - 1] = end + 1;
6019  }
6020  else {
6021   /* But if the end is the maximum representable on the machine, just let
6022   * the range have no end */
6023   invlist_set_len(invlist, len - 1);
6024  }
6025 }
6026 #endif
6027
6028 STATIC HV*
6029 S_invlist_union(pTHX_ HV* const a, HV* const b)
6030 {
6031  /* Return a new inversion list which is the union of two inversion lists.
6032  * The basis for this comes from "Unicode Demystified" Chapter 13 by
6033  * Richard Gillam, published by Addison-Wesley, and explained at some
6034  * length there.  The preface says to incorporate its examples into your
6035  * code at your own risk.
6036  *
6037  * The algorithm is like a merge sort.
6038  *
6039  * XXX A potential performance improvement is to keep track as we go along
6040  * if only one of the inputs contributes to the result, meaning the other
6041  * is a subset of that one.  In that case, we can skip the final copy and
6042  * return the larger of the input lists */
6043
6044  UV* array_a = invlist_array(a);   /* a's array */
6045  UV* array_b = invlist_array(b);
6046  UV len_a = invlist_len(a); /* length of a's array */
6047  UV len_b = invlist_len(b);
6048
6049  HV* u;   /* the resulting union */
6050  UV* array_u;
6051  UV len_u;
6052
6053  UV i_a = 0;      /* current index into a's array */
6054  UV i_b = 0;
6055  UV i_u = 0;
6056
6057  /* running count, as explained in the algorithm source book; items are
6058  * stopped accumulating and are output when the count changes to/from 0.
6059  * The count is incremented when we start a range that's in the set, and
6060  * decremented when we start a range that's not in the set.  So its range
6061  * is 0 to 2.  Only when the count is zero is something not in the set.
6062  */
6063  UV count = 0;
6064
6065  PERL_ARGS_ASSERT_INVLIST_UNION;
6066
6067  /* Size the union for the worst case: that the sets are completely
6068  * disjoint */
6069  u = _new_invlist(len_a + len_b);
6070  array_u = invlist_array(u);
6071
6072  /* Go through each list item by item, stopping when exhausted one of
6073  * them */
6074  while (i_a < len_a && i_b < len_b) {
6075   UV cp;     /* The element to potentially add to the union's array */
6076   bool cp_in_set;   /* is it in the the input list's set or not */
6077
6078   /* We need to take one or the other of the two inputs for the union.
6079   * Since we are merging two sorted lists, we take the smaller of the
6080   * next items.  In case of a tie, we take the one that is in its set
6081   * first.  If we took one not in the set first, it would decrement the
6082   * count, possibly to 0 which would cause it to be output as ending the
6083   * range, and the next time through we would take the same number, and
6084   * output it again as beginning the next range.  By doing it the
6085   * opposite way, there is no possibility that the count will be
6086   * momentarily decremented to 0, and thus the two adjoining ranges will
6087   * be seamlessly merged.  (In a tie and both are in the set or both not
6088   * in the set, it doesn't matter which we take first.) */
6089   if (array_a[i_a] < array_b[i_b]
6090    || (array_a[i_a] == array_b[i_b] && ELEMENT_IN_INVLIST_SET(i_a)))
6091   {
6092    cp_in_set = ELEMENT_IN_INVLIST_SET(i_a);
6093    cp= array_a[i_a++];
6094   }
6095   else {
6096    cp_in_set = ELEMENT_IN_INVLIST_SET(i_b);
6097    cp= array_b[i_b++];
6098   }
6099
6100   /* Here, have chosen which of the two inputs to look at.  Only output
6101   * if the running count changes to/from 0, which marks the
6102   * beginning/end of a range in that's in the set */
6103   if (cp_in_set) {
6104    if (count == 0) {
6105     array_u[i_u++] = cp;
6106    }
6107    count++;
6108   }
6109   else {
6110    count--;
6111    if (count == 0) {
6112     array_u[i_u++] = cp;
6113    }
6114   }
6115  }
6116
6117  /* Here, we are finished going through at least one of the lists, which
6118  * means there is something remaining in at most one.  We check if the list
6119  * that hasn't been exhausted is positioned such that we are in the middle
6120  * of a range in its set or not.  (We are in the set if the next item in
6121  * the array marks the beginning of something not in the set)   If in the
6122  * set, we decrement 'count'; if 0, there is potentially more to output.
6123  * There are four cases:
6124  * 1) Both weren't in their sets, count is 0, and remains 0.  What's left
6125  *    in the union is entirely from the non-exhausted set.
6126  * 2) Both were in their sets, count is 2.  Nothing further should
6127  *    be output, as everything that remains will be in the exhausted
6128  *    list's set, hence in the union; decrementing to 1 but not 0 insures
6129  *    that
6130  * 3) the exhausted was in its set, non-exhausted isn't, count is 1.
6131  *    Nothing further should be output because the union includes
6132  *    everything from the exhausted set.  Not decrementing insures that.
6133  * 4) the exhausted wasn't in its set, non-exhausted is, count is 1;
6134  *    decrementing to 0 insures that we look at the remainder of the
6135  *    non-exhausted set */
6136  if ((i_a != len_a && ! ELEMENT_IN_INVLIST_SET(i_a))
6137   || (i_b != len_b && ! ELEMENT_IN_INVLIST_SET(i_b)))
6138  {
6139   count--;
6140  }
6141
6142  /* The final length is what we've output so far, plus what else is about to
6143  * be output.  (If 'count' is non-zero, then the input list we exhausted
6144  * has everything remaining up to the machine's limit in its set, and hence
6145  * in the union, so there will be no further output. */
6146  len_u = i_u;
6147  if (count == 0) {
6148   /* At most one of the subexpressions will be non-zero */
6149   len_u += (len_a - i_a) + (len_b - i_b);
6150  }
6151
6152  /* Set result to final length, which can change the pointer to array_u, so
6153  * re-find it */
6154  if (len_u != invlist_len(u)) {
6155   invlist_set_len(u, len_u);
6156   invlist_trim(u);
6157   array_u = invlist_array(u);
6158  }
6159
6160  /* When 'count' is 0, the list that was exhausted (if one was shorter than
6161  * the other) ended with everything above it not in its set.  That means
6162  * that the remaining part of the union is precisely the same as the
6163  * non-exhausted list, so can just copy it unchanged.  (If both list were
6164  * exhausted at the same time, then the operations below will be both 0.)
6165  */
6166  if (count == 0) {
6167   IV copy_count; /* At most one will have a non-zero copy count */
6168   if ((copy_count = len_a - i_a) > 0) {
6169    Copy(array_a + i_a, array_u + i_u, copy_count, UV);
6170   }
6171   else if ((copy_count = len_b - i_b) > 0) {
6172    Copy(array_b + i_b, array_u + i_u, copy_count, UV);
6173   }
6174  }
6175
6176  return u;
6177 }
6178
6179 STATIC HV*
6180 S_invlist_intersection(pTHX_ HV* const a, HV* const b)
6181 {
6182  /* Return the intersection of two inversion lists.  The basis for this
6183  * comes from "Unicode Demystified" Chapter 13 by Richard Gillam, published
6184  * by Addison-Wesley, and explained at some length there.  The preface says
6185  * to incorporate its examples into your code at your own risk.
6186  *
6187  * The algorithm is like a merge sort, and is essentially the same as the
6188  * union above
6189  */
6190
6191  UV* array_a = invlist_array(a);   /* a's array */
6192  UV* array_b = invlist_array(b);
6193  UV len_a = invlist_len(a); /* length of a's array */
6194  UV len_b = invlist_len(b);
6195
6196  HV* r;       /* the resulting intersection */
6197  UV* array_r;
6198  UV len_r;
6199
6200  UV i_a = 0;      /* current index into a's array */
6201  UV i_b = 0;
6202  UV i_r = 0;
6203
6204  /* running count, as explained in the algorithm source book; items are
6205  * stopped accumulating and are output when the count changes to/from 2.
6206  * The count is incremented when we start a range that's in the set, and
6207  * decremented when we start a range that's not in the set.  So its range
6208  * is 0 to 2.  Only when the count is 2 is something in the intersection.
6209  */
6210  UV count = 0;
6211
6212  PERL_ARGS_ASSERT_INVLIST_INTERSECTION;
6213
6214  /* Size the intersection for the worst case: that the intersection ends up
6215  * fragmenting everything to be completely disjoint */
6216  r= _new_invlist(len_a + len_b);
6217  array_r = invlist_array(r);
6218
6219  /* Go through each list item by item, stopping when exhausted one of
6220  * them */
6221  while (i_a < len_a && i_b < len_b) {
6222   UV cp;     /* The element to potentially add to the intersection's
6223      array */
6224   bool cp_in_set; /* Is it in the input list's set or not */
6225
6226   /* We need to take one or the other of the two inputs for the union.
6227   * Since we are merging two sorted lists, we take the smaller of the
6228   * next items.  In case of a tie, we take the one that is not in its
6229   * set first (a difference from the union algorithm).  If we took one
6230   * in the set first, it would increment the count, possibly to 2 which
6231   * would cause it to be output as starting a range in the intersection,
6232   * and the next time through we would take that same number, and output
6233   * it again as ending the set.  By doing it the opposite of this, we
6234   * there is no possibility that the count will be momentarily
6235   * incremented to 2.  (In a tie and both are in the set or both not in
6236   * the set, it doesn't matter which we take first.) */
6237   if (array_a[i_a] < array_b[i_b]
6238    || (array_a[i_a] == array_b[i_b] && ! ELEMENT_IN_INVLIST_SET(i_a)))
6239   {
6240    cp_in_set = ELEMENT_IN_INVLIST_SET(i_a);
6241    cp= array_a[i_a++];
6242   }
6243   else {
6244    cp_in_set = ELEMENT_IN_INVLIST_SET(i_b);
6245    cp= array_b[i_b++];
6246   }
6247
6248   /* Here, have chosen which of the two inputs to look at.  Only output
6249   * if the running count changes to/from 2, which marks the
6250   * beginning/end of a range that's in the intersection */
6251   if (cp_in_set) {
6252    count++;
6253    if (count == 2) {
6254     array_r[i_r++] = cp;
6255    }
6256   }
6257   else {
6258    if (count == 2) {
6259     array_r[i_r++] = cp;
6260    }
6261    count--;
6262   }
6263  }
6264
6265  /* Here, we are finished going through at least one of the sets, which
6266  * means there is something remaining in at most one.  See the comments in
6267  * the union code */
6268  if ((i_a != len_a && ! ELEMENT_IN_INVLIST_SET(i_a))
6269   || (i_b != len_b && ! ELEMENT_IN_INVLIST_SET(i_b)))
6270  {
6271   count--;
6272  }
6273
6274  /* The final length is what we've output so far plus what else is in the
6275  * intersection.  Only one of the subexpressions below will be non-zero */
6276  len_r = i_r;
6277  if (count == 2) {
6278   len_r += (len_a - i_a) + (len_b - i_b);
6279  }
6280
6281  /* Set result to final length, which can change the pointer to array_r, so
6282  * re-find it */
6283  if (len_r != invlist_len(r)) {
6284   invlist_set_len(r, len_r);
6285   invlist_trim(r);
6286   array_r = invlist_array(r);
6287  }
6288
6289  /* Finish outputting any remaining */
6290  if (count == 2) { /* Only one of will have a non-zero copy count */
6291   IV copy_count;
6292   if ((copy_count = len_a - i_a) > 0) {
6293    Copy(array_a + i_a, array_r + i_r, copy_count, UV);
6294   }
6295   else if ((copy_count = len_b - i_b) > 0) {
6296    Copy(array_b + i_b, array_r + i_r, copy_count, UV);
6297   }
6298  }
6299
6300  return r;
6301 }
6302
6303 STATIC HV*
6304 S_add_range_to_invlist(pTHX_ HV* invlist, const UV start, const UV end)
6305 {
6306  /* Add the range from 'start' to 'end' inclusive to the inversion list's
6307  * set.  A pointer to the inversion list is returned.  This may actually be
6308  * a new list, in which case the passed in one has been destroyed.  The
6309  * passed in inversion list can be NULL, in which case a new one is created
6310  * with just the one range in it */
6311
6312  HV* range_invlist;
6313  HV* added_invlist;
6314  UV len;
6315
6316  if (invlist == NULL) {
6317   invlist = _new_invlist(2);
6318   len = 0;
6319  }
6320  else {
6321   len = invlist_len(invlist);
6322  }
6323
6324  /* If comes after the final entry, can just append it to the end */
6325  if (len == 0
6326   || start >= invlist_array(invlist)
6327          [invlist_len(invlist) - 1])
6328  {
6329   _append_range_to_invlist(invlist, start, end);
6330   return invlist;
6331  }
6332
6333  /* Here, can't just append things, create and return a new inversion list
6334  * which is the union of this range and the existing inversion list */
6335  range_invlist = _new_invlist(2);
6336  _append_range_to_invlist(range_invlist, start, end);
6337
6338  added_invlist = invlist_union(invlist, range_invlist);
6339
6340  /* The passed in list can be freed, as well as our temporary */
6341  invlist_destroy(range_invlist);
6342  if (invlist != added_invlist) {
6343   invlist_destroy(invlist);
6344  }
6345
6346  return added_invlist;
6347 }
6348
6349 PERL_STATIC_INLINE HV*
6350 S_add_cp_to_invlist(pTHX_ HV* invlist, const UV cp) {
6351  return add_range_to_invlist(invlist, cp, cp);
6352 }
6353
6354 /* End of inversion list object */
6355
6356 /*
6357  - reg - regular expression, i.e. main body or parenthesized thing
6358  *
6359  * Caller must absorb opening parenthesis.
6360  *
6361  * Combining parenthesis handling with the base level of regular expression
6362  * is a trifle forced, but the need to tie the tails of the branches to what
6363  * follows makes it hard to avoid.
6364  */
6365 #define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1)
6366 #ifdef DEBUGGING
6367 #define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1)
6368 #else
6369 #define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
6370 #endif
6371
6372 STATIC regnode *
6373 S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
6374  /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
6375 {
6376  dVAR;
6377  register regnode *ret;  /* Will be the head of the group. */
6378  register regnode *br;
6379  register regnode *lastbr;
6380  register regnode *ender = NULL;
6381  register I32 parno = 0;
6382  I32 flags;
6383  U32 oregflags = RExC_flags;
6384  bool have_branch = 0;
6385  bool is_open = 0;
6386  I32 freeze_paren = 0;
6387  I32 after_freeze = 0;
6388
6389  /* for (?g), (?gc), and (?o) warnings; warning
6390  about (?c) will warn about (?g) -- japhy    */
6391
6392 #define WASTED_O  0x01
6393 #define WASTED_G  0x02
6394 #define WASTED_C  0x04
6395 #define WASTED_GC (0x02|0x04)
6396  I32 wastedflags = 0x00;
6397
6398  char * parse_start = RExC_parse; /* MJD */
6399  char * const oregcomp_parse = RExC_parse;
6400
6401  GET_RE_DEBUG_FLAGS_DECL;
6402
6403  PERL_ARGS_ASSERT_REG;
6404  DEBUG_PARSE("reg ");
6405
6406  *flagp = 0;    /* Tentatively. */
6407
6408
6409  /* Make an OPEN node, if parenthesized. */
6410  if (paren) {
6411   if ( *RExC_parse == '*') { /* (*VERB:ARG) */
6412    char *start_verb = RExC_parse;
6413    STRLEN verb_len = 0;
6414    char *start_arg = NULL;
6415    unsigned char op = 0;
6416    int argok = 1;
6417    int internal_argval = 0; /* internal_argval is only useful if !argok */
6418    while ( *RExC_parse && *RExC_parse != ')' ) {
6419     if ( *RExC_parse == ':' ) {
6420      start_arg = RExC_parse + 1;
6421      break;
6422     }
6423     RExC_parse++;
6424    }
6425    ++start_verb;
6426    verb_len = RExC_parse - start_verb;
6427    if ( start_arg ) {
6428     RExC_parse++;
6429     while ( *RExC_parse && *RExC_parse != ')' )
6430      RExC_parse++;
6431     if ( *RExC_parse != ')' )
6432      vFAIL("Unterminated verb pattern argument");
6433     if ( RExC_parse == start_arg )
6434      start_arg = NULL;
6435    } else {
6436     if ( *RExC_parse != ')' )
6437      vFAIL("Unterminated verb pattern");
6438    }
6439
6440    switch ( *start_verb ) {
6441    case 'A':  /* (*ACCEPT) */
6442     if ( memEQs(start_verb,verb_len,"ACCEPT") ) {
6443      op = ACCEPT;
6444      internal_argval = RExC_nestroot;
6445     }
6446     break;
6447    case 'C':  /* (*COMMIT) */
6448     if ( memEQs(start_verb,verb_len,"COMMIT") )
6449      op = COMMIT;
6450     break;
6451    case 'F':  /* (*FAIL) */
6452     if ( verb_len==1 || memEQs(start_verb,verb_len,"FAIL") ) {
6453      op = OPFAIL;
6454      argok = 0;
6455     }
6456     break;
6457    case ':':  /* (*:NAME) */
6458    case 'M':  /* (*MARK:NAME) */
6459     if ( verb_len==0 || memEQs(start_verb,verb_len,"MARK") ) {
6460      op = MARKPOINT;
6461      argok = -1;
6462     }
6463     break;
6464    case 'P':  /* (*PRUNE) */
6465     if ( memEQs(start_verb,verb_len,"PRUNE") )
6466      op = PRUNE;
6467     break;
6468    case 'S':   /* (*SKIP) */
6469     if ( memEQs(start_verb,verb_len,"SKIP") )
6470      op = SKIP;
6471     break;
6472    case 'T':  /* (*THEN) */
6473     /* [19:06] <TimToady> :: is then */
6474     if ( memEQs(start_verb,verb_len,"THEN") ) {
6475      op = CUTGROUP;
6476      RExC_seen |= REG_SEEN_CUTGROUP;
6477     }
6478     break;
6479    }
6480    if ( ! op ) {
6481     RExC_parse++;
6482     vFAIL3("Unknown verb pattern '%.*s'",
6483      verb_len, start_verb);
6484    }
6485    if ( argok ) {
6486     if ( start_arg && internal_argval ) {
6487      vFAIL3("Verb pattern '%.*s' may not have an argument",
6488       verb_len, start_verb);
6489     } else if ( argok < 0 && !start_arg ) {
6490      vFAIL3("Verb pattern '%.*s' has a mandatory argument",
6491       verb_len, start_verb);
6492     } else {
6493      ret = reganode(pRExC_state, op, internal_argval);
6494      if ( ! internal_argval && ! SIZE_ONLY ) {
6495       if (start_arg) {
6496        SV *sv = newSVpvn( start_arg, RExC_parse - start_arg);
6497        ARG(ret) = add_data( pRExC_state, 1, "S" );
6498        RExC_rxi->data->data[ARG(ret)]=(void*)sv;
6499        ret->flags = 0;
6500       } else {
6501        ret->flags = 1;
6502       }
6503      }
6504     }
6505     if (!internal_argval)
6506      RExC_seen |= REG_SEEN_VERBARG;
6507    } else if ( start_arg ) {
6508     vFAIL3("Verb pattern '%.*s' may not have an argument",
6509       verb_len, start_verb);
6510    } else {
6511     ret = reg_node(pRExC_state, op);
6512    }
6513    nextchar(pRExC_state);
6514    return ret;
6515   } else
6516   if (*RExC_parse == '?') { /* (?...) */
6517    bool is_logical = 0;
6518    const char * const seqstart = RExC_parse;
6519    bool has_use_defaults = FALSE;
6520
6521    RExC_parse++;
6522    paren = *RExC_parse++;
6523    ret = NULL;   /* For look-ahead/behind. */
6524    switch (paren) {
6525
6526    case 'P': /* (?P...) variants for those used to PCRE/Python */
6527     paren = *RExC_parse++;
6528     if ( paren == '<')         /* (?P<...>) named capture */
6529      goto named_capture;
6530     else if (paren == '>') {   /* (?P>name) named recursion */
6531      goto named_recursion;
6532     }
6533     else if (paren == '=') {   /* (?P=...)  named backref */
6534      /* this pretty much dupes the code for \k<NAME> in regatom(), if
6535      you change this make sure you change that */
6536      char* name_start = RExC_parse;
6537      U32 num = 0;
6538      SV *sv_dat = reg_scan_name(pRExC_state,
6539       SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
6540      if (RExC_parse == name_start || *RExC_parse != ')')
6541       vFAIL2("Sequence %.3s... not terminated",parse_start);
6542
6543      if (!SIZE_ONLY) {
6544       num = add_data( pRExC_state, 1, "S" );
6545       RExC_rxi->data->data[num]=(void*)sv_dat;
6546       SvREFCNT_inc_simple_void(sv_dat);
6547      }
6548      RExC_sawback = 1;
6549      ret = reganode(pRExC_state,
6550         ((! FOLD)
6551          ? NREF
6552          : (MORE_ASCII_RESTRICTED)
6553          ? NREFFA
6554          : (AT_LEAST_UNI_SEMANTICS)
6555           ? NREFFU
6556           : (LOC)
6557           ? NREFFL
6558           : NREFF),
6559          num);
6560      *flagp |= HASWIDTH;
6561
6562      Set_Node_Offset(ret, parse_start+1);
6563      Set_Node_Cur_Length(ret); /* MJD */
6564
6565      nextchar(pRExC_state);
6566      return ret;
6567     }
6568     RExC_parse++;
6569     vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
6570     /*NOTREACHED*/
6571    case '<':           /* (?<...) */
6572     if (*RExC_parse == '!')
6573      paren = ',';
6574     else if (*RExC_parse != '=')
6575    named_capture:
6576     {               /* (?<...>) */
6577      char *name_start;
6578      SV *svname;
6579      paren= '>';
6580    case '\'':          /* (?'...') */
6581       name_start= RExC_parse;
6582       svname = reg_scan_name(pRExC_state,
6583        SIZE_ONLY ?  /* reverse test from the others */
6584        REG_RSN_RETURN_NAME :
6585        REG_RSN_RETURN_NULL);
6586      if (RExC_parse == name_start) {
6587       RExC_parse++;
6588       vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
6589       /*NOTREACHED*/
6590      }
6591      if (*RExC_parse != paren)
6592       vFAIL2("Sequence (?%c... not terminated",
6593        paren=='>' ? '<' : paren);
6594      if (SIZE_ONLY) {
6595       HE *he_str;
6596       SV *sv_dat = NULL;
6597       if (!svname) /* shouldn't happen */
6598        Perl_croak(aTHX_
6599         "panic: reg_scan_name returned NULL");
6600       if (!RExC_paren_names) {
6601        RExC_paren_names= newHV();
6602        sv_2mortal(MUTABLE_SV(RExC_paren_names));
6603 #ifdef DEBUGGING
6604        RExC_paren_name_list= newAV();
6605        sv_2mortal(MUTABLE_SV(RExC_paren_name_list));
6606 #endif
6607       }
6608       he_str = hv_fetch_ent( RExC_paren_names, svname, 1, 0 );
6609       if ( he_str )
6610        sv_dat = HeVAL(he_str);
6611       if ( ! sv_dat ) {
6612        /* croak baby croak */
6613        Perl_croak(aTHX_
6614         "panic: paren_name hash element allocation failed");
6615       } else if ( SvPOK(sv_dat) ) {
6616        /* (?|...) can mean we have dupes so scan to check
6617        its already been stored. Maybe a flag indicating
6618        we are inside such a construct would be useful,
6619        but the arrays are likely to be quite small, so
6620        for now we punt -- dmq */
6621        IV count = SvIV(sv_dat);
6622        I32 *pv = (I32*)SvPVX(sv_dat);
6623        IV i;
6624        for ( i = 0 ; i < count ; i++ ) {
6625         if ( pv[i] == RExC_npar ) {
6626          count = 0;
6627          break;
6628         }
6629        }
6630        if ( count ) {
6631         pv = (I32*)SvGROW(sv_dat, SvCUR(sv_dat) + sizeof(I32)+1);
6632         SvCUR_set(sv_dat, SvCUR(sv_dat) + sizeof(I32));
6633         pv[count] = RExC_npar;
6634         SvIV_set(sv_dat, SvIVX(sv_dat) + 1);
6635        }
6636       } else {
6637        (void)SvUPGRADE(sv_dat,SVt_PVNV);
6638        sv_setpvn(sv_dat, (char *)&(RExC_npar), sizeof(I32));
6639        SvIOK_on(sv_dat);
6640        SvIV_set(sv_dat, 1);
6641       }
6642 #ifdef DEBUGGING
6643       if (!av_store(RExC_paren_name_list, RExC_npar, SvREFCNT_inc(svname)))
6644        SvREFCNT_dec(svname);
6645 #endif
6646
6647       /*sv_dump(sv_dat);*/
6648      }
6649      nextchar(pRExC_state);
6650      paren = 1;
6651      goto capturing_parens;
6652     }
6653     RExC_seen |= REG_SEEN_LOOKBEHIND;
6654     RExC_in_lookbehind++;
6655     RExC_parse++;
6656    case '=':           /* (?=...) */
6657     RExC_seen_zerolen++;
6658     break;
6659    case '!':           /* (?!...) */
6660     RExC_seen_zerolen++;
6661     if (*RExC_parse == ')') {
6662      ret=reg_node(pRExC_state, OPFAIL);
6663      nextchar(pRExC_state);
6664      return ret;
6665     }
6666     break;
6667    case '|':           /* (?|...) */
6668     /* branch reset, behave like a (?:...) except that
6669     buffers in alternations share the same numbers */
6670     paren = ':';
6671     after_freeze = freeze_paren = RExC_npar;
6672     break;
6673    case ':':           /* (?:...) */
6674    case '>':           /* (?>...) */
6675     break;
6676    case '$':           /* (?$...) */
6677    case '@':           /* (?@...) */
6678     vFAIL2("Sequence (?%c...) not implemented", (int)paren);
6679     break;
6680    case '#':           /* (?#...) */
6681     while (*RExC_parse && *RExC_parse != ')')
6682      RExC_parse++;
6683     if (*RExC_parse != ')')
6684      FAIL("Sequence (?#... not terminated");
6685     nextchar(pRExC_state);
6686     *flagp = TRYAGAIN;
6687     return NULL;
6688    case '0' :           /* (?0) */
6689    case 'R' :           /* (?R) */
6690     if (*RExC_parse != ')')
6691      FAIL("Sequence (?R) not terminated");
6692     ret = reg_node(pRExC_state, GOSTART);
6693     *flagp |= POSTPONED;
6694     nextchar(pRExC_state);
6695     return ret;
6696     /*notreached*/
6697    { /* named and numeric backreferences */
6698     I32 num;
6699    case '&':            /* (?&NAME) */
6700     parse_start = RExC_parse - 1;
6701    named_recursion:
6702     {
6703       SV *sv_dat = reg_scan_name(pRExC_state,
6704        SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
6705       num = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
6706     }
6707     goto gen_recurse_regop;
6708     /* NOT REACHED */
6709    case '+':
6710     if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
6711      RExC_parse++;
6712      vFAIL("Illegal pattern");
6713     }
6714     goto parse_recursion;
6715     /* NOT REACHED*/
6716    case '-': /* (?-1) */
6717     if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
6718      RExC_parse--; /* rewind to let it be handled later */
6719      goto parse_flags;
6720     }
6721     /*FALLTHROUGH */
6722    case '1': case '2': case '3': case '4': /* (?1) */
6723    case '5': case '6': case '7': case '8': case '9':
6724     RExC_parse--;
6725    parse_recursion:
6726     num = atoi(RExC_parse);
6727     parse_start = RExC_parse - 1; /* MJD */
6728     if (*RExC_parse == '-')
6729      RExC_parse++;
6730     while (isDIGIT(*RExC_parse))
6731       RExC_parse++;
6732     if (*RExC_parse!=')')
6733      vFAIL("Expecting close bracket");
6734
6735    gen_recurse_regop:
6736     if ( paren == '-' ) {
6737      /*
6738      Diagram of capture buffer numbering.
6739      Top line is the normal capture buffer numbers
6740      Bottom line is the negative indexing as from
6741      the X (the (?-2))
6742
6743      +   1 2    3 4 5 X          6 7
6744      /(a(x)y)(a(b(c(?-2)d)e)f)(g(h))/
6745      -   5 4    3 2 1 X          x x
6746
6747      */
6748      num = RExC_npar + num;
6749      if (num < 1)  {
6750       RExC_parse++;
6751       vFAIL("Reference to nonexistent group");
6752      }
6753     } else if ( paren == '+' ) {
6754      num = RExC_npar + num - 1;
6755     }
6756
6757     ret = reganode(pRExC_state, GOSUB, num);
6758     if (!SIZE_ONLY) {
6759      if (num > (I32)RExC_rx->nparens) {
6760       RExC_parse++;
6761       vFAIL("Reference to nonexistent group");
6762      }
6763      ARG2L_SET( ret, RExC_recurse_count++);
6764      RExC_emit++;
6765      DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
6766       "Recurse #%"UVuf" to %"IVdf"\n", (UV)ARG(ret), (IV)ARG2L(ret)));
6767     } else {
6768      RExC_size++;
6769      }
6770      RExC_seen |= REG_SEEN_RECURSE;
6771     Set_Node_Length(ret, 1 + regarglen[OP(ret)]); /* MJD */
6772     Set_Node_Offset(ret, parse_start); /* MJD */
6773
6774     *flagp |= POSTPONED;
6775     nextchar(pRExC_state);
6776     return ret;
6777    } /* named and numeric backreferences */
6778    /* NOT REACHED */
6779
6780    case '?':           /* (??...) */
6781     is_logical = 1;
6782     if (*RExC_parse != '{') {
6783      RExC_parse++;
6784      vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
6785      /*NOTREACHED*/
6786     }
6787     *flagp |= POSTPONED;
6788     paren = *RExC_parse++;
6789     /* FALL THROUGH */
6790    case '{':           /* (?{...}) */
6791    {
6792     I32 count = 1;
6793     U32 n = 0;
6794     char c;
6795     char *s = RExC_parse;
6796
6797     RExC_seen_zerolen++;
6798     RExC_seen |= REG_SEEN_EVAL;
6799     while (count && (c = *RExC_parse)) {
6800      if (c == '\\') {
6801       if (RExC_parse[1])
6802        RExC_parse++;
6803      }
6804      else if (c == '{')
6805       count++;
6806      else if (c == '}')
6807       count--;
6808      RExC_parse++;
6809     }
6810     if (*RExC_parse != ')') {
6811      RExC_parse = s;
6812      vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
6813     }
6814     if (!SIZE_ONLY) {
6815      PAD *pad;
6816      OP_4tree *sop, *rop;
6817      SV * const sv = newSVpvn(s, RExC_parse - 1 - s);
6818
6819      ENTER;
6820      Perl_save_re_context(aTHX);
6821      rop = Perl_sv_compile_2op_is_broken(aTHX_ sv, &sop, "re", &pad);
6822      sop->op_private |= OPpREFCOUNTED;
6823      /* re_dup will OpREFCNT_inc */
6824      OpREFCNT_set(sop, 1);
6825      LEAVE;
6826
6827      n = add_data(pRExC_state, 3, "nop");
6828      RExC_rxi->data->data[n] = (void*)rop;
6829      RExC_rxi->data->data[n+1] = (void*)sop;
6830      RExC_rxi->data->data[n+2] = (void*)pad;
6831      SvREFCNT_dec(sv);
6832     }
6833     else {      /* First pass */
6834      if (PL_reginterp_cnt < ++RExC_seen_evals
6835       && IN_PERL_RUNTIME)
6836       /* No compiled RE interpolated, has runtime
6837       components ===> unsafe.  */
6838       FAIL("Eval-group not allowed at runtime, use re 'eval'");
6839      if (PL_tainting && PL_tainted)
6840       FAIL("Eval-group in insecure regular expression");
6841 #if PERL_VERSION > 8
6842      if (IN_PERL_COMPILETIME)
6843       PL_cv_has_eval = 1;
6844 #endif
6845     }
6846
6847     nextchar(pRExC_state);
6848     if (is_logical) {
6849      ret = reg_node(pRExC_state, LOGICAL);
6850      if (!SIZE_ONLY)
6851       ret->flags = 2;
6852      REGTAIL(pRExC_state, ret, reganode(pRExC_state, EVAL, n));
6853      /* deal with the length of this later - MJD */
6854      return ret;
6855     }
6856     ret = reganode(pRExC_state, EVAL, n);
6857     Set_Node_Length(ret, RExC_parse - parse_start + 1);
6858     Set_Node_Offset(ret, parse_start);
6859     return ret;
6860    }
6861    case '(':           /* (?(?{...})...) and (?(?=...)...) */
6862    {
6863     int is_define= 0;
6864     if (RExC_parse[0] == '?') {        /* (?(?...)) */
6865      if (RExC_parse[1] == '=' || RExC_parse[1] == '!'
6866       || RExC_parse[1] == '<'
6867       || RExC_parse[1] == '{') { /* Lookahead or eval. */
6868       I32 flag;
6869
6870       ret = reg_node(pRExC_state, LOGICAL);
6871       if (!SIZE_ONLY)
6872        ret->flags = 1;
6873       REGTAIL(pRExC_state, ret, reg(pRExC_state, 1, &flag,depth+1));
6874       goto insert_if;
6875      }
6876     }
6877     else if ( RExC_parse[0] == '<'     /* (?(<NAME>)...) */
6878       || RExC_parse[0] == '\'' ) /* (?('NAME')...) */
6879     {
6880      char ch = RExC_parse[0] == '<' ? '>' : '\'';
6881      char *name_start= RExC_parse++;
6882      U32 num = 0;
6883      SV *sv_dat=reg_scan_name(pRExC_state,
6884       SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
6885      if (RExC_parse == name_start || *RExC_parse != ch)
6886       vFAIL2("Sequence (?(%c... not terminated",
6887        (ch == '>' ? '<' : ch));
6888      RExC_parse++;
6889      if (!SIZE_ONLY) {
6890       num = add_data( pRExC_state, 1, "S" );
6891       RExC_rxi->data->data[num]=(void*)sv_dat;
6892       SvREFCNT_inc_simple_void(sv_dat);
6893      }
6894      ret = reganode(pRExC_state,NGROUPP,num);
6895      goto insert_if_check_paren;
6896     }
6897     else if (RExC_parse[0] == 'D' &&
6898       RExC_parse[1] == 'E' &&
6899       RExC_parse[2] == 'F' &&
6900       RExC_parse[3] == 'I' &&
6901       RExC_parse[4] == 'N' &&
6902       RExC_parse[5] == 'E')
6903     {
6904      ret = reganode(pRExC_state,DEFINEP,0);
6905      RExC_parse +=6 ;
6906      is_define = 1;
6907      goto insert_if_check_paren;
6908     }
6909     else if (RExC_parse[0] == 'R') {
6910      RExC_parse++;
6911      parno = 0;
6912      if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
6913       parno = atoi(RExC_parse++);
6914       while (isDIGIT(*RExC_parse))
6915        RExC_parse++;
6916      } else if (RExC_parse[0] == '&') {
6917       SV *sv_dat;
6918       RExC_parse++;
6919       sv_dat = reg_scan_name(pRExC_state,
6920         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
6921        parno = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
6922      }
6923      ret = reganode(pRExC_state,INSUBP,parno);
6924      goto insert_if_check_paren;
6925     }
6926     else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
6927      /* (?(1)...) */
6928      char c;
6929      parno = atoi(RExC_parse++);
6930
6931      while (isDIGIT(*RExC_parse))
6932       RExC_parse++;
6933      ret = reganode(pRExC_state, GROUPP, parno);
6934
6935     insert_if_check_paren:
6936      if ((c = *nextchar(pRExC_state)) != ')')
6937       vFAIL("Switch condition not recognized");
6938     insert_if:
6939      REGTAIL(pRExC_state, ret, reganode(pRExC_state, IFTHEN, 0));
6940      br = regbranch(pRExC_state, &flags, 1,depth+1);
6941      if (br == NULL)
6942       br = reganode(pRExC_state, LONGJMP, 0);
6943      else
6944       REGTAIL(pRExC_state, br, reganode(pRExC_state, LONGJMP, 0));
6945      c = *nextchar(pRExC_state);
6946      if (flags&HASWIDTH)
6947       *flagp |= HASWIDTH;
6948      if (c == '|') {
6949       if (is_define)
6950        vFAIL("(?(DEFINE)....) does not allow branches");
6951       lastbr = reganode(pRExC_state, IFTHEN, 0); /* Fake one for optimizer. */
6952       regbranch(pRExC_state, &flags, 1,depth+1);
6953       REGTAIL(pRExC_state, ret, lastbr);
6954       if (flags&HASWIDTH)
6955        *flagp |= HASWIDTH;
6956       c = *nextchar(pRExC_state);
6957      }
6958      else
6959       lastbr = NULL;
6960      if (c != ')')
6961       vFAIL("Switch (?(condition)... contains too many branches");
6962      ender = reg_node(pRExC_state, TAIL);
6963      REGTAIL(pRExC_state, br, ender);
6964      if (lastbr) {
6965       REGTAIL(pRExC_state, lastbr, ender);
6966       REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
6967      }
6968      else
6969       REGTAIL(pRExC_state, ret, ender);
6970      RExC_size++; /* XXX WHY do we need this?!!
6971          For large programs it seems to be required
6972          but I can't figure out why. -- dmq*/
6973      return ret;
6974     }
6975     else {
6976      vFAIL2("Unknown switch condition (?(%.2s", RExC_parse);
6977     }
6978    }
6979    case 0:
6980     RExC_parse--; /* for vFAIL to print correctly */
6981     vFAIL("Sequence (? incomplete");
6982     break;
6983    case DEFAULT_PAT_MOD:   /* Use default flags with the exceptions
6984          that follow */
6985     has_use_defaults = TRUE;
6986     STD_PMMOD_FLAGS_CLEAR(&RExC_flags);
6987     set_regex_charset(&RExC_flags, (RExC_utf8 || RExC_uni_semantics)
6988             ? REGEX_UNICODE_CHARSET
6989             : REGEX_DEPENDS_CHARSET);
6990     goto parse_flags;
6991    default:
6992     --RExC_parse;
6993     parse_flags:      /* (?i) */
6994    {
6995     U32 posflags = 0, negflags = 0;
6996     U32 *flagsp = &posflags;
6997     char has_charset_modifier = '\0';
6998     regex_charset cs = (RExC_utf8 || RExC_uni_semantics)
6999          ? REGEX_UNICODE_CHARSET
7000          : REGEX_DEPENDS_CHARSET;
7001
7002     while (*RExC_parse) {
7003      /* && strchr("iogcmsx", *RExC_parse) */
7004      /* (?g), (?gc) and (?o) are useless here
7005      and must be globally applied -- japhy */
7006      switch (*RExC_parse) {
7007      CASE_STD_PMMOD_FLAGS_PARSE_SET(flagsp);
7008      case LOCALE_PAT_MOD:
7009       if (has_charset_modifier) {
7010        goto excess_modifier;
7011       }
7012       else if (flagsp == &negflags) {
7013        goto neg_modifier;
7014       }
7015       cs = REGEX_LOCALE_CHARSET;
7016       has_charset_modifier = LOCALE_PAT_MOD;
7017       RExC_contains_locale = 1;
7018       break;
7019      case UNICODE_PAT_MOD:
7020       if (has_charset_modifier) {
7021        goto excess_modifier;
7022       }
7023       else if (flagsp == &negflags) {
7024        goto neg_modifier;
7025       }
7026       cs = REGEX_UNICODE_CHARSET;
7027       has_charset_modifier = UNICODE_PAT_MOD;
7028       break;
7029      case ASCII_RESTRICT_PAT_MOD:
7030       if (flagsp == &negflags) {
7031        goto neg_modifier;
7032       }
7033       if (has_charset_modifier) {
7034        if (cs != REGEX_ASCII_RESTRICTED_CHARSET) {
7035         goto excess_modifier;
7036        }
7037        /* Doubled modifier implies more restricted */
7038        cs = REGEX_ASCII_MORE_RESTRICTED_CHARSET;
7039       }
7040       else {
7041        cs = REGEX_ASCII_RESTRICTED_CHARSET;
7042       }
7043       has_charset_modifier = ASCII_RESTRICT_PAT_MOD;
7044       break;
7045      case DEPENDS_PAT_MOD:
7046       if (has_use_defaults) {
7047        goto fail_modifiers;
7048       }
7049       else if (flagsp == &negflags) {
7050        goto neg_modifier;
7051       }
7052       else if (has_charset_modifier) {
7053        goto excess_modifier;
7054       }
7055
7056       /* The dual charset means unicode semantics if the
7057       * pattern (or target, not known until runtime) are
7058       * utf8, or something in the pattern indicates unicode
7059       * semantics */
7060       cs = (RExC_utf8 || RExC_uni_semantics)
7061        ? REGEX_UNICODE_CHARSET
7062        : REGEX_DEPENDS_CHARSET;
7063       has_charset_modifier = DEPENDS_PAT_MOD;
7064       break;
7065      excess_modifier:
7066       RExC_parse++;
7067       if (has_charset_modifier == ASCII_RESTRICT_PAT_MOD) {
7068        vFAIL2("Regexp modifier \"%c\" may appear a maximum of twice", ASCII_RESTRICT_PAT_MOD);
7069       }
7070       else if (has_charset_modifier == *(RExC_parse - 1)) {
7071        vFAIL2("Regexp modifier \"%c\" may not appear twice", *(RExC_parse - 1));
7072       }
7073       else {
7074        vFAIL3("Regexp modifiers \"%c\" and \"%c\" are mutually exclusive", has_charset_modifier, *(RExC_parse - 1));
7075       }
7076       /*NOTREACHED*/
7077      neg_modifier:
7078       RExC_parse++;
7079       vFAIL2("Regexp modifier \"%c\" may not appear after the \"-\"", *(RExC_parse - 1));
7080       /*NOTREACHED*/
7081      case ONCE_PAT_MOD: /* 'o' */
7082      case GLOBAL_PAT_MOD: /* 'g' */
7083       if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
7084        const I32 wflagbit = *RExC_parse == 'o' ? WASTED_O : WASTED_G;
7085        if (! (wastedflags & wflagbit) ) {
7086         wastedflags |= wflagbit;
7087         vWARN5(
7088          RExC_parse + 1,
7089          "Useless (%s%c) - %suse /%c modifier",
7090          flagsp == &negflags ? "?-" : "?",
7091          *RExC_parse,
7092          flagsp == &negflags ? "don't " : "",
7093          *RExC_parse
7094         );
7095        }
7096       }
7097       break;
7098
7099      case CONTINUE_PAT_MOD: /* 'c' */
7100       if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
7101        if (! (wastedflags & WASTED_C) ) {
7102         wastedflags |= WASTED_GC;
7103         vWARN3(
7104          RExC_parse + 1,
7105          "Useless (%sc) - %suse /gc modifier",
7106          flagsp == &negflags ? "?-" : "?",
7107          flagsp == &negflags ? "don't " : ""
7108         );
7109        }
7110       }
7111       break;
7112      case KEEPCOPY_PAT_MOD: /* 'p' */
7113       if (flagsp == &negflags) {
7114        if (SIZE_ONLY)
7115         ckWARNreg(RExC_parse + 1,"Useless use of (?-p)");
7116       } else {
7117        *flagsp |= RXf_PMf_KEEPCOPY;
7118       }
7119       break;
7120      case '-':
7121       /* A flag is a default iff it is following a minus, so
7122       * if there is a minus, it means will be trying to
7123       * re-specify a default which is an error */
7124       if (has_use_defaults || flagsp == &negflags) {
7125    fail_modifiers:
7126        RExC_parse++;
7127        vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
7128        /*NOTREACHED*/
7129       }
7130       flagsp = &negflags;
7131       wastedflags = 0;  /* reset so (?g-c) warns twice */
7132       break;
7133      case ':':
7134       paren = ':';
7135       /*FALLTHROUGH*/
7136      case ')':
7137       RExC_flags |= posflags;
7138       RExC_flags &= ~negflags;
7139       set_regex_charset(&RExC_flags, cs);
7140       if (paren != ':') {
7141        oregflags |= posflags;
7142        oregflags &= ~negflags;
7143        set_regex_charset(&oregflags, cs);
7144       }
7145       nextchar(pRExC_state);
7146       if (paren != ':') {
7147        *flagp = TRYAGAIN;
7148        return NULL;
7149       } else {
7150        ret = NULL;
7151        goto parse_rest;
7152       }
7153       /*NOTREACHED*/
7154      default:
7155       RExC_parse++;
7156       vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
7157       /*NOTREACHED*/
7158      }
7159      ++RExC_parse;
7160     }
7161    }} /* one for the default block, one for the switch */
7162   }
7163   else {                  /* (...) */
7164   capturing_parens:
7165    parno = RExC_npar;
7166    RExC_npar++;
7167
7168    ret = reganode(pRExC_state, OPEN, parno);
7169    if (!SIZE_ONLY ){
7170     if (!RExC_nestroot)
7171      RExC_nestroot = parno;
7172     if (RExC_seen & REG_SEEN_RECURSE
7173      && !RExC_open_parens[parno-1])
7174     {
7175      DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
7176       "Setting open paren #%"IVdf" to %d\n",
7177       (IV)parno, REG_NODE_NUM(ret)));
7178      RExC_open_parens[parno-1]= ret;
7179     }
7180    }
7181    Set_Node_Length(ret, 1); /* MJD */
7182    Set_Node_Offset(ret, RExC_parse); /* MJD */
7183    is_open = 1;
7184   }
7185  }
7186  else                        /* ! paren */
7187   ret = NULL;
7188
7189    parse_rest:
7190  /* Pick up the branches, linking them together. */
7191  parse_start = RExC_parse;   /* MJD */
7192  br = regbranch(pRExC_state, &flags, 1,depth+1);
7193
7194  /*     branch_len = (paren != 0); */
7195
7196  if (br == NULL)
7197   return(NULL);
7198  if (*RExC_parse == '|') {
7199   if (!SIZE_ONLY && RExC_extralen) {
7200    reginsert(pRExC_state, BRANCHJ, br, depth+1);
7201   }
7202   else {                  /* MJD */
7203    reginsert(pRExC_state, BRANCH, br, depth+1);
7204    Set_Node_Length(br, paren != 0);
7205    Set_Node_Offset_To_R(br-RExC_emit_start, parse_start-RExC_start);
7206   }
7207   have_branch = 1;
7208   if (SIZE_ONLY)
7209    RExC_extralen += 1;  /* For BRANCHJ-BRANCH. */
7210  }
7211  else if (paren == ':') {
7212   *flagp |= flags&SIMPLE;
7213  }
7214  if (is_open) {    /* Starts with OPEN. */
7215   REGTAIL(pRExC_state, ret, br);          /* OPEN -> first. */
7216  }
7217  else if (paren != '?')  /* Not Conditional */
7218   ret = br;
7219  *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
7220  lastbr = br;
7221  while (*RExC_parse == '|') {
7222   if (!SIZE_ONLY && RExC_extralen) {
7223    ender = reganode(pRExC_state, LONGJMP,0);
7224    REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
7225   }
7226   if (SIZE_ONLY)
7227    RExC_extralen += 2;  /* Account for LONGJMP. */
7228   nextchar(pRExC_state);
7229   if (freeze_paren) {
7230    if (RExC_npar > after_freeze)
7231     after_freeze = RExC_npar;
7232    RExC_npar = freeze_paren;
7233   }
7234   br = regbranch(pRExC_state, &flags, 0, depth+1);
7235
7236   if (br == NULL)
7237    return(NULL);
7238   REGTAIL(pRExC_state, lastbr, br);               /* BRANCH -> BRANCH. */
7239   lastbr = br;
7240   *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
7241  }
7242
7243  if (have_branch || paren != ':') {
7244   /* Make a closing node, and hook it on the end. */
7245   switch (paren) {
7246   case ':':
7247    ender = reg_node(pRExC_state, TAIL);
7248    break;
7249   case 1:
7250    ender = reganode(pRExC_state, CLOSE, parno);
7251    if (!SIZE_ONLY && RExC_seen & REG_SEEN_RECURSE) {
7252     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
7253       "Setting close paren #%"IVdf" to %d\n",
7254       (IV)parno, REG_NODE_NUM(ender)));
7255     RExC_close_parens[parno-1]= ender;
7256     if (RExC_nestroot == parno)
7257      RExC_nestroot = 0;
7258    }
7259    Set_Node_Offset(ender,RExC_parse+1); /* MJD */
7260    Set_Node_Length(ender,1); /* MJD */
7261    break;
7262   case '<':
7263   case ',':
7264   case '=':
7265   case '!':
7266    *flagp &= ~HASWIDTH;
7267    /* FALL THROUGH */
7268   case '>':
7269    ender = reg_node(pRExC_state, SUCCEED);
7270    break;
7271   case 0:
7272    ender = reg_node(pRExC_state, END);
7273    if (!SIZE_ONLY) {
7274     assert(!RExC_opend); /* there can only be one! */
7275     RExC_opend = ender;
7276    }
7277    break;
7278   }
7279   REGTAIL(pRExC_state, lastbr, ender);
7280
7281   if (have_branch && !SIZE_ONLY) {
7282    if (depth==1)
7283     RExC_seen |= REG_TOP_LEVEL_BRANCHES;
7284
7285    /* Hook the tails of the branches to the closing node. */
7286    for (br = ret; br; br = regnext(br)) {
7287     const U8 op = PL_regkind[OP(br)];
7288     if (op == BRANCH) {
7289      REGTAIL_STUDY(pRExC_state, NEXTOPER(br), ender);
7290     }
7291     else if (op == BRANCHJ) {
7292      REGTAIL_STUDY(pRExC_state, NEXTOPER(NEXTOPER(br)), ender);
7293     }
7294    }
7295   }
7296  }
7297
7298  {
7299   const char *p;
7300   static const char parens[] = "=!<,>";
7301
7302   if (paren && (p = strchr(parens, paren))) {
7303    U8 node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
7304    int flag = (p - parens) > 1;
7305
7306    if (paren == '>')
7307     node = SUSPEND, flag = 0;
7308    reginsert(pRExC_state, node,ret, depth+1);
7309    Set_Node_Cur_Length(ret);
7310    Set_Node_Offset(ret, parse_start + 1);
7311    ret->flags = flag;
7312    REGTAIL_STUDY(pRExC_state, ret, reg_node(pRExC_state, TAIL));
7313   }
7314  }
7315
7316  /* Check for proper termination. */
7317  if (paren) {
7318   RExC_flags = oregflags;
7319   if (RExC_parse >= RExC_end || *nextchar(pRExC_state) != ')') {
7320    RExC_parse = oregcomp_parse;
7321    vFAIL("Unmatched (");
7322   }
7323  }
7324  else if (!paren && RExC_parse < RExC_end) {
7325   if (*RExC_parse == ')') {
7326    RExC_parse++;
7327    vFAIL("Unmatched )");
7328   }
7329   else
7330    FAIL("Junk on end of regexp"); /* "Can't happen". */
7331   /* NOTREACHED */
7332  }
7333
7334  if (RExC_in_lookbehind) {
7335   RExC_in_lookbehind--;
7336  }
7337  if (after_freeze > RExC_npar)
7338   RExC_npar = after_freeze;
7339  return(ret);
7340 }
7341
7342 /*
7343  - regbranch - one alternative of an | operator
7344  *
7345  * Implements the concatenation operator.
7346  */
7347 STATIC regnode *
7348 S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
7349 {
7350  dVAR;
7351  register regnode *ret;
7352  register regnode *chain = NULL;
7353  register regnode *latest;
7354  I32 flags = 0, c = 0;
7355  GET_RE_DEBUG_FLAGS_DECL;
7356
7357  PERL_ARGS_ASSERT_REGBRANCH;
7358
7359  DEBUG_PARSE("brnc");
7360
7361  if (first)
7362   ret = NULL;
7363  else {
7364   if (!SIZE_ONLY && RExC_extralen)
7365    ret = reganode(pRExC_state, BRANCHJ,0);
7366   else {
7367    ret = reg_node(pRExC_state, BRANCH);
7368    Set_Node_Length(ret, 1);
7369   }
7370  }
7371
7372  if (!first && SIZE_ONLY)
7373   RExC_extralen += 1;   /* BRANCHJ */
7374
7375  *flagp = WORST;   /* Tentatively. */
7376
7377  RExC_parse--;
7378  nextchar(pRExC_state);
7379  while (RExC_parse < RExC_end && *RExC_parse != '|' && *RExC_parse != ')') {
7380   flags &= ~TRYAGAIN;
7381   latest = regpiece(pRExC_state, &flags,depth+1);
7382   if (latest == NULL) {
7383    if (flags & TRYAGAIN)
7384     continue;
7385    return(NULL);
7386   }
7387   else if (ret == NULL)
7388    ret = latest;
7389   *flagp |= flags&(HASWIDTH|POSTPONED);
7390   if (chain == NULL)  /* First piece. */
7391    *flagp |= flags&SPSTART;
7392   else {
7393    RExC_naughty++;
7394    REGTAIL(pRExC_state, chain, latest);
7395   }
7396   chain = latest;
7397   c++;
7398  }
7399  if (chain == NULL) { /* Loop ran zero times. */
7400   chain = reg_node(pRExC_state, NOTHING);
7401   if (ret == NULL)
7402    ret = chain;
7403  }
7404  if (c == 1) {
7405   *flagp |= flags&SIMPLE;
7406  }
7407
7408  return ret;
7409 }
7410
7411 /*
7412  - regpiece - something followed by possible [*+?]
7413  *
7414  * Note that the branching code sequences used for ? and the general cases
7415  * of * and + are somewhat optimized:  they use the same NOTHING node as
7416  * both the endmarker for their branch list and the body of the last branch.
7417  * It might seem that this node could be dispensed with entirely, but the
7418  * endmarker role is not redundant.
7419  */
7420 STATIC regnode *
7421 S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
7422 {
7423  dVAR;
7424  register regnode *ret;
7425  register char op;
7426  register char *next;
7427  I32 flags;
7428  const char * const origparse = RExC_parse;
7429  I32 min;
7430  I32 max = REG_INFTY;
7431  char *parse_start;
7432  const char *maxpos = NULL;
7433  GET_RE_DEBUG_FLAGS_DECL;
7434
7435  PERL_ARGS_ASSERT_REGPIECE;
7436
7437  DEBUG_PARSE("piec");
7438
7439  ret = regatom(pRExC_state, &flags,depth+1);
7440  if (ret == NULL) {
7441   if (flags & TRYAGAIN)
7442    *flagp |= TRYAGAIN;
7443   return(NULL);
7444  }
7445
7446  op = *RExC_parse;
7447
7448  if (op == '{' && regcurly(RExC_parse)) {
7449   maxpos = NULL;
7450   parse_start = RExC_parse; /* MJD */
7451   next = RExC_parse + 1;
7452   while (isDIGIT(*next) || *next == ',') {
7453    if (*next == ',') {
7454     if (maxpos)
7455      break;
7456     else
7457      maxpos = next;
7458    }
7459    next++;
7460   }
7461   if (*next == '}') {  /* got one */
7462    if (!maxpos)
7463     maxpos = next;
7464    RExC_parse++;
7465    min = atoi(RExC_parse);
7466    if (*maxpos == ',')
7467     maxpos++;
7468    else
7469     maxpos = RExC_parse;
7470    max = atoi(maxpos);
7471    if (!max && *maxpos != '0')
7472     max = REG_INFTY;  /* meaning "infinity" */
7473    else if (max >= REG_INFTY)
7474     vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
7475    RExC_parse = next;
7476    nextchar(pRExC_state);
7477
7478   do_curly:
7479    if ((flags&SIMPLE)) {
7480     RExC_naughty += 2 + RExC_naughty / 2;
7481     reginsert(pRExC_state, CURLY, ret, depth+1);
7482     Set_Node_Offset(ret, parse_start+1); /* MJD */
7483     Set_Node_Cur_Length(ret);
7484    }
7485    else {
7486     regnode * const w = reg_node(pRExC_state, WHILEM);
7487
7488     w->flags = 0;
7489     REGTAIL(pRExC_state, ret, w);
7490     if (!SIZE_ONLY && RExC_extralen) {
7491      reginsert(pRExC_state, LONGJMP,ret, depth+1);
7492      reginsert(pRExC_state, NOTHING,ret, depth+1);
7493      NEXT_OFF(ret) = 3; /* Go over LONGJMP. */
7494     }
7495     reginsert(pRExC_state, CURLYX,ret, depth+1);
7496         /* MJD hk */
7497     Set_Node_Offset(ret, parse_start+1);
7498     Set_Node_Length(ret,
7499         op == '{' ? (RExC_parse - parse_start) : 1);
7500
7501     if (!SIZE_ONLY && RExC_extralen)
7502      NEXT_OFF(ret) = 3; /* Go over NOTHING to LONGJMP. */
7503     REGTAIL(pRExC_state, ret, reg_node(pRExC_state, NOTHING));
7504     if (SIZE_ONLY)
7505      RExC_whilem_seen++, RExC_extralen += 3;
7506     RExC_naughty += 4 + RExC_naughty; /* compound interest */
7507    }
7508    ret->flags = 0;
7509
7510    if (min > 0)
7511     *flagp = WORST;
7512    if (max > 0)
7513     *flagp |= HASWIDTH;
7514    if (max < min)
7515     vFAIL("Can't do {n,m} with n > m");
7516    if (!SIZE_ONLY) {
7517     ARG1_SET(ret, (U16)min);
7518     ARG2_SET(ret, (U16)max);
7519    }
7520
7521    goto nest_check;
7522   }
7523  }
7524
7525  if (!ISMULT1(op)) {
7526   *flagp = flags;
7527   return(ret);
7528  }
7529
7530 #if 0    /* Now runtime fix should be reliable. */
7531
7532  /* if this is reinstated, don't forget to put this back into perldiag:
7533
7534    =item Regexp *+ operand could be empty at {#} in regex m/%s/
7535
7536   (F) The part of the regexp subject to either the * or + quantifier
7537   could match an empty string. The {#} shows in the regular
7538   expression about where the problem was discovered.
7539
7540  */
7541
7542  if (!(flags&HASWIDTH) && op != '?')
7543  vFAIL("Regexp *+ operand could be empty");
7544 #endif
7545
7546  parse_start = RExC_parse;
7547  nextchar(pRExC_state);
7548
7549  *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
7550
7551  if (op == '*' && (flags&SIMPLE)) {
7552   reginsert(pRExC_state, STAR, ret, depth+1);
7553   ret->flags = 0;
7554   RExC_naughty += 4;
7555  }
7556  else if (op == '*') {
7557   min = 0;
7558   goto do_curly;
7559  }
7560  else if (op == '+' && (flags&SIMPLE)) {
7561   reginsert(pRExC_state, PLUS, ret, depth+1);
7562   ret->flags = 0;
7563   RExC_naughty += 3;
7564  }
7565  else if (op == '+') {
7566   min = 1;
7567   goto do_curly;
7568  }
7569  else if (op == '?') {
7570   min = 0; max = 1;
7571   goto do_curly;
7572  }
7573   nest_check:
7574  if (!SIZE_ONLY && !(flags&(HASWIDTH|POSTPONED)) && max > REG_INFTY/3) {
7575   ckWARN3reg(RExC_parse,
7576     "%.*s matches null string many times",
7577     (int)(RExC_parse >= origparse ? RExC_parse - origparse : 0),
7578     origparse);
7579  }
7580
7581  if (RExC_parse < RExC_end && *RExC_parse == '?') {
7582   nextchar(pRExC_state);
7583   reginsert(pRExC_state, MINMOD, ret, depth+1);
7584   REGTAIL(pRExC_state, ret, ret + NODE_STEP_REGNODE);
7585  }
7586 #ifndef REG_ALLOW_MINMOD_SUSPEND
7587  else
7588 #endif
7589  if (RExC_parse < RExC_end && *RExC_parse == '+') {
7590   regnode *ender;
7591   nextchar(pRExC_state);
7592   ender = reg_node(pRExC_state, SUCCEED);
7593   REGTAIL(pRExC_state, ret, ender);
7594   reginsert(pRExC_state, SUSPEND, ret, depth+1);
7595   ret->flags = 0;
7596   ender = reg_node(pRExC_state, TAIL);
7597   REGTAIL(pRExC_state, ret, ender);
7598   /*ret= ender;*/
7599  }
7600
7601  if (RExC_parse < RExC_end && ISMULT2(RExC_parse)) {
7602   RExC_parse++;
7603   vFAIL("Nested quantifiers");
7604  }
7605
7606  return(ret);
7607 }
7608
7609
7610 /* reg_namedseq(pRExC_state,UVp, UV depth)
7611
7612    This is expected to be called by a parser routine that has
7613    recognized '\N' and needs to handle the rest. RExC_parse is
7614    expected to point at the first char following the N at the time
7615    of the call.
7616
7617    The \N may be inside (indicated by valuep not being NULL) or outside a
7618    character class.
7619
7620    \N may begin either a named sequence, or if outside a character class, mean
7621    to match a non-newline.  For non single-quoted regexes, the tokenizer has
7622    attempted to decide which, and in the case of a named sequence converted it
7623    into one of the forms: \N{} (if the sequence is null), or \N{U+c1.c2...},
7624    where c1... are the characters in the sequence.  For single-quoted regexes,
7625    the tokenizer passes the \N sequence through unchanged; this code will not
7626    attempt to determine this nor expand those.  The net effect is that if the
7627    beginning of the passed-in pattern isn't '{U+' or there is no '}', it
7628    signals that this \N occurrence means to match a non-newline.
7629
7630    Only the \N{U+...} form should occur in a character class, for the same
7631    reason that '.' inside a character class means to just match a period: it
7632    just doesn't make sense.
7633
7634    If valuep is non-null then it is assumed that we are parsing inside
7635    of a charclass definition and the first codepoint in the resolved
7636    string is returned via *valuep and the routine will return NULL.
7637    In this mode if a multichar string is returned from the charnames
7638    handler, a warning will be issued, and only the first char in the
7639    sequence will be examined. If the string returned is zero length
7640    then the value of *valuep is undefined and NON-NULL will
7641    be returned to indicate failure. (This will NOT be a valid pointer
7642    to a regnode.)
7643
7644    If valuep is null then it is assumed that we are parsing normal text and a
7645    new EXACT node is inserted into the program containing the resolved string,
7646    and a pointer to the new node is returned.  But if the string is zero length
7647    a NOTHING node is emitted instead.
7648
7649    On success RExC_parse is set to the char following the endbrace.
7650    Parsing failures will generate a fatal error via vFAIL(...)
7651  */
7652 STATIC regnode *
7653 S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep, I32 *flagp, U32 depth)
7654 {
7655  char * endbrace;    /* '}' following the name */
7656  regnode *ret = NULL;
7657  char* p;
7658
7659  GET_RE_DEBUG_FLAGS_DECL;
7660
7661  PERL_ARGS_ASSERT_REG_NAMEDSEQ;
7662
7663  GET_RE_DEBUG_FLAGS;
7664
7665  /* The [^\n] meaning of \N ignores spaces and comments under the /x
7666  * modifier.  The other meaning does not */
7667  p = (RExC_flags & RXf_PMf_EXTENDED)
7668   ? regwhite( pRExC_state, RExC_parse )
7669   : RExC_parse;
7670
7671  /* Disambiguate between \N meaning a named character versus \N meaning
7672  * [^\n].  The former is assumed when it can't be the latter. */
7673  if (*p != '{' || regcurly(p)) {
7674   RExC_parse = p;
7675   if (valuep) {
7676    /* no bare \N in a charclass */
7677    vFAIL("\\N in a character class must be a named character: \\N{...}");
7678   }
7679   nextchar(pRExC_state);
7680   ret = reg_node(pRExC_state, REG_ANY);
7681   *flagp |= HASWIDTH|SIMPLE;
7682   RExC_naughty++;
7683   RExC_parse--;
7684   Set_Node_Length(ret, 1); /* MJD */
7685   return ret;
7686  }
7687
7688  /* Here, we have decided it should be a named sequence */
7689
7690  /* The test above made sure that the next real character is a '{', but
7691  * under the /x modifier, it could be separated by space (or a comment and
7692  * \n) and this is not allowed (for consistency with \x{...} and the
7693  * tokenizer handling of \N{NAME}). */
7694  if (*RExC_parse != '{') {
7695   vFAIL("Missing braces on \\N{}");
7696  }
7697
7698  RExC_parse++; /* Skip past the '{' */
7699
7700  if (! (endbrace = strchr(RExC_parse, '}')) /* no trailing brace */
7701   || ! (endbrace == RExC_parse  /* nothing between the {} */
7702    || (endbrace - RExC_parse >= 2 /* U+ (bad hex is checked below */
7703     && strnEQ(RExC_parse, "U+", 2)))) /* for a better error msg) */
7704  {
7705   if (endbrace) RExC_parse = endbrace; /* position msg's '<--HERE' */
7706   vFAIL("\\N{NAME} must be resolved by the lexer");
7707  }
7708
7709  if (endbrace == RExC_parse) {   /* empty: \N{} */
7710   if (! valuep) {
7711    RExC_parse = endbrace + 1;
7712    return reg_node(pRExC_state,NOTHING);
7713   }
7714
7715   if (SIZE_ONLY) {
7716    ckWARNreg(RExC_parse,
7717      "Ignoring zero length \\N{} in character class"
7718    );
7719    RExC_parse = endbrace + 1;
7720   }
7721   *valuep = 0;
7722   return (regnode *) &RExC_parse; /* Invalid regnode pointer */
7723  }
7724
7725  REQUIRE_UTF8; /* named sequences imply Unicode semantics */
7726  RExC_parse += 2; /* Skip past the 'U+' */
7727
7728  if (valuep) {   /* In a bracketed char class */
7729   /* We only pay attention to the first char of
7730   multichar strings being returned. I kinda wonder
7731   if this makes sense as it does change the behaviour
7732   from earlier versions, OTOH that behaviour was broken
7733   as well. XXX Solution is to recharacterize as
7734   [rest-of-class]|multi1|multi2... */
7735
7736   STRLEN length_of_hex;
7737   I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
7738    | PERL_SCAN_DISALLOW_PREFIX
7739    | (SIZE_ONLY ? PERL_SCAN_SILENT_ILLDIGIT : 0);
7740
7741   char * endchar = RExC_parse + strcspn(RExC_parse, ".}");
7742   if (endchar < endbrace) {
7743    ckWARNreg(endchar, "Using just the first character returned by \\N{} in character class");
7744   }
7745
7746   length_of_hex = (STRLEN)(endchar - RExC_parse);
7747   *valuep = grok_hex(RExC_parse, &length_of_hex, &flags, NULL);
7748
7749   /* The tokenizer should have guaranteed validity, but it's possible to
7750   * bypass it by using single quoting, so check */
7751   if (length_of_hex == 0
7752    || length_of_hex != (STRLEN)(endchar - RExC_parse) )
7753   {
7754    RExC_parse += length_of_hex; /* Includes all the valid */
7755    RExC_parse += (RExC_orig_utf8) /* point to after 1st invalid */
7756        ? UTF8SKIP(RExC_parse)
7757        : 1;
7758    /* Guard against malformed utf8 */
7759    if (RExC_parse >= endchar) RExC_parse = endchar;
7760    vFAIL("Invalid hexadecimal number in \\N{U+...}");
7761   }
7762
7763   RExC_parse = endbrace + 1;
7764   if (endchar == endbrace) return NULL;
7765
7766   ret = (regnode *) &RExC_parse; /* Invalid regnode pointer */
7767  }
7768  else { /* Not a char class */
7769
7770   /* What is done here is to convert this to a sub-pattern of the form
7771   * (?:\x{char1}\x{char2}...)
7772   * and then call reg recursively.  That way, it retains its atomicness,
7773   * while not having to worry about special handling that some code
7774   * points may have.  toke.c has converted the original Unicode values
7775   * to native, so that we can just pass on the hex values unchanged.  We
7776   * do have to set a flag to keep recoding from happening in the
7777   * recursion */
7778
7779   SV * substitute_parse = newSVpvn_flags("?:", 2, SVf_UTF8|SVs_TEMP);
7780   STRLEN len;
7781   char *endchar;     /* Points to '.' or '}' ending cur char in the input
7782        stream */
7783   char *orig_end = RExC_end;
7784
7785   while (RExC_parse < endbrace) {
7786
7787    /* Code points are separated by dots.  If none, there is only one
7788    * code point, and is terminated by the brace */
7789    endchar = RExC_parse + strcspn(RExC_parse, ".}");
7790
7791    /* Convert to notation the rest of the code understands */
7792    sv_catpv(substitute_parse, "\\x{");
7793    sv_catpvn(substitute_parse, RExC_parse, endchar - RExC_parse);
7794    sv_catpv(substitute_parse, "}");
7795
7796    /* Point to the beginning of the next character in the sequence. */
7797    RExC_parse = endchar + 1;
7798   }
7799   sv_catpv(substitute_parse, ")");
7800
7801   RExC_parse = SvPV(substitute_parse, len);
7802
7803   /* Don't allow empty number */
7804   if (len < 8) {
7805    vFAIL("Invalid hexadecimal number in \\N{U+...}");
7806   }
7807   RExC_end = RExC_parse + len;
7808
7809   /* The values are Unicode, and therefore not subject to recoding */
7810   RExC_override_recoding = 1;
7811
7812   ret = reg(pRExC_state, 1, flagp, depth+1);
7813
7814   RExC_parse = endbrace;
7815   RExC_end = orig_end;
7816   RExC_override_recoding = 0;
7817
7818   nextchar(pRExC_state);
7819  }
7820
7821  return ret;
7822 }
7823
7824
7825 /*
7826  * reg_recode
7827  *
7828  * It returns the code point in utf8 for the value in *encp.
7829  *    value: a code value in the source encoding
7830  *    encp:  a pointer to an Encode object
7831  *
7832  * If the result from Encode is not a single character,
7833  * it returns U+FFFD (Replacement character) and sets *encp to NULL.
7834  */
7835 STATIC UV
7836 S_reg_recode(pTHX_ const char value, SV **encp)
7837 {
7838  STRLEN numlen = 1;
7839  SV * const sv = newSVpvn_flags(&value, numlen, SVs_TEMP);
7840  const char * const s = *encp ? sv_recode_to_utf8(sv, *encp) : SvPVX(sv);
7841  const STRLEN newlen = SvCUR(sv);
7842  UV uv = UNICODE_REPLACEMENT;
7843
7844  PERL_ARGS_ASSERT_REG_RECODE;
7845
7846  if (newlen)
7847   uv = SvUTF8(sv)
7848    ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
7849    : *(U8*)s;
7850
7851  if (!newlen || numlen != newlen) {
7852   uv = UNICODE_REPLACEMENT;
7853   *encp = NULL;
7854  }
7855  return uv;
7856 }
7857
7858
7859 /*
7860  - regatom - the lowest level
7861
7862    Try to identify anything special at the start of the pattern. If there
7863    is, then handle it as required. This may involve generating a single regop,
7864    such as for an assertion; or it may involve recursing, such as to
7865    handle a () structure.
7866
7867    If the string doesn't start with something special then we gobble up
7868    as much literal text as we can.
7869
7870    Once we have been able to handle whatever type of thing started the
7871    sequence, we return.
7872
7873    Note: we have to be careful with escapes, as they can be both literal
7874    and special, and in the case of \10 and friends can either, depending
7875    on context. Specifically there are two separate switches for handling
7876    escape sequences, with the one for handling literal escapes requiring
7877    a dummy entry for all of the special escapes that are actually handled
7878    by the other.
7879 */
7880
7881 STATIC regnode *
7882 S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
7883 {
7884  dVAR;
7885  register regnode *ret = NULL;
7886  I32 flags;
7887  char *parse_start = RExC_parse;
7888  U8 op;
7889  GET_RE_DEBUG_FLAGS_DECL;
7890  DEBUG_PARSE("atom");
7891  *flagp = WORST;  /* Tentatively. */
7892
7893  PERL_ARGS_ASSERT_REGATOM;
7894
7895 tryagain:
7896  switch ((U8)*RExC_parse) {
7897  case '^':
7898   RExC_seen_zerolen++;
7899   nextchar(pRExC_state);
7900   if (RExC_flags & RXf_PMf_MULTILINE)
7901    ret = reg_node(pRExC_state, MBOL);
7902   else if (RExC_flags & RXf_PMf_SINGLELINE)
7903    ret = reg_node(pRExC_state, SBOL);
7904   else
7905    ret = reg_node(pRExC_state, BOL);
7906   Set_Node_Length(ret, 1); /* MJD */
7907   break;
7908  case '$':
7909   nextchar(pRExC_state);
7910   if (*RExC_parse)
7911    RExC_seen_zerolen++;
7912   if (RExC_flags & RXf_PMf_MULTILINE)
7913    ret = reg_node(pRExC_state, MEOL);
7914   else if (RExC_flags & RXf_PMf_SINGLELINE)
7915    ret = reg_node(pRExC_state, SEOL);
7916   else
7917    ret = reg_node(pRExC_state, EOL);
7918   Set_Node_Length(ret, 1); /* MJD */
7919   break;
7920  case '.':
7921   nextchar(pRExC_state);
7922   if (RExC_flags & RXf_PMf_SINGLELINE)
7923    ret = reg_node(pRExC_state, SANY);
7924   else
7925    ret = reg_node(pRExC_state, REG_ANY);
7926   *flagp |= HASWIDTH|SIMPLE;
7927   RExC_naughty++;
7928   Set_Node_Length(ret, 1); /* MJD */
7929   break;
7930  case '[':
7931  {
7932   char * const oregcomp_parse = ++RExC_parse;
7933   ret = regclass(pRExC_state,depth+1);
7934   if (*RExC_parse != ']') {
7935    RExC_parse = oregcomp_parse;
7936    vFAIL("Unmatched [");
7937   }
7938   nextchar(pRExC_state);
7939   *flagp |= HASWIDTH|SIMPLE;
7940   Set_Node_Length(ret, RExC_parse - oregcomp_parse + 1); /* MJD */
7941   break;
7942  }
7943  case '(':
7944   nextchar(pRExC_state);
7945   ret = reg(pRExC_state, 1, &flags,depth+1);
7946   if (ret == NULL) {
7947     if (flags & TRYAGAIN) {
7948      if (RExC_parse == RExC_end) {
7949       /* Make parent create an empty node if needed. */
7950       *flagp |= TRYAGAIN;
7951       return(NULL);
7952      }
7953      goto tryagain;
7954     }
7955     return(NULL);
7956   }
7957   *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE|POSTPONED);
7958   break;
7959  case '|':
7960  case ')':
7961   if (flags & TRYAGAIN) {
7962    *flagp |= TRYAGAIN;
7963    return NULL;
7964   }
7965   vFAIL("Internal urp");
7966         /* Supposed to be caught earlier. */
7967   break;
7968  case '{':
7969   if (!regcurly(RExC_parse)) {
7970    RExC_parse++;
7971    goto defchar;
7972   }
7973   /* FALL THROUGH */
7974  case '?':
7975  case '+':
7976  case '*':
7977   RExC_parse++;
7978   vFAIL("Quantifier follows nothing");
7979   break;
7980  case '\\':
7981   /* Special Escapes
7982
7983   This switch handles escape sequences that resolve to some kind
7984   of special regop and not to literal text. Escape sequnces that
7985   resolve to literal text are handled below in the switch marked
7986   "Literal Escapes".
7987
7988   Every entry in this switch *must* have a corresponding entry
7989   in the literal escape switch. However, the opposite is not
7990   required, as the default for this switch is to jump to the
7991   literal text handling code.
7992   */
7993   switch ((U8)*++RExC_parse) {
7994   /* Special Escapes */
7995   case 'A':
7996    RExC_seen_zerolen++;
7997    ret = reg_node(pRExC_state, SBOL);
7998    *flagp |= SIMPLE;
7999    goto finish_meta_pat;
8000   case 'G':
8001    ret = reg_node(pRExC_state, GPOS);
8002    RExC_seen |= REG_SEEN_GPOS;
8003    *flagp |= SIMPLE;
8004    goto finish_meta_pat;
8005   case 'K':
8006    RExC_seen_zerolen++;
8007    ret = reg_node(pRExC_state, KEEPS);
8008    *flagp |= SIMPLE;
8009    /* XXX:dmq : disabling in-place substitution seems to
8010    * be necessary here to avoid cases of memory corruption, as
8011    * with: C<$_="x" x 80; s/x\K/y/> -- rgs
8012    */
8013    RExC_seen |= REG_SEEN_LOOKBEHIND;
8014    goto finish_meta_pat;
8015   case 'Z':
8016    ret = reg_node(pRExC_state, SEOL);
8017    *flagp |= SIMPLE;
8018    RExC_seen_zerolen++;  /* Do not optimize RE away */
8019    goto finish_meta_pat;
8020   case 'z':
8021    ret = reg_node(pRExC_state, EOS);
8022    *flagp |= SIMPLE;
8023    RExC_seen_zerolen++;  /* Do not optimize RE away */
8024    goto finish_meta_pat;
8025   case 'C':
8026    ret = reg_node(pRExC_state, CANY);
8027    RExC_seen |= REG_SEEN_CANY;
8028    *flagp |= HASWIDTH|SIMPLE;
8029    goto finish_meta_pat;
8030   case 'X':
8031    ret = reg_node(pRExC_state, CLUMP);
8032    *flagp |= HASWIDTH;
8033    goto finish_meta_pat;
8034   case 'w':
8035    switch (get_regex_charset(RExC_flags)) {
8036     case REGEX_LOCALE_CHARSET:
8037      op = ALNUML;
8038      break;
8039     case REGEX_UNICODE_CHARSET:
8040      op = ALNUMU;
8041      break;
8042     case REGEX_ASCII_RESTRICTED_CHARSET:
8043     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8044      op = ALNUMA;
8045      break;
8046     case REGEX_DEPENDS_CHARSET:
8047      op = ALNUM;
8048      break;
8049     default:
8050      goto bad_charset;
8051    }
8052    ret = reg_node(pRExC_state, op);
8053    *flagp |= HASWIDTH|SIMPLE;
8054    goto finish_meta_pat;
8055   case 'W':
8056    switch (get_regex_charset(RExC_flags)) {
8057     case REGEX_LOCALE_CHARSET:
8058      op = NALNUML;
8059      break;
8060     case REGEX_UNICODE_CHARSET:
8061      op = NALNUMU;
8062      break;
8063     case REGEX_ASCII_RESTRICTED_CHARSET:
8064     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8065      op = NALNUMA;
8066      break;
8067     case REGEX_DEPENDS_CHARSET:
8068      op = NALNUM;
8069      break;
8070     default:
8071      goto bad_charset;
8072    }
8073    ret = reg_node(pRExC_state, op);
8074    *flagp |= HASWIDTH|SIMPLE;
8075    goto finish_meta_pat;
8076   case 'b':
8077    RExC_seen_zerolen++;
8078    RExC_seen |= REG_SEEN_LOOKBEHIND;
8079    switch (get_regex_charset(RExC_flags)) {
8080     case REGEX_LOCALE_CHARSET:
8081      op = BOUNDL;
8082      break;
8083     case REGEX_UNICODE_CHARSET:
8084      op = BOUNDU;
8085      break;
8086     case REGEX_ASCII_RESTRICTED_CHARSET:
8087     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8088      op = BOUNDA;
8089      break;
8090     case REGEX_DEPENDS_CHARSET:
8091      op = BOUND;
8092      break;
8093     default:
8094      goto bad_charset;
8095    }
8096    ret = reg_node(pRExC_state, op);
8097    FLAGS(ret) = get_regex_charset(RExC_flags);
8098    *flagp |= SIMPLE;
8099    if (! SIZE_ONLY && (U8) *(RExC_parse + 1) == '{') {
8100     ckWARNregdep(RExC_parse, "\"\\b{\" is deprecated; use \"\\b\\{\" instead");
8101    }
8102    goto finish_meta_pat;
8103   case 'B':
8104    RExC_seen_zerolen++;
8105    RExC_seen |= REG_SEEN_LOOKBEHIND;
8106    switch (get_regex_charset(RExC_flags)) {
8107     case REGEX_LOCALE_CHARSET:
8108      op = NBOUNDL;
8109      break;
8110     case REGEX_UNICODE_CHARSET:
8111      op = NBOUNDU;
8112      break;
8113     case REGEX_ASCII_RESTRICTED_CHARSET:
8114     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8115      op = NBOUNDA;
8116      break;
8117     case REGEX_DEPENDS_CHARSET:
8118      op = NBOUND;
8119      break;
8120     default:
8121      goto bad_charset;
8122    }
8123    ret = reg_node(pRExC_state, op);
8124    FLAGS(ret) = get_regex_charset(RExC_flags);
8125    *flagp |= SIMPLE;
8126    if (! SIZE_ONLY && (U8) *(RExC_parse + 1) == '{') {
8127     ckWARNregdep(RExC_parse, "\"\\B{\" is deprecated; use \"\\B\\{\" instead");
8128    }
8129    goto finish_meta_pat;
8130   case 's':
8131    switch (get_regex_charset(RExC_flags)) {
8132     case REGEX_LOCALE_CHARSET:
8133      op = SPACEL;
8134      break;
8135     case REGEX_UNICODE_CHARSET:
8136      op = SPACEU;
8137      break;
8138     case REGEX_ASCII_RESTRICTED_CHARSET:
8139     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8140      op = SPACEA;
8141      break;
8142     case REGEX_DEPENDS_CHARSET:
8143      op = SPACE;
8144      break;
8145     default:
8146      goto bad_charset;
8147    }
8148    ret = reg_node(pRExC_state, op);
8149    *flagp |= HASWIDTH|SIMPLE;
8150    goto finish_meta_pat;
8151   case 'S':
8152    switch (get_regex_charset(RExC_flags)) {
8153     case REGEX_LOCALE_CHARSET:
8154      op = NSPACEL;
8155      break;
8156     case REGEX_UNICODE_CHARSET:
8157      op = NSPACEU;
8158      break;
8159     case REGEX_ASCII_RESTRICTED_CHARSET:
8160     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8161      op = NSPACEA;
8162      break;
8163     case REGEX_DEPENDS_CHARSET:
8164      op = NSPACE;
8165      break;
8166     default:
8167      goto bad_charset;
8168    }
8169    ret = reg_node(pRExC_state, op);
8170    *flagp |= HASWIDTH|SIMPLE;
8171    goto finish_meta_pat;
8172   case 'd':
8173    switch (get_regex_charset(RExC_flags)) {
8174     case REGEX_LOCALE_CHARSET:
8175      op = DIGITL;
8176      break;
8177     case REGEX_ASCII_RESTRICTED_CHARSET:
8178     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8179      op = DIGITA;
8180      break;
8181     case REGEX_DEPENDS_CHARSET: /* No difference between these */
8182     case REGEX_UNICODE_CHARSET:
8183      op = DIGIT;
8184      break;
8185     default:
8186      goto bad_charset;
8187    }
8188    ret = reg_node(pRExC_state, op);
8189    *flagp |= HASWIDTH|SIMPLE;
8190    goto finish_meta_pat;
8191   case 'D':
8192    switch (get_regex_charset(RExC_flags)) {
8193     case REGEX_LOCALE_CHARSET:
8194      op = NDIGITL;
8195      break;
8196     case REGEX_ASCII_RESTRICTED_CHARSET:
8197     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
8198      op = NDIGITA;
8199      break;
8200     case REGEX_DEPENDS_CHARSET: /* No difference between these */
8201     case REGEX_UNICODE_CHARSET:
8202      op = NDIGIT;
8203      break;
8204     default:
8205      goto bad_charset;
8206    }
8207    ret = reg_node(pRExC_state, op);
8208    *flagp |= HASWIDTH|SIMPLE;
8209    goto finish_meta_pat;
8210   case 'R':
8211    ret = reg_node(pRExC_state, LNBREAK);
8212    *flagp |= HASWIDTH|SIMPLE;
8213    goto finish_meta_pat;
8214   case 'h':
8215    ret = reg_node(pRExC_state, HORIZWS);
8216    *flagp |= HASWIDTH|SIMPLE;
8217    goto finish_meta_pat;
8218   case 'H':
8219    ret = reg_node(pRExC_state, NHORIZWS);
8220    *flagp |= HASWIDTH|SIMPLE;
8221    goto finish_meta_pat;
8222   case 'v':
8223    ret = reg_node(pRExC_state, VERTWS);
8224    *flagp |= HASWIDTH|SIMPLE;
8225    goto finish_meta_pat;
8226   case 'V':
8227    ret = reg_node(pRExC_state, NVERTWS);
8228    *flagp |= HASWIDTH|SIMPLE;
8229   finish_meta_pat:
8230    nextchar(pRExC_state);
8231    Set_Node_Length(ret, 2); /* MJD */
8232    break;
8233   case 'p':
8234   case 'P':
8235    {
8236     char* const oldregxend = RExC_end;
8237 #ifdef DEBUGGING
8238     char* parse_start = RExC_parse - 2;
8239 #endif
8240
8241     if (RExC_parse[1] == '{') {
8242     /* a lovely hack--pretend we saw [\pX] instead */
8243      RExC_end = strchr(RExC_parse, '}');
8244      if (!RExC_end) {
8245       const U8 c = (U8)*RExC_parse;
8246       RExC_parse += 2;
8247       RExC_end = oldregxend;
8248       vFAIL2("Missing right brace on \\%c{}", c);
8249      }
8250      RExC_end++;
8251     }
8252     else {
8253      RExC_end = RExC_parse + 2;
8254      if (RExC_end > oldregxend)
8255       RExC_end = oldregxend;
8256     }
8257     RExC_parse--;
8258
8259     ret = regclass(pRExC_state,depth+1);
8260
8261     RExC_end = oldregxend;
8262     RExC_parse--;
8263
8264     Set_Node_Offset(ret, parse_start + 2);
8265     Set_Node_Cur_Length(ret);
8266     nextchar(pRExC_state);
8267     *flagp |= HASWIDTH|SIMPLE;
8268    }
8269    break;
8270   case 'N':
8271    /* Handle \N and \N{NAME} here and not below because it can be
8272    multicharacter. join_exact() will join them up later on.
8273    Also this makes sure that things like /\N{BLAH}+/ and
8274    \N{BLAH} being multi char Just Happen. dmq*/
8275    ++RExC_parse;
8276    ret= reg_namedseq(pRExC_state, NULL, flagp, depth);
8277    break;
8278   case 'k':    /* Handle \k<NAME> and \k'NAME' */
8279   parse_named_seq:
8280   {
8281    char ch= RExC_parse[1];
8282    if (ch != '<' && ch != '\'' && ch != '{') {
8283     RExC_parse++;
8284     vFAIL2("Sequence %.2s... not terminated",parse_start);
8285    } else {
8286     /* this pretty much dupes the code for (?P=...) in reg(), if
8287     you change this make sure you change that */
8288     char* name_start = (RExC_parse += 2);
8289     U32 num = 0;
8290     SV *sv_dat = reg_scan_name(pRExC_state,
8291      SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
8292     ch= (ch == '<') ? '>' : (ch == '{') ? '}' : '\'';
8293     if (RExC_parse == name_start || *RExC_parse != ch)
8294      vFAIL2("Sequence %.3s... not terminated",parse_start);
8295
8296     if (!SIZE_ONLY) {
8297      num = add_data( pRExC_state, 1, "S" );
8298      RExC_rxi->data->data[num]=(void*)sv_dat;
8299      SvREFCNT_inc_simple_void(sv_dat);
8300     }
8301
8302     RExC_sawback = 1;
8303     ret = reganode(pRExC_state,
8304        ((! FOLD)
8305         ? NREF
8306         : (MORE_ASCII_RESTRICTED)
8307         ? NREFFA
8308         : (AT_LEAST_UNI_SEMANTICS)
8309          ? NREFFU
8310          : (LOC)
8311          ? NREFFL
8312          : NREFF),
8313         num);
8314     *flagp |= HASWIDTH;
8315
8316     /* override incorrect value set in reganode MJD */
8317     Set_Node_Offset(ret, parse_start+1);
8318     Set_Node_Cur_Length(ret); /* MJD */
8319     nextchar(pRExC_state);
8320
8321    }
8322    break;
8323   }
8324   case 'g':
8325   case '1': case '2': case '3': case '4':
8326   case '5': case '6': case '7': case '8': case '9':
8327    {
8328     I32 num;
8329     bool isg = *RExC_parse == 'g';
8330     bool isrel = 0;
8331     bool hasbrace = 0;
8332     if (isg) {
8333      RExC_parse++;
8334      if (*RExC_parse == '{') {
8335       RExC_parse++;
8336       hasbrace = 1;
8337      }
8338      if (*RExC_parse == '-') {
8339       RExC_parse++;
8340       isrel = 1;
8341      }
8342      if (hasbrace && !isDIGIT(*RExC_parse)) {
8343       if (isrel) RExC_parse--;
8344       RExC_parse -= 2;
8345       goto parse_named_seq;
8346     }   }
8347     num = atoi(RExC_parse);
8348     if (isg && num == 0)
8349      vFAIL("Reference to invalid group 0");
8350     if (isrel) {
8351      num = RExC_npar - num;
8352      if (num < 1)
8353       vFAIL("Reference to nonexistent or unclosed group");
8354     }
8355     if (!isg && num > 9 && num >= RExC_npar)
8356      goto defchar;
8357     else {
8358      char * const parse_start = RExC_parse - 1; /* MJD */
8359      while (isDIGIT(*RExC_parse))
8360       RExC_parse++;
8361      if (parse_start == RExC_parse - 1)
8362       vFAIL("Unterminated \\g... pattern");
8363      if (hasbrace) {
8364       if (*RExC_parse != '}')
8365        vFAIL("Unterminated \\g{...} pattern");
8366       RExC_parse++;
8367      }
8368      if (!SIZE_ONLY) {
8369       if (num > (I32)RExC_rx->nparens)
8370        vFAIL("Reference to nonexistent group");
8371      }
8372      RExC_sawback = 1;
8373      ret = reganode(pRExC_state,
8374         ((! FOLD)
8375          ? REF
8376          : (MORE_ASCII_RESTRICTED)
8377          ? REFFA
8378          : (AT_LEAST_UNI_SEMANTICS)
8379           ? REFFU
8380           : (LOC)
8381           ? REFFL
8382           : REFF),
8383          num);
8384      *flagp |= HASWIDTH;
8385
8386      /* override incorrect value set in reganode MJD */
8387      Set_Node_Offset(ret, parse_start+1);
8388      Set_Node_Cur_Length(ret); /* MJD */
8389      RExC_parse--;
8390      nextchar(pRExC_state);
8391     }
8392    }
8393    break;
8394   case '\0':
8395    if (RExC_parse >= RExC_end)
8396     FAIL("Trailing \\");
8397    /* FALL THROUGH */
8398   default:
8399    /* Do not generate "unrecognized" warnings here, we fall
8400    back into the quick-grab loop below */
8401    parse_start--;
8402    goto defchar;
8403   }
8404   break;
8405
8406  case '#':
8407   if (RExC_flags & RXf_PMf_EXTENDED) {
8408    if ( reg_skipcomment( pRExC_state ) )
8409     goto tryagain;
8410   }
8411   /* FALL THROUGH */
8412
8413  default:
8414
8415    parse_start = RExC_parse - 1;
8416
8417    RExC_parse++;
8418
8419   defchar: {
8420    typedef enum {
8421     generic_char = 0,
8422     char_s,
8423     upsilon_1,
8424     upsilon_2,
8425     iota_1,
8426     iota_2,
8427    } char_state;
8428    char_state latest_char_state = generic_char;
8429    register STRLEN len;
8430    register UV ender;
8431    register char *p;
8432    char *s;
8433    STRLEN foldlen;
8434    U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
8435    regnode * orig_emit;
8436
8437    ender = 0;
8438    orig_emit = RExC_emit; /* Save the original output node position in
8439          case we need to output a different node
8440          type */
8441    ret = reg_node(pRExC_state,
8442       (U8) ((! FOLD) ? EXACT
8443           : (LOC)
8444            ? EXACTFL
8445            : (MORE_ASCII_RESTRICTED)
8446            ? EXACTFA
8447            : (AT_LEAST_UNI_SEMANTICS)
8448             ? EXACTFU
8449             : EXACTF)
8450      );
8451    s = STRING(ret);
8452    for (len = 0, p = RExC_parse - 1;
8453    len < 127 && p < RExC_end;
8454    len++)
8455    {
8456     char * const oldp = p;
8457
8458     if (RExC_flags & RXf_PMf_EXTENDED)
8459      p = regwhite( pRExC_state, p );
8460     switch ((U8)*p) {
8461     case '^':
8462     case '$':
8463     case '.':
8464     case '[':
8465     case '(':
8466     case ')':
8467     case '|':
8468      goto loopdone;
8469     case '\\':
8470      /* Literal Escapes Switch
8471
8472      This switch is meant to handle escape sequences that
8473      resolve to a literal character.
8474
8475      Every escape sequence that represents something
8476      else, like an assertion or a char class, is handled
8477      in the switch marked 'Special Escapes' above in this
8478      routine, but also has an entry here as anything that
8479      isn't explicitly mentioned here will be treated as
8480      an unescaped equivalent literal.
8481      */
8482
8483      switch ((U8)*++p) {
8484      /* These are all the special escapes. */
8485      case 'A':             /* Start assertion */
8486      case 'b': case 'B':   /* Word-boundary assertion*/
8487      case 'C':             /* Single char !DANGEROUS! */
8488      case 'd': case 'D':   /* digit class */
8489      case 'g': case 'G':   /* generic-backref, pos assertion */
8490      case 'h': case 'H':   /* HORIZWS */
8491      case 'k': case 'K':   /* named backref, keep marker */
8492      case 'N':             /* named char sequence */
8493      case 'p': case 'P':   /* Unicode property */
8494        case 'R':   /* LNBREAK */
8495      case 's': case 'S':   /* space class */
8496      case 'v': case 'V':   /* VERTWS */
8497      case 'w': case 'W':   /* word class */
8498      case 'X':             /* eXtended Unicode "combining character sequence" */
8499      case 'z': case 'Z':   /* End of line/string assertion */
8500       --p;
8501       goto loopdone;
8502
8503      /* Anything after here is an escape that resolves to a
8504      literal. (Except digits, which may or may not)
8505      */
8506      case 'n':
8507       ender = '\n';
8508       p++;
8509       break;
8510      case 'r':
8511       ender = '\r';
8512       p++;
8513       break;
8514      case 't':
8515       ender = '\t';
8516       p++;
8517       break;
8518      case 'f':
8519       ender = '\f';
8520       p++;
8521       break;
8522      case 'e':
8523       ender = ASCII_TO_NATIVE('\033');
8524       p++;
8525       break;
8526      case 'a':
8527       ender = ASCII_TO_NATIVE('\007');
8528       p++;
8529       break;
8530      case 'o':
8531       {
8532        STRLEN brace_len = len;
8533        UV result;
8534        const char* error_msg;
8535
8536        bool valid = grok_bslash_o(p,
8537              &result,
8538              &brace_len,
8539              &error_msg,
8540              1);
8541        p += brace_len;
8542        if (! valid) {
8543         RExC_parse = p; /* going to die anyway; point
8544             to exact spot of failure */
8545         vFAIL(error_msg);
8546        }
8547        else
8548        {
8549         ender = result;
8550        }
8551        if (PL_encoding && ender < 0x100) {
8552         goto recode_encoding;
8553        }
8554        if (ender > 0xff) {
8555         REQUIRE_UTF8;
8556        }
8557        break;
8558       }
8559      case 'x':
8560       if (*++p == '{') {
8561        char* const e = strchr(p, '}');
8562
8563        if (!e) {
8564         RExC_parse = p + 1;
8565         vFAIL("Missing right brace on \\x{}");
8566        }
8567        else {
8568         I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
8569          | PERL_SCAN_DISALLOW_PREFIX;
8570         STRLEN numlen = e - p - 1;
8571         ender = grok_hex(p + 1, &numlen, &flags, NULL);
8572         if (ender > 0xff)
8573          REQUIRE_UTF8;
8574         p = e + 1;
8575        }
8576       }
8577       else {
8578        I32 flags = PERL_SCAN_DISALLOW_PREFIX;
8579        STRLEN numlen = 2;
8580        ender = grok_hex(p, &numlen, &flags, NULL);
8581        p += numlen;
8582       }
8583       if (PL_encoding && ender < 0x100)
8584        goto recode_encoding;
8585       break;
8586      case 'c':
8587       p++;
8588       ender = grok_bslash_c(*p++, UTF, SIZE_ONLY);
8589       break;
8590      case '0': case '1': case '2': case '3':case '4':
8591      case '5': case '6': case '7': case '8':case '9':
8592       if (*p == '0' ||
8593        (isDIGIT(p[1]) && atoi(p) >= RExC_npar))
8594       {
8595        I32 flags = PERL_SCAN_SILENT_ILLDIGIT;
8596        STRLEN numlen = 3;
8597        ender = grok_oct(p, &numlen, &flags, NULL);
8598        if (ender > 0xff) {
8599         REQUIRE_UTF8;
8600        }
8601        p += numlen;
8602       }
8603       else {
8604        --p;
8605        goto loopdone;
8606       }
8607       if (PL_encoding && ender < 0x100)
8608        goto recode_encoding;
8609       break;
8610      recode_encoding:
8611       if (! RExC_override_recoding) {
8612        SV* enc = PL_encoding;
8613        ender = reg_recode((const char)(U8)ender, &enc);
8614        if (!enc && SIZE_ONLY)
8615         ckWARNreg(p, "Invalid escape in the specified encoding");
8616        REQUIRE_UTF8;
8617       }
8618       break;
8619      case '\0':
8620       if (p >= RExC_end)
8621        FAIL("Trailing \\");
8622       /* FALL THROUGH */
8623      default:
8624       if (!SIZE_ONLY&& isALPHA(*p)) {
8625        /* Include any { following the alpha to emphasize
8626        * that it could be part of an escape at some point
8627        * in the future */
8628        int len = (*(p + 1) == '{') ? 2 : 1;
8629        ckWARN3reg(p + len, "Unrecognized escape \\%.*s passed through", len, p);
8630       }
8631       goto normal_default;
8632      }
8633      break;
8634     default:
8635     normal_default:
8636      if (UTF8_IS_START(*p) && UTF) {
8637       STRLEN numlen;
8638       ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
8639            &numlen, UTF8_ALLOW_DEFAULT);
8640       p += numlen;
8641      }
8642      else
8643       ender = (U8) *p++;
8644      break;
8645     } /* End of switch on the literal */
8646
8647     /* Certain characters are problematic because their folded
8648     * length is so different from their original length that it
8649     * isn't handleable by the optimizer.  They are therefore not
8650     * placed in an EXACTish node; and are here handled specially.
8651     * (Even if the optimizer handled LATIN_SMALL_LETTER_SHARP_S,
8652     * putting it in a special node keeps regexec from having to
8653     * deal with a non-utf8 multi-char fold */
8654     if (FOLD
8655      && (ender > 255 || (! MORE_ASCII_RESTRICTED && ! LOC)))
8656     {
8657      /* We look for either side of the fold.  For example \xDF
8658      * folds to 'ss'.  We look for both the single character
8659      * \xDF and the sequence 'ss'.  When we find something that
8660      * could be one of those, we stop and flush whatever we
8661      * have output so far into the EXACTish node that was being
8662      * built.  Then restore the input pointer to what it was.
8663      * regatom will return that EXACT node, and will be called
8664      * again, positioned so the first character is the one in
8665      * question, which we return in a different node type.
8666      * The multi-char folds are a sequence, so the occurrence
8667      * of the first character in that sequence doesn't
8668      * necessarily mean that what follows is the rest of the
8669      * sequence.  We keep track of that with a state machine,
8670      * with the state being set to the latest character
8671      * processed before the current one.  Most characters will
8672      * set the state to 0, but if one occurs that is part of a
8673      * potential tricky fold sequence, the state is set to that
8674      * character, and the next loop iteration sees if the state
8675      * should progress towards the final folded-from character,
8676      * or if it was a false alarm.  If it turns out to be a
8677      * false alarm, the character(s) will be output in a new
8678      * EXACTish node, and join_exact() will later combine them.
8679      * In the case of the 'ss' sequence, which is more common
8680      * and more easily checked, some look-ahead is done to
8681      * save time by ruling-out some false alarms */
8682      switch (ender) {
8683       default:
8684        latest_char_state = generic_char;
8685        break;
8686       case 's':
8687       case 'S':
8688       case 0x17F: /* LATIN SMALL LETTER LONG S */
8689        if (AT_LEAST_UNI_SEMANTICS) {
8690         if (latest_char_state == char_s) {  /* 'ss' */
8691          ender = LATIN_SMALL_LETTER_SHARP_S;
8692          goto do_tricky;
8693         }
8694         else if (p < RExC_end) {
8695
8696          /* Look-ahead at the next character.  If it
8697          * is also an s, we handle as a sharp s
8698          * tricky regnode.  */
8699          if (*p == 's' || *p == 'S') {
8700
8701           /* But first flush anything in the
8702           * EXACTish buffer */
8703           if (len != 0) {
8704            p = oldp;
8705            goto loopdone;
8706           }
8707           p++; /* Account for swallowing this
8708             's' up */
8709           ender = LATIN_SMALL_LETTER_SHARP_S;
8710           goto do_tricky;
8711          }
8712           /* Here, the next character is not a
8713           * literal 's', but still could
8714           * evaluate to one if part of a \o{},
8715           * \x or \OCTAL-DIGIT.  The minimum
8716           * length required for that is 4, eg
8717           * \x53 or \123 */
8718          else if (*p == '\\'
8719            && p < RExC_end - 4
8720            && (isDIGIT(*(p + 1))
8721             || *(p + 1) == 'x'
8722             || *(p + 1) == 'o' ))
8723          {
8724
8725           /* Here, it could be an 's', too much
8726           * bother to figure it out here.  Flush
8727           * the buffer if any; when come back
8728           * here, set the state so know that the
8729           * previous char was an 's' */
8730           if (len != 0) {
8731            latest_char_state = generic_char;
8732            p = oldp;
8733            goto loopdone;
8734           }
8735           latest_char_state = char_s;
8736           break;
8737          }
8738         }
8739        }
8740
8741        /* Here, can't be an 'ss' sequence, or at least not
8742        * one that could fold to/from the sharp ss */
8743        latest_char_state = generic_char;
8744        break;
8745       case 0x03C5: /* First char in upsilon series */
8746        if (p < RExC_end - 4) { /* Need >= 4 bytes left */
8747         latest_char_state = upsilon_1;
8748         if (len != 0) {
8749          p = oldp;
8750          goto loopdone;
8751         }
8752        }
8753        else {
8754         latest_char_state = generic_char;
8755        }
8756        break;
8757       case 0x03B9: /* First char in iota series */
8758        if (p < RExC_end - 4) {
8759         latest_char_state = iota_1;
8760         if (len != 0) {
8761          p = oldp;
8762          goto loopdone;
8763         }
8764        }
8765        else {
8766         latest_char_state = generic_char;
8767        }
8768        break;
8769       case 0x0308:
8770        if (latest_char_state == upsilon_1) {
8771         latest_char_state = upsilon_2;
8772        }
8773        else if (latest_char_state == iota_1) {
8774         latest_char_state = iota_2;
8775        }
8776        else {
8777         latest_char_state = generic_char;
8778        }
8779        break;
8780       case 0x301:
8781        if (latest_char_state == upsilon_2) {
8782         ender = GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS;
8783         goto do_tricky;
8784        }
8785        else if (latest_char_state == iota_2) {
8786         ender = GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS;
8787         goto do_tricky;
8788        }
8789        latest_char_state = generic_char;
8790        break;
8791
8792       /* These are the tricky fold characters.  Flush any
8793       * buffer first. */
8794       case GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS:
8795       case GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS:
8796       case LATIN_SMALL_LETTER_SHARP_S:
8797       case LATIN_CAPITAL_LETTER_SHARP_S:
8798       case 0x1FD3:
8799       case 0x1FE3:
8800        if (len != 0) {
8801         p = oldp;
8802         goto loopdone;
8803        }
8804        /* FALL THROUGH */
8805       do_tricky: {
8806        char* const oldregxend = RExC_end;
8807        U8 tmpbuf[UTF8_MAXBYTES+1];
8808
8809        /* Here, we know we need to generate a special
8810        * regnode, and 'ender' contains the tricky
8811        * character.  What's done is to pretend it's in a
8812        * [bracketed] class, and let the code that deals
8813        * with those handle it, as that code has all the
8814        * intelligence necessary.  First save the current
8815        * parse state, get rid of the already allocated
8816        * but empty EXACT node that the ANYOFV node will
8817        * replace, and point the parse to a buffer which
8818        * we fill with the character we want the regclass
8819        * code to think is being parsed */
8820        RExC_emit = orig_emit;
8821        RExC_parse = (char *) tmpbuf;
8822        if (UTF) {
8823         U8 *d = uvchr_to_utf8(tmpbuf, ender);
8824         *d = '\0';
8825         RExC_end = (char *) d;
8826        }
8827        else {  /* ender above 255 already excluded */
8828         tmpbuf[0] = (U8) ender;
8829         tmpbuf[1] = '\0';
8830         RExC_end = RExC_parse + 1;
8831        }
8832
8833        ret = regclass(pRExC_state,depth+1);
8834
8835        /* Here, have parsed the buffer.  Reset the parse to
8836        * the actual input, and return */
8837        RExC_end = oldregxend;
8838        RExC_parse = p - 1;
8839
8840        Set_Node_Offset(ret, RExC_parse);
8841        Set_Node_Cur_Length(ret);
8842        nextchar(pRExC_state);
8843        *flagp |= HASWIDTH|SIMPLE;
8844        return ret;
8845       }
8846      }
8847     }
8848
8849     if ( RExC_flags & RXf_PMf_EXTENDED)
8850      p = regwhite( pRExC_state, p );
8851     if (UTF && FOLD) {
8852      /* Prime the casefolded buffer.  Locale rules, which apply
8853      * only to code points < 256, aren't known until execution,
8854      * so for them, just output the original character using
8855      * utf8 */
8856      if (LOC && ender < 256) {
8857       if (UNI_IS_INVARIANT(ender)) {
8858        *tmpbuf = (U8) ender;
8859        foldlen = 1;
8860       } else {
8861        *tmpbuf = UTF8_TWO_BYTE_HI(ender);
8862        *(tmpbuf + 1) = UTF8_TWO_BYTE_LO(ender);
8863        foldlen = 2;
8864       }
8865      }
8866      else if (isASCII(ender)) { /* Note: Here can't also be LOC
8867             */
8868       ender = toLOWER(ender);
8869       *tmpbuf = (U8) ender;
8870       foldlen = 1;
8871      }
8872      else if (! MORE_ASCII_RESTRICTED && ! LOC) {
8873
8874       /* Locale and /aa require more selectivity about the
8875       * fold, so are handled below.  Otherwise, here, just
8876       * use the fold */
8877       ender = toFOLD_uni(ender, tmpbuf, &foldlen);
8878      }
8879      else {
8880       /* Under locale rules or /aa we are not to mix,
8881       * respectively, ords < 256 or ASCII with non-.  So
8882       * reject folds that mix them, using only the
8883       * non-folded code point.  So do the fold to a
8884       * temporary, and inspect each character in it. */
8885       U8 trialbuf[UTF8_MAXBYTES_CASE+1];
8886       U8* s = trialbuf;
8887       UV tmpender = toFOLD_uni(ender, trialbuf, &foldlen);
8888       U8* e = s + foldlen;
8889       bool fold_ok = TRUE;
8890
8891       while (s < e) {
8892        if (isASCII(*s)
8893         || (LOC && (UTF8_IS_INVARIANT(*s)
8894           || UTF8_IS_DOWNGRADEABLE_START(*s))))
8895        {
8896         fold_ok = FALSE;
8897         break;
8898        }
8899        s += UTF8SKIP(s);
8900       }
8901       if (fold_ok) {
8902        Copy(trialbuf, tmpbuf, foldlen, U8);
8903        ender = tmpender;
8904       }
8905       else {
8906        uvuni_to_utf8(tmpbuf, ender);
8907        foldlen = UNISKIP(ender);
8908       }
8909      }
8910     }
8911     if (p < RExC_end && ISMULT2(p)) { /* Back off on ?+*. */
8912      if (len)
8913       p = oldp;
8914      else if (UTF) {
8915       if (FOLD) {
8916        /* Emit all the Unicode characters. */
8917        STRLEN numlen;
8918        for (foldbuf = tmpbuf;
8919         foldlen;
8920         foldlen -= numlen) {
8921         ender = utf8_to_uvchr(foldbuf, &numlen);
8922         if (numlen > 0) {
8923           const STRLEN unilen = reguni(pRExC_state, ender, s);
8924           s       += unilen;
8925           len     += unilen;
8926           /* In EBCDIC the numlen
8927           * and unilen can differ. */
8928           foldbuf += numlen;
8929           if (numlen >= foldlen)
8930            break;
8931         }
8932         else
8933           break; /* "Can't happen." */
8934        }
8935       }
8936       else {
8937        const STRLEN unilen = reguni(pRExC_state, ender, s);
8938        if (unilen > 0) {
8939         s   += unilen;
8940         len += unilen;
8941        }
8942       }
8943      }
8944      else {
8945       len++;
8946       REGC((char)ender, s++);
8947      }
8948      break;
8949     }
8950     if (UTF) {
8951      if (FOLD) {
8952       /* Emit all the Unicode characters. */
8953       STRLEN numlen;
8954       for (foldbuf = tmpbuf;
8955        foldlen;
8956        foldlen -= numlen) {
8957        ender = utf8_to_uvchr(foldbuf, &numlen);
8958        if (numlen > 0) {
8959          const STRLEN unilen = reguni(pRExC_state, ender, s);
8960          len     += unilen;
8961          s       += unilen;
8962          /* In EBCDIC the numlen
8963          * and unilen can differ. */
8964          foldbuf += numlen;
8965          if (numlen >= foldlen)
8966           break;
8967        }
8968        else
8969          break;
8970       }
8971      }
8972      else {
8973       const STRLEN unilen = reguni(pRExC_state, ender, s);
8974       if (unilen > 0) {
8975        s   += unilen;
8976        len += unilen;
8977       }
8978      }
8979      len--;
8980     }
8981     else {
8982      REGC((char)ender, s++);
8983     }
8984    }
8985   loopdone:   /* Jumped to when encounters something that shouldn't be in
8986      the node */
8987    RExC_parse = p - 1;
8988    Set_Node_Cur_Length(ret); /* MJD */
8989    nextchar(pRExC_state);
8990    {
8991     /* len is STRLEN which is unsigned, need to copy to signed */
8992     IV iv = len;
8993     if (iv < 0)
8994      vFAIL("Internal disaster");
8995    }
8996    if (len > 0)
8997     *flagp |= HASWIDTH;
8998    if (len == 1 && UNI_IS_INVARIANT(ender))
8999     *flagp |= SIMPLE;
9000
9001    if (SIZE_ONLY)
9002     RExC_size += STR_SZ(len);
9003    else {
9004     STR_LEN(ret) = len;
9005     RExC_emit += STR_SZ(len);
9006    }
9007   }
9008   break;
9009  }
9010
9011  return(ret);
9012
9013 /* Jumped to when an unrecognized character set is encountered */
9014 bad_charset:
9015  Perl_croak(aTHX_ "panic: Unknown regex character set encoding: %u", get_regex_charset(RExC_flags));
9016  return(NULL);
9017 }
9018
9019 STATIC char *
9020 S_regwhite( RExC_state_t *pRExC_state, char *p )
9021 {
9022  const char *e = RExC_end;
9023
9024  PERL_ARGS_ASSERT_REGWHITE;
9025
9026  while (p < e) {
9027   if (isSPACE(*p))
9028    ++p;
9029   else if (*p == '#') {
9030    bool ended = 0;
9031    do {
9032     if (*p++ == '\n') {
9033      ended = 1;
9034      break;
9035     }
9036    } while (p < e);
9037    if (!ended)
9038     RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
9039   }
9040   else
9041    break;
9042  }
9043  return p;
9044 }
9045
9046 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
9047    Character classes ([:foo:]) can also be negated ([:^foo:]).
9048    Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
9049    Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
9050    but trigger failures because they are currently unimplemented. */
9051
9052 #define POSIXCC_DONE(c)   ((c) == ':')
9053 #define POSIXCC_NOTYET(c) ((c) == '=' || (c) == '.')
9054 #define POSIXCC(c) (POSIXCC_DONE(c) || POSIXCC_NOTYET(c))
9055
9056 STATIC I32
9057 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value)
9058 {
9059  dVAR;
9060  I32 namedclass = OOB_NAMEDCLASS;
9061
9062  PERL_ARGS_ASSERT_REGPPOSIXCC;
9063
9064  if (value == '[' && RExC_parse + 1 < RExC_end &&
9065   /* I smell either [: or [= or [. -- POSIX has been here, right? */
9066   POSIXCC(UCHARAT(RExC_parse))) {
9067   const char c = UCHARAT(RExC_parse);
9068   char* const s = RExC_parse++;
9069
9070   while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != c)
9071    RExC_parse++;
9072   if (RExC_parse == RExC_end)
9073    /* Grandfather lone [:, [=, [. */
9074    RExC_parse = s;
9075   else {
9076    const char* const t = RExC_parse++; /* skip over the c */
9077    assert(*t == c);
9078
9079    if (UCHARAT(RExC_parse) == ']') {
9080     const char *posixcc = s + 1;
9081     RExC_parse++; /* skip over the ending ] */
9082
9083     if (*s == ':') {
9084      const I32 complement = *posixcc == '^' ? *posixcc++ : 0;
9085      const I32 skip = t - posixcc;
9086
9087      /* Initially switch on the length of the name.  */
9088      switch (skip) {
9089      case 4:
9090       if (memEQ(posixcc, "word", 4)) /* this is not POSIX, this is the Perl \w */
9091        namedclass = complement ? ANYOF_NALNUM : ANYOF_ALNUM;
9092       break;
9093      case 5:
9094       /* Names all of length 5.  */
9095       /* alnum alpha ascii blank cntrl digit graph lower
9096       print punct space upper  */
9097       /* Offset 4 gives the best switch position.  */
9098       switch (posixcc[4]) {
9099       case 'a':
9100        if (memEQ(posixcc, "alph", 4)) /* alpha */
9101         namedclass = complement ? ANYOF_NALPHA : ANYOF_ALPHA;
9102        break;
9103       case 'e':
9104        if (memEQ(posixcc, "spac", 4)) /* space */
9105         namedclass = complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
9106        break;
9107       case 'h':
9108        if (memEQ(posixcc, "grap", 4)) /* graph */
9109         namedclass = complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
9110        break;
9111       case 'i':
9112        if (memEQ(posixcc, "asci", 4)) /* ascii */
9113         namedclass = complement ? ANYOF_NASCII : ANYOF_ASCII;
9114        break;
9115       case 'k':
9116        if (memEQ(posixcc, "blan", 4)) /* blank */
9117         namedclass = complement ? ANYOF_NBLANK : ANYOF_BLANK;
9118        break;
9119       case 'l':
9120        if (memEQ(posixcc, "cntr", 4)) /* cntrl */
9121         namedclass = complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
9122        break;
9123       case 'm':
9124        if (memEQ(posixcc, "alnu", 4)) /* alnum */
9125         namedclass = complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
9126        break;
9127       case 'r':
9128        if (memEQ(posixcc, "lowe", 4)) /* lower */
9129         namedclass = complement ? ANYOF_NLOWER : ANYOF_LOWER;
9130        else if (memEQ(posixcc, "uppe", 4)) /* upper */
9131         namedclass = complement ? ANYOF_NUPPER : ANYOF_UPPER;
9132        break;
9133       case 't':
9134        if (memEQ(posixcc, "digi", 4)) /* digit */
9135         namedclass = complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
9136        else if (memEQ(posixcc, "prin", 4)) /* print */
9137         namedclass = complement ? ANYOF_NPRINT : ANYOF_PRINT;
9138        else if (memEQ(posixcc, "punc", 4)) /* punct */
9139         namedclass = complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
9140        break;
9141       }
9142       break;
9143      case 6:
9144       if (memEQ(posixcc, "xdigit", 6))
9145        namedclass = complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
9146       break;
9147      }
9148
9149      if (namedclass == OOB_NAMEDCLASS)
9150       Simple_vFAIL3("POSIX class [:%.*s:] unknown",
9151          t - s - 1, s + 1);
9152      assert (posixcc[skip] == ':');
9153      assert (posixcc[skip+1] == ']');
9154     } else if (!SIZE_ONLY) {
9155      /* [[=foo=]] and [[.foo.]] are still future. */
9156
9157      /* adjust RExC_parse so the warning shows after
9158      the class closes */
9159      while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse) != ']')
9160       RExC_parse++;
9161      Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
9162     }
9163    } else {
9164     /* Maternal grandfather:
9165     * "[:" ending in ":" but not in ":]" */
9166     RExC_parse = s;
9167    }
9168   }
9169  }
9170
9171  return namedclass;
9172 }
9173
9174 STATIC void
9175 S_checkposixcc(pTHX_ RExC_state_t *pRExC_state)
9176 {
9177  dVAR;
9178
9179  PERL_ARGS_ASSERT_CHECKPOSIXCC;
9180
9181  if (POSIXCC(UCHARAT(RExC_parse))) {
9182   const char *s = RExC_parse;
9183   const char  c = *s++;
9184
9185   while (isALNUM(*s))
9186    s++;
9187   if (*s && c == *s && s[1] == ']') {
9188    ckWARN3reg(s+2,
9189      "POSIX syntax [%c %c] belongs inside character classes",
9190      c, c);
9191
9192    /* [[=foo=]] and [[.foo.]] are still future. */
9193    if (POSIXCC_NOTYET(c)) {
9194     /* adjust RExC_parse so the error shows after
9195     the class closes */
9196     while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse++) != ']')
9197      NOOP;
9198     Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
9199    }
9200   }
9201  }
9202 }
9203
9204 /* No locale test, and always Unicode semantics, no ignore-case differences */
9205 #define _C_C_T_NOLOC_(NAME,TEST,WORD)                                          \
9206 ANYOF_##NAME:                                                                  \
9207   for (value = 0; value < 256; value++)                                  \
9208    if (TEST)                                                          \
9209    stored += set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);  \
9210  yesno = '+';                                                               \
9211  what = WORD;                                                               \
9212  break;                                                                     \
9213 case ANYOF_N##NAME:                                                            \
9214   for (value = 0; value < 256; value++)                                  \
9215    if (!TEST)                                                         \
9216    stored += set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);  \
9217  yesno = '!';                                                               \
9218  what = WORD;                                                               \
9219  break
9220
9221 /* Like the above, but there are differences if we are in uni-8-bit or not, so
9222  * there are two tests passed in, to use depending on that. There aren't any
9223  * cases where the label is different from the name, so no need for that
9224  * parameter.
9225  * Sets 'what' to WORD which is the property name for non-bitmap code points;
9226  * But, uses FOLD_WORD instead if /i has been selected, to allow a different
9227  * property name */
9228 #define _C_C_T_(NAME, TEST_8, TEST_7, WORD, FOLD_WORD)                         \
9229 ANYOF_##NAME:                                                                  \
9230  if (LOC) ANYOF_CLASS_SET(ret, ANYOF_##NAME);                               \
9231  else if (UNI_SEMANTICS) {                                                  \
9232   for (value = 0; value < 256; value++) {                                \
9233    if (TEST_8(value)) stored +=                                       \
9234      set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);  \
9235   }                                                                      \
9236  }                                                                          \
9237  else {                                                                     \
9238   for (value = 0; value < 128; value++) {                                \
9239    if (TEST_7(UNI_TO_NATIVE(value))) stored +=                        \
9240     set_regclass_bit(pRExC_state, ret,                     \
9241         (U8) UNI_TO_NATIVE(value), &l1_fold_invlist, &unicode_alternate);                 \
9242   }                                                                      \
9243  }                                                                          \
9244  yesno = '+';                                                               \
9245  if (FOLD) {                                                                \
9246   what = FOLD_WORD;                                                      \
9247  }                                                                          \
9248  else {                                                                     \
9249   what = WORD;                                                           \
9250  }                                                                          \
9251  break;                                                                     \
9252 case ANYOF_N##NAME:                                                            \
9253  if (LOC) ANYOF_CLASS_SET(ret, ANYOF_N##NAME);                              \
9254  else if (UNI_SEMANTICS) {                                                  \
9255   for (value = 0; value < 256; value++) {                                \
9256    if (! TEST_8(value)) stored +=                                     \
9257      set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);    \
9258   }                                                                      \
9259  }                                                                          \
9260  else {                                                                     \
9261   for (value = 0; value < 128; value++) {                                \
9262    if (! TEST_7(UNI_TO_NATIVE(value))) stored += set_regclass_bit(  \
9263       pRExC_state, ret, (U8) UNI_TO_NATIVE(value), &l1_fold_invlist, &unicode_alternate);    \
9264   }                                                                      \
9265   if (AT_LEAST_ASCII_RESTRICTED) {                                       \
9266    for (value = 128; value < 256; value++) {                          \
9267    stored += set_regclass_bit(                                     \
9268       pRExC_state, ret, (U8) UNI_TO_NATIVE(value), &l1_fold_invlist, &unicode_alternate); \
9269    }                                                                  \
9270    ANYOF_FLAGS(ret) |= ANYOF_UNICODE_ALL;                             \
9271   }                                                                      \
9272   else {                                                                 \
9273    /* For a non-ut8 target string with DEPENDS semantics, all above   \
9274    * ASCII Latin1 code points match the complement of any of the     \
9275    * classes.  But in utf8, they have their Unicode semantics, so    \
9276    * can't just set them in the bitmap, or else regexec.c will think \
9277    * they matched when they shouldn't. */                            \
9278    ANYOF_FLAGS(ret) |= ANYOF_NON_UTF8_LATIN1_ALL;                     \
9279   }                                                                      \
9280  }                                                                          \
9281  yesno = '!';                                                               \
9282  if (FOLD) {                                                                \
9283   what = FOLD_WORD;                                                      \
9284  }                                                                          \
9285  else {                                                                     \
9286   what = WORD;                                                           \
9287  }                                                                          \
9288  break
9289
9290 STATIC U8
9291 S_set_regclass_bit_fold(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** invlist_ptr, AV** alternate_ptr)
9292 {
9293
9294  /* Handle the setting of folds in the bitmap for non-locale ANYOF nodes.
9295  * Locale folding is done at run-time, so this function should not be
9296  * called for nodes that are for locales.
9297  *
9298  * This function sets the bit corresponding to the fold of the input
9299  * 'value', if not already set.  The fold of 'f' is 'F', and the fold of
9300  * 'F' is 'f'.
9301  *
9302  * It also knows about the characters that are in the bitmap that have
9303  * folds that are matchable only outside it, and sets the appropriate lists
9304  * and flags.
9305  *
9306  * It returns the number of bits that actually changed from 0 to 1 */
9307
9308  U8 stored = 0;
9309  U8 fold;
9310
9311  PERL_ARGS_ASSERT_SET_REGCLASS_BIT_FOLD;
9312
9313  fold = (AT_LEAST_UNI_SEMANTICS) ? PL_fold_latin1[value]
9314          : PL_fold[value];
9315
9316  /* It assumes the bit for 'value' has already been set */
9317  if (fold != value && ! ANYOF_BITMAP_TEST(node, fold)) {
9318   ANYOF_BITMAP_SET(node, fold);
9319   stored++;
9320  }
9321  if (_HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(value) && (! isASCII(value) || ! MORE_ASCII_RESTRICTED)) {
9322   /* Certain Latin1 characters have matches outside the bitmap.  To get
9323   * here, 'value' is one of those characters.   None of these matches is
9324   * valid for ASCII characters under /aa, which have been excluded by
9325   * the 'if' above.  The matches fall into three categories:
9326   * 1) They are singly folded-to or -from an above 255 character, as
9327   *    LATIN SMALL LETTER Y WITH DIAERESIS and LATIN CAPITAL LETTER Y
9328   *    WITH DIAERESIS;
9329   * 2) They are part of a multi-char fold with another character in the
9330   *    bitmap, only LATIN SMALL LETTER SHARP S => "ss" fits that bill;
9331   * 3) They are part of a multi-char fold with a character not in the
9332   *    bitmap, such as various ligatures.
9333   * We aren't dealing fully with multi-char folds, except we do deal
9334   * with the pattern containing a character that has a multi-char fold
9335   * (not so much the inverse).
9336   * For types 1) and 3), the matches only happen when the target string
9337   * is utf8; that's not true for 2), and we set a flag for it.
9338   *
9339   * The code below adds to the passed in inversion list the single fold
9340   * closures for 'value'.  The values are hard-coded here so that an
9341   * innocent-looking character class, like /[ks]/i won't have to go out
9342   * to disk to find the possible matches.  XXX It would be better to
9343   * generate these via regen, in case a new version of the Unicode
9344   * standard adds new mappings, though that is not really likely. */
9345   switch (value) {
9346    case 'k':
9347    case 'K':
9348     /* KELVIN SIGN */
9349     *invlist_ptr = add_cp_to_invlist(*invlist_ptr, 0x212A);
9350     break;
9351    case 's':
9352    case 'S':
9353     /* LATIN SMALL LETTER LONG S */
9354     *invlist_ptr = add_cp_to_invlist(*invlist_ptr, 0x017F);
9355     break;
9356    case MICRO_SIGN:
9357     *invlist_ptr = add_cp_to_invlist(*invlist_ptr,
9358             GREEK_SMALL_LETTER_MU);
9359     *invlist_ptr = add_cp_to_invlist(*invlist_ptr,
9360             GREEK_CAPITAL_LETTER_MU);
9361     break;
9362    case LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE:
9363    case LATIN_SMALL_LETTER_A_WITH_RING_ABOVE:
9364     /* ANGSTROM SIGN */
9365     *invlist_ptr = add_cp_to_invlist(*invlist_ptr, 0x212B);
9366     if (DEPENDS_SEMANTICS) {    /* See DEPENDS comment below */
9367      *invlist_ptr = add_cp_to_invlist(*invlist_ptr,
9368              PL_fold_latin1[value]);
9369     }
9370     break;
9371    case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS:
9372     *invlist_ptr = add_cp_to_invlist(*invlist_ptr,
9373           LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS);
9374     break;
9375    case LATIN_SMALL_LETTER_SHARP_S:
9376     *invlist_ptr = add_cp_to_invlist(*invlist_ptr,
9377           LATIN_CAPITAL_LETTER_SHARP_S);
9378
9379     /* Under /a, /d, and /u, this can match the two chars "ss" */
9380     if (! MORE_ASCII_RESTRICTED) {
9381      add_alternate(alternate_ptr, (U8 *) "ss", 2);
9382
9383      /* And under /u or /a, it can match even if the target is
9384      * not utf8 */
9385      if (AT_LEAST_UNI_SEMANTICS) {
9386       ANYOF_FLAGS(node) |= ANYOF_NONBITMAP_NON_UTF8;
9387      }
9388     }
9389     break;
9390    case 'F': case 'f':
9391    case 'I': case 'i':
9392    case 'L': case 'l':
9393    case 'T': case 't':
9394    case 'A': case 'a':
9395    case 'H': case 'h':
9396    case 'J': case 'j':
9397    case 'N': case 'n':
9398    case 'W': case 'w':
9399    case 'Y': case 'y':
9400     /* These all are targets of multi-character folds from code
9401     * points that require UTF8 to express, so they can't match
9402     * unless the target string is in UTF-8, so no action here is
9403     * necessary, as regexec.c properly handles the general case
9404     * for UTF-8 matching */
9405     break;
9406    default:
9407     /* Use deprecated warning to increase the chances of this
9408     * being output */
9409     ckWARN2regdep(RExC_parse, "Perl folding rules are not up-to-date for 0x%x; please use the perlbug utility to report;", value);
9410     break;
9411   }
9412  }
9413  else if (DEPENDS_SEMANTICS
9414    && ! isASCII(value)
9415    && PL_fold_latin1[value] != value)
9416  {
9417   /* Under DEPENDS rules, non-ASCII Latin1 characters match their
9418    * folds only when the target string is in UTF-8.  We add the fold
9419    * here to the list of things to match outside the bitmap, which
9420    * won't be looked at unless it is UTF8 (or else if something else
9421    * says to look even if not utf8, but those things better not happen
9422    * under DEPENDS semantics. */
9423   *invlist_ptr = add_cp_to_invlist(*invlist_ptr, PL_fold_latin1[value]);
9424  }
9425
9426  return stored;
9427 }
9428
9429
9430 PERL_STATIC_INLINE U8
9431 S_set_regclass_bit(pTHX_ RExC_state_t *pRExC_state, regnode* node, const U8 value, HV** invlist_ptr, AV** alternate_ptr)
9432 {
9433  /* This inline function sets a bit in the bitmap if not already set, and if
9434  * appropriate, its fold, returning the number of bits that actually
9435  * changed from 0 to 1 */
9436
9437  U8 stored;
9438
9439  PERL_ARGS_ASSERT_SET_REGCLASS_BIT;
9440
9441  if (ANYOF_BITMAP_TEST(node, value)) {   /* Already set */
9442   return 0;
9443  }
9444
9445  ANYOF_BITMAP_SET(node, value);
9446  stored = 1;
9447
9448  if (FOLD && ! LOC) { /* Locale folds aren't known until runtime */
9449   stored += set_regclass_bit_fold(pRExC_state, node, value, invlist_ptr, alternate_ptr);
9450  }
9451
9452  return stored;
9453 }
9454
9455 STATIC void
9456 S_add_alternate(pTHX_ AV** alternate_ptr, U8* string, STRLEN len)
9457 {
9458  /* Adds input 'string' with length 'len' to the ANYOF node's unicode
9459  * alternate list, pointed to by 'alternate_ptr'.  This is an array of
9460  * the multi-character folds of characters in the node */
9461  SV *sv;
9462
9463  PERL_ARGS_ASSERT_ADD_ALTERNATE;
9464
9465  if (! *alternate_ptr) {
9466   *alternate_ptr = newAV();
9467  }
9468  sv = newSVpvn_utf8((char*)string, len, TRUE);
9469  av_push(*alternate_ptr, sv);
9470  return;
9471 }
9472
9473 /*
9474    parse a class specification and produce either an ANYOF node that
9475    matches the pattern or perhaps will be optimized into an EXACTish node
9476    instead. The node contains a bit map for the first 256 characters, with the
9477    corresponding bit set if that character is in the list.  For characters
9478    above 255, a range list is used */
9479
9480 STATIC regnode *
9481 S_regclass(pTHX_ RExC_state_t *pRExC_state, U32 depth)
9482 {
9483  dVAR;
9484  register UV nextvalue;
9485  register IV prevvalue = OOB_UNICODE;
9486  register IV range = 0;
9487  UV value = 0; /* XXX:dmq: needs to be referenceable (unfortunately) */
9488  register regnode *ret;
9489  STRLEN numlen;
9490  IV namedclass;
9491  char *rangebegin = NULL;
9492  bool need_class = 0;
9493  bool allow_full_fold = TRUE;   /* Assume wants multi-char folding */
9494  SV *listsv = NULL;
9495  STRLEN initial_listsv_len = 0; /* Kind of a kludge to see if it is more
9496          than just initialized.  */
9497  UV n;
9498
9499  /* code points this node matches that can't be stored in the bitmap */
9500  HV* nonbitmap = NULL;
9501
9502  /* The items that are to match that aren't stored in the bitmap, but are a
9503  * result of things that are stored there.  This is the fold closure of
9504  * such a character, either because it has DEPENDS semantics and shouldn't
9505  * be matched unless the target string is utf8, or is a code point that is
9506  * too large for the bit map, as for example, the fold of the MICRO SIGN is
9507  * above 255.  This all is solely for performance reasons.  By having this
9508  * code know the outside-the-bitmap folds that the bitmapped characters are
9509  * involved with, we don't have to go out to disk to find the list of
9510  * matches, unless the character class includes code points that aren't
9511  * storable in the bit map.  That means that a character class with an 's'
9512  * in it, for example, doesn't need to go out to disk to find everything
9513  * that matches.  A 2nd list is used so that the 'nonbitmap' list is kept
9514  * empty unless there is something whose fold we don't know about, and will
9515  * have to go out to the disk to find. */
9516  HV* l1_fold_invlist = NULL;
9517
9518  /* List of multi-character folds that are matched by this node */
9519  AV* unicode_alternate  = NULL;
9520 #ifdef EBCDIC
9521  UV literal_endpoint = 0;
9522 #endif
9523  UV stored = 0;  /* how many chars stored in the bitmap */
9524
9525  regnode * const orig_emit = RExC_emit; /* Save the original RExC_emit in
9526   case we need to change the emitted regop to an EXACT. */
9527  const char * orig_parse = RExC_parse;
9528  GET_RE_DEBUG_FLAGS_DECL;
9529
9530  PERL_ARGS_ASSERT_REGCLASS;
9531 #ifndef DEBUGGING
9532  PERL_UNUSED_ARG(depth);
9533 #endif
9534
9535  DEBUG_PARSE("clas");
9536
9537  /* Assume we are going to generate an ANYOF node. */
9538  ret = reganode(pRExC_state, ANYOF, 0);
9539
9540
9541  if (!SIZE_ONLY) {
9542   ANYOF_FLAGS(ret) = 0;
9543  }
9544
9545  if (UCHARAT(RExC_parse) == '^') { /* Complement of range. */
9546   RExC_naughty++;
9547   RExC_parse++;
9548   if (!SIZE_ONLY)
9549    ANYOF_FLAGS(ret) |= ANYOF_INVERT;
9550
9551   /* We have decided to not allow multi-char folds in inverted character
9552   * classes, due to the confusion that can happen, even with classes
9553   * that are designed for a non-Unicode world:  You have the peculiar
9554   * case that:
9555    "s s" =~ /^[^\xDF]+$/i => Y
9556    "ss"  =~ /^[^\xDF]+$/i => N
9557   *
9558   * See [perl #89750] */
9559   allow_full_fold = FALSE;
9560  }
9561
9562  if (SIZE_ONLY) {
9563   RExC_size += ANYOF_SKIP;
9564   listsv = &PL_sv_undef; /* For code scanners: listsv always non-NULL. */
9565  }
9566  else {
9567   RExC_emit += ANYOF_SKIP;
9568   if (LOC) {
9569    ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
9570   }
9571   ANYOF_BITMAP_ZERO(ret);
9572   listsv = newSVpvs("# comment\n");
9573   initial_listsv_len = SvCUR(listsv);
9574  }
9575
9576  nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
9577
9578  if (!SIZE_ONLY && POSIXCC(nextvalue))
9579   checkposixcc(pRExC_state);
9580
9581  /* allow 1st char to be ] (allowing it to be - is dealt with later) */
9582  if (UCHARAT(RExC_parse) == ']')
9583   goto charclassloop;
9584
9585 parseit:
9586  while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
9587
9588  charclassloop:
9589
9590   namedclass = OOB_NAMEDCLASS; /* initialize as illegal */
9591
9592   if (!range)
9593    rangebegin = RExC_parse;
9594   if (UTF) {
9595    value = utf8n_to_uvchr((U8*)RExC_parse,
9596         RExC_end - RExC_parse,
9597         &numlen, UTF8_ALLOW_DEFAULT);
9598    RExC_parse += numlen;
9599   }
9600   else
9601    value = UCHARAT(RExC_parse++);
9602
9603   nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
9604   if (value == '[' && POSIXCC(nextvalue))
9605    namedclass = regpposixcc(pRExC_state, value);
9606   else if (value == '\\') {
9607    if (UTF) {
9608     value = utf8n_to_uvchr((U8*)RExC_parse,
9609         RExC_end - RExC_parse,
9610         &numlen, UTF8_ALLOW_DEFAULT);
9611     RExC_parse += numlen;
9612    }
9613    else
9614     value = UCHARAT(RExC_parse++);
9615    /* Some compilers cannot handle switching on 64-bit integer
9616    * values, therefore value cannot be an UV.  Yes, this will
9617    * be a problem later if we want switch on Unicode.
9618    * A similar issue a little bit later when switching on
9619    * namedclass. --jhi */
9620    switch ((I32)value) {
9621    case 'w': namedclass = ANYOF_ALNUM; break;
9622    case 'W': namedclass = ANYOF_NALNUM; break;
9623    case 's': namedclass = ANYOF_SPACE; break;
9624    case 'S': namedclass = ANYOF_NSPACE; break;
9625    case 'd': namedclass = ANYOF_DIGIT; break;
9626    case 'D': namedclass = ANYOF_NDIGIT; break;
9627    case 'v': namedclass = ANYOF_VERTWS; break;
9628    case 'V': namedclass = ANYOF_NVERTWS; break;
9629    case 'h': namedclass = ANYOF_HORIZWS; break;
9630    case 'H': namedclass = ANYOF_NHORIZWS; break;
9631    case 'N':  /* Handle \N{NAME} in class */
9632     {
9633      /* We only pay attention to the first char of
9634      multichar strings being returned. I kinda wonder
9635      if this makes sense as it does change the behaviour
9636      from earlier versions, OTOH that behaviour was broken
9637      as well. */
9638      UV v; /* value is register so we cant & it /grrr */
9639      if (reg_namedseq(pRExC_state, &v, NULL, depth)) {
9640       goto parseit;
9641      }
9642      value= v;
9643     }
9644     break;
9645    case 'p':
9646    case 'P':
9647     {
9648     char *e;
9649     if (RExC_parse >= RExC_end)
9650      vFAIL2("Empty \\%c{}", (U8)value);
9651     if (*RExC_parse == '{') {
9652      const U8 c = (U8)value;
9653      e = strchr(RExC_parse++, '}');
9654      if (!e)
9655       vFAIL2("Missing right brace on \\%c{}", c);
9656      while (isSPACE(UCHARAT(RExC_parse)))
9657       RExC_parse++;
9658      if (e == RExC_parse)
9659       vFAIL2("Empty \\%c{}", c);
9660      n = e - RExC_parse;
9661      while (isSPACE(UCHARAT(RExC_parse + n - 1)))
9662       n--;
9663     }
9664     else {
9665      e = RExC_parse;
9666      n = 1;
9667     }
9668     if (!SIZE_ONLY) {
9669      if (UCHARAT(RExC_parse) == '^') {
9670       RExC_parse++;
9671       n--;
9672       value = value == 'p' ? 'P' : 'p'; /* toggle */
9673       while (isSPACE(UCHARAT(RExC_parse))) {
9674        RExC_parse++;
9675        n--;
9676       }
9677      }
9678
9679      /* Add the property name to the list.  If /i matching, give
9680      * a different name which consists of the normal name
9681      * sandwiched between two underscores and '_i'.  The design
9682      * is discussed in the commit message for this. */
9683      Perl_sv_catpvf(aTHX_ listsv, "%cutf8::%s%.*s%s\n",
9684           (value=='p' ? '+' : '!'),
9685           (FOLD) ? "__" : "",
9686           (int)n,
9687           RExC_parse,
9688           (FOLD) ? "_i" : ""
9689          );
9690     }
9691     RExC_parse = e + 1;
9692
9693     /* The \p could match something in the Latin1 range, hence
9694     * something that isn't utf8 */
9695     ANYOF_FLAGS(ret) |= ANYOF_NONBITMAP_NON_UTF8;
9696     namedclass = ANYOF_MAX;  /* no official name, but it's named */
9697
9698     /* \p means they want Unicode semantics */
9699     RExC_uni_semantics = 1;
9700     }
9701     break;
9702    case 'n': value = '\n';   break;
9703    case 'r': value = '\r';   break;
9704    case 't': value = '\t';   break;
9705    case 'f': value = '\f';   break;
9706    case 'b': value = '\b';   break;
9707    case 'e': value = ASCII_TO_NATIVE('\033');break;
9708    case 'a': value = ASCII_TO_NATIVE('\007');break;
9709    case 'o':
9710     RExC_parse--; /* function expects to be pointed at the 'o' */
9711     {
9712      const char* error_msg;
9713      bool valid = grok_bslash_o(RExC_parse,
9714            &value,
9715            &numlen,
9716            &error_msg,
9717            SIZE_ONLY);
9718      RExC_parse += numlen;
9719      if (! valid) {
9720       vFAIL(error_msg);
9721      }
9722     }
9723     if (PL_encoding && value < 0x100) {
9724      goto recode_encoding;
9725     }
9726     break;
9727    case 'x':
9728     if (*RExC_parse == '{') {
9729      I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
9730       | PERL_SCAN_DISALLOW_PREFIX;
9731      char * const e = strchr(RExC_parse++, '}');
9732      if (!e)
9733       vFAIL("Missing right brace on \\x{}");
9734
9735      numlen = e - RExC_parse;
9736      value = grok_hex(RExC_parse, &numlen, &flags, NULL);
9737      RExC_parse = e + 1;
9738     }
9739     else {
9740      I32 flags = PERL_SCAN_DISALLOW_PREFIX;
9741      numlen = 2;
9742      value = grok_hex(RExC_parse, &numlen, &flags, NULL);
9743      RExC_parse += numlen;
9744     }
9745     if (PL_encoding && value < 0x100)
9746      goto recode_encoding;
9747     break;
9748    case 'c':
9749     value = grok_bslash_c(*RExC_parse++, UTF, SIZE_ONLY);
9750     break;
9751    case '0': case '1': case '2': case '3': case '4':
9752    case '5': case '6': case '7':
9753     {
9754      /* Take 1-3 octal digits */
9755      I32 flags = PERL_SCAN_SILENT_ILLDIGIT;
9756      numlen = 3;
9757      value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
9758      RExC_parse += numlen;
9759      if (PL_encoding && value < 0x100)
9760       goto recode_encoding;
9761      break;
9762     }
9763    recode_encoding:
9764     if (! RExC_override_recoding) {
9765      SV* enc = PL_encoding;
9766      value = reg_recode((const char)(U8)value, &enc);
9767      if (!enc && SIZE_ONLY)
9768       ckWARNreg(RExC_parse,
9769         "Invalid escape in the specified encoding");
9770      break;
9771     }
9772    default:
9773     /* Allow \_ to not give an error */
9774     if (!SIZE_ONLY && isALNUM(value) && value != '_') {
9775      ckWARN2reg(RExC_parse,
9776        "Unrecognized escape \\%c in character class passed through",
9777        (int)value);
9778     }
9779     break;
9780    }
9781   } /* end of \blah */
9782 #ifdef EBCDIC
9783   else
9784    literal_endpoint++;
9785 #endif
9786
9787   if (namedclass > OOB_NAMEDCLASS) { /* this is a named class \blah */
9788
9789    /* What matches in a locale is not known until runtime, so need to
9790    * (one time per class) allocate extra space to pass to regexec.
9791    * The space will contain a bit for each named class that is to be
9792    * matched against.  This isn't needed for \p{} and pseudo-classes,
9793    * as they are not affected by locale, and hence are dealt with
9794    * separately */
9795    if (LOC && namedclass < ANYOF_MAX && ! need_class) {
9796     need_class = 1;
9797     if (SIZE_ONLY) {
9798      RExC_size += ANYOF_CLASS_SKIP - ANYOF_SKIP;
9799     }
9800     else {
9801      RExC_emit += ANYOF_CLASS_SKIP - ANYOF_SKIP;
9802      ANYOF_CLASS_ZERO(ret);
9803     }
9804     ANYOF_FLAGS(ret) |= ANYOF_CLASS;
9805    }
9806
9807    /* a bad range like a-\d, a-[:digit:].  The '-' is taken as a
9808    * literal, as is the character that began the false range, i.e.
9809    * the 'a' in the examples */
9810    if (range) {
9811     if (!SIZE_ONLY) {
9812      const int w =
9813       RExC_parse >= rangebegin ?
9814       RExC_parse - rangebegin : 0;
9815      ckWARN4reg(RExC_parse,
9816        "False [] range \"%*.*s\"",
9817        w, w, rangebegin);
9818
9819      stored +=
9820       set_regclass_bit(pRExC_state, ret, '-', &l1_fold_invlist, &unicode_alternate);
9821      if (prevvalue < 256) {
9822       stored +=
9823       set_regclass_bit(pRExC_state, ret, (U8) prevvalue, &l1_fold_invlist, &unicode_alternate);
9824      }
9825      else {
9826       nonbitmap = add_cp_to_invlist(nonbitmap, prevvalue);
9827      }
9828     }
9829
9830     range = 0; /* this was not a true range */
9831    }
9832
9833
9834
9835    if (!SIZE_ONLY) {
9836     const char *what = NULL;
9837     char yesno = 0;
9838
9839     /* Possible truncation here but in some 64-bit environments
9840     * the compiler gets heartburn about switch on 64-bit values.
9841     * A similar issue a little earlier when switching on value.
9842     * --jhi */
9843     switch ((I32)namedclass) {
9844
9845     case _C_C_T_(ALNUMC, isALNUMC_L1, isALNUMC, "XPosixAlnum", "XPosixAlnum");
9846     case _C_C_T_(ALPHA, isALPHA_L1, isALPHA, "XPosixAlpha", "XPosixAlpha");
9847     case _C_C_T_(BLANK, isBLANK_L1, isBLANK, "XPosixBlank", "XPosixBlank");
9848     case _C_C_T_(CNTRL, isCNTRL_L1, isCNTRL, "XPosixCntrl", "XPosixCntrl");
9849     case _C_C_T_(GRAPH, isGRAPH_L1, isGRAPH, "XPosixGraph", "XPosixGraph");
9850     case _C_C_T_(LOWER, isLOWER_L1, isLOWER, "XPosixLower", "__XPosixLower_i");
9851     case _C_C_T_(PRINT, isPRINT_L1, isPRINT, "XPosixPrint", "XPosixPrint");
9852     case _C_C_T_(PSXSPC, isPSXSPC_L1, isPSXSPC, "XPosixSpace", "XPosixSpace");
9853     case _C_C_T_(PUNCT, isPUNCT_L1, isPUNCT, "XPosixPunct", "XPosixPunct");
9854     case _C_C_T_(UPPER, isUPPER_L1, isUPPER, "XPosixUpper", "__XPosixUpper_i");
9855     /* \s, \w match all unicode if utf8. */
9856     case _C_C_T_(SPACE, isSPACE_L1, isSPACE, "SpacePerl", "SpacePerl");
9857     case _C_C_T_(ALNUM, isWORDCHAR_L1, isALNUM, "Word", "Word");
9858     case _C_C_T_(XDIGIT, isXDIGIT_L1, isXDIGIT, "XPosixXDigit", "XPosixXDigit");
9859     case _C_C_T_NOLOC_(VERTWS, is_VERTWS_latin1(&value), "VertSpace");
9860     case _C_C_T_NOLOC_(HORIZWS, is_HORIZWS_latin1(&value), "HorizSpace");
9861     case ANYOF_ASCII:
9862      if (LOC)
9863       ANYOF_CLASS_SET(ret, ANYOF_ASCII);
9864      else {
9865       for (value = 0; value < 128; value++)
9866        stored +=
9867        set_regclass_bit(pRExC_state, ret, (U8) ASCII_TO_NATIVE(value), &l1_fold_invlist, &unicode_alternate);
9868      }
9869      yesno = '+';
9870      what = NULL; /* Doesn't match outside ascii, so
9871           don't want to add +utf8:: */
9872      break;
9873     case ANYOF_NASCII:
9874      if (LOC)
9875       ANYOF_CLASS_SET(ret, ANYOF_NASCII);
9876      else {
9877       for (value = 128; value < 256; value++)
9878        stored +=
9879        set_regclass_bit(pRExC_state, ret, (U8) ASCII_TO_NATIVE(value), &l1_fold_invlist, &unicode_alternate);
9880      }
9881      ANYOF_FLAGS(ret) |= ANYOF_UNICODE_ALL;
9882      yesno = '!';
9883      what = "ASCII";
9884      break;
9885     case ANYOF_DIGIT:
9886      if (LOC)
9887       ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
9888      else {
9889       /* consecutive digits assumed */
9890       for (value = '0'; value <= '9'; value++)
9891        stored +=
9892        set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);
9893      }
9894      yesno = '+';
9895      what = "Digit";
9896      break;
9897     case ANYOF_NDIGIT:
9898      if (LOC)
9899       ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
9900      else {
9901       /* consecutive digits assumed */
9902       for (value = 0; value < '0'; value++)
9903        stored +=
9904        set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);
9905       for (value = '9' + 1; value < 256; value++)
9906        stored +=
9907        set_regclass_bit(pRExC_state, ret, (U8) value, &l1_fold_invlist, &unicode_alternate);
9908      }
9909      yesno = '!';
9910      what = "Digit";
9911      if (AT_LEAST_ASCII_RESTRICTED ) {
9912       ANYOF_FLAGS(ret) |= ANYOF_UNICODE_ALL;
9913      }
9914      break;
9915     case ANYOF_MAX:
9916      /* this is to handle \p and \P */
9917      break;
9918     default:
9919      vFAIL("Invalid [::] class");
9920      break;
9921     }
9922     if (what && ! (AT_LEAST_ASCII_RESTRICTED)) {
9923      /* Strings such as "+utf8::isWord\n" */
9924      Perl_sv_catpvf(aTHX_ listsv, "%cutf8::%s\n", yesno, what);
9925     }
9926
9927     continue;
9928    }
9929   } /* end of namedclass \blah */
9930
9931   if (range) {
9932    if (prevvalue > (IV)value) /* b-a */ {
9933     const int w = RExC_parse - rangebegin;
9934     Simple_vFAIL4("Invalid [] range \"%*.*s\"", w, w, rangebegin);
9935     range = 0; /* not a valid range */
9936    }
9937   }
9938   else {
9939    prevvalue = value; /* save the beginning of the range */
9940    if (RExC_parse+1 < RExC_end
9941     && *RExC_parse == '-'
9942     && RExC_parse[1] != ']')
9943    {
9944     RExC_parse++;
9945
9946     /* a bad range like \w-, [:word:]- ? */
9947     if (namedclass > OOB_NAMEDCLASS) {
9948      if (ckWARN(WARN_REGEXP)) {
9949       const int w =
9950        RExC_parse >= rangebegin ?
9951        RExC_parse - rangebegin : 0;
9952       vWARN4(RExC_parse,
9953        "False [] range \"%*.*s\"",
9954        w, w, rangebegin);
9955      }
9956      if (!SIZE_ONLY)
9957       stored +=
9958        set_regclass_bit(pRExC_state, ret, '-', &l1_fold_invlist, &unicode_alternate);
9959     } else
9960      range = 1; /* yeah, it's a range! */
9961     continue; /* but do it the next time */
9962    }
9963   }
9964
9965   /* non-Latin1 code point implies unicode semantics.  Must be set in
9966   * pass1 so is there for the whole of pass 2 */
9967   if (value > 255) {
9968    RExC_uni_semantics = 1;
9969   }
9970
9971   /* now is the next time */
9972   if (!SIZE_ONLY) {
9973    if (prevvalue < 256) {
9974     const IV ceilvalue = value < 256 ? value : 255;
9975     IV i;
9976 #ifdef EBCDIC
9977     /* In EBCDIC [\x89-\x91] should include
9978     * the \x8e but [i-j] should not. */
9979     if (literal_endpoint == 2 &&
9980      ((isLOWER(prevvalue) && isLOWER(ceilvalue)) ||
9981      (isUPPER(prevvalue) && isUPPER(ceilvalue))))
9982     {
9983      if (isLOWER(prevvalue)) {
9984       for (i = prevvalue; i <= ceilvalue; i++)
9985        if (isLOWER(i) && !ANYOF_BITMAP_TEST(ret,i)) {
9986         stored +=
9987         set_regclass_bit(pRExC_state, ret, (U8) i, &l1_fold_invlist, &unicode_alternate);
9988        }
9989      } else {
9990       for (i = prevvalue; i <= ceilvalue; i++)
9991        if (isUPPER(i) && !ANYOF_BITMAP_TEST(ret,i)) {
9992         stored +=
9993         set_regclass_bit(pRExC_state, ret, (U8) i, &l1_fold_invlist, &unicode_alternate);
9994        }
9995      }
9996     }
9997     else
9998 #endif
9999      for (i = prevvalue; i <= ceilvalue; i++) {
10000       stored += set_regclass_bit(pRExC_state, ret, (U8) i, &l1_fold_invlist, &unicode_alternate);
10001      }
10002   }
10003   if (value > 255) {
10004    const UV prevnatvalue  = NATIVE_TO_UNI(prevvalue);
10005    const UV natvalue      = NATIVE_TO_UNI(value);
10006    nonbitmap = add_range_to_invlist(nonbitmap, prevnatvalue, natvalue);
10007   }
10008 #ifdef EBCDIC
10009    literal_endpoint = 0;
10010 #endif
10011   }
10012
10013   range = 0; /* this range (if it was one) is done now */
10014  }
10015
10016
10017
10018  if (SIZE_ONLY)
10019   return ret;
10020  /****** !SIZE_ONLY AFTER HERE *********/
10021
10022  /* If folding and there are code points above 255, we calculate all
10023  * characters that could fold to or from the ones already on the list */
10024  if (FOLD && nonbitmap) {
10025   UV i;
10026
10027   HV* fold_intersection;
10028   UV* fold_list;
10029
10030   /* This is a list of all the characters that participate in folds
10031    * (except marks, etc in multi-char folds */
10032   if (! PL_utf8_foldable) {
10033    SV* swash = swash_init("utf8", "Cased", &PL_sv_undef, 1, 0);
10034    PL_utf8_foldable = _swash_to_invlist(swash);
10035   }
10036
10037   /* This is a hash that for a particular fold gives all characters
10038    * that are involved in it */
10039   if (! PL_utf8_foldclosures) {
10040
10041    /* If we were unable to find any folds, then we likely won't be
10042    * able to find the closures.  So just create an empty list.
10043    * Folding will effectively be restricted to the non-Unicode rules
10044    * hard-coded into Perl.  (This case happens legitimately during
10045    * compilation of Perl itself before the Unicode tables are
10046    * generated) */
10047    if (invlist_len(PL_utf8_foldable) == 0) {
10048     PL_utf8_foldclosures = _new_invlist(0);
10049    } else {
10050     /* If the folds haven't been read in, call a fold function
10051      * to force that */
10052     if (! PL_utf8_tofold) {
10053      U8 dummy[UTF8_MAXBYTES+1];
10054      STRLEN dummy_len;
10055      to_utf8_fold((U8*) "A", dummy, &dummy_len);
10056     }
10057     PL_utf8_foldclosures = _swash_inversion_hash(PL_utf8_tofold);
10058    }
10059   }
10060
10061   /* Only the characters in this class that participate in folds need
10062    * be checked.  Get the intersection of this class and all the
10063    * possible characters that are foldable.  This can quickly narrow
10064    * down a large class */
10065   fold_intersection = invlist_intersection(PL_utf8_foldable, nonbitmap);
10066
10067   /* Now look at the foldable characters in this class individually */
10068   fold_list = invlist_array(fold_intersection);
10069   for (i = 0; i < invlist_len(fold_intersection); i++) {
10070    UV j;
10071
10072    /* The next entry is the beginning of the range that is in the
10073    * class */
10074    UV start = fold_list[i++];
10075
10076
10077    /* The next entry is the beginning of the next range, which
10078     * isn't in the class, so the end of the current range is one
10079     * less than that */
10080    UV end = fold_list[i] - 1;
10081
10082    /* Look at every character in the range */
10083    for (j = start; j <= end; j++) {
10084
10085     /* Get its fold */
10086     U8 foldbuf[UTF8_MAXBYTES_CASE+1];
10087     STRLEN foldlen;
10088     const UV f =
10089      _to_uni_fold_flags(j, foldbuf, &foldlen, allow_full_fold);
10090
10091     if (foldlen > (STRLEN)UNISKIP(f)) {
10092
10093      /* Any multicharacter foldings (disallowed in
10094       * lookbehind patterns) require the following
10095       * transform: [ABCDEF] -> (?:[ABCabcDEFd]|pq|rst) where
10096       * E folds into "pq" and F folds into "rst", all other
10097       * characters fold to single characters.  We save away
10098       * these multicharacter foldings, to be later saved as
10099       * part of the additional "s" data. */
10100      if (! RExC_in_lookbehind) {
10101       U8* loc = foldbuf;
10102       U8* e = foldbuf + foldlen;
10103
10104       /* If any of the folded characters of this are in
10105        * the Latin1 range, tell the regex engine that
10106        * this can match a non-utf8 target string.  The
10107        * only multi-byte fold whose source is in the
10108        * Latin1 range (U+00DF) applies only when the
10109        * target string is utf8, or under unicode rules */
10110       if (j > 255 || AT_LEAST_UNI_SEMANTICS) {
10111        while (loc < e) {
10112
10113         /* Can't mix ascii with non- under /aa */
10114         if (MORE_ASCII_RESTRICTED
10115          && (isASCII(*loc) != isASCII(j)))
10116         {
10117          goto end_multi_fold;
10118         }
10119         if (UTF8_IS_INVARIANT(*loc)
10120          || UTF8_IS_DOWNGRADEABLE_START(*loc))
10121         {
10122          /* Can't mix above and below 256 under
10123           * LOC */
10124          if (LOC) {
10125           goto end_multi_fold;
10126          }
10127          ANYOF_FLAGS(ret)
10128            |= ANYOF_NONBITMAP_NON_UTF8;
10129          break;
10130         }
10131         loc += UTF8SKIP(loc);
10132        }
10133       }
10134
10135       add_alternate(&unicode_alternate, foldbuf, foldlen);
10136      end_multi_fold: ;
10137      }
10138
10139      /* This is special-cased, as it is the only letter which
10140      * has both a multi-fold and single-fold in Latin1.  All
10141      * the other chars that have single and multi-folds are
10142      * always in utf8, and the utf8 folding algorithm catches
10143      * them */
10144      if (! LOC && j == LATIN_CAPITAL_LETTER_SHARP_S) {
10145       stored += set_regclass_bit(pRExC_state,
10146           ret,
10147           LATIN_SMALL_LETTER_SHARP_S,
10148           &l1_fold_invlist, &unicode_alternate);
10149      }
10150     }
10151     else {
10152      /* Single character fold.  Add everything in its fold
10153       * closure to the list that this node should match */
10154      SV** listp;
10155
10156      /* The fold closures data structure is a hash with the
10157       * keys being every character that is folded to, like
10158       * 'k', and the values each an array of everything that
10159       * folds to its key.  e.g. [ 'k', 'K', KELVIN_SIGN ] */
10160      if ((listp = hv_fetch(PL_utf8_foldclosures,
10161          (char *) foldbuf, foldlen, FALSE)))
10162      {
10163       AV* list = (AV*) *listp;
10164       IV k;
10165       for (k = 0; k <= av_len(list); k++) {
10166        SV** c_p = av_fetch(list, k, FALSE);
10167        UV c;
10168        if (c_p == NULL) {
10169         Perl_croak(aTHX_ "panic: invalid PL_utf8_foldclosures structure");
10170        }
10171        c = SvUV(*c_p);
10172
10173        /* /aa doesn't allow folds between ASCII and
10174         * non-; /l doesn't allow them between above
10175         * and below 256 */
10176        if ((MORE_ASCII_RESTRICTED
10177         && (isASCII(c) != isASCII(j)))
10178          || (LOC && ((c < 256) != (j < 256))))
10179        {
10180         continue;
10181        }
10182
10183        if (c < 256 && AT_LEAST_UNI_SEMANTICS) {
10184         stored += set_regclass_bit(pRExC_state,
10185           ret,
10186           (U8) c,
10187           &l1_fold_invlist, &unicode_alternate);
10188        }
10189         /* It may be that the code point is already
10190          * in this range or already in the bitmap,
10191          * in which case we need do nothing */
10192        else if ((c < start || c > end)
10193           && (c > 255
10194            || ! ANYOF_BITMAP_TEST(ret, c)))
10195        {
10196         nonbitmap = add_cp_to_invlist(nonbitmap, c);
10197        }
10198       }
10199      }
10200     }
10201    }
10202   }
10203   invlist_destroy(fold_intersection);
10204  }
10205
10206  /* Combine the two lists into one. */
10207  if (l1_fold_invlist) {
10208   if (nonbitmap) {
10209    HV* temp = invlist_union(nonbitmap, l1_fold_invlist);
10210    invlist_destroy(nonbitmap);
10211    nonbitmap = temp;
10212    invlist_destroy(l1_fold_invlist);
10213   }
10214   else {
10215    nonbitmap = l1_fold_invlist;
10216   }
10217  }
10218
10219  /* Here, we have calculated what code points should be in the character
10220  * class.   Now we can see about various optimizations.  Fold calculation
10221  * needs to take place before inversion.  Otherwise /[^k]/i would invert to
10222  * include K, which under /i would match k. */
10223
10224  /* Optimize inverted simple patterns (e.g. [^a-z]).  Note that we haven't
10225  * set the FOLD flag yet, so this this does optimize those.  It doesn't
10226  * optimize locale.  Doing so perhaps could be done as long as there is
10227  * nothing like \w in it; some thought also would have to be given to the
10228  * interaction with above 0x100 chars */
10229  if (! LOC
10230   && (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT
10231   && ! unicode_alternate
10232   && ! nonbitmap
10233   && SvCUR(listsv) == initial_listsv_len)
10234  {
10235   for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
10236    ANYOF_BITMAP(ret)[value] ^= 0xFF;
10237   stored = 256 - stored;
10238
10239   /* The inversion means that everything above 255 is matched; and at the
10240   * same time we clear the invert flag */
10241   ANYOF_FLAGS(ret) = ANYOF_UNICODE_ALL;
10242  }
10243
10244  /* Folding in the bitmap is taken care of above, but not for locale (for
10245  * which we have to wait to see what folding is in effect at runtime), and
10246  * for things not in the bitmap.  Set run-time fold flag for these */
10247  if (FOLD && (LOC || nonbitmap || unicode_alternate)) {
10248   ANYOF_FLAGS(ret) |= ANYOF_LOC_NONBITMAP_FOLD;
10249  }
10250
10251  /* A single character class can be "optimized" into an EXACTish node.
10252  * Note that since we don't currently count how many characters there are
10253  * outside the bitmap, we are XXX missing optimization possibilities for
10254  * them.  This optimization can't happen unless this is a truly single
10255  * character class, which means that it can't be an inversion into a
10256  * many-character class, and there must be no possibility of there being
10257  * things outside the bitmap.  'stored' (only) for locales doesn't include
10258  * \w, etc, so have to make a special test that they aren't present
10259  *
10260  * Similarly A 2-character class of the very special form like [bB] can be
10261  * optimized into an EXACTFish node, but only for non-locales, and for
10262  * characters which only have the two folds; so things like 'fF' and 'Ii'
10263  * wouldn't work because they are part of the fold of 'LATIN SMALL LIGATURE
10264  * FI'. */
10265  if (! nonbitmap
10266   && ! unicode_alternate
10267   && SvCUR(listsv) == initial_listsv_len
10268   && ! (ANYOF_FLAGS(ret) & (ANYOF_INVERT|ANYOF_UNICODE_ALL))
10269   && (((stored == 1 && ((! (ANYOF_FLAGS(ret) & ANYOF_LOCALE))
10270        || (! ANYOF_CLASS_TEST_ANY_SET(ret)))))
10271    || (stored == 2 && ((! (ANYOF_FLAGS(ret) & ANYOF_LOCALE))
10272         && (! _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(value))
10273         /* If the latest code point has a fold whose
10274         * bit is set, it must be the only other one */
10275         && ((prevvalue = PL_fold_latin1[value]) != (IV)value)
10276         && ANYOF_BITMAP_TEST(ret, prevvalue)))))
10277  {
10278   /* Note that the information needed to decide to do this optimization
10279   * is not currently available until the 2nd pass, and that the actually
10280   * used EXACTish node takes less space than the calculated ANYOF node,
10281   * and hence the amount of space calculated in the first pass is larger
10282   * than actually used, so this optimization doesn't gain us any space.
10283   * But an EXACT node is faster than an ANYOF node, and can be combined
10284   * with any adjacent EXACT nodes later by the optimizer for further
10285   * gains.  The speed of executing an EXACTF is similar to an ANYOF
10286   * node, so the optimization advantage comes from the ability to join
10287   * it to adjacent EXACT nodes */
10288
10289   const char * cur_parse= RExC_parse;
10290   U8 op;
10291   RExC_emit = (regnode *)orig_emit;
10292   RExC_parse = (char *)orig_parse;
10293
10294   if (stored == 1) {
10295
10296    /* A locale node with one point can be folded; all the other cases
10297    * with folding will have two points, since we calculate them above
10298    */
10299    if (ANYOF_FLAGS(ret) & ANYOF_LOC_NONBITMAP_FOLD) {
10300     op = EXACTFL;
10301    }
10302    else {
10303     op = EXACT;
10304    }
10305   }   /* else 2 chars in the bit map: the folds of each other */
10306   else if (AT_LEAST_UNI_SEMANTICS || !isASCII(value)) {
10307
10308    /* To join adjacent nodes, they must be the exact EXACTish type.
10309    * Try to use the most likely type, by using EXACTFU if the regex
10310    * calls for them, or is required because the character is
10311    * non-ASCII */
10312    op = EXACTFU;
10313   }
10314   else {    /* Otherwise, more likely to be EXACTF type */
10315    op = EXACTF;
10316   }
10317
10318   ret = reg_node(pRExC_state, op);
10319   RExC_parse = (char *)cur_parse;
10320   if (UTF && ! NATIVE_IS_INVARIANT(value)) {
10321    *STRING(ret)= UTF8_EIGHT_BIT_HI((U8) value);
10322    *(STRING(ret) + 1)= UTF8_EIGHT_BIT_LO((U8) value);
10323    STR_LEN(ret)= 2;
10324    RExC_emit += STR_SZ(2);
10325   }
10326   else {
10327    *STRING(ret)= (char)value;
10328    STR_LEN(ret)= 1;
10329    RExC_emit += STR_SZ(1);
10330   }
10331   SvREFCNT_dec(listsv);
10332   return ret;
10333  }
10334
10335  if (nonbitmap) {
10336   UV* nonbitmap_array = invlist_array(nonbitmap);
10337   UV nonbitmap_len = invlist_len(nonbitmap);
10338   UV i;
10339
10340   /*  Here have the full list of items to match that aren't in the
10341   *  bitmap.  Convert to the structure that the rest of the code is
10342   *  expecting.   XXX That rest of the code should convert to this
10343   *  structure */
10344   for (i = 0; i < nonbitmap_len; i++) {
10345
10346    /* The next entry is the beginning of the range that is in the
10347    * class */
10348    UV start = nonbitmap_array[i++];
10349    UV end;
10350
10351    /* The next entry is the beginning of the next range, which isn't
10352    * in the class, so the end of the current range is one less than
10353    * that.  But if there is no next range, it means that the range
10354    * begun by 'start' extends to infinity, which for this platform
10355    * ends at UV_MAX */
10356    if (i == nonbitmap_len) {
10357     end = UV_MAX;
10358    }
10359    else {
10360     end = nonbitmap_array[i] - 1;
10361    }
10362
10363    if (start == end) {
10364     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", start);
10365    }
10366    else {
10367     /* The \t sets the whole range */
10368     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
10369       /* XXX EBCDIC */
10370         start, end);
10371    }
10372   }
10373   invlist_destroy(nonbitmap);
10374  }
10375
10376  if (SvCUR(listsv) == initial_listsv_len && ! unicode_alternate) {
10377   ARG_SET(ret, ANYOF_NONBITMAP_EMPTY);
10378   SvREFCNT_dec(listsv);
10379   SvREFCNT_dec(unicode_alternate);
10380  }
10381  else {
10382
10383   AV * const av = newAV();
10384   SV *rv;
10385   /* The 0th element stores the character class description
10386   * in its textual form: used later (regexec.c:Perl_regclass_swash())
10387   * to initialize the appropriate swash (which gets stored in
10388   * the 1st element), and also useful for dumping the regnode.
10389   * The 2nd element stores the multicharacter foldings,
10390   * used later (regexec.c:S_reginclass()). */
10391   av_store(av, 0, listsv);
10392   av_store(av, 1, NULL);
10393
10394   /* Store any computed multi-char folds only if we are allowing
10395   * them */
10396   if (allow_full_fold) {
10397    av_store(av, 2, MUTABLE_SV(unicode_alternate));
10398    if (unicode_alternate) { /* This node is variable length */
10399     OP(ret) = ANYOFV;
10400    }
10401   }
10402   else {
10403    av_store(av, 2, NULL);
10404   }
10405   rv = newRV_noinc(MUTABLE_SV(av));
10406   n = add_data(pRExC_state, 1, "s");
10407   RExC_rxi->data->data[n] = (void*)rv;
10408   ARG_SET(ret, n);
10409  }
10410  return ret;
10411 }
10412 #undef _C_C_T_
10413
10414
10415 /* reg_skipcomment()
10416
10417    Absorbs an /x style # comments from the input stream.
10418    Returns true if there is more text remaining in the stream.
10419    Will set the REG_SEEN_RUN_ON_COMMENT flag if the comment
10420    terminates the pattern without including a newline.
10421
10422    Note its the callers responsibility to ensure that we are
10423    actually in /x mode
10424
10425 */
10426
10427 STATIC bool
10428 S_reg_skipcomment(pTHX_ RExC_state_t *pRExC_state)
10429 {
10430  bool ended = 0;
10431
10432  PERL_ARGS_ASSERT_REG_SKIPCOMMENT;
10433
10434  while (RExC_parse < RExC_end)
10435   if (*RExC_parse++ == '\n') {
10436    ended = 1;
10437    break;
10438   }
10439  if (!ended) {
10440   /* we ran off the end of the pattern without ending
10441   the comment, so we have to add an \n when wrapping */
10442   RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
10443   return 0;
10444  } else
10445   return 1;
10446 }
10447
10448 /* nextchar()
10449
10450    Advances the parse position, and optionally absorbs
10451    "whitespace" from the inputstream.
10452
10453    Without /x "whitespace" means (?#...) style comments only,
10454    with /x this means (?#...) and # comments and whitespace proper.
10455
10456    Returns the RExC_parse point from BEFORE the scan occurs.
10457
10458    This is the /x friendly way of saying RExC_parse++.
10459 */
10460
10461 STATIC char*
10462 S_nextchar(pTHX_ RExC_state_t *pRExC_state)
10463 {
10464  char* const retval = RExC_parse++;
10465
10466  PERL_ARGS_ASSERT_NEXTCHAR;
10467
10468  for (;;) {
10469   if (*RExC_parse == '(' && RExC_parse[1] == '?' &&
10470     RExC_parse[2] == '#') {
10471    while (*RExC_parse != ')') {
10472     if (RExC_parse == RExC_end)
10473      FAIL("Sequence (?#... not terminated");
10474     RExC_parse++;
10475    }
10476    RExC_parse++;
10477    continue;
10478   }
10479   if (RExC_flags & RXf_PMf_EXTENDED) {
10480    if (isSPACE(*RExC_parse)) {
10481     RExC_parse++;
10482     continue;
10483    }
10484    else if (*RExC_parse == '#') {
10485     if ( reg_skipcomment( pRExC_state ) )
10486      continue;
10487    }
10488   }
10489   return retval;
10490  }
10491 }
10492
10493 /*
10494 - reg_node - emit a node
10495 */
10496 STATIC regnode *   /* Location. */
10497 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
10498 {
10499  dVAR;
10500  register regnode *ptr;
10501  regnode * const ret = RExC_emit;
10502  GET_RE_DEBUG_FLAGS_DECL;
10503
10504  PERL_ARGS_ASSERT_REG_NODE;
10505
10506  if (SIZE_ONLY) {
10507   SIZE_ALIGN(RExC_size);
10508   RExC_size += 1;
10509   return(ret);
10510  }
10511  if (RExC_emit >= RExC_emit_bound)
10512   Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d", op);
10513
10514  NODE_ALIGN_FILL(ret);
10515  ptr = ret;
10516  FILL_ADVANCE_NODE(ptr, op);
10517  REH_CALL_COMP_NODE_HOOK(pRExC_state->rx, (ptr) - 1);
10518 #ifdef RE_TRACK_PATTERN_OFFSETS
10519  if (RExC_offsets) {         /* MJD */
10520   MJD_OFFSET_DEBUG(("%s:%d: (op %s) %s %"UVuf" (len %"UVuf") (max %"UVuf").\n",
10521    "reg_node", __LINE__,
10522    PL_reg_name[op],
10523    (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0]
10524     ? "Overwriting end of array!\n" : "OK",
10525    (UV)(RExC_emit - RExC_emit_start),
10526    (UV)(RExC_parse - RExC_start),
10527    (UV)RExC_offsets[0]));
10528   Set_Node_Offset(RExC_emit, RExC_parse + (op == END));
10529  }
10530 #endif
10531  RExC_emit = ptr;
10532  return(ret);
10533 }
10534
10535 /*
10536 - reganode - emit a node with an argument
10537 */
10538 STATIC regnode *   /* Location. */
10539 S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
10540 {
10541  dVAR;
10542  register regnode *ptr;
10543  regnode * const ret = RExC_emit;
10544  GET_RE_DEBUG_FLAGS_DECL;
10545
10546  PERL_ARGS_ASSERT_REGANODE;
10547
10548  if (SIZE_ONLY) {
10549   SIZE_ALIGN(RExC_size);
10550   RExC_size += 2;
10551   /*
10552   We can't do this:
10553
10554   assert(2==regarglen[op]+1);
10555
10556   Anything larger than this has to allocate the extra amount.
10557   If we changed this to be:
10558
10559   RExC_size += (1 + regarglen[op]);
10560
10561   then it wouldn't matter. Its not clear what side effect
10562   might come from that so its not done so far.
10563   -- dmq
10564   */
10565   return(ret);
10566  }
10567  if (RExC_emit >= RExC_emit_bound)
10568   Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d", op);
10569
10570  NODE_ALIGN_FILL(ret);
10571  ptr = ret;
10572  FILL_ADVANCE_NODE_ARG(ptr, op, arg);
10573  REH_CALL_COMP_NODE_HOOK(pRExC_state->rx, (ptr) - 2);
10574 #ifdef RE_TRACK_PATTERN_OFFSETS
10575  if (RExC_offsets) {         /* MJD */
10576   MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n",
10577    "reganode",
10578    __LINE__,
10579    PL_reg_name[op],
10580    (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] ?
10581    "Overwriting end of array!\n" : "OK",
10582    (UV)(RExC_emit - RExC_emit_start),
10583    (UV)(RExC_parse - RExC_start),
10584    (UV)RExC_offsets[0]));
10585   Set_Cur_Node_Offset;
10586  }
10587 #endif
10588  RExC_emit = ptr;
10589  return(ret);
10590 }
10591
10592 /*
10593 - reguni - emit (if appropriate) a Unicode character
10594 */
10595 STATIC STRLEN
10596 S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char* s)
10597 {
10598  dVAR;
10599
10600  PERL_ARGS_ASSERT_REGUNI;
10601
10602  return SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
10603 }
10604
10605 /*
10606 - reginsert - insert an operator in front of already-emitted operand
10607 *
10608 * Means relocating the operand.
10609 */
10610 STATIC void
10611 S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
10612 {
10613  dVAR;
10614  register regnode *src;
10615  register regnode *dst;
10616  register regnode *place;
10617  const int offset = regarglen[(U8)op];
10618  const int size = NODE_STEP_REGNODE + offset;
10619  GET_RE_DEBUG_FLAGS_DECL;
10620
10621  PERL_ARGS_ASSERT_REGINSERT;
10622  PERL_UNUSED_ARG(depth);
10623 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
10624  DEBUG_PARSE_FMT("inst"," - %s",PL_reg_name[op]);
10625  if (SIZE_ONLY) {
10626   RExC_size += size;
10627   return;
10628  }
10629
10630  src = RExC_emit;
10631  RExC_emit += size;
10632  dst = RExC_emit;
10633  if (RExC_open_parens) {
10634   int paren;
10635   /*DEBUG_PARSE_FMT("inst"," - %"IVdf, (IV)RExC_npar);*/
10636   for ( paren=0 ; paren < RExC_npar ; paren++ ) {
10637    if ( RExC_open_parens[paren] >= opnd ) {
10638     /*DEBUG_PARSE_FMT("open"," - %d",size);*/
10639     RExC_open_parens[paren] += size;
10640    } else {
10641     /*DEBUG_PARSE_FMT("open"," - %s","ok");*/
10642    }
10643    if ( RExC_close_parens[paren] >= opnd ) {
10644     /*DEBUG_PARSE_FMT("close"," - %d",size);*/
10645     RExC_close_parens[paren] += size;
10646    } else {
10647     /*DEBUG_PARSE_FMT("close"," - %s","ok");*/
10648    }
10649   }
10650  }
10651
10652  while (src > opnd) {
10653   StructCopy(--src, --dst, regnode);
10654 #ifdef RE_TRACK_PATTERN_OFFSETS
10655   if (RExC_offsets) {     /* MJD 20010112 */
10656    MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s copy %"UVuf" -> %"UVuf" (max %"UVuf").\n",
10657     "reg_insert",
10658     __LINE__,
10659     PL_reg_name[op],
10660     (UV)(dst - RExC_emit_start) > RExC_offsets[0]
10661      ? "Overwriting end of array!\n" : "OK",
10662     (UV)(src - RExC_emit_start),
10663     (UV)(dst - RExC_emit_start),
10664     (UV)RExC_offsets[0]));
10665    Set_Node_Offset_To_R(dst-RExC_emit_start, Node_Offset(src));
10666    Set_Node_Length_To_R(dst-RExC_emit_start, Node_Length(src));
10667   }
10668 #endif
10669  }
10670
10671
10672  place = opnd;  /* Op node, where operand used to be. */
10673 #ifdef RE_TRACK_PATTERN_OFFSETS
10674  if (RExC_offsets) {         /* MJD */
10675   MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n",
10676    "reginsert",
10677    __LINE__,
10678    PL_reg_name[op],
10679    (UV)(place - RExC_emit_start) > RExC_offsets[0]
10680    ? "Overwriting end of array!\n" : "OK",
10681    (UV)(place - RExC_emit_start),
10682    (UV)(RExC_parse - RExC_start),
10683    (UV)RExC_offsets[0]));
10684   Set_Node_Offset(place, RExC_parse);
10685   Set_Node_Length(place, 1);
10686  }
10687 #endif
10688  src = NEXTOPER(place);
10689  FILL_ADVANCE_NODE(place, op);
10690  REH_CALL_COMP_NODE_HOOK(pRExC_state->rx, (place) - 1);
10691  Zero(src, offset, regnode);
10692 }
10693
10694 /*
10695 - regtail - set the next-pointer at the end of a node chain of p to val.
10696 - SEE ALSO: regtail_study
10697 */
10698 /* TODO: All three parms should be const */
10699 STATIC void
10700 S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
10701 {
10702  dVAR;
10703  register regnode *scan;
10704  GET_RE_DEBUG_FLAGS_DECL;
10705
10706  PERL_ARGS_ASSERT_REGTAIL;
10707 #ifndef DEBUGGING
10708  PERL_UNUSED_ARG(depth);
10709 #endif
10710
10711  if (SIZE_ONLY)
10712   return;
10713
10714  /* Find last node. */
10715  scan = p;
10716  for (;;) {
10717   regnode * const temp = regnext(scan);
10718   DEBUG_PARSE_r({
10719    SV * const mysv=sv_newmortal();
10720    DEBUG_PARSE_MSG((scan==p ? "tail" : ""));
10721    regprop(RExC_rx, mysv, scan);
10722    PerlIO_printf(Perl_debug_log, "~ %s (%d) %s %s\n",
10723     SvPV_nolen_const(mysv), REG_NODE_NUM(scan),
10724      (temp == NULL ? "->" : ""),
10725      (temp == NULL ? PL_reg_name[OP(val)] : "")
10726    );
10727   });
10728   if (temp == NULL)
10729    break;
10730   scan = temp;
10731  }
10732
10733  if (reg_off_by_arg[OP(scan)]) {
10734   ARG_SET(scan, val - scan);
10735  }
10736  else {
10737   NEXT_OFF(scan) = val - scan;
10738  }
10739 }
10740
10741 #ifdef DEBUGGING
10742 /*
10743 - regtail_study - set the next-pointer at the end of a node chain of p to val.
10744 - Look for optimizable sequences at the same time.
10745 - currently only looks for EXACT chains.
10746
10747 This is experimental code. The idea is to use this routine to perform
10748 in place optimizations on branches and groups as they are constructed,
10749 with the long term intention of removing optimization from study_chunk so
10750 that it is purely analytical.
10751
10752 Currently only used when in DEBUG mode. The macro REGTAIL_STUDY() is used
10753 to control which is which.
10754
10755 */
10756 /* TODO: All four parms should be const */
10757
10758 STATIC U8
10759 S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
10760 {
10761  dVAR;
10762  register regnode *scan;
10763  U8 exact = PSEUDO;
10764 #ifdef EXPERIMENTAL_INPLACESCAN
10765  I32 min = 0;
10766 #endif
10767  GET_RE_DEBUG_FLAGS_DECL;
10768
10769  PERL_ARGS_ASSERT_REGTAIL_STUDY;
10770
10771
10772  if (SIZE_ONLY)
10773   return exact;
10774
10775  /* Find last node. */
10776
10777  scan = p;
10778  for (;;) {
10779   regnode * const temp = regnext(scan);
10780 #ifdef EXPERIMENTAL_INPLACESCAN
10781   if (PL_regkind[OP(scan)] == EXACT)
10782    if (join_exact(pRExC_state,scan,&min,1,val,depth+1))
10783     return EXACT;
10784 #endif
10785   if ( exact ) {
10786    switch (OP(scan)) {
10787     case EXACT:
10788     case EXACTF:
10789     case EXACTFA:
10790     case EXACTFU:
10791     case EXACTFL:
10792       if( exact == PSEUDO )
10793        exact= OP(scan);
10794       else if ( exact != OP(scan) )
10795        exact= 0;
10796     case NOTHING:
10797      break;
10798     default:
10799      exact= 0;
10800    }
10801   }
10802   DEBUG_PARSE_r({
10803    SV * const mysv=sv_newmortal();
10804    DEBUG_PARSE_MSG((scan==p ? "tsdy" : ""));
10805    regprop(RExC_rx, mysv, scan);
10806    PerlIO_printf(Perl_debug_log, "~ %s (%d) -> %s\n",
10807     SvPV_nolen_const(mysv),
10808     REG_NODE_NUM(scan),
10809     PL_reg_name[exact]);
10810   });
10811   if (temp == NULL)
10812    break;
10813   scan = temp;
10814  }
10815  DEBUG_PARSE_r({
10816   SV * const mysv_val=sv_newmortal();
10817   DEBUG_PARSE_MSG("");
10818   regprop(RExC_rx, mysv_val, val);
10819   PerlIO_printf(Perl_debug_log, "~ attach to %s (%"IVdf") offset to %"IVdf"\n",
10820      SvPV_nolen_const(mysv_val),
10821      (IV)REG_NODE_NUM(val),
10822      (IV)(val - scan)
10823   );
10824  });
10825  if (reg_off_by_arg[OP(scan)]) {
10826   ARG_SET(scan, val - scan);
10827  }
10828  else {
10829   NEXT_OFF(scan) = val - scan;
10830  }
10831
10832  return exact;
10833 }
10834 #endif
10835
10836 /*
10837  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
10838  */
10839 #ifdef DEBUGGING
10840 static void
10841 S_regdump_extflags(pTHX_ const char *lead, const U32 flags)
10842 {
10843  int bit;
10844  int set=0;
10845  regex_charset cs;
10846
10847  for (bit=0; bit<32; bit++) {
10848   if (flags & (1<<bit)) {
10849    if ((1<<bit) & RXf_PMf_CHARSET) { /* Output separately, below */
10850     continue;
10851    }
10852    if (!set++ && lead)
10853     PerlIO_printf(Perl_debug_log, "%s",lead);
10854    PerlIO_printf(Perl_debug_log, "%s ",PL_reg_extflags_name[bit]);
10855   }
10856  }
10857  if ((cs = get_regex_charset(flags)) != REGEX_DEPENDS_CHARSET) {
10858    if (!set++ && lead) {
10859     PerlIO_printf(Perl_debug_log, "%s",lead);
10860    }
10861    switch (cs) {
10862     case REGEX_UNICODE_CHARSET:
10863      PerlIO_printf(Perl_debug_log, "UNICODE");
10864      break;
10865     case REGEX_LOCALE_CHARSET:
10866      PerlIO_printf(Perl_debug_log, "LOCALE");
10867      break;
10868     case REGEX_ASCII_RESTRICTED_CHARSET:
10869      PerlIO_printf(Perl_debug_log, "ASCII-RESTRICTED");
10870      break;
10871     case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
10872      PerlIO_printf(Perl_debug_log, "ASCII-MORE_RESTRICTED");
10873      break;
10874     default:
10875      PerlIO_printf(Perl_debug_log, "UNKNOWN CHARACTER SET");
10876      break;
10877    }
10878  }
10879  if (lead)  {
10880   if (set)
10881    PerlIO_printf(Perl_debug_log, "\n");
10882   else
10883    PerlIO_printf(Perl_debug_log, "%s[none-set]\n",lead);
10884  }
10885 }
10886 #endif
10887
10888 void
10889 Perl_regdump(pTHX_ const regexp *r)
10890 {
10891 #ifdef DEBUGGING
10892  dVAR;
10893  SV * const sv = sv_newmortal();
10894  SV *dsv= sv_newmortal();
10895  RXi_GET_DECL(r,ri);
10896  GET_RE_DEBUG_FLAGS_DECL;
10897
10898  PERL_ARGS_ASSERT_REGDUMP;
10899
10900  (void)dumpuntil(r, ri->program, ri->program + 1, NULL, NULL, sv, 0, 0);
10901
10902  /* Header fields of interest. */
10903  if (r->anchored_substr) {
10904   RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->anchored_substr),
10905    RE_SV_DUMPLEN(r->anchored_substr), 30);
10906   PerlIO_printf(Perl_debug_log,
10907      "anchored %s%s at %"IVdf" ",
10908      s, RE_SV_TAIL(r->anchored_substr),
10909      (IV)r->anchored_offset);
10910  } else if (r->anchored_utf8) {
10911   RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->anchored_utf8),
10912    RE_SV_DUMPLEN(r->anchored_utf8), 30);
10913   PerlIO_printf(Perl_debug_log,
10914      "anchored utf8 %s%s at %"IVdf" ",
10915      s, RE_SV_TAIL(r->anchored_utf8),
10916      (IV)r->anchored_offset);
10917  }
10918  if (r->float_substr) {
10919   RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->float_substr),
10920    RE_SV_DUMPLEN(r->float_substr), 30);
10921   PerlIO_printf(Perl_debug_log,
10922      "floating %s%s at %"IVdf"..%"UVuf" ",
10923      s, RE_SV_TAIL(r->float_substr),
10924      (IV)r->float_min_offset, (UV)r->float_max_offset);
10925  } else if (r->float_utf8) {
10926   RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->float_utf8),
10927    RE_SV_DUMPLEN(r->float_utf8), 30);
10928   PerlIO_printf(Perl_debug_log,
10929      "floating utf8 %s%s at %"IVdf"..%"UVuf" ",
10930      s, RE_SV_TAIL(r->float_utf8),
10931      (IV)r->float_min_offset, (UV)r->float_max_offset);
10932  }
10933  if (r->check_substr || r->check_utf8)
10934   PerlIO_printf(Perl_debug_log,
10935      (const char *)
10936      (r->check_substr == r->float_substr
10937      && r->check_utf8 == r->float_utf8
10938      ? "(checking floating" : "(checking anchored"));
10939  if (r->extflags & RXf_NOSCAN)
10940   PerlIO_printf(Perl_debug_log, " noscan");
10941  if (r->extflags & RXf_CHECK_ALL)
10942   PerlIO_printf(Perl_debug_log, " isall");
10943  if (r->check_substr || r->check_utf8)
10944   PerlIO_printf(Perl_debug_log, ") ");
10945
10946  if (ri->regstclass) {
10947   regprop(r, sv, ri->regstclass);
10948   PerlIO_printf(Perl_debug_log, "stclass %s ", SvPVX_const(sv));
10949  }
10950  if (r->extflags & RXf_ANCH) {
10951   PerlIO_printf(Perl_debug_log, "anchored");
10952   if (r->extflags & RXf_ANCH_BOL)
10953    PerlIO_printf(Perl_debug_log, "(BOL)");
10954   if (r->extflags & RXf_ANCH_MBOL)
10955    PerlIO_printf(Perl_debug_log, "(MBOL)");
10956   if (r->extflags & RXf_ANCH_SBOL)
10957    PerlIO_printf(Perl_debug_log, "(SBOL)");
10958   if (r->extflags & RXf_ANCH_GPOS)
10959    PerlIO_printf(Perl_debug_log, "(GPOS)");
10960   PerlIO_putc(Perl_debug_log, ' ');
10961  }
10962  if (r->extflags & RXf_GPOS_SEEN)
10963   PerlIO_printf(Perl_debug_log, "GPOS:%"UVuf" ", (UV)r->gofs);
10964  if (r->intflags & PREGf_SKIP)
10965   PerlIO_printf(Perl_debug_log, "plus ");
10966  if (r->intflags & PREGf_IMPLICIT)
10967   PerlIO_printf(Perl_debug_log, "implicit ");
10968  PerlIO_printf(Perl_debug_log, "minlen %"IVdf" ", (IV)r->minlen);
10969  if (r->extflags & RXf_EVAL_SEEN)
10970   PerlIO_printf(Perl_debug_log, "with eval ");
10971  PerlIO_printf(Perl_debug_log, "\n");
10972  DEBUG_FLAGS_r(regdump_extflags("r->extflags: ",r->extflags));
10973 #else
10974  PERL_ARGS_ASSERT_REGDUMP;
10975  PERL_UNUSED_CONTEXT;
10976  PERL_UNUSED_ARG(r);
10977 #endif /* DEBUGGING */
10978 }
10979
10980 /*
10981 - regprop - printable representation of opcode
10982 */
10983 #define EMIT_ANYOF_TEST_SEPARATOR(do_sep,sv,flags) \
10984 STMT_START { \
10985   if (do_sep) {                           \
10986    Perl_sv_catpvf(aTHX_ sv,"%s][%s",PL_colors[1],PL_colors[0]); \
10987    if (flags & ANYOF_INVERT)           \
10988     /*make sure the invert info is in each */ \
10989     sv_catpvs(sv, "^");             \
10990    do_sep = 0;                         \
10991   }                                       \
10992 } STMT_END
10993
10994 void
10995 Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o)
10996 {
10997 #ifdef DEBUGGING
10998  dVAR;
10999  register int k;
11000  RXi_GET_DECL(prog,progi);
11001  GET_RE_DEBUG_FLAGS_DECL;
11002
11003  PERL_ARGS_ASSERT_REGPROP;
11004
11005  sv_setpvs(sv, "");
11006
11007  if (OP(o) > REGNODE_MAX)  /* regnode.type is unsigned */
11008   /* It would be nice to FAIL() here, but this may be called from
11009   regexec.c, and it would be hard to supply pRExC_state. */
11010   Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", (int)OP(o), (int)REGNODE_MAX);
11011  sv_catpv(sv, PL_reg_name[OP(o)]); /* Take off const! */
11012
11013  k = PL_regkind[OP(o)];
11014
11015  if (k == EXACT) {
11016   sv_catpvs(sv, " ");
11017   /* Using is_utf8_string() (via PERL_PV_UNI_DETECT)
11018   * is a crude hack but it may be the best for now since
11019   * we have no flag "this EXACTish node was UTF-8"
11020   * --jhi */
11021   pv_pretty(sv, STRING(o), STR_LEN(o), 60, PL_colors[0], PL_colors[1],
11022     PERL_PV_ESCAPE_UNI_DETECT |
11023     PERL_PV_ESCAPE_NONASCII   |
11024     PERL_PV_PRETTY_ELLIPSES   |
11025     PERL_PV_PRETTY_LTGT       |
11026     PERL_PV_PRETTY_NOCLEAR
11027     );
11028  } else if (k == TRIE) {
11029   /* print the details of the trie in dumpuntil instead, as
11030   * progi->data isn't available here */
11031   const char op = OP(o);
11032   const U32 n = ARG(o);
11033   const reg_ac_data * const ac = IS_TRIE_AC(op) ?
11034    (reg_ac_data *)progi->data->data[n] :
11035    NULL;
11036   const reg_trie_data * const trie
11037    = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
11038
11039   Perl_sv_catpvf(aTHX_ sv, "-%s",PL_reg_name[o->flags]);
11040   DEBUG_TRIE_COMPILE_r(
11041    Perl_sv_catpvf(aTHX_ sv,
11042     "<S:%"UVuf"/%"IVdf" W:%"UVuf" L:%"UVuf"/%"UVuf" C:%"UVuf"/%"UVuf">",
11043     (UV)trie->startstate,
11044     (IV)trie->statecount-1, /* -1 because of the unused 0 element */
11045     (UV)trie->wordcount,
11046     (UV)trie->minlen,
11047     (UV)trie->maxlen,
11048     (UV)TRIE_CHARCOUNT(trie),
11049     (UV)trie->uniquecharcount
11050    )
11051   );
11052   if ( IS_ANYOF_TRIE(op) || trie->bitmap ) {
11053    int i;
11054    int rangestart = -1;
11055    U8* bitmap = IS_ANYOF_TRIE(op) ? (U8*)ANYOF_BITMAP(o) : (U8*)TRIE_BITMAP(trie);
11056    sv_catpvs(sv, "[");
11057    for (i = 0; i <= 256; i++) {
11058     if (i < 256 && BITMAP_TEST(bitmap,i)) {
11059      if (rangestart == -1)
11060       rangestart = i;
11061     } else if (rangestart != -1) {
11062      if (i <= rangestart + 3)
11063       for (; rangestart < i; rangestart++)
11064        put_byte(sv, rangestart);
11065      else {
11066       put_byte(sv, rangestart);
11067       sv_catpvs(sv, "-");
11068       put_byte(sv, i - 1);
11069      }
11070      rangestart = -1;
11071     }
11072    }
11073    sv_catpvs(sv, "]");
11074   }
11075
11076  } else if (k == CURLY) {
11077   if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
11078    Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
11079   Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
11080  }
11081  else if (k == WHILEM && o->flags)   /* Ordinal/of */
11082   Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
11083  else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP || OP(o)==ACCEPT) {
11084   Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o)); /* Parenth number */
11085   if ( RXp_PAREN_NAMES(prog) ) {
11086    if ( k != REF || (OP(o) < NREF)) {
11087     AV *list= MUTABLE_AV(progi->data->data[progi->name_list_idx]);
11088     SV **name= av_fetch(list, ARG(o), 0 );
11089     if (name)
11090      Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
11091    }
11092    else {
11093     AV *list= MUTABLE_AV(progi->data->data[ progi->name_list_idx ]);
11094     SV *sv_dat= MUTABLE_SV(progi->data->data[ ARG( o ) ]);
11095     I32 *nums=(I32*)SvPVX(sv_dat);
11096     SV **name= av_fetch(list, nums[0], 0 );
11097     I32 n;
11098     if (name) {
11099      for ( n=0; n<SvIVX(sv_dat); n++ ) {
11100       Perl_sv_catpvf(aTHX_ sv, "%s%"IVdf,
11101          (n ? "," : ""), (IV)nums[n]);
11102      }
11103      Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
11104     }
11105    }
11106   }
11107  } else if (k == GOSUB)
11108   Perl_sv_catpvf(aTHX_ sv, "%d[%+d]", (int)ARG(o),(int)ARG2L(o)); /* Paren and offset */
11109  else if (k == VERB) {
11110   if (!o->flags)
11111    Perl_sv_catpvf(aTHX_ sv, ":%"SVf,
11112       SVfARG((MUTABLE_SV(progi->data->data[ ARG( o ) ]))));
11113  } else if (k == LOGICAL)
11114   Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* 2: embedded, otherwise 1 */
11115  else if (k == FOLDCHAR)
11116   Perl_sv_catpvf(aTHX_ sv, "[0x%"UVXf"]", PTR2UV(ARG(o)) );
11117  else if (k == ANYOF) {
11118   int i, rangestart = -1;
11119   const U8 flags = ANYOF_FLAGS(o);
11120   int do_sep = 0;
11121
11122   /* Should be synchronized with * ANYOF_ #xdefines in regcomp.h */
11123   static const char * const anyofs[] = {
11124    "\\w",
11125    "\\W",
11126    "\\s",
11127    "\\S",
11128    "\\d",
11129    "\\D",
11130    "[:alnum:]",
11131    "[:^alnum:]",
11132    "[:alpha:]",
11133    "[:^alpha:]",
11134    "[:ascii:]",
11135    "[:^ascii:]",
11136    "[:cntrl:]",
11137    "[:^cntrl:]",
11138    "[:graph:]",
11139    "[:^graph:]",
11140    "[:lower:]",
11141    "[:^lower:]",
11142    "[:print:]",
11143    "[:^print:]",
11144    "[:punct:]",
11145    "[:^punct:]",
11146    "[:upper:]",
11147    "[:^upper:]",
11148    "[:xdigit:]",
11149    "[:^xdigit:]",
11150    "[:space:]",
11151    "[:^space:]",
11152    "[:blank:]",
11153    "[:^blank:]"
11154   };
11155
11156   if (flags & ANYOF_LOCALE)
11157    sv_catpvs(sv, "{loc}");
11158   if (flags & ANYOF_LOC_NONBITMAP_FOLD)
11159    sv_catpvs(sv, "{i}");
11160   Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
11161   if (flags & ANYOF_INVERT)
11162    sv_catpvs(sv, "^");
11163
11164   /* output what the standard cp 0-255 bitmap matches */
11165   for (i = 0; i <= 256; i++) {
11166    if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
11167     if (rangestart == -1)
11168      rangestart = i;
11169    } else if (rangestart != -1) {
11170     if (i <= rangestart + 3)
11171      for (; rangestart < i; rangestart++)
11172       put_byte(sv, rangestart);
11173     else {
11174      put_byte(sv, rangestart);
11175      sv_catpvs(sv, "-");
11176      put_byte(sv, i - 1);
11177     }
11178     do_sep = 1;
11179     rangestart = -1;
11180    }
11181   }
11182
11183   EMIT_ANYOF_TEST_SEPARATOR(do_sep,sv,flags);
11184   /* output any special charclass tests (used entirely under use locale) */
11185   if (ANYOF_CLASS_TEST_ANY_SET(o))
11186    for (i = 0; i < (int)(sizeof(anyofs)/sizeof(char*)); i++)
11187     if (ANYOF_CLASS_TEST(o,i)) {
11188      sv_catpv(sv, anyofs[i]);
11189      do_sep = 1;
11190     }
11191
11192   EMIT_ANYOF_TEST_SEPARATOR(do_sep,sv,flags);
11193
11194   if (flags & ANYOF_NON_UTF8_LATIN1_ALL) {
11195    sv_catpvs(sv, "{non-utf8-latin1-all}");
11196   }
11197
11198   /* output information about the unicode matching */
11199   if (flags & ANYOF_UNICODE_ALL)
11200    sv_catpvs(sv, "{unicode_all}");
11201   else if (ANYOF_NONBITMAP(o))
11202    sv_catpvs(sv, "{unicode}");
11203   if (flags & ANYOF_NONBITMAP_NON_UTF8)
11204    sv_catpvs(sv, "{outside bitmap}");
11205
11206   if (ANYOF_NONBITMAP(o)) {
11207    SV *lv;
11208    SV * const sw = regclass_swash(prog, o, FALSE, &lv, 0);
11209
11210    if (lv) {
11211     if (sw) {
11212      U8 s[UTF8_MAXBYTES_CASE+1];
11213
11214      for (i = 0; i <= 256; i++) { /* just the first 256 */
11215       uvchr_to_utf8(s, i);
11216
11217       if (i < 256 && swash_fetch(sw, s, TRUE)) {
11218        if (rangestart == -1)
11219         rangestart = i;
11220       } else if (rangestart != -1) {
11221        if (i <= rangestart + 3)
11222         for (; rangestart < i; rangestart++) {
11223          const U8 * const e = uvchr_to_utf8(s,rangestart);
11224          U8 *p;
11225          for(p = s; p < e; p++)
11226           put_byte(sv, *p);
11227         }
11228        else {
11229         const U8 *e = uvchr_to_utf8(s,rangestart);
11230         U8 *p;
11231         for (p = s; p < e; p++)
11232          put_byte(sv, *p);
11233         sv_catpvs(sv, "-");
11234         e = uvchr_to_utf8(s, i-1);
11235         for (p = s; p < e; p++)
11236          put_byte(sv, *p);
11237         }
11238         rangestart = -1;
11239        }
11240       }
11241
11242      sv_catpvs(sv, "..."); /* et cetera */
11243     }
11244
11245     {
11246      char *s = savesvpv(lv);
11247      char * const origs = s;
11248
11249      while (*s && *s != '\n')
11250       s++;
11251
11252      if (*s == '\n') {
11253       const char * const t = ++s;
11254
11255       while (*s) {
11256        if (*s == '\n')
11257         *s = ' ';
11258        s++;
11259       }
11260       if (s[-1] == ' ')
11261        s[-1] = 0;
11262
11263       sv_catpv(sv, t);
11264      }
11265
11266      Safefree(origs);
11267     }
11268    }
11269   }
11270
11271   Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
11272  }
11273  else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
11274   Perl_sv_catpvf(aTHX_ sv, "[%d]", -(o->flags));
11275 #else
11276  PERL_UNUSED_CONTEXT;
11277  PERL_UNUSED_ARG(sv);
11278  PERL_UNUSED_ARG(o);
11279  PERL_UNUSED_ARG(prog);
11280 #endif /* DEBUGGING */
11281 }
11282
11283 SV *
11284 Perl_re_intuit_string(pTHX_ REGEXP * const r)
11285 {    /* Assume that RE_INTUIT is set */
11286  dVAR;
11287  struct regexp *const prog = (struct regexp *)SvANY(r);
11288  GET_RE_DEBUG_FLAGS_DECL;
11289
11290  PERL_ARGS_ASSERT_RE_INTUIT_STRING;
11291  PERL_UNUSED_CONTEXT;
11292
11293  DEBUG_COMPILE_r(
11294   {
11295    const char * const s = SvPV_nolen_const(prog->check_substr
11296      ? prog->check_substr : prog->check_utf8);
11297
11298    if (!PL_colorset) reginitcolors();
11299    PerlIO_printf(Perl_debug_log,
11300      "%sUsing REx %ssubstr:%s \"%s%.60s%s%s\"\n",
11301      PL_colors[4],
11302      prog->check_substr ? "" : "utf8 ",
11303      PL_colors[5],PL_colors[0],
11304      s,
11305      PL_colors[1],
11306      (strlen(s) > 60 ? "..." : ""));
11307   } );
11308
11309  return prog->check_substr ? prog->check_substr : prog->check_utf8;
11310 }
11311
11312 /*
11313    pregfree()
11314
11315    handles refcounting and freeing the perl core regexp structure. When
11316    it is necessary to actually free the structure the first thing it
11317    does is call the 'free' method of the regexp_engine associated to
11318    the regexp, allowing the handling of the void *pprivate; member
11319    first. (This routine is not overridable by extensions, which is why
11320    the extensions free is called first.)
11321
11322    See regdupe and regdupe_internal if you change anything here.
11323 */
11324 #ifndef PERL_IN_XSUB_RE
11325 void
11326 Perl_pregfree(pTHX_ REGEXP *r)
11327 {
11328  SvREFCNT_dec(r);
11329 }
11330
11331 void
11332 Perl_pregfree2(pTHX_ REGEXP *rx)
11333 {
11334  dVAR;
11335  struct regexp *const r = (struct regexp *)SvANY(rx);
11336  GET_RE_DEBUG_FLAGS_DECL;
11337
11338  PERL_ARGS_ASSERT_PREGFREE2;
11339
11340  if (r->mother_re) {
11341   ReREFCNT_dec(r->mother_re);
11342  } else {
11343   CALLREGFREE_PVT(rx); /* free the private data */
11344   SvREFCNT_dec(RXp_PAREN_NAMES(r));
11345  }
11346  if (r->substrs) {
11347   SvREFCNT_dec(r->anchored_substr);
11348   SvREFCNT_dec(r->anchored_utf8);
11349   SvREFCNT_dec(r->float_substr);
11350   SvREFCNT_dec(r->float_utf8);
11351   Safefree(r->substrs);
11352  }
11353  RX_MATCH_COPY_FREE(rx);
11354 #ifdef PERL_OLD_COPY_ON_WRITE
11355  SvREFCNT_dec(r->saved_copy);
11356 #endif
11357  Safefree(r->offs);
11358 }
11359
11360 /*  reg_temp_copy()
11361
11362  This is a hacky workaround to the structural issue of match results
11363  being stored in the regexp structure which is in turn stored in
11364  PL_curpm/PL_reg_curpm. The problem is that due to qr// the pattern
11365  could be PL_curpm in multiple contexts, and could require multiple
11366  result sets being associated with the pattern simultaneously, such
11367  as when doing a recursive match with (??{$qr})
11368
11369  The solution is to make a lightweight copy of the regexp structure
11370  when a qr// is returned from the code executed by (??{$qr}) this
11371  lightweight copy doesn't actually own any of its data except for
11372  the starp/end and the actual regexp structure itself.
11373
11374 */
11375
11376
11377 REGEXP *
11378 Perl_reg_temp_copy (pTHX_ REGEXP *ret_x, REGEXP *rx)
11379 {
11380  struct regexp *ret;
11381  struct regexp *const r = (struct regexp *)SvANY(rx);
11382  register const I32 npar = r->nparens+1;
11383
11384  PERL_ARGS_ASSERT_REG_TEMP_COPY;
11385
11386  if (!ret_x)
11387   ret_x = (REGEXP*) newSV_type(SVt_REGEXP);
11388  ret = (struct regexp *)SvANY(ret_x);
11389
11390  (void)ReREFCNT_inc(rx);
11391  /* We can take advantage of the existing "copied buffer" mechanism in SVs
11392  by pointing directly at the buffer, but flagging that the allocated
11393  space in the copy is zero. As we've just done a struct copy, it's now
11394  a case of zero-ing that, rather than copying the current length.  */
11395  SvPV_set(ret_x, RX_WRAPPED(rx));
11396  SvFLAGS(ret_x) |= SvFLAGS(rx) & (SVf_POK|SVp_POK|SVf_UTF8);
11397  memcpy(&(ret->xpv_cur), &(r->xpv_cur),
11398   sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur));
11399  SvLEN_set(ret_x, 0);
11400  SvSTASH_set(ret_x, NULL);
11401  SvMAGIC_set(ret_x, NULL);
11402  Newx(ret->offs, npar, regexp_paren_pair);
11403  Copy(r->offs, ret->offs, npar, regexp_paren_pair);
11404  if (r->substrs) {
11405   Newx(ret->substrs, 1, struct reg_substr_data);
11406   StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
11407
11408   SvREFCNT_inc_void(ret->anchored_substr);
11409   SvREFCNT_inc_void(ret->anchored_utf8);
11410   SvREFCNT_inc_void(ret->float_substr);
11411   SvREFCNT_inc_void(ret->float_utf8);
11412
11413   /* check_substr and check_utf8, if non-NULL, point to either their
11414   anchored or float namesakes, and don't hold a second reference.  */
11415  }
11416  RX_MATCH_COPIED_off(ret_x);
11417 #ifdef PERL_OLD_COPY_ON_WRITE
11418  ret->saved_copy = NULL;
11419 #endif
11420  ret->mother_re = rx;
11421
11422  return ret_x;
11423 }
11424 #endif
11425
11426 /* regfree_internal()
11427
11428    Free the private data in a regexp. This is overloadable by
11429    extensions. Perl takes care of the regexp structure in pregfree(),
11430    this covers the *pprivate pointer which technically perl doesn't
11431    know about, however of course we have to handle the
11432    regexp_internal structure when no extension is in use.
11433
11434    Note this is called before freeing anything in the regexp
11435    structure.
11436  */
11437
11438 void
11439 Perl_regfree_internal(pTHX_ REGEXP * const rx)
11440 {
11441  dVAR;
11442  struct regexp *const r = (struct regexp *)SvANY(rx);
11443  RXi_GET_DECL(r,ri);
11444  GET_RE_DEBUG_FLAGS_DECL;
11445
11446  PERL_ARGS_ASSERT_REGFREE_INTERNAL;
11447
11448  DEBUG_COMPILE_r({
11449   if (!PL_colorset)
11450    reginitcolors();
11451   {
11452    SV *dsv= sv_newmortal();
11453    RE_PV_QUOTED_DECL(s, RX_UTF8(rx),
11454     dsv, RX_PRECOMP(rx), RX_PRELEN(rx), 60);
11455    PerlIO_printf(Perl_debug_log,"%sFreeing REx:%s %s\n",
11456     PL_colors[4],PL_colors[5],s);
11457   }
11458  });
11459 #ifdef RE_TRACK_PATTERN_OFFSETS
11460  if (ri->u.offsets)
11461   Safefree(ri->u.offsets);             /* 20010421 MJD */
11462 #endif
11463  if (ri->data) {
11464   int n = ri->data->count;
11465   PAD* new_comppad = NULL;
11466   PAD* old_comppad;
11467   PADOFFSET refcnt;
11468
11469   while (--n >= 0) {
11470   /* If you add a ->what type here, update the comment in regcomp.h */
11471    switch (ri->data->what[n]) {
11472    case 'a':
11473    case 's':
11474    case 'S':
11475    case 'u':
11476     SvREFCNT_dec(MUTABLE_SV(ri->data->data[n]));
11477     break;
11478    case 'f':
11479     Safefree(ri->data->data[n]);
11480     break;
11481    case 'p':
11482     new_comppad = MUTABLE_AV(ri->data->data[n]);
11483     break;
11484    case 'o':
11485     if (new_comppad == NULL)
11486      Perl_croak(aTHX_ "panic: pregfree comppad");
11487     PAD_SAVE_LOCAL(old_comppad,
11488      /* Watch out for global destruction's random ordering. */
11489      (SvTYPE(new_comppad) == SVt_PVAV) ? new_comppad : NULL
11490     );
11491     OP_REFCNT_LOCK;
11492     refcnt = OpREFCNT_dec((OP_4tree*)ri->data->data[n]);
11493     OP_REFCNT_UNLOCK;
11494     if (!refcnt)
11495      op_free((OP_4tree*)ri->data->data[n]);
11496
11497     PAD_RESTORE_LOCAL(old_comppad);
11498     SvREFCNT_dec(MUTABLE_SV(new_comppad));
11499     new_comppad = NULL;
11500     break;
11501    case 'n':
11502     break;
11503    case 'T':
11504     { /* Aho Corasick add-on structure for a trie node.
11505      Used in stclass optimization only */
11506      U32 refcount;
11507      reg_ac_data *aho=(reg_ac_data*)ri->data->data[n];
11508      OP_REFCNT_LOCK;
11509      refcount = --aho->refcount;
11510      OP_REFCNT_UNLOCK;
11511      if ( !refcount ) {
11512       PerlMemShared_free(aho->states);
11513       PerlMemShared_free(aho->fail);
11514       /* do this last!!!! */
11515       PerlMemShared_free(ri->data->data[n]);
11516       PerlMemShared_free(ri->regstclass);
11517      }
11518     }
11519     break;
11520    case 't':
11521     {
11522      /* trie structure. */
11523      U32 refcount;
11524      reg_trie_data *trie=(reg_trie_data*)ri->data->data[n];
11525      OP_REFCNT_LOCK;
11526      refcount = --trie->refcount;
11527      OP_REFCNT_UNLOCK;
11528      if ( !refcount ) {
11529       PerlMemShared_free(trie->charmap);
11530       PerlMemShared_free(trie->states);
11531       PerlMemShared_free(trie->trans);
11532       if (trie->bitmap)
11533        PerlMemShared_free(trie->bitmap);
11534       if (trie->jump)
11535        PerlMemShared_free(trie->jump);
11536       PerlMemShared_free(trie->wordinfo);
11537       /* do this last!!!! */
11538       PerlMemShared_free(ri->data->data[n]);
11539      }
11540     }
11541     break;
11542    default:
11543     Perl_croak(aTHX_ "panic: regfree data code '%c'", ri->data->what[n]);
11544    }
11545   }
11546   Safefree(ri->data->what);
11547   Safefree(ri->data);
11548  }
11549
11550  Safefree(ri);
11551 }
11552
11553 #define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
11554 #define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
11555 #define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
11556
11557 /*
11558    re_dup - duplicate a regexp.
11559
11560    This routine is expected to clone a given regexp structure. It is only
11561    compiled under USE_ITHREADS.
11562
11563    After all of the core data stored in struct regexp is duplicated
11564    the regexp_engine.dupe method is used to copy any private data
11565    stored in the *pprivate pointer. This allows extensions to handle
11566    any duplication it needs to do.
11567
11568    See pregfree() and regfree_internal() if you change anything here.
11569 */
11570 #if defined(USE_ITHREADS)
11571 #ifndef PERL_IN_XSUB_RE
11572 void
11573 Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS *param)
11574 {
11575  dVAR;
11576  I32 npar;
11577  const struct regexp *r = (const struct regexp *)SvANY(sstr);
11578  struct regexp *ret = (struct regexp *)SvANY(dstr);
11579
11580  PERL_ARGS_ASSERT_RE_DUP_GUTS;
11581
11582  npar = r->nparens+1;
11583  Newx(ret->offs, npar, regexp_paren_pair);
11584  Copy(r->offs, ret->offs, npar, regexp_paren_pair);
11585  if(ret->swap) {
11586   /* no need to copy these */
11587   Newx(ret->swap, npar, regexp_paren_pair);
11588  }
11589
11590  if (ret->substrs) {
11591   /* Do it this way to avoid reading from *r after the StructCopy().
11592   That way, if any of the sv_dup_inc()s dislodge *r from the L1
11593   cache, it doesn't matter.  */
11594   const bool anchored = r->check_substr
11595    ? r->check_substr == r->anchored_substr
11596    : r->check_utf8 == r->anchored_utf8;
11597   Newx(ret->substrs, 1, struct reg_substr_data);
11598   StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
11599
11600   ret->anchored_substr = sv_dup_inc(ret->anchored_substr, param);
11601   ret->anchored_utf8 = sv_dup_inc(ret->anchored_utf8, param);
11602   ret->float_substr = sv_dup_inc(ret->float_substr, param);
11603   ret->float_utf8 = sv_dup_inc(ret->float_utf8, param);
11604
11605   /* check_substr and check_utf8, if non-NULL, point to either their
11606   anchored or float namesakes, and don't hold a second reference.  */
11607
11608   if (ret->check_substr) {
11609    if (anchored) {
11610     assert(r->check_utf8 == r->anchored_utf8);
11611     ret->check_substr = ret->anchored_substr;
11612     ret->check_utf8 = ret->anchored_utf8;
11613    } else {
11614     assert(r->check_substr == r->float_substr);
11615     assert(r->check_utf8 == r->float_utf8);
11616     ret->check_substr = ret->float_substr;
11617     ret->check_utf8 = ret->float_utf8;
11618    }
11619   } else if (ret->check_utf8) {
11620    if (anchored) {
11621     ret->check_utf8 = ret->anchored_utf8;
11622    } else {
11623     ret->check_utf8 = ret->float_utf8;
11624    }
11625   }
11626  }
11627
11628  RXp_PAREN_NAMES(ret) = hv_dup_inc(RXp_PAREN_NAMES(ret), param);
11629
11630  if (ret->pprivate)
11631   RXi_SET(ret,CALLREGDUPE_PVT(dstr,param));
11632
11633  if (RX_MATCH_COPIED(dstr))
11634   ret->subbeg  = SAVEPVN(ret->subbeg, ret->sublen);
11635  else
11636   ret->subbeg = NULL;
11637 #ifdef PERL_OLD_COPY_ON_WRITE
11638  ret->saved_copy = NULL;
11639 #endif
11640
11641  if (ret->mother_re) {
11642   if (SvPVX_const(dstr) == SvPVX_const(ret->mother_re)) {
11643    /* Our storage points directly to our mother regexp, but that's
11644    1: a buffer in a different thread
11645    2: something we no longer hold a reference on
11646    so we need to copy it locally.  */
11647    /* Note we need to sue SvCUR() on our mother_re, because it, in
11648    turn, may well be pointing to its own mother_re.  */
11649    SvPV_set(dstr, SAVEPVN(SvPVX_const(ret->mother_re),
11650         SvCUR(ret->mother_re)+1));
11651    SvLEN_set(dstr, SvCUR(ret->mother_re)+1);
11652   }
11653   ret->mother_re      = NULL;
11654  }
11655  ret->gofs = 0;
11656 }
11657 #endif /* PERL_IN_XSUB_RE */
11658
11659 /*
11660    regdupe_internal()
11661
11662    This is the internal complement to regdupe() which is used to copy
11663    the structure pointed to by the *pprivate pointer in the regexp.
11664    This is the core version of the extension overridable cloning hook.
11665    The regexp structure being duplicated will be copied by perl prior
11666    to this and will be provided as the regexp *r argument, however
11667    with the /old/ structures pprivate pointer value. Thus this routine
11668    may override any copying normally done by perl.
11669
11670    It returns a pointer to the new regexp_internal structure.
11671 */
11672
11673 void *
11674 Perl_regdupe_internal(pTHX_ REGEXP * const rx, CLONE_PARAMS *param)
11675 {
11676  dVAR;
11677  struct regexp *const r = (struct regexp *)SvANY(rx);
11678  regexp_internal *reti;
11679  int len, npar;
11680  RXi_GET_DECL(r,ri);
11681
11682  PERL_ARGS_ASSERT_REGDUPE_INTERNAL;
11683
11684  npar = r->nparens+1;
11685  len = ProgLen(ri);
11686
11687  Newxc(reti, sizeof(regexp_internal) + len*sizeof(regnode), char, regexp_internal);
11688  Copy(ri->program, reti->program, len+1, regnode);
11689
11690
11691  reti->regstclass = NULL;
11692
11693  if (ri->data) {
11694   struct reg_data *d;
11695   const int count = ri->data->count;
11696   int i;
11697
11698   Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
11699     char, struct reg_data);
11700   Newx(d->what, count, U8);
11701
11702   d->count = count;
11703   for (i = 0; i < count; i++) {
11704    d->what[i] = ri->data->what[i];
11705    switch (d->what[i]) {
11706     /* legal options are one of: sSfpontTua
11707     see also regcomp.h and pregfree() */
11708    case 'a': /* actually an AV, but the dup function is identical.  */
11709    case 's':
11710    case 'S':
11711    case 'p': /* actually an AV, but the dup function is identical.  */
11712    case 'u': /* actually an HV, but the dup function is identical.  */
11713     d->data[i] = sv_dup_inc((const SV *)ri->data->data[i], param);
11714     break;
11715    case 'f':
11716     /* This is cheating. */
11717     Newx(d->data[i], 1, struct regnode_charclass_class);
11718     StructCopy(ri->data->data[i], d->data[i],
11719        struct regnode_charclass_class);
11720     reti->regstclass = (regnode*)d->data[i];
11721     break;
11722    case 'o':
11723     /* Compiled op trees are readonly and in shared memory,
11724     and can thus be shared without duplication. */
11725     OP_REFCNT_LOCK;
11726     d->data[i] = (void*)OpREFCNT_inc((OP*)ri->data->data[i]);
11727     OP_REFCNT_UNLOCK;
11728     break;
11729    case 'T':
11730     /* Trie stclasses are readonly and can thus be shared
11731     * without duplication. We free the stclass in pregfree
11732     * when the corresponding reg_ac_data struct is freed.
11733     */
11734     reti->regstclass= ri->regstclass;
11735     /* Fall through */
11736    case 't':
11737     OP_REFCNT_LOCK;
11738     ((reg_trie_data*)ri->data->data[i])->refcount++;
11739     OP_REFCNT_UNLOCK;
11740     /* Fall through */
11741    case 'n':
11742     d->data[i] = ri->data->data[i];
11743     break;
11744    default:
11745     Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", ri->data->what[i]);
11746    }
11747   }
11748
11749   reti->data = d;
11750  }
11751  else
11752   reti->data = NULL;
11753
11754  reti->name_list_idx = ri->name_list_idx;
11755
11756 #ifdef RE_TRACK_PATTERN_OFFSETS
11757  if (ri->u.offsets) {
11758   Newx(reti->u.offsets, 2*len+1, U32);
11759   Copy(ri->u.offsets, reti->u.offsets, 2*len+1, U32);
11760  }
11761 #else
11762  SetProgLen(reti,len);
11763 #endif
11764
11765  return (void*)reti;
11766 }
11767
11768 #endif    /* USE_ITHREADS */
11769
11770 #ifndef PERL_IN_XSUB_RE
11771
11772 /*
11773  - regnext - dig the "next" pointer out of a node
11774  */
11775 regnode *
11776 Perl_regnext(pTHX_ register regnode *p)
11777 {
11778  dVAR;
11779  register I32 offset;
11780
11781  if (!p)
11782   return(NULL);
11783
11784  if (OP(p) > REGNODE_MAX) {  /* regnode.type is unsigned */
11785   Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", (int)OP(p), (int)REGNODE_MAX);
11786  }
11787
11788  offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
11789  if (offset == 0)
11790   return(NULL);
11791
11792  return(p+offset);
11793 }
11794 #endif
11795
11796 STATIC void
11797 S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
11798 {
11799  va_list args;
11800  STRLEN l1 = strlen(pat1);
11801  STRLEN l2 = strlen(pat2);
11802  char buf[512];
11803  SV *msv;
11804  const char *message;
11805
11806  PERL_ARGS_ASSERT_RE_CROAK2;
11807
11808  if (l1 > 510)
11809   l1 = 510;
11810  if (l1 + l2 > 510)
11811   l2 = 510 - l1;
11812  Copy(pat1, buf, l1 , char);
11813  Copy(pat2, buf + l1, l2 , char);
11814  buf[l1 + l2] = '\n';
11815  buf[l1 + l2 + 1] = '\0';
11816 #ifdef I_STDARG
11817  /* ANSI variant takes additional second argument */
11818  va_start(args, pat2);
11819 #else
11820  va_start(args);
11821 #endif
11822  msv = vmess(buf, &args);
11823  va_end(args);
11824  message = SvPV_const(msv,l1);
11825  if (l1 > 512)
11826   l1 = 512;
11827  Copy(message, buf, l1 , char);
11828  buf[l1-1] = '\0';   /* Overwrite \n */
11829  Perl_croak(aTHX_ "%s", buf);
11830 }
11831
11832 /* XXX Here's a total kludge.  But we need to re-enter for swash routines. */
11833
11834 #ifndef PERL_IN_XSUB_RE
11835 void
11836 Perl_save_re_context(pTHX)
11837 {
11838  dVAR;
11839
11840  struct re_save_state *state;
11841
11842  SAVEVPTR(PL_curcop);
11843  SSGROW(SAVESTACK_ALLOC_FOR_RE_SAVE_STATE + 1);
11844
11845  state = (struct re_save_state *)(PL_savestack + PL_savestack_ix);
11846  PL_savestack_ix += SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
11847  SSPUSHUV(SAVEt_RE_STATE);
11848
11849  Copy(&PL_reg_state, state, 1, struct re_save_state);
11850
11851  PL_reg_start_tmp = 0;
11852  PL_reg_start_tmpl = 0;
11853  PL_reg_oldsaved = NULL;
11854  PL_reg_oldsavedlen = 0;
11855  PL_reg_maxiter = 0;
11856  PL_reg_leftiter = 0;
11857  PL_reg_poscache = NULL;
11858  PL_reg_poscache_size = 0;
11859 #ifdef PERL_OLD_COPY_ON_WRITE
11860  PL_nrs = NULL;
11861 #endif
11862
11863  /* Save $1..$n (#18107: UTF-8 s/(\w+)/uc($1)/e); AMS 20021106. */
11864  if (PL_curpm) {
11865   const REGEXP * const rx = PM_GETRE(PL_curpm);
11866   if (rx) {
11867    U32 i;
11868    for (i = 1; i <= RX_NPARENS(rx); i++) {
11869     char digits[TYPE_CHARS(long)];
11870     const STRLEN len = my_snprintf(digits, sizeof(digits), "%lu", (long)i);
11871     GV *const *const gvp
11872      = (GV**)hv_fetch(PL_defstash, digits, len, 0);
11873
11874     if (gvp) {
11875      GV * const gv = *gvp;
11876      if (SvTYPE(gv) == SVt_PVGV && GvSV(gv))
11877       save_scalar(gv);
11878     }
11879    }
11880   }
11881  }
11882 }
11883 #endif
11884
11885 static void
11886 clear_re(pTHX_ void *r)
11887 {
11888  dVAR;
11889  ReREFCNT_dec((REGEXP *)r);
11890 }
11891
11892 #ifdef DEBUGGING
11893
11894 STATIC void
11895 S_put_byte(pTHX_ SV *sv, int c)
11896 {
11897  PERL_ARGS_ASSERT_PUT_BYTE;
11898
11899  /* Our definition of isPRINT() ignores locales, so only bytes that are
11900  not part of UTF-8 are considered printable. I assume that the same
11901  holds for UTF-EBCDIC.
11902  Also, code point 255 is not printable in either (it's E0 in EBCDIC,
11903  which Wikipedia says:
11904
11905  EO, or Eight Ones, is an 8-bit EBCDIC character code represented as all
11906  ones (binary 1111 1111, hexadecimal FF). It is similar, but not
11907  identical, to the ASCII delete (DEL) or rubout control character.
11908  ) So the old condition can be simplified to !isPRINT(c)  */
11909  if (!isPRINT(c)) {
11910   if (c < 256) {
11911    Perl_sv_catpvf(aTHX_ sv, "\\x%02x", c);
11912   }
11913   else {
11914    Perl_sv_catpvf(aTHX_ sv, "\\x{%x}", c);
11915   }
11916  }
11917  else {
11918   const char string = c;
11919   if (c == '-' || c == ']' || c == '\\' || c == '^')
11920    sv_catpvs(sv, "\\");
11921   sv_catpvn(sv, &string, 1);
11922  }
11923 }
11924
11925
11926 #define CLEAR_OPTSTART \
11927  if (optstart) STMT_START { \
11928    DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log, " (%"IVdf" nodes)\n", (IV)(node - optstart))); \
11929    optstart=NULL; \
11930  } STMT_END
11931
11932 #define DUMPUNTIL(b,e) CLEAR_OPTSTART; node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1);
11933
11934 STATIC const regnode *
11935 S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node,
11936    const regnode *last, const regnode *plast,
11937    SV* sv, I32 indent, U32 depth)
11938 {
11939  dVAR;
11940  register U8 op = PSEUDO; /* Arbitrary non-END op. */
11941  register const regnode *next;
11942  const regnode *optstart= NULL;
11943
11944  RXi_GET_DECL(r,ri);
11945  GET_RE_DEBUG_FLAGS_DECL;
11946
11947  PERL_ARGS_ASSERT_DUMPUNTIL;
11948
11949 #ifdef DEBUG_DUMPUNTIL
11950  PerlIO_printf(Perl_debug_log, "--- %d : %d - %d - %d\n",indent,node-start,
11951   last ? last-start : 0,plast ? plast-start : 0);
11952 #endif
11953
11954  if (plast && plast < last)
11955   last= plast;
11956
11957  while (PL_regkind[op] != END && (!last || node < last)) {
11958   /* While that wasn't END last time... */
11959   NODE_ALIGN(node);
11960   op = OP(node);
11961   if (op == CLOSE || op == WHILEM)
11962    indent--;
11963   next = regnext((regnode *)node);
11964
11965   /* Where, what. */
11966   if (OP(node) == OPTIMIZED) {
11967    if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE))
11968     optstart = node;
11969    else
11970     goto after_print;
11971   } else
11972    CLEAR_OPTSTART;
11973
11974   regprop(r, sv, node);
11975   PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
11976      (int)(2*indent + 1), "", SvPVX_const(sv));
11977
11978   if (OP(node) != OPTIMIZED) {
11979    if (next == NULL)  /* Next ptr. */
11980     PerlIO_printf(Perl_debug_log, " (0)");
11981    else if (PL_regkind[(U8)op] == BRANCH && PL_regkind[OP(next)] != BRANCH )
11982     PerlIO_printf(Perl_debug_log, " (FAIL)");
11983    else
11984     PerlIO_printf(Perl_debug_log, " (%"IVdf")", (IV)(next - start));
11985    (void)PerlIO_putc(Perl_debug_log, '\n');
11986   }
11987
11988  after_print:
11989   if (PL_regkind[(U8)op] == BRANCHJ) {
11990    assert(next);
11991    {
11992     register const regnode *nnode = (OP(next) == LONGJMP
11993            ? regnext((regnode *)next)
11994            : next);
11995     if (last && nnode > last)
11996      nnode = last;
11997     DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode);
11998    }
11999   }
12000   else if (PL_regkind[(U8)op] == BRANCH) {
12001    assert(next);
12002    DUMPUNTIL(NEXTOPER(node), next);
12003   }
12004   else if ( PL_regkind[(U8)op]  == TRIE ) {
12005    const regnode *this_trie = node;
12006    const char op = OP(node);
12007    const U32 n = ARG(node);
12008    const reg_ac_data * const ac = op>=AHOCORASICK ?
12009    (reg_ac_data *)ri->data->data[n] :
12010    NULL;
12011    const reg_trie_data * const trie =
12012     (reg_trie_data*)ri->data->data[op<AHOCORASICK ? n : ac->trie];
12013 #ifdef DEBUGGING
12014    AV *const trie_words = MUTABLE_AV(ri->data->data[n + TRIE_WORDS_OFFSET]);
12015 #endif
12016    const regnode *nextbranch= NULL;
12017    I32 word_idx;
12018    sv_setpvs(sv, "");
12019    for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) {
12020     SV ** const elem_ptr = av_fetch(trie_words,word_idx,0);
12021
12022     PerlIO_printf(Perl_debug_log, "%*s%s ",
12023     (int)(2*(indent+3)), "",
12024      elem_ptr ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr), SvCUR(*elem_ptr), 60,
12025        PL_colors[0], PL_colors[1],
12026        (SvUTF8(*elem_ptr) ? PERL_PV_ESCAPE_UNI : 0) |
12027        PERL_PV_PRETTY_ELLIPSES    |
12028        PERL_PV_PRETTY_LTGT
12029        )
12030        : "???"
12031     );
12032     if (trie->jump) {
12033      U16 dist= trie->jump[word_idx+1];
12034      PerlIO_printf(Perl_debug_log, "(%"UVuf")\n",
12035         (UV)((dist ? this_trie + dist : next) - start));
12036      if (dist) {
12037       if (!nextbranch)
12038        nextbranch= this_trie + trie->jump[0];
12039       DUMPUNTIL(this_trie + dist, nextbranch);
12040      }
12041      if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
12042       nextbranch= regnext((regnode *)nextbranch);
12043     } else {
12044      PerlIO_printf(Perl_debug_log, "\n");
12045     }
12046    }
12047    if (last && next > last)
12048     node= last;
12049    else
12050     node= next;
12051   }
12052   else if ( op == CURLY ) {   /* "next" might be very big: optimizer */
12053    DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS,
12054      NEXTOPER(node) + EXTRA_STEP_2ARGS + 1);
12055   }
12056   else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
12057    assert(next);
12058    DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next);
12059   }
12060   else if ( op == PLUS || op == STAR) {
12061    DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1);
12062   }
12063   else if (PL_regkind[(U8)op] == ANYOF) {
12064    /* arglen 1 + class block */
12065    node += 1 + ((ANYOF_FLAGS(node) & ANYOF_CLASS)
12066      ? ANYOF_CLASS_SKIP : ANYOF_SKIP);
12067    node = NEXTOPER(node);
12068   }
12069   else if (PL_regkind[(U8)op] == EXACT) {
12070    /* Literal string, where present. */
12071    node += NODE_SZ_STR(node) - 1;
12072    node = NEXTOPER(node);
12073   }
12074   else {
12075    node = NEXTOPER(node);
12076    node += regarglen[(U8)op];
12077   }
12078   if (op == CURLYX || op == OPEN)
12079    indent++;
12080  }
12081  CLEAR_OPTSTART;
12082 #ifdef DEBUG_DUMPUNTIL
12083  PerlIO_printf(Perl_debug_log, "--- %d\n", (int)indent);
12084 #endif
12085  return node;
12086 }
12087
12088 #endif /* DEBUGGING */
12089
12090 /*
12091  * Local variables:
12092  * c-indentation-style: bsd
12093  * c-basic-offset: 4
12094  * indent-tabs-mode: t
12095  * End:
12096  *
12097  * ex: set ts=8 sts=4 sw=4 noet:
12098  */