]> git.vpit.fr Git - perl/modules/re-engine-Hooks.git/blob - src/5010001/regcomp.c
Attach the callbacks to every regexps in a thread-safe way
[perl/modules/re-engine-Hooks.git] / src / 5010001 / 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 #ifdef op
89 #undef op
90 #endif /* op */
91
92 #ifdef MSDOS
93 #  if defined(BUGGY_MSC6)
94  /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
95 #    pragma optimize("a",off)
96  /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
97 #    pragma optimize("w",on )
98 #  endif /* BUGGY_MSC6 */
99 #endif /* MSDOS */
100
101 #ifndef STATIC
102 #define STATIC  static
103 #endif
104
105 typedef struct RExC_state_t {
106     U32         flags;                  /* are we folding, multilining? */
107     char        *precomp;               /* uncompiled string. */
108     regexp      *rx;                    /* perl core regexp structure */
109     regexp_internal     *rxi;           /* internal data for regexp object pprivate field */        
110     char        *start;                 /* Start of input for compile */
111     char        *end;                   /* End of input for compile */
112     char        *parse;                 /* Input-scan pointer. */
113     I32         whilem_seen;            /* number of WHILEM in this expr */
114     regnode     *emit_start;            /* Start of emitted-code area */
115     regnode     *emit_bound;            /* First regnode outside of the allocated space */
116     regnode     *emit;                  /* Code-emit pointer; &regdummy = don't = compiling */
117     I32         naughty;                /* How bad is this pattern? */
118     I32         sawback;                /* Did we see \1, ...? */
119     U32         seen;
120     I32         size;                   /* Code size. */
121     I32         npar;                   /* Capture buffer count, (OPEN). */
122     I32         cpar;                   /* Capture buffer count, (CLOSE). */
123     I32         nestroot;               /* root parens we are in - used by accept */
124     I32         extralen;
125     I32         seen_zerolen;
126     I32         seen_evals;
127     regnode     **open_parens;          /* pointers to open parens */
128     regnode     **close_parens;         /* pointers to close parens */
129     regnode     *opend;                 /* END node in program */
130     I32         utf8;           /* whether the pattern is utf8 or not */
131     I32         orig_utf8;      /* whether the pattern was originally in utf8 */
132                                 /* XXX use this for future optimisation of case
133                                  * where pattern must be upgraded to utf8. */
134     HV          *charnames;             /* cache of named sequences */
135     HV          *paren_names;           /* Paren names */
136     
137     regnode     **recurse;              /* Recurse regops */
138     I32         recurse_count;          /* Number of recurse regops */
139 #if ADD_TO_REGEXEC
140     char        *starttry;              /* -Dr: where regtry was called. */
141 #define RExC_starttry   (pRExC_state->starttry)
142 #endif
143 #ifdef DEBUGGING
144     const char  *lastparse;
145     I32         lastnum;
146     AV          *paren_name_list;       /* idx -> name */
147 #define RExC_lastparse  (pRExC_state->lastparse)
148 #define RExC_lastnum    (pRExC_state->lastnum)
149 #define RExC_paren_name_list    (pRExC_state->paren_name_list)
150 #endif
151 } RExC_state_t;
152
153 #define RExC_flags      (pRExC_state->flags)
154 #define RExC_precomp    (pRExC_state->precomp)
155 #define RExC_rx         (pRExC_state->rx)
156 #define RExC_rxi        (pRExC_state->rxi)
157 #define RExC_start      (pRExC_state->start)
158 #define RExC_end        (pRExC_state->end)
159 #define RExC_parse      (pRExC_state->parse)
160 #define RExC_whilem_seen        (pRExC_state->whilem_seen)
161 #ifdef RE_TRACK_PATTERN_OFFSETS
162 #define RExC_offsets    (pRExC_state->rxi->u.offsets) /* I am not like the others */
163 #endif
164 #define RExC_emit       (pRExC_state->emit)
165 #define RExC_emit_start (pRExC_state->emit_start)
166 #define RExC_emit_bound (pRExC_state->emit_bound)
167 #define RExC_naughty    (pRExC_state->naughty)
168 #define RExC_sawback    (pRExC_state->sawback)
169 #define RExC_seen       (pRExC_state->seen)
170 #define RExC_size       (pRExC_state->size)
171 #define RExC_npar       (pRExC_state->npar)
172 #define RExC_nestroot   (pRExC_state->nestroot)
173 #define RExC_extralen   (pRExC_state->extralen)
174 #define RExC_seen_zerolen       (pRExC_state->seen_zerolen)
175 #define RExC_seen_evals (pRExC_state->seen_evals)
176 #define RExC_utf8       (pRExC_state->utf8)
177 #define RExC_orig_utf8  (pRExC_state->orig_utf8)
178 #define RExC_charnames  (pRExC_state->charnames)
179 #define RExC_open_parens        (pRExC_state->open_parens)
180 #define RExC_close_parens       (pRExC_state->close_parens)
181 #define RExC_opend      (pRExC_state->opend)
182 #define RExC_paren_names        (pRExC_state->paren_names)
183 #define RExC_recurse    (pRExC_state->recurse)
184 #define RExC_recurse_count      (pRExC_state->recurse_count)
185
186
187 #define ISMULT1(c)      ((c) == '*' || (c) == '+' || (c) == '?')
188 #define ISMULT2(s)      ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
189         ((*s) == '{' && regcurly(s)))
190
191 #ifdef SPSTART
192 #undef SPSTART          /* dratted cpp namespace... */
193 #endif
194 /*
195  * Flags to be passed up and down.
196  */
197 #define WORST           0       /* Worst case. */
198 #define HASWIDTH        0x01    /* Known to match non-null strings. */
199 #define SIMPLE          0x02    /* Simple enough to be STAR/PLUS operand. */
200 #define SPSTART         0x04    /* Starts with * or +. */
201 #define TRYAGAIN        0x08    /* Weeded out a declaration. */
202 #define POSTPONED       0x10    /* (?1),(?&name), (??{...}) or similar */
203
204 #define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1)
205
206 /* whether trie related optimizations are enabled */
207 #if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION
208 #define TRIE_STUDY_OPT
209 #define FULL_TRIE_STUDY
210 #define TRIE_STCLASS
211 #endif
212
213
214
215 #define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3]
216 #define PBITVAL(paren) (1 << ((paren) & 7))
217 #define PAREN_TEST(u8str,paren) ( PBYTE(u8str,paren) & PBITVAL(paren))
218 #define PAREN_SET(u8str,paren) PBYTE(u8str,paren) |= PBITVAL(paren)
219 #define PAREN_UNSET(u8str,paren) PBYTE(u8str,paren) &= (~PBITVAL(paren))
220
221
222 /* About scan_data_t.
223
224   During optimisation we recurse through the regexp program performing
225   various inplace (keyhole style) optimisations. In addition study_chunk
226   and scan_commit populate this data structure with information about
227   what strings MUST appear in the pattern. We look for the longest 
228   string that must appear for at a fixed location, and we look for the
229   longest string that may appear at a floating location. So for instance
230   in the pattern:
231   
232     /FOO[xX]A.*B[xX]BAR/
233     
234   Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating
235   strings (because they follow a .* construct). study_chunk will identify
236   both FOO and BAR as being the longest fixed and floating strings respectively.
237   
238   The strings can be composites, for instance
239   
240      /(f)(o)(o)/
241      
242   will result in a composite fixed substring 'foo'.
243   
244   For each string some basic information is maintained:
245   
246   - offset or min_offset
247     This is the position the string must appear at, or not before.
248     It also implicitly (when combined with minlenp) tells us how many
249     character must match before the string we are searching.
250     Likewise when combined with minlenp and the length of the string
251     tells us how many characters must appear after the string we have 
252     found.
253   
254   - max_offset
255     Only used for floating strings. This is the rightmost point that
256     the string can appear at. Ifset to I32 max it indicates that the
257     string can occur infinitely far to the right.
258   
259   - minlenp
260     A pointer to the minimum length of the pattern that the string 
261     was found inside. This is important as in the case of positive 
262     lookahead or positive lookbehind we can have multiple patterns 
263     involved. Consider
264     
265     /(?=FOO).*F/
266     
267     The minimum length of the pattern overall is 3, the minimum length
268     of the lookahead part is 3, but the minimum length of the part that
269     will actually match is 1. So 'FOO's minimum length is 3, but the 
270     minimum length for the F is 1. This is important as the minimum length
271     is used to determine offsets in front of and behind the string being 
272     looked for.  Since strings can be composites this is the length of the
273     pattern at the time it was commited with a scan_commit. Note that
274     the length is calculated by study_chunk, so that the minimum lengths
275     are not known until the full pattern has been compiled, thus the 
276     pointer to the value.
277   
278   - lookbehind
279   
280     In the case of lookbehind the string being searched for can be
281     offset past the start point of the final matching string. 
282     If this value was just blithely removed from the min_offset it would
283     invalidate some of the calculations for how many chars must match
284     before or after (as they are derived from min_offset and minlen and
285     the length of the string being searched for). 
286     When the final pattern is compiled and the data is moved from the
287     scan_data_t structure into the regexp structure the information
288     about lookbehind is factored in, with the information that would 
289     have been lost precalculated in the end_shift field for the 
290     associated string.
291
292   The fields pos_min and pos_delta are used to store the minimum offset
293   and the delta to the maximum offset at the current point in the pattern.    
294
295 */
296
297 typedef struct scan_data_t {
298     /*I32 len_min;      unused */
299     /*I32 len_delta;    unused */
300     I32 pos_min;
301     I32 pos_delta;
302     SV *last_found;
303     I32 last_end;           /* min value, <0 unless valid. */
304     I32 last_start_min;
305     I32 last_start_max;
306     SV **longest;           /* Either &l_fixed, or &l_float. */
307     SV *longest_fixed;      /* longest fixed string found in pattern */
308     I32 offset_fixed;       /* offset where it starts */
309     I32 *minlen_fixed;      /* pointer to the minlen relevent to the string */
310     I32 lookbehind_fixed;   /* is the position of the string modfied by LB */
311     SV *longest_float;      /* longest floating string found in pattern */
312     I32 offset_float_min;   /* earliest point in string it can appear */
313     I32 offset_float_max;   /* latest point in string it can appear */
314     I32 *minlen_float;      /* pointer to the minlen relevent to the string */
315     I32 lookbehind_float;   /* is the position of the string modified by LB */
316     I32 flags;
317     I32 whilem_c;
318     I32 *last_closep;
319     struct regnode_charclass_class *start_class;
320 } scan_data_t;
321
322 /*
323  * Forward declarations for pregcomp()'s friends.
324  */
325
326 static const scan_data_t zero_scan_data =
327   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
328
329 #define SF_BEFORE_EOL           (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
330 #define SF_BEFORE_SEOL          0x0001
331 #define SF_BEFORE_MEOL          0x0002
332 #define SF_FIX_BEFORE_EOL       (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
333 #define SF_FL_BEFORE_EOL        (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
334
335 #ifdef NO_UNARY_PLUS
336 #  define SF_FIX_SHIFT_EOL      (0+2)
337 #  define SF_FL_SHIFT_EOL               (0+4)
338 #else
339 #  define SF_FIX_SHIFT_EOL      (+2)
340 #  define SF_FL_SHIFT_EOL               (+4)
341 #endif
342
343 #define SF_FIX_BEFORE_SEOL      (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
344 #define SF_FIX_BEFORE_MEOL      (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
345
346 #define SF_FL_BEFORE_SEOL       (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
347 #define SF_FL_BEFORE_MEOL       (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
348 #define SF_IS_INF               0x0040
349 #define SF_HAS_PAR              0x0080
350 #define SF_IN_PAR               0x0100
351 #define SF_HAS_EVAL             0x0200
352 #define SCF_DO_SUBSTR           0x0400
353 #define SCF_DO_STCLASS_AND      0x0800
354 #define SCF_DO_STCLASS_OR       0x1000
355 #define SCF_DO_STCLASS          (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
356 #define SCF_WHILEM_VISITED_POS  0x2000
357
358 #define SCF_TRIE_RESTUDY        0x4000 /* Do restudy? */
359 #define SCF_SEEN_ACCEPT         0x8000 
360
361 #define UTF (RExC_utf8 != 0)
362 #define LOC ((RExC_flags & RXf_PMf_LOCALE) != 0)
363 #define FOLD ((RExC_flags & RXf_PMf_FOLD) != 0)
364
365 #define OOB_UNICODE             12345678
366 #define OOB_NAMEDCLASS          -1
367
368 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
369 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
370
371
372 /* length of regex to show in messages that don't mark a position within */
373 #define RegexLengthToShowInErrorMessages 127
374
375 /*
376  * If MARKER[12] are adjusted, be sure to adjust the constants at the top
377  * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
378  * op/pragma/warn/regcomp.
379  */
380 #define MARKER1 "<-- HERE"    /* marker as it appears in the description */
381 #define MARKER2 " <-- HERE "  /* marker as it appears within the regex */
382
383 #define REPORT_LOCATION " in regex; marked by " MARKER1 " in m/%.*s" MARKER2 "%s/"
384
385 /*
386  * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
387  * arg. Show regex, up to a maximum length. If it's too long, chop and add
388  * "...".
389  */
390 #define _FAIL(code) STMT_START {                                        \
391     const char *ellipses = "";                                          \
392     IV len = RExC_end - RExC_precomp;                                   \
393                                                                         \
394     if (!SIZE_ONLY)                                                     \
395         SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx);                      \
396     if (len > RegexLengthToShowInErrorMessages) {                       \
397         /* chop 10 shorter than the max, to ensure meaning of "..." */  \
398         len = RegexLengthToShowInErrorMessages - 10;                    \
399         ellipses = "...";                                               \
400     }                                                                   \
401     code;                                                               \
402 } STMT_END
403
404 #define FAIL(msg) _FAIL(                            \
405     Perl_croak(aTHX_ "%s in regex m/%.*s%s/",       \
406             msg, (int)len, RExC_precomp, ellipses))
407
408 #define FAIL2(msg,arg) _FAIL(                       \
409     Perl_croak(aTHX_ msg " in regex m/%.*s%s/",     \
410             arg, (int)len, RExC_precomp, ellipses))
411
412 /*
413  * Simple_vFAIL -- like FAIL, but marks the current location in the scan
414  */
415 #define Simple_vFAIL(m) STMT_START {                                    \
416     const IV offset = RExC_parse - RExC_precomp;                        \
417     Perl_croak(aTHX_ "%s" REPORT_LOCATION,                              \
418             m, (int)offset, RExC_precomp, RExC_precomp + offset);       \
419 } STMT_END
420
421 /*
422  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
423  */
424 #define vFAIL(m) STMT_START {                           \
425     if (!SIZE_ONLY)                                     \
426         SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx);      \
427     Simple_vFAIL(m);                                    \
428 } STMT_END
429
430 /*
431  * Like Simple_vFAIL(), but accepts two arguments.
432  */
433 #define Simple_vFAIL2(m,a1) STMT_START {                        \
434     const IV offset = RExC_parse - RExC_precomp;                        \
435     S_re_croak2(aTHX_ m, REPORT_LOCATION, a1,                   \
436             (int)offset, RExC_precomp, RExC_precomp + offset);  \
437 } STMT_END
438
439 /*
440  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
441  */
442 #define vFAIL2(m,a1) STMT_START {                       \
443     if (!SIZE_ONLY)                                     \
444         SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx);      \
445     Simple_vFAIL2(m, a1);                               \
446 } STMT_END
447
448
449 /*
450  * Like Simple_vFAIL(), but accepts three arguments.
451  */
452 #define Simple_vFAIL3(m, a1, a2) STMT_START {                   \
453     const IV offset = RExC_parse - RExC_precomp;                \
454     S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2,               \
455             (int)offset, RExC_precomp, RExC_precomp + offset);  \
456 } STMT_END
457
458 /*
459  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
460  */
461 #define vFAIL3(m,a1,a2) STMT_START {                    \
462     if (!SIZE_ONLY)                                     \
463         SAVEDESTRUCTOR_X(clear_re,(void*)RExC_rx);      \
464     Simple_vFAIL3(m, a1, a2);                           \
465 } STMT_END
466
467 /*
468  * Like Simple_vFAIL(), but accepts four arguments.
469  */
470 #define Simple_vFAIL4(m, a1, a2, a3) STMT_START {               \
471     const IV offset = RExC_parse - RExC_precomp;                \
472     S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3,           \
473             (int)offset, RExC_precomp, RExC_precomp + offset);  \
474 } STMT_END
475
476 #define vWARN(loc,m) STMT_START {                                       \
477     const IV offset = loc - RExC_precomp;                               \
478     Perl_warner(aTHX_ packWARN(WARN_REGEXP), "%s" REPORT_LOCATION,      \
479             m, (int)offset, RExC_precomp, RExC_precomp + offset);       \
480 } STMT_END
481
482 #define vWARNdep(loc,m) STMT_START {                                    \
483     const IV offset = loc - RExC_precomp;                               \
484     Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_REGEXP),          \
485             "%s" REPORT_LOCATION,                                       \
486             m, (int)offset, RExC_precomp, RExC_precomp + offset);       \
487 } STMT_END
488
489
490 #define vWARN2(loc, m, a1) STMT_START {                                 \
491     const IV offset = loc - RExC_precomp;                               \
492     Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,         \
493             a1, (int)offset, RExC_precomp, RExC_precomp + offset);      \
494 } STMT_END
495
496 #define vWARN3(loc, m, a1, a2) STMT_START {                             \
497     const IV offset = loc - RExC_precomp;                               \
498     Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,         \
499             a1, a2, (int)offset, RExC_precomp, RExC_precomp + offset);  \
500 } STMT_END
501
502 #define vWARN4(loc, m, a1, a2, a3) STMT_START {                         \
503     const IV offset = loc - RExC_precomp;                               \
504     Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,         \
505             a1, a2, a3, (int)offset, RExC_precomp, RExC_precomp + offset); \
506 } STMT_END
507
508 #define vWARN5(loc, m, a1, a2, a3, a4) STMT_START {                     \
509     const IV offset = loc - RExC_precomp;                               \
510     Perl_warner(aTHX_ packWARN(WARN_REGEXP), m REPORT_LOCATION,         \
511             a1, a2, a3, a4, (int)offset, RExC_precomp, RExC_precomp + offset); \
512 } STMT_END
513
514
515 /* Allow for side effects in s */
516 #define REGC(c,s) STMT_START {                  \
517     if (!SIZE_ONLY) *(s) = (c); else (void)(s); \
518 } STMT_END
519
520 /* Macros for recording node offsets.   20001227 mjd@plover.com 
521  * Nodes are numbered 1, 2, 3, 4.  Node #n's position is recorded in
522  * element 2*n-1 of the array.  Element #2n holds the byte length node #n.
523  * Element 0 holds the number n.
524  * Position is 1 indexed.
525  */
526 #ifndef RE_TRACK_PATTERN_OFFSETS
527 #define Set_Node_Offset_To_R(node,byte)
528 #define Set_Node_Offset(node,byte)
529 #define Set_Cur_Node_Offset
530 #define Set_Node_Length_To_R(node,len)
531 #define Set_Node_Length(node,len)
532 #define Set_Node_Cur_Length(node)
533 #define Node_Offset(n) 
534 #define Node_Length(n) 
535 #define Set_Node_Offset_Length(node,offset,len)
536 #define ProgLen(ri) ri->u.proglen
537 #define SetProgLen(ri,x) ri->u.proglen = x
538 #else
539 #define ProgLen(ri) ri->u.offsets[0]
540 #define SetProgLen(ri,x) ri->u.offsets[0] = x
541 #define Set_Node_Offset_To_R(node,byte) STMT_START {                    \
542     if (! SIZE_ONLY) {                                                  \
543         MJD_OFFSET_DEBUG(("** (%d) offset of node %d is %d.\n",         \
544                     __LINE__, (int)(node), (int)(byte)));               \
545         if((node) < 0) {                                                \
546             Perl_croak(aTHX_ "value of node is %d in Offset macro", (int)(node)); \
547         } else {                                                        \
548             RExC_offsets[2*(node)-1] = (byte);                          \
549         }                                                               \
550     }                                                                   \
551 } STMT_END
552
553 #define Set_Node_Offset(node,byte) \
554     Set_Node_Offset_To_R((node)-RExC_emit_start, (byte)-RExC_start)
555 #define Set_Cur_Node_Offset Set_Node_Offset(RExC_emit, RExC_parse)
556
557 #define Set_Node_Length_To_R(node,len) STMT_START {                     \
558     if (! SIZE_ONLY) {                                                  \
559         MJD_OFFSET_DEBUG(("** (%d) size of node %d is %d.\n",           \
560                 __LINE__, (int)(node), (int)(len)));                    \
561         if((node) < 0) {                                                \
562             Perl_croak(aTHX_ "value of node is %d in Length macro", (int)(node)); \
563         } else {                                                        \
564             RExC_offsets[2*(node)] = (len);                             \
565         }                                                               \
566     }                                                                   \
567 } STMT_END
568
569 #define Set_Node_Length(node,len) \
570     Set_Node_Length_To_R((node)-RExC_emit_start, len)
571 #define Set_Cur_Node_Length(len) Set_Node_Length(RExC_emit, len)
572 #define Set_Node_Cur_Length(node) \
573     Set_Node_Length(node, RExC_parse - parse_start)
574
575 /* Get offsets and lengths */
576 #define Node_Offset(n) (RExC_offsets[2*((n)-RExC_emit_start)-1])
577 #define Node_Length(n) (RExC_offsets[2*((n)-RExC_emit_start)])
578
579 #define Set_Node_Offset_Length(node,offset,len) STMT_START {    \
580     Set_Node_Offset_To_R((node)-RExC_emit_start, (offset));     \
581     Set_Node_Length_To_R((node)-RExC_emit_start, (len));        \
582 } STMT_END
583 #endif
584
585 #if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS
586 #define EXPERIMENTAL_INPLACESCAN
587 #endif /*RE_TRACK_PATTERN_OFFSETS*/
588
589 #define DEBUG_STUDYDATA(str,data,depth)                              \
590 DEBUG_OPTIMISE_MORE_r(if(data){                                      \
591     PerlIO_printf(Perl_debug_log,                                    \
592         "%*s" str "Pos:%"IVdf"/%"IVdf                                \
593         " Flags: 0x%"UVXf" Whilem_c: %"IVdf" Lcp: %"IVdf" %s",       \
594         (int)(depth)*2, "",                                          \
595         (IV)((data)->pos_min),                                       \
596         (IV)((data)->pos_delta),                                     \
597         (UV)((data)->flags),                                         \
598         (IV)((data)->whilem_c),                                      \
599         (IV)((data)->last_closep ? *((data)->last_closep) : -1),     \
600         is_inf ? "INF " : ""                                         \
601     );                                                               \
602     if ((data)->last_found)                                          \
603         PerlIO_printf(Perl_debug_log,                                \
604             "Last:'%s' %"IVdf":%"IVdf"/%"IVdf" %sFixed:'%s' @ %"IVdf \
605             " %sFloat: '%s' @ %"IVdf"/%"IVdf"",                      \
606             SvPVX_const((data)->last_found),                         \
607             (IV)((data)->last_end),                                  \
608             (IV)((data)->last_start_min),                            \
609             (IV)((data)->last_start_max),                            \
610             ((data)->longest &&                                      \
611              (data)->longest==&((data)->longest_fixed)) ? "*" : "",  \
612             SvPVX_const((data)->longest_fixed),                      \
613             (IV)((data)->offset_fixed),                              \
614             ((data)->longest &&                                      \
615              (data)->longest==&((data)->longest_float)) ? "*" : "",  \
616             SvPVX_const((data)->longest_float),                      \
617             (IV)((data)->offset_float_min),                          \
618             (IV)((data)->offset_float_max)                           \
619         );                                                           \
620     PerlIO_printf(Perl_debug_log,"\n");                              \
621 });
622
623 static void clear_re(pTHX_ void *r);
624
625 /* Mark that we cannot extend a found fixed substring at this point.
626    Update the longest found anchored substring and the longest found
627    floating substrings if needed. */
628
629 STATIC void
630 S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data, I32 *minlenp, int is_inf)
631 {
632     const STRLEN l = CHR_SVLEN(data->last_found);
633     const STRLEN old_l = CHR_SVLEN(*data->longest);
634     GET_RE_DEBUG_FLAGS_DECL;
635
636     PERL_ARGS_ASSERT_SCAN_COMMIT;
637
638     if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
639         SvSetMagicSV(*data->longest, data->last_found);
640         if (*data->longest == data->longest_fixed) {
641             data->offset_fixed = l ? data->last_start_min : data->pos_min;
642             if (data->flags & SF_BEFORE_EOL)
643                 data->flags
644                     |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
645             else
646                 data->flags &= ~SF_FIX_BEFORE_EOL;
647             data->minlen_fixed=minlenp; 
648             data->lookbehind_fixed=0;
649         }
650         else { /* *data->longest == data->longest_float */
651             data->offset_float_min = l ? data->last_start_min : data->pos_min;
652             data->offset_float_max = (l
653                                       ? data->last_start_max
654                                       : data->pos_min + data->pos_delta);
655             if (is_inf || (U32)data->offset_float_max > (U32)I32_MAX)
656                 data->offset_float_max = I32_MAX;
657             if (data->flags & SF_BEFORE_EOL)
658                 data->flags
659                     |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
660             else
661                 data->flags &= ~SF_FL_BEFORE_EOL;
662             data->minlen_float=minlenp;
663             data->lookbehind_float=0;
664         }
665     }
666     SvCUR_set(data->last_found, 0);
667     {
668         SV * const sv = data->last_found;
669         if (SvUTF8(sv) && SvMAGICAL(sv)) {
670             MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8);
671             if (mg)
672                 mg->mg_len = 0;
673         }
674     }
675     data->last_end = -1;
676     data->flags &= ~SF_BEFORE_EOL;
677     DEBUG_STUDYDATA("commit: ",data,0);
678 }
679
680 /* Can match anything (initialization) */
681 STATIC void
682 S_cl_anything(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
683 {
684     PERL_ARGS_ASSERT_CL_ANYTHING;
685
686     ANYOF_CLASS_ZERO(cl);
687     ANYOF_BITMAP_SETALL(cl);
688     cl->flags = ANYOF_EOS|ANYOF_UNICODE_ALL;
689     if (LOC)
690         cl->flags |= ANYOF_LOCALE;
691 }
692
693 /* Can match anything (initialization) */
694 STATIC int
695 S_cl_is_anything(const struct regnode_charclass_class *cl)
696 {
697     int value;
698
699     PERL_ARGS_ASSERT_CL_IS_ANYTHING;
700
701     for (value = 0; value <= ANYOF_MAX; value += 2)
702         if (ANYOF_CLASS_TEST(cl, value) && ANYOF_CLASS_TEST(cl, value + 1))
703             return 1;
704     if (!(cl->flags & ANYOF_UNICODE_ALL))
705         return 0;
706     if (!ANYOF_BITMAP_TESTALLSET((const void*)cl))
707         return 0;
708     return 1;
709 }
710
711 /* Can match anything (initialization) */
712 STATIC void
713 S_cl_init(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
714 {
715     PERL_ARGS_ASSERT_CL_INIT;
716
717     Zero(cl, 1, struct regnode_charclass_class);
718     cl->type = ANYOF;
719     cl_anything(pRExC_state, cl);
720 }
721
722 STATIC void
723 S_cl_init_zero(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
724 {
725     PERL_ARGS_ASSERT_CL_INIT_ZERO;
726
727     Zero(cl, 1, struct regnode_charclass_class);
728     cl->type = ANYOF;
729     cl_anything(pRExC_state, cl);
730     if (LOC)
731         cl->flags |= ANYOF_LOCALE;
732 }
733
734 /* 'And' a given class with another one.  Can create false positives */
735 /* We assume that cl is not inverted */
736 STATIC void
737 S_cl_and(struct regnode_charclass_class *cl,
738         const struct regnode_charclass_class *and_with)
739 {
740     PERL_ARGS_ASSERT_CL_AND;
741
742     assert(and_with->type == ANYOF);
743     if (!(and_with->flags & ANYOF_CLASS)
744         && !(cl->flags & ANYOF_CLASS)
745         && (and_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
746         && !(and_with->flags & ANYOF_FOLD)
747         && !(cl->flags & ANYOF_FOLD)) {
748         int i;
749
750         if (and_with->flags & ANYOF_INVERT)
751             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
752                 cl->bitmap[i] &= ~and_with->bitmap[i];
753         else
754             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
755                 cl->bitmap[i] &= and_with->bitmap[i];
756     } /* XXXX: logic is complicated otherwise, leave it along for a moment. */
757     if (!(and_with->flags & ANYOF_EOS))
758         cl->flags &= ~ANYOF_EOS;
759
760     if (cl->flags & ANYOF_UNICODE_ALL && and_with->flags & ANYOF_UNICODE &&
761         !(and_with->flags & ANYOF_INVERT)) {
762         cl->flags &= ~ANYOF_UNICODE_ALL;
763         cl->flags |= ANYOF_UNICODE;
764         ARG_SET(cl, ARG(and_with));
765     }
766     if (!(and_with->flags & ANYOF_UNICODE_ALL) &&
767         !(and_with->flags & ANYOF_INVERT))
768         cl->flags &= ~ANYOF_UNICODE_ALL;
769     if (!(and_with->flags & (ANYOF_UNICODE|ANYOF_UNICODE_ALL)) &&
770         !(and_with->flags & ANYOF_INVERT))
771         cl->flags &= ~ANYOF_UNICODE;
772 }
773
774 /* 'OR' a given class with another one.  Can create false positives */
775 /* We assume that cl is not inverted */
776 STATIC void
777 S_cl_or(const RExC_state_t *pRExC_state, struct regnode_charclass_class *cl, const struct regnode_charclass_class *or_with)
778 {
779     PERL_ARGS_ASSERT_CL_OR;
780
781     if (or_with->flags & ANYOF_INVERT) {
782         /* We do not use
783          * (B1 | CL1) | (!B2 & !CL2) = (B1 | !B2 & !CL2) | (CL1 | (!B2 & !CL2))
784          *   <= (B1 | !B2) | (CL1 | !CL2)
785          * which is wasteful if CL2 is small, but we ignore CL2:
786          *   (B1 | CL1) | (!B2 & !CL2) <= (B1 | CL1) | !B2 = (B1 | !B2) | CL1
787          * XXXX Can we handle case-fold?  Unclear:
788          *   (OK1(i) | OK1(i')) | !(OK1(i) | OK1(i')) =
789          *   (OK1(i) | OK1(i')) | (!OK1(i) & !OK1(i'))
790          */
791         if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
792              && !(or_with->flags & ANYOF_FOLD)
793              && !(cl->flags & ANYOF_FOLD) ) {
794             int i;
795
796             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
797                 cl->bitmap[i] |= ~or_with->bitmap[i];
798         } /* XXXX: logic is complicated otherwise */
799         else {
800             cl_anything(pRExC_state, cl);
801         }
802     } else {
803         /* (B1 | CL1) | (B2 | CL2) = (B1 | B2) | (CL1 | CL2)) */
804         if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
805              && (!(or_with->flags & ANYOF_FOLD)
806                  || (cl->flags & ANYOF_FOLD)) ) {
807             int i;
808
809             /* OR char bitmap and class bitmap separately */
810             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
811                 cl->bitmap[i] |= or_with->bitmap[i];
812             if (or_with->flags & ANYOF_CLASS) {
813                 for (i = 0; i < ANYOF_CLASSBITMAP_SIZE; i++)
814                     cl->classflags[i] |= or_with->classflags[i];
815                 cl->flags |= ANYOF_CLASS;
816             }
817         }
818         else { /* XXXX: logic is complicated, leave it along for a moment. */
819             cl_anything(pRExC_state, cl);
820         }
821     }
822     if (or_with->flags & ANYOF_EOS)
823         cl->flags |= ANYOF_EOS;
824
825     if (cl->flags & ANYOF_UNICODE && or_with->flags & ANYOF_UNICODE &&
826         ARG(cl) != ARG(or_with)) {
827         cl->flags |= ANYOF_UNICODE_ALL;
828         cl->flags &= ~ANYOF_UNICODE;
829     }
830     if (or_with->flags & ANYOF_UNICODE_ALL) {
831         cl->flags |= ANYOF_UNICODE_ALL;
832         cl->flags &= ~ANYOF_UNICODE;
833     }
834 }
835
836 #define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ]
837 #define TRIE_LIST_CUR(state)  ( TRIE_LIST_ITEM( state, 0 ).forid )
838 #define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate )
839 #define TRIE_LIST_USED(idx)  ( trie->states[state].trans.list ? (TRIE_LIST_CUR( idx ) - 1) : 0 )
840
841
842 #ifdef DEBUGGING
843 /*
844    dump_trie(trie,widecharmap,revcharmap)
845    dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc)
846    dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc)
847
848    These routines dump out a trie in a somewhat readable format.
849    The _interim_ variants are used for debugging the interim
850    tables that are used to generate the final compressed
851    representation which is what dump_trie expects.
852
853    Part of the reason for their existance is to provide a form
854    of documentation as to how the different representations function.
855
856 */
857
858 /*
859   Dumps the final compressed table form of the trie to Perl_debug_log.
860   Used for debugging make_trie().
861 */
862  
863 STATIC void
864 S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap,
865             AV *revcharmap, U32 depth)
866 {
867     U32 state;
868     SV *sv=sv_newmortal();
869     int colwidth= widecharmap ? 6 : 4;
870     GET_RE_DEBUG_FLAGS_DECL;
871
872     PERL_ARGS_ASSERT_DUMP_TRIE;
873
874     PerlIO_printf( Perl_debug_log, "%*sChar : %-6s%-6s%-4s ",
875         (int)depth * 2 + 2,"",
876         "Match","Base","Ofs" );
877
878     for( state = 0 ; state < trie->uniquecharcount ; state++ ) {
879         SV ** const tmp = av_fetch( revcharmap, state, 0);
880         if ( tmp ) {
881             PerlIO_printf( Perl_debug_log, "%*s", 
882                 colwidth,
883                 pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, 
884                             PL_colors[0], PL_colors[1],
885                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
886                             PERL_PV_ESCAPE_FIRSTCHAR 
887                 ) 
888             );
889         }
890     }
891     PerlIO_printf( Perl_debug_log, "\n%*sState|-----------------------",
892         (int)depth * 2 + 2,"");
893
894     for( state = 0 ; state < trie->uniquecharcount ; state++ )
895         PerlIO_printf( Perl_debug_log, "%.*s", colwidth, "--------");
896     PerlIO_printf( Perl_debug_log, "\n");
897
898     for( state = 1 ; state < trie->statecount ; state++ ) {
899         const U32 base = trie->states[ state ].trans.base;
900
901         PerlIO_printf( Perl_debug_log, "%*s#%4"UVXf"|", (int)depth * 2 + 2,"", (UV)state);
902
903         if ( trie->states[ state ].wordnum ) {
904             PerlIO_printf( Perl_debug_log, " W%4X", trie->states[ state ].wordnum );
905         } else {
906             PerlIO_printf( Perl_debug_log, "%6s", "" );
907         }
908
909         PerlIO_printf( Perl_debug_log, " @%4"UVXf" ", (UV)base );
910
911         if ( base ) {
912             U32 ofs = 0;
913
914             while( ( base + ofs  < trie->uniquecharcount ) ||
915                    ( base + ofs - trie->uniquecharcount < trie->lasttrans
916                      && trie->trans[ base + ofs - trie->uniquecharcount ].check != state))
917                     ofs++;
918
919             PerlIO_printf( Perl_debug_log, "+%2"UVXf"[ ", (UV)ofs);
920
921             for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
922                 if ( ( base + ofs >= trie->uniquecharcount ) &&
923                      ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
924                      trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
925                 {
926                    PerlIO_printf( Perl_debug_log, "%*"UVXf,
927                     colwidth,
928                     (UV)trie->trans[ base + ofs - trie->uniquecharcount ].next );
929                 } else {
930                     PerlIO_printf( Perl_debug_log, "%*s",colwidth,"   ." );
931                 }
932             }
933
934             PerlIO_printf( Perl_debug_log, "]");
935
936         }
937         PerlIO_printf( Perl_debug_log, "\n" );
938     }
939 }    
940 /*
941   Dumps a fully constructed but uncompressed trie in list form.
942   List tries normally only are used for construction when the number of 
943   possible chars (trie->uniquecharcount) is very high.
944   Used for debugging make_trie().
945 */
946 STATIC void
947 S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie,
948                          HV *widecharmap, AV *revcharmap, U32 next_alloc,
949                          U32 depth)
950 {
951     U32 state;
952     SV *sv=sv_newmortal();
953     int colwidth= widecharmap ? 6 : 4;
954     GET_RE_DEBUG_FLAGS_DECL;
955
956     PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST;
957
958     /* print out the table precompression.  */
959     PerlIO_printf( Perl_debug_log, "%*sState :Word | Transition Data\n%*s%s",
960         (int)depth * 2 + 2,"", (int)depth * 2 + 2,"",
961         "------:-----+-----------------\n" );
962     
963     for( state=1 ; state < next_alloc ; state ++ ) {
964         U16 charid;
965     
966         PerlIO_printf( Perl_debug_log, "%*s %4"UVXf" :",
967             (int)depth * 2 + 2,"", (UV)state  );
968         if ( ! trie->states[ state ].wordnum ) {
969             PerlIO_printf( Perl_debug_log, "%5s| ","");
970         } else {
971             PerlIO_printf( Perl_debug_log, "W%4x| ",
972                 trie->states[ state ].wordnum
973             );
974         }
975         for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) {
976             SV ** const tmp = av_fetch( revcharmap, TRIE_LIST_ITEM(state,charid).forid, 0);
977             if ( tmp ) {
978                 PerlIO_printf( Perl_debug_log, "%*s:%3X=%4"UVXf" | ",
979                     colwidth,
980                     pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, 
981                             PL_colors[0], PL_colors[1],
982                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
983                             PERL_PV_ESCAPE_FIRSTCHAR 
984                     ) ,
985                     TRIE_LIST_ITEM(state,charid).forid,
986                     (UV)TRIE_LIST_ITEM(state,charid).newstate
987                 );
988                 if (!(charid % 10)) 
989                     PerlIO_printf(Perl_debug_log, "\n%*s| ",
990                         (int)((depth * 2) + 14), "");
991             }
992         }
993         PerlIO_printf( Perl_debug_log, "\n");
994     }
995 }    
996
997 /*
998   Dumps a fully constructed but uncompressed trie in table form.
999   This is the normal DFA style state transition table, with a few 
1000   twists to facilitate compression later. 
1001   Used for debugging make_trie().
1002 */
1003 STATIC void
1004 S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie,
1005                           HV *widecharmap, AV *revcharmap, U32 next_alloc,
1006                           U32 depth)
1007 {
1008     U32 state;
1009     U16 charid;
1010     SV *sv=sv_newmortal();
1011     int colwidth= widecharmap ? 6 : 4;
1012     GET_RE_DEBUG_FLAGS_DECL;
1013
1014     PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE;
1015     
1016     /*
1017        print out the table precompression so that we can do a visual check
1018        that they are identical.
1019      */
1020     
1021     PerlIO_printf( Perl_debug_log, "%*sChar : ",(int)depth * 2 + 2,"" );
1022
1023     for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1024         SV ** const tmp = av_fetch( revcharmap, charid, 0);
1025         if ( tmp ) {
1026             PerlIO_printf( Perl_debug_log, "%*s", 
1027                 colwidth,
1028                 pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, 
1029                             PL_colors[0], PL_colors[1],
1030                             (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
1031                             PERL_PV_ESCAPE_FIRSTCHAR 
1032                 ) 
1033             );
1034         }
1035     }
1036
1037     PerlIO_printf( Perl_debug_log, "\n%*sState+-",(int)depth * 2 + 2,"" );
1038
1039     for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) {
1040         PerlIO_printf( Perl_debug_log, "%.*s", colwidth,"--------");
1041     }
1042
1043     PerlIO_printf( Perl_debug_log, "\n" );
1044
1045     for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) {
1046
1047         PerlIO_printf( Perl_debug_log, "%*s%4"UVXf" : ", 
1048             (int)depth * 2 + 2,"",
1049             (UV)TRIE_NODENUM( state ) );
1050
1051         for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) {
1052             UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next );
1053             if (v)
1054                 PerlIO_printf( Perl_debug_log, "%*"UVXf, colwidth, v );
1055             else
1056                 PerlIO_printf( Perl_debug_log, "%*s", colwidth, "." );
1057         }
1058         if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) {
1059             PerlIO_printf( Perl_debug_log, " (%4"UVXf")\n", (UV)trie->trans[ state ].check );
1060         } else {
1061             PerlIO_printf( Perl_debug_log, " (%4"UVXf") W%4X\n", (UV)trie->trans[ state ].check,
1062             trie->states[ TRIE_NODENUM( state ) ].wordnum );
1063         }
1064     }
1065 }
1066
1067 #endif
1068
1069 /* make_trie(startbranch,first,last,tail,word_count,flags,depth)
1070   startbranch: the first branch in the whole branch sequence
1071   first      : start branch of sequence of branch-exact nodes.
1072                May be the same as startbranch
1073   last       : Thing following the last branch.
1074                May be the same as tail.
1075   tail       : item following the branch sequence
1076   count      : words in the sequence
1077   flags      : currently the OP() type we will be building one of /EXACT(|F|Fl)/
1078   depth      : indent depth
1079
1080 Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node.
1081
1082 A trie is an N'ary tree where the branches are determined by digital
1083 decomposition of the key. IE, at the root node you look up the 1st character and
1084 follow that branch repeat until you find the end of the branches. Nodes can be
1085 marked as "accepting" meaning they represent a complete word. Eg:
1086
1087   /he|she|his|hers/
1088
1089 would convert into the following structure. Numbers represent states, letters
1090 following numbers represent valid transitions on the letter from that state, if
1091 the number is in square brackets it represents an accepting state, otherwise it
1092 will be in parenthesis.
1093
1094       +-h->+-e->[3]-+-r->(8)-+-s->[9]
1095       |    |
1096       |   (2)
1097       |    |
1098      (1)   +-i->(6)-+-s->[7]
1099       |
1100       +-s->(3)-+-h->(4)-+-e->[5]
1101
1102       Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers)
1103
1104 This shows that when matching against the string 'hers' we will begin at state 1
1105 read 'h' and move to state 2, read 'e' and move to state 3 which is accepting,
1106 then read 'r' and go to state 8 followed by 's' which takes us to state 9 which
1107 is also accepting. Thus we know that we can match both 'he' and 'hers' with a
1108 single traverse. We store a mapping from accepting to state to which word was
1109 matched, and then when we have multiple possibilities we try to complete the
1110 rest of the regex in the order in which they occured in the alternation.
1111
1112 The only prior NFA like behaviour that would be changed by the TRIE support is
1113 the silent ignoring of duplicate alternations which are of the form:
1114
1115  / (DUPE|DUPE) X? (?{ ... }) Y /x
1116
1117 Thus EVAL blocks follwing a trie may be called a different number of times with
1118 and without the optimisation. With the optimisations dupes will be silently
1119 ignored. This inconsistant behaviour of EVAL type nodes is well established as
1120 the following demonstrates:
1121
1122  'words'=~/(word|word|word)(?{ print $1 })[xyz]/
1123
1124 which prints out 'word' three times, but
1125
1126  'words'=~/(word|word|word)(?{ print $1 })S/
1127
1128 which doesnt print it out at all. This is due to other optimisations kicking in.
1129
1130 Example of what happens on a structural level:
1131
1132 The regexp /(ac|ad|ab)+/ will produce the folowing debug output:
1133
1134    1: CURLYM[1] {1,32767}(18)
1135    5:   BRANCH(8)
1136    6:     EXACT <ac>(16)
1137    8:   BRANCH(11)
1138    9:     EXACT <ad>(16)
1139   11:   BRANCH(14)
1140   12:     EXACT <ab>(16)
1141   16:   SUCCEED(0)
1142   17:   NOTHING(18)
1143   18: END(0)
1144
1145 This would be optimizable with startbranch=5, first=5, last=16, tail=16
1146 and should turn into:
1147
1148    1: CURLYM[1] {1,32767}(18)
1149    5:   TRIE(16)
1150         [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1]
1151           <ac>
1152           <ad>
1153           <ab>
1154   16:   SUCCEED(0)
1155   17:   NOTHING(18)
1156   18: END(0)
1157
1158 Cases where tail != last would be like /(?foo|bar)baz/:
1159
1160    1: BRANCH(4)
1161    2:   EXACT <foo>(8)
1162    4: BRANCH(7)
1163    5:   EXACT <bar>(8)
1164    7: TAIL(8)
1165    8: EXACT <baz>(10)
1166   10: END(0)
1167
1168 which would be optimizable with startbranch=1, first=1, last=7, tail=8
1169 and would end up looking like:
1170
1171     1: TRIE(8)
1172       [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1]
1173         <foo>
1174         <bar>
1175    7: TAIL(8)
1176    8: EXACT <baz>(10)
1177   10: END(0)
1178
1179     d = uvuni_to_utf8_flags(d, uv, 0);
1180
1181 is the recommended Unicode-aware way of saying
1182
1183     *(d++) = uv;
1184 */
1185
1186 #define TRIE_STORE_REVCHAR                                                 \
1187     STMT_START {                                                           \
1188         if (UTF) {                                                         \
1189             SV *zlopp = newSV(2);                                          \
1190             unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp);      \
1191             unsigned const char *const kapow = uvuni_to_utf8(flrbbbbb, uvc & 0xFF); \
1192             SvCUR_set(zlopp, kapow - flrbbbbb);                            \
1193             SvPOK_on(zlopp);                                               \
1194             SvUTF8_on(zlopp);                                              \
1195             av_push(revcharmap, zlopp);                                    \
1196         } else {                                                           \
1197             char ooooff = (char)uvc;                                               \
1198             av_push(revcharmap, newSVpvn(&ooooff, 1));                     \
1199         }                                                                  \
1200         } STMT_END
1201
1202 #define TRIE_READ_CHAR STMT_START {                                           \
1203     wordlen++;                                                                \
1204     if ( UTF ) {                                                              \
1205         if ( folder ) {                                                       \
1206             if ( foldlen > 0 ) {                                              \
1207                uvc = utf8n_to_uvuni( scan, UTF8_MAXLEN, &len, uniflags );     \
1208                foldlen -= len;                                                \
1209                scan += len;                                                   \
1210                len = 0;                                                       \
1211             } else {                                                          \
1212                 uvc = utf8n_to_uvuni( (const U8*)uc, UTF8_MAXLEN, &len, uniflags);\
1213                 uvc = to_uni_fold( uvc, foldbuf, &foldlen );                  \
1214                 foldlen -= UNISKIP( uvc );                                    \
1215                 scan = foldbuf + UNISKIP( uvc );                              \
1216             }                                                                 \
1217         } else {                                                              \
1218             uvc = utf8n_to_uvuni( (const U8*)uc, UTF8_MAXLEN, &len, uniflags);\
1219         }                                                                     \
1220     } else {                                                                  \
1221         uvc = (U32)*uc;                                                       \
1222         len = 1;                                                              \
1223     }                                                                         \
1224 } STMT_END
1225
1226
1227
1228 #define TRIE_LIST_PUSH(state,fid,ns) STMT_START {               \
1229     if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) {    \
1230         U32 ging = TRIE_LIST_LEN( state ) *= 2;                 \
1231         Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \
1232     }                                                           \
1233     TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid;     \
1234     TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns;   \
1235     TRIE_LIST_CUR( state )++;                                   \
1236 } STMT_END
1237
1238 #define TRIE_LIST_NEW(state) STMT_START {                       \
1239     Newxz( trie->states[ state ].trans.list,               \
1240         4, reg_trie_trans_le );                                 \
1241      TRIE_LIST_CUR( state ) = 1;                                \
1242      TRIE_LIST_LEN( state ) = 4;                                \
1243 } STMT_END
1244
1245 #define TRIE_HANDLE_WORD(state) STMT_START {                    \
1246     U16 dupe= trie->states[ state ].wordnum;                    \
1247     regnode * const noper_next = regnext( noper );              \
1248                                                                 \
1249     if (trie->wordlen)                                          \
1250         trie->wordlen[ curword ] = wordlen;                     \
1251     DEBUG_r({                                                   \
1252         /* store the word for dumping */                        \
1253         SV* tmp;                                                \
1254         if (OP(noper) != NOTHING)                               \
1255             tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF);    \
1256         else                                                    \
1257             tmp = newSVpvn_utf8( "", 0, UTF );                  \
1258         av_push( trie_words, tmp );                             \
1259     });                                                         \
1260                                                                 \
1261     curword++;                                                  \
1262                                                                 \
1263     if ( noper_next < tail ) {                                  \
1264         if (!trie->jump)                                        \
1265             trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, sizeof(U16) ); \
1266         trie->jump[curword] = (U16)(noper_next - convert);      \
1267         if (!jumper)                                            \
1268             jumper = noper_next;                                \
1269         if (!nextbranch)                                        \
1270             nextbranch= regnext(cur);                           \
1271     }                                                           \
1272                                                                 \
1273     if ( dupe ) {                                               \
1274         /* So it's a dupe. This means we need to maintain a   */\
1275         /* linked-list from the first to the next.            */\
1276         /* we only allocate the nextword buffer when there    */\
1277         /* a dupe, so first time we have to do the allocation */\
1278         if (!trie->nextword)                                    \
1279             trie->nextword = (U16 *)                                    \
1280                 PerlMemShared_calloc( word_count + 1, sizeof(U16));     \
1281         while ( trie->nextword[dupe] )                          \
1282             dupe= trie->nextword[dupe];                         \
1283         trie->nextword[dupe]= curword;                          \
1284     } else {                                                    \
1285         /* we haven't inserted this word yet.                */ \
1286         trie->states[ state ].wordnum = curword;                \
1287     }                                                           \
1288 } STMT_END
1289
1290
1291 #define TRIE_TRANS_STATE(state,base,ucharcount,charid,special)          \
1292      ( ( base + charid >=  ucharcount                                   \
1293          && base + charid < ubound                                      \
1294          && state == trie->trans[ base - ucharcount + charid ].check    \
1295          && trie->trans[ base - ucharcount + charid ].next )            \
1296            ? trie->trans[ base - ucharcount + charid ].next             \
1297            : ( state==1 ? special : 0 )                                 \
1298       )
1299
1300 #define MADE_TRIE       1
1301 #define MADE_JUMP_TRIE  2
1302 #define MADE_EXACT_TRIE 4
1303
1304 STATIC I32
1305 S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth)
1306 {
1307     dVAR;
1308     /* first pass, loop through and scan words */
1309     reg_trie_data *trie;
1310     HV *widecharmap = NULL;
1311     AV *revcharmap = newAV();
1312     regnode *cur;
1313     const U32 uniflags = UTF8_ALLOW_DEFAULT;
1314     STRLEN len = 0;
1315     UV uvc = 0;
1316     U16 curword = 0;
1317     U32 next_alloc = 0;
1318     regnode *jumper = NULL;
1319     regnode *nextbranch = NULL;
1320     regnode *convert = NULL;
1321     /* we just use folder as a flag in utf8 */
1322     const U8 * const folder = ( flags == EXACTF
1323                        ? PL_fold
1324                        : ( flags == EXACTFL
1325                            ? PL_fold_locale
1326                            : NULL
1327                          )
1328                      );
1329
1330 #ifdef DEBUGGING
1331     const U32 data_slot = add_data( pRExC_state, 4, "tuuu" );
1332     AV *trie_words = NULL;
1333     /* along with revcharmap, this only used during construction but both are
1334      * useful during debugging so we store them in the struct when debugging.
1335      */
1336 #else
1337     const U32 data_slot = add_data( pRExC_state, 2, "tu" );
1338     STRLEN trie_charcount=0;
1339 #endif
1340     SV *re_trie_maxbuff;
1341     GET_RE_DEBUG_FLAGS_DECL;
1342
1343     PERL_ARGS_ASSERT_MAKE_TRIE;
1344 #ifndef DEBUGGING
1345     PERL_UNUSED_ARG(depth);
1346 #endif
1347
1348     trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) );
1349     trie->refcount = 1;
1350     trie->startstate = 1;
1351     trie->wordcount = word_count;
1352     RExC_rxi->data->data[ data_slot ] = (void*)trie;
1353     trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) );
1354     if (!(UTF && folder))
1355         trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 );
1356     DEBUG_r({
1357         trie_words = newAV();
1358     });
1359
1360     re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
1361     if (!SvIOK(re_trie_maxbuff)) {
1362         sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
1363     }
1364     DEBUG_OPTIMISE_r({
1365                 PerlIO_printf( Perl_debug_log,
1366                   "%*smake_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n",
1367                   (int)depth * 2 + 2, "", 
1368                   REG_NODE_NUM(startbranch),REG_NODE_NUM(first), 
1369                   REG_NODE_NUM(last), REG_NODE_NUM(tail),
1370                   (int)depth);
1371     });
1372    
1373    /* Find the node we are going to overwrite */
1374     if ( first == startbranch && OP( last ) != BRANCH ) {
1375         /* whole branch chain */
1376         convert = first;
1377     } else {
1378         /* branch sub-chain */
1379         convert = NEXTOPER( first );
1380     }
1381         
1382     /*  -- First loop and Setup --
1383
1384        We first traverse the branches and scan each word to determine if it
1385        contains widechars, and how many unique chars there are, this is
1386        important as we have to build a table with at least as many columns as we
1387        have unique chars.
1388
1389        We use an array of integers to represent the character codes 0..255
1390        (trie->charmap) and we use a an HV* to store Unicode characters. We use the
1391        native representation of the character value as the key and IV's for the
1392        coded index.
1393
1394        *TODO* If we keep track of how many times each character is used we can
1395        remap the columns so that the table compression later on is more
1396        efficient in terms of memory by ensuring most common value is in the
1397        middle and the least common are on the outside.  IMO this would be better
1398        than a most to least common mapping as theres a decent chance the most
1399        common letter will share a node with the least common, meaning the node
1400        will not be compressable. With a middle is most common approach the worst
1401        case is when we have the least common nodes twice.
1402
1403      */
1404
1405     for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
1406         regnode * const noper = NEXTOPER( cur );
1407         const U8 *uc = (U8*)STRING( noper );
1408         const U8 * const e  = uc + STR_LEN( noper );
1409         STRLEN foldlen = 0;
1410         U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1411         const U8 *scan = (U8*)NULL;
1412         U32 wordlen      = 0;         /* required init */
1413         STRLEN chars = 0;
1414         bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the bitmap?*/
1415
1416         if (OP(noper) == NOTHING) {
1417             trie->minlen= 0;
1418             continue;
1419         }
1420         if ( set_bit ) /* bitmap only alloced when !(UTF&&Folding) */
1421             TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte
1422                                           regardless of encoding */
1423
1424         for ( ; uc < e ; uc += len ) {
1425             TRIE_CHARCOUNT(trie)++;
1426             TRIE_READ_CHAR;
1427             chars++;
1428             if ( uvc < 256 ) {
1429                 if ( !trie->charmap[ uvc ] ) {
1430                     trie->charmap[ uvc ]=( ++trie->uniquecharcount );
1431                     if ( folder )
1432                         trie->charmap[ folder[ uvc ] ] = trie->charmap[ uvc ];
1433                     TRIE_STORE_REVCHAR;
1434                 }
1435                 if ( set_bit ) {
1436                     /* store the codepoint in the bitmap, and if its ascii
1437                        also store its folded equivelent. */
1438                     TRIE_BITMAP_SET(trie,uvc);
1439
1440                     /* store the folded codepoint */
1441                     if ( folder ) TRIE_BITMAP_SET(trie,folder[ uvc ]);
1442
1443                     if ( !UTF ) {
1444                         /* store first byte of utf8 representation of
1445                            codepoints in the 127 < uvc < 256 range */
1446                         if (127 < uvc && uvc < 192) {
1447                             TRIE_BITMAP_SET(trie,194);
1448                         } else if (191 < uvc ) {
1449                             TRIE_BITMAP_SET(trie,195);
1450                         /* && uvc < 256 -- we know uvc is < 256 already */
1451                         }
1452                     }
1453                     set_bit = 0; /* We've done our bit :-) */
1454                 }
1455             } else {
1456                 SV** svpp;
1457                 if ( !widecharmap )
1458                     widecharmap = newHV();
1459
1460                 svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 );
1461
1462                 if ( !svpp )
1463                     Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%"UVXf, uvc );
1464
1465                 if ( !SvTRUE( *svpp ) ) {
1466                     sv_setiv( *svpp, ++trie->uniquecharcount );
1467                     TRIE_STORE_REVCHAR;
1468                 }
1469             }
1470         }
1471         if( cur == first ) {
1472             trie->minlen=chars;
1473             trie->maxlen=chars;
1474         } else if (chars < trie->minlen) {
1475             trie->minlen=chars;
1476         } else if (chars > trie->maxlen) {
1477             trie->maxlen=chars;
1478         }
1479
1480     } /* end first pass */
1481     DEBUG_TRIE_COMPILE_r(
1482         PerlIO_printf( Perl_debug_log, "%*sTRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n",
1483                 (int)depth * 2 + 2,"",
1484                 ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count,
1485                 (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount,
1486                 (int)trie->minlen, (int)trie->maxlen )
1487     );
1488     trie->wordlen = (U32 *) PerlMemShared_calloc( word_count, sizeof(U32) );
1489
1490     /*
1491         We now know what we are dealing with in terms of unique chars and
1492         string sizes so we can calculate how much memory a naive
1493         representation using a flat table  will take. If it's over a reasonable
1494         limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory
1495         conservative but potentially much slower representation using an array
1496         of lists.
1497
1498         At the end we convert both representations into the same compressed
1499         form that will be used in regexec.c for matching with. The latter
1500         is a form that cannot be used to construct with but has memory
1501         properties similar to the list form and access properties similar
1502         to the table form making it both suitable for fast searches and
1503         small enough that its feasable to store for the duration of a program.
1504
1505         See the comment in the code where the compressed table is produced
1506         inplace from the flat tabe representation for an explanation of how
1507         the compression works.
1508
1509     */
1510
1511
1512     if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1) > SvIV(re_trie_maxbuff) ) {
1513         /*
1514             Second Pass -- Array Of Lists Representation
1515
1516             Each state will be represented by a list of charid:state records
1517             (reg_trie_trans_le) the first such element holds the CUR and LEN
1518             points of the allocated array. (See defines above).
1519
1520             We build the initial structure using the lists, and then convert
1521             it into the compressed table form which allows faster lookups
1522             (but cant be modified once converted).
1523         */
1524
1525         STRLEN transcount = 1;
1526
1527         DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log, 
1528             "%*sCompiling trie using list compiler\n",
1529             (int)depth * 2 + 2, ""));
1530         
1531         trie->states = (reg_trie_state *)
1532             PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
1533                                   sizeof(reg_trie_state) );
1534         TRIE_LIST_NEW(1);
1535         next_alloc = 2;
1536
1537         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
1538
1539             regnode * const noper = NEXTOPER( cur );
1540             U8 *uc           = (U8*)STRING( noper );
1541             const U8 * const e = uc + STR_LEN( noper );
1542             U32 state        = 1;         /* required init */
1543             U16 charid       = 0;         /* sanity init */
1544             U8 *scan         = (U8*)NULL; /* sanity init */
1545             STRLEN foldlen   = 0;         /* required init */
1546             U32 wordlen      = 0;         /* required init */
1547             U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1548
1549             if (OP(noper) != NOTHING) {
1550                 for ( ; uc < e ; uc += len ) {
1551
1552                     TRIE_READ_CHAR;
1553
1554                     if ( uvc < 256 ) {
1555                         charid = trie->charmap[ uvc ];
1556                     } else {
1557                         SV** const svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 0);
1558                         if ( !svpp ) {
1559                             charid = 0;
1560                         } else {
1561                             charid=(U16)SvIV( *svpp );
1562                         }
1563                     }
1564                     /* charid is now 0 if we dont know the char read, or nonzero if we do */
1565                     if ( charid ) {
1566
1567                         U16 check;
1568                         U32 newstate = 0;
1569
1570                         charid--;
1571                         if ( !trie->states[ state ].trans.list ) {
1572                             TRIE_LIST_NEW( state );
1573                         }
1574                         for ( check = 1; check <= TRIE_LIST_USED( state ); check++ ) {
1575                             if ( TRIE_LIST_ITEM( state, check ).forid == charid ) {
1576                                 newstate = TRIE_LIST_ITEM( state, check ).newstate;
1577                                 break;
1578                             }
1579                         }
1580                         if ( ! newstate ) {
1581                             newstate = next_alloc++;
1582                             TRIE_LIST_PUSH( state, charid, newstate );
1583                             transcount++;
1584                         }
1585                         state = newstate;
1586                     } else {
1587                         Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
1588                     }
1589                 }
1590             }
1591             TRIE_HANDLE_WORD(state);
1592
1593         } /* end second pass */
1594
1595         /* next alloc is the NEXT state to be allocated */
1596         trie->statecount = next_alloc; 
1597         trie->states = (reg_trie_state *)
1598             PerlMemShared_realloc( trie->states,
1599                                    next_alloc
1600                                    * sizeof(reg_trie_state) );
1601
1602         /* and now dump it out before we compress it */
1603         DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap,
1604                                                          revcharmap, next_alloc,
1605                                                          depth+1)
1606         );
1607
1608         trie->trans = (reg_trie_trans *)
1609             PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) );
1610         {
1611             U32 state;
1612             U32 tp = 0;
1613             U32 zp = 0;
1614
1615
1616             for( state=1 ; state < next_alloc ; state ++ ) {
1617                 U32 base=0;
1618
1619                 /*
1620                 DEBUG_TRIE_COMPILE_MORE_r(
1621                     PerlIO_printf( Perl_debug_log, "tp: %d zp: %d ",tp,zp)
1622                 );
1623                 */
1624
1625                 if (trie->states[state].trans.list) {
1626                     U16 minid=TRIE_LIST_ITEM( state, 1).forid;
1627                     U16 maxid=minid;
1628                     U16 idx;
1629
1630                     for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
1631                         const U16 forid = TRIE_LIST_ITEM( state, idx).forid;
1632                         if ( forid < minid ) {
1633                             minid=forid;
1634                         } else if ( forid > maxid ) {
1635                             maxid=forid;
1636                         }
1637                     }
1638                     if ( transcount < tp + maxid - minid + 1) {
1639                         transcount *= 2;
1640                         trie->trans = (reg_trie_trans *)
1641                             PerlMemShared_realloc( trie->trans,
1642                                                      transcount
1643                                                      * sizeof(reg_trie_trans) );
1644                         Zero( trie->trans + (transcount / 2), transcount / 2 , reg_trie_trans );
1645                     }
1646                     base = trie->uniquecharcount + tp - minid;
1647                     if ( maxid == minid ) {
1648                         U32 set = 0;
1649                         for ( ; zp < tp ; zp++ ) {
1650                             if ( ! trie->trans[ zp ].next ) {
1651                                 base = trie->uniquecharcount + zp - minid;
1652                                 trie->trans[ zp ].next = TRIE_LIST_ITEM( state, 1).newstate;
1653                                 trie->trans[ zp ].check = state;
1654                                 set = 1;
1655                                 break;
1656                             }
1657                         }
1658                         if ( !set ) {
1659                             trie->trans[ tp ].next = TRIE_LIST_ITEM( state, 1).newstate;
1660                             trie->trans[ tp ].check = state;
1661                             tp++;
1662                             zp = tp;
1663                         }
1664                     } else {
1665                         for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) {
1666                             const U32 tid = base -  trie->uniquecharcount + TRIE_LIST_ITEM( state, idx ).forid;
1667                             trie->trans[ tid ].next = TRIE_LIST_ITEM( state, idx ).newstate;
1668                             trie->trans[ tid ].check = state;
1669                         }
1670                         tp += ( maxid - minid + 1 );
1671                     }
1672                     Safefree(trie->states[ state ].trans.list);
1673                 }
1674                 /*
1675                 DEBUG_TRIE_COMPILE_MORE_r(
1676                     PerlIO_printf( Perl_debug_log, " base: %d\n",base);
1677                 );
1678                 */
1679                 trie->states[ state ].trans.base=base;
1680             }
1681             trie->lasttrans = tp + 1;
1682         }
1683     } else {
1684         /*
1685            Second Pass -- Flat Table Representation.
1686
1687            we dont use the 0 slot of either trans[] or states[] so we add 1 to each.
1688            We know that we will need Charcount+1 trans at most to store the data
1689            (one row per char at worst case) So we preallocate both structures
1690            assuming worst case.
1691
1692            We then construct the trie using only the .next slots of the entry
1693            structs.
1694
1695            We use the .check field of the first entry of the node  temporarily to
1696            make compression both faster and easier by keeping track of how many non
1697            zero fields are in the node.
1698
1699            Since trans are numbered from 1 any 0 pointer in the table is a FAIL
1700            transition.
1701
1702            There are two terms at use here: state as a TRIE_NODEIDX() which is a
1703            number representing the first entry of the node, and state as a
1704            TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1) and
1705            TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3) if there
1706            are 2 entrys per node. eg:
1707
1708              A B       A B
1709           1. 2 4    1. 3 7
1710           2. 0 3    3. 0 5
1711           3. 0 0    5. 0 0
1712           4. 0 0    7. 0 0
1713
1714            The table is internally in the right hand, idx form. However as we also
1715            have to deal with the states array which is indexed by nodenum we have to
1716            use TRIE_NODENUM() to convert.
1717
1718         */
1719         DEBUG_TRIE_COMPILE_MORE_r( PerlIO_printf( Perl_debug_log, 
1720             "%*sCompiling trie using table compiler\n",
1721             (int)depth * 2 + 2, ""));
1722
1723         trie->trans = (reg_trie_trans *)
1724             PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 )
1725                                   * trie->uniquecharcount + 1,
1726                                   sizeof(reg_trie_trans) );
1727         trie->states = (reg_trie_state *)
1728             PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2,
1729                                   sizeof(reg_trie_state) );
1730         next_alloc = trie->uniquecharcount + 1;
1731
1732
1733         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
1734
1735             regnode * const noper   = NEXTOPER( cur );
1736             const U8 *uc     = (U8*)STRING( noper );
1737             const U8 * const e = uc + STR_LEN( noper );
1738
1739             U32 state        = 1;         /* required init */
1740
1741             U16 charid       = 0;         /* sanity init */
1742             U32 accept_state = 0;         /* sanity init */
1743             U8 *scan         = (U8*)NULL; /* sanity init */
1744
1745             STRLEN foldlen   = 0;         /* required init */
1746             U32 wordlen      = 0;         /* required init */
1747             U8 foldbuf[ UTF8_MAXBYTES_CASE + 1 ];
1748
1749             if ( OP(noper) != NOTHING ) {
1750                 for ( ; uc < e ; uc += len ) {
1751
1752                     TRIE_READ_CHAR;
1753
1754                     if ( uvc < 256 ) {
1755                         charid = trie->charmap[ uvc ];
1756                     } else {
1757                         SV* const * const svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 0);
1758                         charid = svpp ? (U16)SvIV(*svpp) : 0;
1759                     }
1760                     if ( charid ) {
1761                         charid--;
1762                         if ( !trie->trans[ state + charid ].next ) {
1763                             trie->trans[ state + charid ].next = next_alloc;
1764                             trie->trans[ state ].check++;
1765                             next_alloc += trie->uniquecharcount;
1766                         }
1767                         state = trie->trans[ state + charid ].next;
1768                     } else {
1769                         Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %"IVdf, uvc );
1770                     }
1771                     /* charid is now 0 if we dont know the char read, or nonzero if we do */
1772                 }
1773             }
1774             accept_state = TRIE_NODENUM( state );
1775             TRIE_HANDLE_WORD(accept_state);
1776
1777         } /* end second pass */
1778
1779         /* and now dump it out before we compress it */
1780         DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap,
1781                                                           revcharmap,
1782                                                           next_alloc, depth+1));
1783
1784         {
1785         /*
1786            * Inplace compress the table.*
1787
1788            For sparse data sets the table constructed by the trie algorithm will
1789            be mostly 0/FAIL transitions or to put it another way mostly empty.
1790            (Note that leaf nodes will not contain any transitions.)
1791
1792            This algorithm compresses the tables by eliminating most such
1793            transitions, at the cost of a modest bit of extra work during lookup:
1794
1795            - Each states[] entry contains a .base field which indicates the
1796            index in the state[] array wheres its transition data is stored.
1797
1798            - If .base is 0 there are no  valid transitions from that node.
1799
1800            - If .base is nonzero then charid is added to it to find an entry in
1801            the trans array.
1802
1803            -If trans[states[state].base+charid].check!=state then the
1804            transition is taken to be a 0/Fail transition. Thus if there are fail
1805            transitions at the front of the node then the .base offset will point
1806            somewhere inside the previous nodes data (or maybe even into a node
1807            even earlier), but the .check field determines if the transition is
1808            valid.
1809
1810            XXX - wrong maybe?
1811            The following process inplace converts the table to the compressed
1812            table: We first do not compress the root node 1,and mark its all its
1813            .check pointers as 1 and set its .base pointer as 1 as well. This
1814            allows to do a DFA construction from the compressed table later, and
1815            ensures that any .base pointers we calculate later are greater than
1816            0.
1817
1818            - We set 'pos' to indicate the first entry of the second node.
1819
1820            - We then iterate over the columns of the node, finding the first and
1821            last used entry at l and m. We then copy l..m into pos..(pos+m-l),
1822            and set the .check pointers accordingly, and advance pos
1823            appropriately and repreat for the next node. Note that when we copy
1824            the next pointers we have to convert them from the original
1825            NODEIDX form to NODENUM form as the former is not valid post
1826            compression.
1827
1828            - If a node has no transitions used we mark its base as 0 and do not
1829            advance the pos pointer.
1830
1831            - If a node only has one transition we use a second pointer into the
1832            structure to fill in allocated fail transitions from other states.
1833            This pointer is independent of the main pointer and scans forward
1834            looking for null transitions that are allocated to a state. When it
1835            finds one it writes the single transition into the "hole".  If the
1836            pointer doesnt find one the single transition is appended as normal.
1837
1838            - Once compressed we can Renew/realloc the structures to release the
1839            excess space.
1840
1841            See "Table-Compression Methods" in sec 3.9 of the Red Dragon,
1842            specifically Fig 3.47 and the associated pseudocode.
1843
1844            demq
1845         */
1846         const U32 laststate = TRIE_NODENUM( next_alloc );
1847         U32 state, charid;
1848         U32 pos = 0, zp=0;
1849         trie->statecount = laststate;
1850
1851         for ( state = 1 ; state < laststate ; state++ ) {
1852             U8 flag = 0;
1853             const U32 stateidx = TRIE_NODEIDX( state );
1854             const U32 o_used = trie->trans[ stateidx ].check;
1855             U32 used = trie->trans[ stateidx ].check;
1856             trie->trans[ stateidx ].check = 0;
1857
1858             for ( charid = 0 ; used && charid < trie->uniquecharcount ; charid++ ) {
1859                 if ( flag || trie->trans[ stateidx + charid ].next ) {
1860                     if ( trie->trans[ stateidx + charid ].next ) {
1861                         if (o_used == 1) {
1862                             for ( ; zp < pos ; zp++ ) {
1863                                 if ( ! trie->trans[ zp ].next ) {
1864                                     break;
1865                                 }
1866                             }
1867                             trie->states[ state ].trans.base = zp + trie->uniquecharcount - charid ;
1868                             trie->trans[ zp ].next = SAFE_TRIE_NODENUM( trie->trans[ stateidx + charid ].next );
1869                             trie->trans[ zp ].check = state;
1870                             if ( ++zp > pos ) pos = zp;
1871                             break;
1872                         }
1873                         used--;
1874                     }
1875                     if ( !flag ) {
1876                         flag = 1;
1877                         trie->states[ state ].trans.base = pos + trie->uniquecharcount - charid ;
1878                     }
1879                     trie->trans[ pos ].next = SAFE_TRIE_NODENUM( trie->trans[ stateidx + charid ].next );
1880                     trie->trans[ pos ].check = state;
1881                     pos++;
1882                 }
1883             }
1884         }
1885         trie->lasttrans = pos + 1;
1886         trie->states = (reg_trie_state *)
1887             PerlMemShared_realloc( trie->states, laststate
1888                                    * sizeof(reg_trie_state) );
1889         DEBUG_TRIE_COMPILE_MORE_r(
1890                 PerlIO_printf( Perl_debug_log,
1891                     "%*sAlloc: %d Orig: %"IVdf" elements, Final:%"IVdf". Savings of %%%5.2f\n",
1892                     (int)depth * 2 + 2,"",
1893                     (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1 ),
1894                     (IV)next_alloc,
1895                     (IV)pos,
1896                     ( ( next_alloc - pos ) * 100 ) / (double)next_alloc );
1897             );
1898
1899         } /* end table compress */
1900     }
1901     DEBUG_TRIE_COMPILE_MORE_r(
1902             PerlIO_printf(Perl_debug_log, "%*sStatecount:%"UVxf" Lasttrans:%"UVxf"\n",
1903                 (int)depth * 2 + 2, "",
1904                 (UV)trie->statecount,
1905                 (UV)trie->lasttrans)
1906     );
1907     /* resize the trans array to remove unused space */
1908     trie->trans = (reg_trie_trans *)
1909         PerlMemShared_realloc( trie->trans, trie->lasttrans
1910                                * sizeof(reg_trie_trans) );
1911
1912     /* and now dump out the compressed format */
1913     DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1));
1914
1915     {   /* Modify the program and insert the new TRIE node*/ 
1916         U8 nodetype =(U8)(flags & 0xFF);
1917         char *str=NULL;
1918         
1919 #ifdef DEBUGGING
1920         regnode *optimize = NULL;
1921 #ifdef RE_TRACK_PATTERN_OFFSETS
1922
1923         U32 mjd_offset = 0;
1924         U32 mjd_nodelen = 0;
1925 #endif /* RE_TRACK_PATTERN_OFFSETS */
1926 #endif /* DEBUGGING */
1927         /*
1928            This means we convert either the first branch or the first Exact,
1929            depending on whether the thing following (in 'last') is a branch
1930            or not and whther first is the startbranch (ie is it a sub part of
1931            the alternation or is it the whole thing.)
1932            Assuming its a sub part we conver the EXACT otherwise we convert
1933            the whole branch sequence, including the first.
1934          */
1935         /* Find the node we are going to overwrite */
1936         if ( first != startbranch || OP( last ) == BRANCH ) {
1937             /* branch sub-chain */
1938             NEXT_OFF( first ) = (U16)(last - first);
1939 #ifdef RE_TRACK_PATTERN_OFFSETS
1940             DEBUG_r({
1941                 mjd_offset= Node_Offset((convert));
1942                 mjd_nodelen= Node_Length((convert));
1943             });
1944 #endif
1945             /* whole branch chain */
1946         }
1947 #ifdef RE_TRACK_PATTERN_OFFSETS
1948         else {
1949             DEBUG_r({
1950                 const  regnode *nop = NEXTOPER( convert );
1951                 mjd_offset= Node_Offset((nop));
1952                 mjd_nodelen= Node_Length((nop));
1953             });
1954         }
1955         DEBUG_OPTIMISE_r(
1956             PerlIO_printf(Perl_debug_log, "%*sMJD offset:%"UVuf" MJD length:%"UVuf"\n",
1957                 (int)depth * 2 + 2, "",
1958                 (UV)mjd_offset, (UV)mjd_nodelen)
1959         );
1960 #endif
1961         /* But first we check to see if there is a common prefix we can 
1962            split out as an EXACT and put in front of the TRIE node.  */
1963         trie->startstate= 1;
1964         if ( trie->bitmap && !widecharmap && !trie->jump  ) {
1965             U32 state;
1966             for ( state = 1 ; state < trie->statecount-1 ; state++ ) {
1967                 U32 ofs = 0;
1968                 I32 idx = -1;
1969                 U32 count = 0;
1970                 const U32 base = trie->states[ state ].trans.base;
1971
1972                 if ( trie->states[state].wordnum )
1973                         count = 1;
1974
1975                 for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) {
1976                     if ( ( base + ofs >= trie->uniquecharcount ) &&
1977                          ( base + ofs - trie->uniquecharcount < trie->lasttrans ) &&
1978                          trie->trans[ base + ofs - trie->uniquecharcount ].check == state )
1979                     {
1980                         if ( ++count > 1 ) {
1981                             SV **tmp = av_fetch( revcharmap, ofs, 0);
1982                             const U8 *ch = (U8*)SvPV_nolen_const( *tmp );
1983                             if ( state == 1 ) break;
1984                             if ( count == 2 ) {
1985                                 Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char);
1986                                 DEBUG_OPTIMISE_r(
1987                                     PerlIO_printf(Perl_debug_log,
1988                                         "%*sNew Start State=%"UVuf" Class: [",
1989                                         (int)depth * 2 + 2, "",
1990                                         (UV)state));
1991                                 if (idx >= 0) {
1992                                     SV ** const tmp = av_fetch( revcharmap, idx, 0);
1993                                     const U8 * const ch = (U8*)SvPV_nolen_const( *tmp );
1994
1995                                     TRIE_BITMAP_SET(trie,*ch);
1996                                     if ( folder )
1997                                         TRIE_BITMAP_SET(trie, folder[ *ch ]);
1998                                     DEBUG_OPTIMISE_r(
1999                                         PerlIO_printf(Perl_debug_log, "%s", (char*)ch)
2000                                     );
2001                                 }
2002                             }
2003                             TRIE_BITMAP_SET(trie,*ch);
2004                             if ( folder )
2005                                 TRIE_BITMAP_SET(trie,folder[ *ch ]);
2006                             DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"%s", ch));
2007                         }
2008                         idx = ofs;
2009                     }
2010                 }
2011                 if ( count == 1 ) {
2012                     SV **tmp = av_fetch( revcharmap, idx, 0);
2013                     STRLEN len;
2014                     char *ch = SvPV( *tmp, len );
2015                     DEBUG_OPTIMISE_r({
2016                         SV *sv=sv_newmortal();
2017                         PerlIO_printf( Perl_debug_log,
2018                             "%*sPrefix State: %"UVuf" Idx:%"UVuf" Char='%s'\n",
2019                             (int)depth * 2 + 2, "",
2020                             (UV)state, (UV)idx, 
2021                             pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6, 
2022                                 PL_colors[0], PL_colors[1],
2023                                 (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) |
2024                                 PERL_PV_ESCAPE_FIRSTCHAR 
2025                             )
2026                         );
2027                     });
2028                     if ( state==1 ) {
2029                         OP( convert ) = nodetype;
2030                         str=STRING(convert);
2031                         STR_LEN(convert)=0;
2032                     }
2033                     STR_LEN(convert) += len;
2034                     while (len--)
2035                         *str++ = *ch++;
2036                 } else {
2037 #ifdef DEBUGGING            
2038                     if (state>1)
2039                         DEBUG_OPTIMISE_r(PerlIO_printf( Perl_debug_log,"]\n"));
2040 #endif
2041                     break;
2042                 }
2043             }
2044             if (str) {
2045                 regnode *n = convert+NODE_SZ_STR(convert);
2046                 NEXT_OFF(convert) = NODE_SZ_STR(convert);
2047                 trie->startstate = state;
2048                 trie->minlen -= (state - 1);
2049                 trie->maxlen -= (state - 1);
2050 #ifdef DEBUGGING
2051                /* At least the UNICOS C compiler choked on this
2052                 * being argument to DEBUG_r(), so let's just have
2053                 * it right here. */
2054                if (
2055 #ifdef PERL_EXT_RE_BUILD
2056                    1
2057 #else
2058                    DEBUG_r_TEST
2059 #endif
2060                    ) {
2061                    regnode *fix = convert;
2062                    U32 word = trie->wordcount;
2063                    mjd_nodelen++;
2064                    Set_Node_Offset_Length(convert, mjd_offset, state - 1);
2065                    while( ++fix < n ) {
2066                        Set_Node_Offset_Length(fix, 0, 0);
2067                    }
2068                    while (word--) {
2069                        SV ** const tmp = av_fetch( trie_words, word, 0 );
2070                        if (tmp) {
2071                            if ( STR_LEN(convert) <= SvCUR(*tmp) )
2072                                sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert));
2073                            else
2074                                sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp));
2075                        }
2076                    }
2077                }
2078 #endif
2079                 if (trie->maxlen) {
2080                     convert = n;
2081                 } else {
2082                     NEXT_OFF(convert) = (U16)(tail - convert);
2083                     DEBUG_r(optimize= n);
2084                 }
2085             }
2086         }
2087         if (!jumper) 
2088             jumper = last; 
2089         if ( trie->maxlen ) {
2090             NEXT_OFF( convert ) = (U16)(tail - convert);
2091             ARG_SET( convert, data_slot );
2092             /* Store the offset to the first unabsorbed branch in 
2093                jump[0], which is otherwise unused by the jump logic. 
2094                We use this when dumping a trie and during optimisation. */
2095             if (trie->jump) 
2096                 trie->jump[0] = (U16)(nextbranch - convert);
2097             
2098             /* XXXX */
2099             if ( !trie->states[trie->startstate].wordnum && trie->bitmap && 
2100                  ( (char *)jumper - (char *)convert) >= (int)sizeof(struct regnode_charclass) )
2101             {
2102                 OP( convert ) = TRIEC;
2103                 Copy(trie->bitmap, ((struct regnode_charclass *)convert)->bitmap, ANYOF_BITMAP_SIZE, char);
2104                 PerlMemShared_free(trie->bitmap);
2105                 trie->bitmap= NULL;
2106             } else 
2107                 OP( convert ) = TRIE;
2108
2109             /* store the type in the flags */
2110             convert->flags = nodetype;
2111             DEBUG_r({
2112             optimize = convert 
2113                       + NODE_STEP_REGNODE 
2114                       + regarglen[ OP( convert ) ];
2115             });
2116             /* XXX We really should free up the resource in trie now, 
2117                    as we won't use them - (which resources?) dmq */
2118         }
2119         /* needed for dumping*/
2120         DEBUG_r(if (optimize) {
2121             regnode *opt = convert;
2122
2123             while ( ++opt < optimize) {
2124                 Set_Node_Offset_Length(opt,0,0);
2125             }
2126             /* 
2127                 Try to clean up some of the debris left after the 
2128                 optimisation.
2129              */
2130             while( optimize < jumper ) {
2131                 mjd_nodelen += Node_Length((optimize));
2132                 OP( optimize ) = OPTIMIZED;
2133                 Set_Node_Offset_Length(optimize,0,0);
2134                 optimize++;
2135             }
2136             Set_Node_Offset_Length(convert,mjd_offset,mjd_nodelen);
2137         });
2138     } /* end node insert */
2139     RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap;
2140 #ifdef DEBUGGING
2141     RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words;
2142     RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap;
2143 #else
2144     SvREFCNT_dec(revcharmap);
2145 #endif
2146     return trie->jump 
2147            ? MADE_JUMP_TRIE 
2148            : trie->startstate>1 
2149              ? MADE_EXACT_TRIE 
2150              : MADE_TRIE;
2151 }
2152
2153 STATIC void
2154 S_make_trie_failtable(pTHX_ RExC_state_t *pRExC_state, regnode *source,  regnode *stclass, U32 depth)
2155 {
2156 /* The Trie is constructed and compressed now so we can build a fail array now if its needed
2157
2158    This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and 3.32 in the
2159    "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi, Ullman 1985/88
2160    ISBN 0-201-10088-6
2161
2162    We find the fail state for each state in the trie, this state is the longest proper
2163    suffix of the current states 'word' that is also a proper prefix of another word in our
2164    trie. State 1 represents the word '' and is the thus the default fail state. This allows
2165    the DFA not to have to restart after its tried and failed a word at a given point, it
2166    simply continues as though it had been matching the other word in the first place.
2167    Consider
2168       'abcdgu'=~/abcdefg|cdgu/
2169    When we get to 'd' we are still matching the first word, we would encounter 'g' which would
2170    fail, which would bring use to the state representing 'd' in the second word where we would
2171    try 'g' and succeed, prodceding to match 'cdgu'.
2172  */
2173  /* add a fail transition */
2174     const U32 trie_offset = ARG(source);
2175     reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset];
2176     U32 *q;
2177     const U32 ucharcount = trie->uniquecharcount;
2178     const U32 numstates = trie->statecount;
2179     const U32 ubound = trie->lasttrans + ucharcount;
2180     U32 q_read = 0;
2181     U32 q_write = 0;
2182     U32 charid;
2183     U32 base = trie->states[ 1 ].trans.base;
2184     U32 *fail;
2185     reg_ac_data *aho;
2186     const U32 data_slot = add_data( pRExC_state, 1, "T" );
2187     GET_RE_DEBUG_FLAGS_DECL;
2188
2189     PERL_ARGS_ASSERT_MAKE_TRIE_FAILTABLE;
2190 #ifndef DEBUGGING
2191     PERL_UNUSED_ARG(depth);
2192 #endif
2193
2194
2195     ARG_SET( stclass, data_slot );
2196     aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) );
2197     RExC_rxi->data->data[ data_slot ] = (void*)aho;
2198     aho->trie=trie_offset;
2199     aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) );
2200     Copy( trie->states, aho->states, numstates, reg_trie_state );
2201     Newxz( q, numstates, U32);
2202     aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) );
2203     aho->refcount = 1;
2204     fail = aho->fail;
2205     /* initialize fail[0..1] to be 1 so that we always have
2206        a valid final fail state */
2207     fail[ 0 ] = fail[ 1 ] = 1;
2208
2209     for ( charid = 0; charid < ucharcount ; charid++ ) {
2210         const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 );
2211         if ( newstate ) {
2212             q[ q_write ] = newstate;
2213             /* set to point at the root */
2214             fail[ q[ q_write++ ] ]=1;
2215         }
2216     }
2217     while ( q_read < q_write) {
2218         const U32 cur = q[ q_read++ % numstates ];
2219         base = trie->states[ cur ].trans.base;
2220
2221         for ( charid = 0 ; charid < ucharcount ; charid++ ) {
2222             const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 );
2223             if (ch_state) {
2224                 U32 fail_state = cur;
2225                 U32 fail_base;
2226                 do {
2227                     fail_state = fail[ fail_state ];
2228                     fail_base = aho->states[ fail_state ].trans.base;
2229                 } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) );
2230
2231                 fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 );
2232                 fail[ ch_state ] = fail_state;
2233                 if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum )
2234                 {
2235                         aho->states[ ch_state ].wordnum =  aho->states[ fail_state ].wordnum;
2236                 }
2237                 q[ q_write++ % numstates] = ch_state;
2238             }
2239         }
2240     }
2241     /* restore fail[0..1] to 0 so that we "fall out" of the AC loop
2242        when we fail in state 1, this allows us to use the
2243        charclass scan to find a valid start char. This is based on the principle
2244        that theres a good chance the string being searched contains lots of stuff
2245        that cant be a start char.
2246      */
2247     fail[ 0 ] = fail[ 1 ] = 0;
2248     DEBUG_TRIE_COMPILE_r({
2249         PerlIO_printf(Perl_debug_log,
2250                       "%*sStclass Failtable (%"UVuf" states): 0", 
2251                       (int)(depth * 2), "", (UV)numstates
2252         );
2253         for( q_read=1; q_read<numstates; q_read++ ) {
2254             PerlIO_printf(Perl_debug_log, ", %"UVuf, (UV)fail[q_read]);
2255         }
2256         PerlIO_printf(Perl_debug_log, "\n");
2257     });
2258     Safefree(q);
2259     /*RExC_seen |= REG_SEEN_TRIEDFA;*/
2260 }
2261
2262
2263 /*
2264  * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
2265  * These need to be revisited when a newer toolchain becomes available.
2266  */
2267 #if defined(__sparc64__) && defined(__GNUC__)
2268 #   if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
2269 #       undef  SPARC64_GCC_WORKAROUND
2270 #       define SPARC64_GCC_WORKAROUND 1
2271 #   endif
2272 #endif
2273
2274 #define DEBUG_PEEP(str,scan,depth) \
2275     DEBUG_OPTIMISE_r({if (scan){ \
2276        SV * const mysv=sv_newmortal(); \
2277        regnode *Next = regnext(scan); \
2278        regprop(RExC_rx, mysv, scan); \
2279        PerlIO_printf(Perl_debug_log, "%*s" str ">%3d: %s (%d)\n", \
2280        (int)depth*2, "", REG_NODE_NUM(scan), SvPV_nolen_const(mysv),\
2281        Next ? (REG_NODE_NUM(Next)) : 0 ); \
2282    }});
2283
2284
2285
2286
2287
2288 #define JOIN_EXACT(scan,min,flags) \
2289     if (PL_regkind[OP(scan)] == EXACT) \
2290         join_exact(pRExC_state,(scan),(min),(flags),NULL,depth+1)
2291
2292 STATIC U32
2293 S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, I32 *min, U32 flags,regnode *val, U32 depth) {
2294     /* Merge several consecutive EXACTish nodes into one. */
2295     regnode *n = regnext(scan);
2296     U32 stringok = 1;
2297     regnode *next = scan + NODE_SZ_STR(scan);
2298     U32 merged = 0;
2299     U32 stopnow = 0;
2300 #ifdef DEBUGGING
2301     regnode *stop = scan;
2302     GET_RE_DEBUG_FLAGS_DECL;
2303 #else
2304     PERL_UNUSED_ARG(depth);
2305 #endif
2306
2307     PERL_ARGS_ASSERT_JOIN_EXACT;
2308 #ifndef EXPERIMENTAL_INPLACESCAN
2309     PERL_UNUSED_ARG(flags);
2310     PERL_UNUSED_ARG(val);
2311 #endif
2312     DEBUG_PEEP("join",scan,depth);
2313     
2314     /* Skip NOTHING, merge EXACT*. */
2315     while (n &&
2316            ( PL_regkind[OP(n)] == NOTHING ||
2317              (stringok && (OP(n) == OP(scan))))
2318            && NEXT_OFF(n)
2319            && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) {
2320         
2321         if (OP(n) == TAIL || n > next)
2322             stringok = 0;
2323         if (PL_regkind[OP(n)] == NOTHING) {
2324             DEBUG_PEEP("skip:",n,depth);
2325             NEXT_OFF(scan) += NEXT_OFF(n);
2326             next = n + NODE_STEP_REGNODE;
2327 #ifdef DEBUGGING
2328             if (stringok)
2329                 stop = n;
2330 #endif
2331             n = regnext(n);
2332         }
2333         else if (stringok) {
2334             const unsigned int oldl = STR_LEN(scan);
2335             regnode * const nnext = regnext(n);
2336             
2337             DEBUG_PEEP("merg",n,depth);
2338             
2339             merged++;
2340             if (oldl + STR_LEN(n) > U8_MAX)
2341                 break;
2342             NEXT_OFF(scan) += NEXT_OFF(n);
2343             STR_LEN(scan) += STR_LEN(n);
2344             next = n + NODE_SZ_STR(n);
2345             /* Now we can overwrite *n : */
2346             Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char);
2347 #ifdef DEBUGGING
2348             stop = next - 1;
2349 #endif
2350             n = nnext;
2351             if (stopnow) break;
2352         }
2353
2354 #ifdef EXPERIMENTAL_INPLACESCAN
2355         if (flags && !NEXT_OFF(n)) {
2356             DEBUG_PEEP("atch", val, depth);
2357             if (reg_off_by_arg[OP(n)]) {
2358                 ARG_SET(n, val - n);
2359             }
2360             else {
2361                 NEXT_OFF(n) = val - n;
2362             }
2363             stopnow = 1;
2364         }
2365 #endif
2366     }
2367     
2368     if (UTF && ( OP(scan) == EXACTF ) && ( STR_LEN(scan) >= 6 ) ) {
2369     /*
2370     Two problematic code points in Unicode casefolding of EXACT nodes:
2371     
2372     U+0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
2373     U+03B0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
2374     
2375     which casefold to
2376     
2377     Unicode                      UTF-8
2378     
2379     U+03B9 U+0308 U+0301         0xCE 0xB9 0xCC 0x88 0xCC 0x81
2380     U+03C5 U+0308 U+0301         0xCF 0x85 0xCC 0x88 0xCC 0x81
2381     
2382     This means that in case-insensitive matching (or "loose matching",
2383     as Unicode calls it), an EXACTF of length six (the UTF-8 encoded byte
2384     length of the above casefolded versions) can match a target string
2385     of length two (the byte length of UTF-8 encoded U+0390 or U+03B0).
2386     This would rather mess up the minimum length computation.
2387     
2388     What we'll do is to look for the tail four bytes, and then peek
2389     at the preceding two bytes to see whether we need to decrease
2390     the minimum length by four (six minus two).
2391     
2392     Thanks to the design of UTF-8, there cannot be false matches:
2393     A sequence of valid UTF-8 bytes cannot be a subsequence of
2394     another valid sequence of UTF-8 bytes.
2395     
2396     */
2397          char * const s0 = STRING(scan), *s, *t;
2398          char * const s1 = s0 + STR_LEN(scan) - 1;
2399          char * const s2 = s1 - 4;
2400 #ifdef EBCDIC /* RD tunifold greek 0390 and 03B0 */
2401          const char t0[] = "\xaf\x49\xaf\x42";
2402 #else
2403          const char t0[] = "\xcc\x88\xcc\x81";
2404 #endif
2405          const char * const t1 = t0 + 3;
2406     
2407          for (s = s0 + 2;
2408               s < s2 && (t = ninstr(s, s1, t0, t1));
2409               s = t + 4) {
2410 #ifdef EBCDIC
2411               if (((U8)t[-1] == 0x68 && (U8)t[-2] == 0xB4) ||
2412                   ((U8)t[-1] == 0x46 && (U8)t[-2] == 0xB5))
2413 #else
2414               if (((U8)t[-1] == 0xB9 && (U8)t[-2] == 0xCE) ||
2415                   ((U8)t[-1] == 0x85 && (U8)t[-2] == 0xCF))
2416 #endif
2417                    *min -= 4;
2418          }
2419     }
2420     
2421 #ifdef DEBUGGING
2422     /* Allow dumping */
2423     n = scan + NODE_SZ_STR(scan);
2424     while (n <= stop) {
2425         if (PL_regkind[OP(n)] != NOTHING || OP(n) == NOTHING) {
2426             OP(n) = OPTIMIZED;
2427             NEXT_OFF(n) = 0;
2428         }
2429         n++;
2430     }
2431 #endif
2432     DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl",scan,depth)});
2433     return stopnow;
2434 }
2435
2436 /* REx optimizer.  Converts nodes into quickier variants "in place".
2437    Finds fixed substrings.  */
2438
2439 /* Stops at toplevel WHILEM as well as at "last". At end *scanp is set
2440    to the position after last scanned or to NULL. */
2441
2442 #define INIT_AND_WITHP \
2443     assert(!and_withp); \
2444     Newx(and_withp,1,struct regnode_charclass_class); \
2445     SAVEFREEPV(and_withp)
2446
2447 /* this is a chain of data about sub patterns we are processing that
2448    need to be handled seperately/specially in study_chunk. Its so
2449    we can simulate recursion without losing state.  */
2450 struct scan_frame;
2451 typedef struct scan_frame {
2452     regnode *last;  /* last node to process in this frame */
2453     regnode *next;  /* next node to process when last is reached */
2454     struct scan_frame *prev; /*previous frame*/
2455     I32 stop; /* what stopparen do we use */
2456 } scan_frame;
2457
2458
2459 #define SCAN_COMMIT(s, data, m) scan_commit(s, data, m, is_inf)
2460
2461 #define CASE_SYNST_FNC(nAmE)                                       \
2462 case nAmE:                                                         \
2463     if (flags & SCF_DO_STCLASS_AND) {                              \
2464             for (value = 0; value < 256; value++)                  \
2465                 if (!is_ ## nAmE ## _cp(value))                       \
2466                     ANYOF_BITMAP_CLEAR(data->start_class, value);  \
2467     }                                                              \
2468     else {                                                         \
2469             for (value = 0; value < 256; value++)                  \
2470                 if (is_ ## nAmE ## _cp(value))                        \
2471                     ANYOF_BITMAP_SET(data->start_class, value);    \
2472     }                                                              \
2473     break;                                                         \
2474 case N ## nAmE:                                                    \
2475     if (flags & SCF_DO_STCLASS_AND) {                              \
2476             for (value = 0; value < 256; value++)                   \
2477                 if (is_ ## nAmE ## _cp(value))                         \
2478                     ANYOF_BITMAP_CLEAR(data->start_class, value);   \
2479     }                                                               \
2480     else {                                                          \
2481             for (value = 0; value < 256; value++)                   \
2482                 if (!is_ ## nAmE ## _cp(value))                        \
2483                     ANYOF_BITMAP_SET(data->start_class, value);     \
2484     }                                                               \
2485     break
2486
2487
2488
2489 STATIC I32
2490 S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
2491                         I32 *minlenp, I32 *deltap,
2492                         regnode *last,
2493                         scan_data_t *data,
2494                         I32 stopparen,
2495                         U8* recursed,
2496                         struct regnode_charclass_class *and_withp,
2497                         U32 flags, U32 depth)
2498                         /* scanp: Start here (read-write). */
2499                         /* deltap: Write maxlen-minlen here. */
2500                         /* last: Stop before this one. */
2501                         /* data: string data about the pattern */
2502                         /* stopparen: treat close N as END */
2503                         /* recursed: which subroutines have we recursed into */
2504                         /* and_withp: Valid if flags & SCF_DO_STCLASS_OR */
2505 {
2506     dVAR;
2507     I32 min = 0, pars = 0, code;
2508     regnode *scan = *scanp, *next;
2509     I32 delta = 0;
2510     int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
2511     int is_inf_internal = 0;            /* The studied chunk is infinite */
2512     I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
2513     scan_data_t data_fake;
2514     SV *re_trie_maxbuff = NULL;
2515     regnode *first_non_open = scan;
2516     I32 stopmin = I32_MAX;
2517     scan_frame *frame = NULL;
2518     GET_RE_DEBUG_FLAGS_DECL;
2519
2520     PERL_ARGS_ASSERT_STUDY_CHUNK;
2521
2522 #ifdef DEBUGGING
2523     StructCopy(&zero_scan_data, &data_fake, scan_data_t);
2524 #endif
2525
2526     if ( depth == 0 ) {
2527         while (first_non_open && OP(first_non_open) == OPEN)
2528             first_non_open=regnext(first_non_open);
2529     }
2530
2531
2532   fake_study_recurse:
2533     while ( scan && OP(scan) != END && scan < last ){
2534         /* Peephole optimizer: */
2535         DEBUG_STUDYDATA("Peep:", data,depth);
2536         DEBUG_PEEP("Peep",scan,depth);
2537         JOIN_EXACT(scan,&min,0);
2538
2539         /* Follow the next-chain of the current node and optimize
2540            away all the NOTHINGs from it.  */
2541         if (OP(scan) != CURLYX) {
2542             const int max = (reg_off_by_arg[OP(scan)]
2543                        ? I32_MAX
2544                        /* I32 may be smaller than U16 on CRAYs! */
2545                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
2546             int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
2547             int noff;
2548             regnode *n = scan;
2549         
2550             /* Skip NOTHING and LONGJMP. */
2551             while ((n = regnext(n))
2552                    && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
2553                        || ((OP(n) == LONGJMP) && (noff = ARG(n))))
2554                    && off + noff < max)
2555                 off += noff;
2556             if (reg_off_by_arg[OP(scan)])
2557                 ARG(scan) = off;
2558             else
2559                 NEXT_OFF(scan) = off;
2560         }
2561
2562
2563
2564         /* The principal pseudo-switch.  Cannot be a switch, since we
2565            look into several different things.  */
2566         if (OP(scan) == BRANCH || OP(scan) == BRANCHJ
2567                    || OP(scan) == IFTHEN) {
2568             next = regnext(scan);
2569             code = OP(scan);
2570             /* demq: the op(next)==code check is to see if we have "branch-branch" AFAICT */
2571         
2572             if (OP(next) == code || code == IFTHEN) {
2573                 /* NOTE - There is similar code to this block below for handling
2574                    TRIE nodes on a re-study.  If you change stuff here check there
2575                    too. */
2576                 I32 max1 = 0, min1 = I32_MAX, num = 0;
2577                 struct regnode_charclass_class accum;
2578                 regnode * const startbranch=scan;
2579                 
2580                 if (flags & SCF_DO_SUBSTR)
2581                     SCAN_COMMIT(pRExC_state, data, minlenp); /* Cannot merge strings after this. */
2582                 if (flags & SCF_DO_STCLASS)
2583                     cl_init_zero(pRExC_state, &accum);
2584
2585                 while (OP(scan) == code) {
2586                     I32 deltanext, minnext, f = 0, fake;
2587                     struct regnode_charclass_class this_class;
2588
2589                     num++;
2590                     data_fake.flags = 0;
2591                     if (data) {
2592                         data_fake.whilem_c = data->whilem_c;
2593                         data_fake.last_closep = data->last_closep;
2594                     }
2595                     else
2596                         data_fake.last_closep = &fake;
2597
2598                     data_fake.pos_delta = delta;
2599                     next = regnext(scan);
2600                     scan = NEXTOPER(scan);
2601                     if (code != BRANCH)
2602                         scan = NEXTOPER(scan);
2603                     if (flags & SCF_DO_STCLASS) {
2604                         cl_init(pRExC_state, &this_class);
2605                         data_fake.start_class = &this_class;
2606                         f = SCF_DO_STCLASS_AND;
2607                     }
2608                     if (flags & SCF_WHILEM_VISITED_POS)
2609                         f |= SCF_WHILEM_VISITED_POS;
2610
2611                     /* we suppose the run is continuous, last=next...*/
2612                     minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext,
2613                                           next, &data_fake,
2614                                           stopparen, recursed, NULL, f,depth+1);
2615                     if (min1 > minnext)
2616                         min1 = minnext;
2617                     if (max1 < minnext + deltanext)
2618                         max1 = minnext + deltanext;
2619                     if (deltanext == I32_MAX)
2620                         is_inf = is_inf_internal = 1;
2621                     scan = next;
2622                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
2623                         pars++;
2624                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
2625                         if ( stopmin > minnext) 
2626                             stopmin = min + min1;
2627                         flags &= ~SCF_DO_SUBSTR;
2628                         if (data)
2629                             data->flags |= SCF_SEEN_ACCEPT;
2630                     }
2631                     if (data) {
2632                         if (data_fake.flags & SF_HAS_EVAL)
2633                             data->flags |= SF_HAS_EVAL;
2634                         data->whilem_c = data_fake.whilem_c;
2635                     }
2636                     if (flags & SCF_DO_STCLASS)
2637                         cl_or(pRExC_state, &accum, &this_class);
2638                 }
2639                 if (code == IFTHEN && num < 2) /* Empty ELSE branch */
2640                     min1 = 0;
2641                 if (flags & SCF_DO_SUBSTR) {
2642                     data->pos_min += min1;
2643                     data->pos_delta += max1 - min1;
2644                     if (max1 != min1 || is_inf)
2645                         data->longest = &(data->longest_float);
2646                 }
2647                 min += min1;
2648                 delta += max1 - min1;
2649                 if (flags & SCF_DO_STCLASS_OR) {
2650                     cl_or(pRExC_state, data->start_class, &accum);
2651                     if (min1) {
2652                         cl_and(data->start_class, and_withp);
2653                         flags &= ~SCF_DO_STCLASS;
2654                     }
2655                 }
2656                 else if (flags & SCF_DO_STCLASS_AND) {
2657                     if (min1) {
2658                         cl_and(data->start_class, &accum);
2659                         flags &= ~SCF_DO_STCLASS;
2660                     }
2661                     else {
2662                         /* Switch to OR mode: cache the old value of
2663                          * data->start_class */
2664                         INIT_AND_WITHP;
2665                         StructCopy(data->start_class, and_withp,
2666                                    struct regnode_charclass_class);
2667                         flags &= ~SCF_DO_STCLASS_AND;
2668                         StructCopy(&accum, data->start_class,
2669                                    struct regnode_charclass_class);
2670                         flags |= SCF_DO_STCLASS_OR;
2671                         data->start_class->flags |= ANYOF_EOS;
2672                     }
2673                 }
2674
2675                 if (PERL_ENABLE_TRIE_OPTIMISATION && OP( startbranch ) == BRANCH ) {
2676                 /* demq.
2677
2678                    Assuming this was/is a branch we are dealing with: 'scan' now
2679                    points at the item that follows the branch sequence, whatever
2680                    it is. We now start at the beginning of the sequence and look
2681                    for subsequences of
2682
2683                    BRANCH->EXACT=>x1
2684                    BRANCH->EXACT=>x2
2685                    tail
2686
2687                    which would be constructed from a pattern like /A|LIST|OF|WORDS/
2688
2689                    If we can find such a subseqence we need to turn the first
2690                    element into a trie and then add the subsequent branch exact
2691                    strings to the trie.
2692
2693                    We have two cases
2694
2695                      1. patterns where the whole set of branch can be converted. 
2696
2697                      2. patterns where only a subset can be converted.
2698
2699                    In case 1 we can replace the whole set with a single regop
2700                    for the trie. In case 2 we need to keep the start and end
2701                    branchs so
2702
2703                      'BRANCH EXACT; BRANCH EXACT; BRANCH X'
2704                      becomes BRANCH TRIE; BRANCH X;
2705
2706                   There is an additional case, that being where there is a 
2707                   common prefix, which gets split out into an EXACT like node
2708                   preceding the TRIE node.
2709
2710                   If x(1..n)==tail then we can do a simple trie, if not we make
2711                   a "jump" trie, such that when we match the appropriate word
2712                   we "jump" to the appopriate tail node. Essentailly we turn
2713                   a nested if into a case structure of sorts.
2714
2715                 */
2716                 
2717                     int made=0;
2718                     if (!re_trie_maxbuff) {
2719                         re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
2720                         if (!SvIOK(re_trie_maxbuff))
2721                             sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
2722                     }
2723                     if ( SvIV(re_trie_maxbuff)>=0  ) {
2724                         regnode *cur;
2725                         regnode *first = (regnode *)NULL;
2726                         regnode *last = (regnode *)NULL;
2727                         regnode *tail = scan;
2728                         U8 optype = 0;
2729                         U32 count=0;
2730
2731 #ifdef DEBUGGING
2732                         SV * const mysv = sv_newmortal();       /* for dumping */
2733 #endif
2734                         /* var tail is used because there may be a TAIL
2735                            regop in the way. Ie, the exacts will point to the
2736                            thing following the TAIL, but the last branch will
2737                            point at the TAIL. So we advance tail. If we
2738                            have nested (?:) we may have to move through several
2739                            tails.
2740                          */
2741
2742                         while ( OP( tail ) == TAIL ) {
2743                             /* this is the TAIL generated by (?:) */
2744                             tail = regnext( tail );
2745                         }
2746
2747                         
2748                         DEBUG_OPTIMISE_r({
2749                             regprop(RExC_rx, mysv, tail );
2750                             PerlIO_printf( Perl_debug_log, "%*s%s%s\n",
2751                                 (int)depth * 2 + 2, "", 
2752                                 "Looking for TRIE'able sequences. Tail node is: ", 
2753                                 SvPV_nolen_const( mysv )
2754                             );
2755                         });
2756                         
2757                         /*
2758
2759                            step through the branches, cur represents each
2760                            branch, noper is the first thing to be matched
2761                            as part of that branch and noper_next is the
2762                            regnext() of that node. if noper is an EXACT
2763                            and noper_next is the same as scan (our current
2764                            position in the regex) then the EXACT branch is
2765                            a possible optimization target. Once we have
2766                            two or more consequetive such branches we can
2767                            create a trie of the EXACT's contents and stich
2768                            it in place. If the sequence represents all of
2769                            the branches we eliminate the whole thing and
2770                            replace it with a single TRIE. If it is a
2771                            subsequence then we need to stitch it in. This
2772                            means the first branch has to remain, and needs
2773                            to be repointed at the item on the branch chain
2774                            following the last branch optimized. This could
2775                            be either a BRANCH, in which case the
2776                            subsequence is internal, or it could be the
2777                            item following the branch sequence in which
2778                            case the subsequence is at the end.
2779
2780                         */
2781
2782                         /* dont use tail as the end marker for this traverse */
2783                         for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) {
2784                             regnode * const noper = NEXTOPER( cur );
2785 #if defined(DEBUGGING) || defined(NOJUMPTRIE)
2786                             regnode * const noper_next = regnext( noper );
2787 #endif
2788
2789                             DEBUG_OPTIMISE_r({
2790                                 regprop(RExC_rx, mysv, cur);
2791                                 PerlIO_printf( Perl_debug_log, "%*s- %s (%d)",
2792                                    (int)depth * 2 + 2,"", SvPV_nolen_const( mysv ), REG_NODE_NUM(cur) );
2793
2794                                 regprop(RExC_rx, mysv, noper);
2795                                 PerlIO_printf( Perl_debug_log, " -> %s",
2796                                     SvPV_nolen_const(mysv));
2797
2798                                 if ( noper_next ) {
2799                                   regprop(RExC_rx, mysv, noper_next );
2800                                   PerlIO_printf( Perl_debug_log,"\t=> %s\t",
2801                                     SvPV_nolen_const(mysv));
2802                                 }
2803                                 PerlIO_printf( Perl_debug_log, "(First==%d,Last==%d,Cur==%d)\n",
2804                                    REG_NODE_NUM(first), REG_NODE_NUM(last), REG_NODE_NUM(cur) );
2805                             });
2806                             if ( (((first && optype!=NOTHING) ? OP( noper ) == optype
2807                                          : PL_regkind[ OP( noper ) ] == EXACT )
2808                                   || OP(noper) == NOTHING )
2809 #ifdef NOJUMPTRIE
2810                                   && noper_next == tail
2811 #endif
2812                                   && count < U16_MAX)
2813                             {
2814                                 count++;
2815                                 if ( !first || optype == NOTHING ) {
2816                                     if (!first) first = cur;
2817                                     optype = OP( noper );
2818                                 } else {
2819                                     last = cur;
2820                                 }
2821                             } else {
2822 /* 
2823     Currently we assume that the trie can handle unicode and ascii
2824     matches fold cased matches. If this proves true then the following
2825     define will prevent tries in this situation. 
2826     
2827     #define TRIE_TYPE_IS_SAFE (UTF || optype==EXACT)
2828 */
2829 #define TRIE_TYPE_IS_SAFE 1
2830                                 if ( last && TRIE_TYPE_IS_SAFE ) {
2831                                     make_trie( pRExC_state, 
2832                                             startbranch, first, cur, tail, count, 
2833                                             optype, depth+1 );
2834                                 }
2835                                 if ( PL_regkind[ OP( noper ) ] == EXACT
2836 #ifdef NOJUMPTRIE
2837                                      && noper_next == tail
2838 #endif
2839                                 ){
2840                                     count = 1;
2841                                     first = cur;
2842                                     optype = OP( noper );
2843                                 } else {
2844                                     count = 0;
2845                                     first = NULL;
2846                                     optype = 0;
2847                                 }
2848                                 last = NULL;
2849                             }
2850                         }
2851                         DEBUG_OPTIMISE_r({
2852                             regprop(RExC_rx, mysv, cur);
2853                             PerlIO_printf( Perl_debug_log,
2854                               "%*s- %s (%d) <SCAN FINISHED>\n", (int)depth * 2 + 2,
2855                               "", SvPV_nolen_const( mysv ),REG_NODE_NUM(cur));
2856
2857                         });
2858                         
2859                         if ( last && TRIE_TYPE_IS_SAFE ) {
2860                             made= make_trie( pRExC_state, startbranch, first, scan, tail, count, optype, depth+1 );
2861 #ifdef TRIE_STUDY_OPT   
2862                             if ( ((made == MADE_EXACT_TRIE && 
2863                                  startbranch == first) 
2864                                  || ( first_non_open == first )) && 
2865                                  depth==0 ) {
2866                                 flags |= SCF_TRIE_RESTUDY;
2867                                 if ( startbranch == first 
2868                                      && scan == tail ) 
2869                                 {
2870                                     RExC_seen &=~REG_TOP_LEVEL_BRANCHES;
2871                                 }
2872                             }
2873 #endif
2874                         }
2875                     }
2876                     
2877                 } /* do trie */
2878                 
2879             }
2880             else if ( code == BRANCHJ ) {  /* single branch is optimized. */
2881                 scan = NEXTOPER(NEXTOPER(scan));
2882             } else                      /* single branch is optimized. */
2883                 scan = NEXTOPER(scan);
2884             continue;
2885         } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB || OP(scan) == GOSTART) {
2886             scan_frame *newframe = NULL;
2887             I32 paren;
2888             regnode *start;
2889             regnode *end;
2890
2891             if (OP(scan) != SUSPEND) {
2892             /* set the pointer */
2893                 if (OP(scan) == GOSUB) {
2894                     paren = ARG(scan);
2895                     RExC_recurse[ARG2L(scan)] = scan;
2896                     start = RExC_open_parens[paren-1];
2897                     end   = RExC_close_parens[paren-1];
2898                 } else {
2899                     paren = 0;
2900                     start = RExC_rxi->program + 1;
2901                     end   = RExC_opend;
2902                 }
2903                 if (!recursed) {
2904                     Newxz(recursed, (((RExC_npar)>>3) +1), U8);
2905                     SAVEFREEPV(recursed);
2906                 }
2907                 if (!PAREN_TEST(recursed,paren+1)) {
2908                     PAREN_SET(recursed,paren+1);
2909                     Newx(newframe,1,scan_frame);
2910                 } else {
2911                     if (flags & SCF_DO_SUBSTR) {
2912                         SCAN_COMMIT(pRExC_state,data,minlenp);
2913                         data->longest = &(data->longest_float);
2914                     }
2915                     is_inf = is_inf_internal = 1;
2916                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
2917                         cl_anything(pRExC_state, data->start_class);
2918                     flags &= ~SCF_DO_STCLASS;
2919                 }
2920             } else {
2921                 Newx(newframe,1,scan_frame);
2922                 paren = stopparen;
2923                 start = scan+2;
2924                 end = regnext(scan);
2925             }
2926             if (newframe) {
2927                 assert(start);
2928                 assert(end);
2929                 SAVEFREEPV(newframe);
2930                 newframe->next = regnext(scan);
2931                 newframe->last = last;
2932                 newframe->stop = stopparen;
2933                 newframe->prev = frame;
2934
2935                 frame = newframe;
2936                 scan =  start;
2937                 stopparen = paren;
2938                 last = end;
2939
2940                 continue;
2941             }
2942         }
2943         else if (OP(scan) == EXACT) {
2944             I32 l = STR_LEN(scan);
2945             UV uc;
2946             if (UTF) {
2947                 const U8 * const s = (U8*)STRING(scan);
2948                 l = utf8_length(s, s + l);
2949                 uc = utf8_to_uvchr(s, NULL);
2950             } else {
2951                 uc = *((U8*)STRING(scan));
2952             }
2953             min += l;
2954             if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
2955                 /* The code below prefers earlier match for fixed
2956                    offset, later match for variable offset.  */
2957                 if (data->last_end == -1) { /* Update the start info. */
2958                     data->last_start_min = data->pos_min;
2959                     data->last_start_max = is_inf
2960                         ? I32_MAX : data->pos_min + data->pos_delta;
2961                 }
2962                 sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
2963                 if (UTF)
2964                     SvUTF8_on(data->last_found);
2965                 {
2966                     SV * const sv = data->last_found;
2967                     MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
2968                         mg_find(sv, PERL_MAGIC_utf8) : NULL;
2969                     if (mg && mg->mg_len >= 0)
2970                         mg->mg_len += utf8_length((U8*)STRING(scan),
2971                                                   (U8*)STRING(scan)+STR_LEN(scan));
2972                 }
2973                 data->last_end = data->pos_min + l;
2974                 data->pos_min += l; /* As in the first entry. */
2975                 data->flags &= ~SF_BEFORE_EOL;
2976             }
2977             if (flags & SCF_DO_STCLASS_AND) {
2978                 /* Check whether it is compatible with what we know already! */
2979                 int compat = 1;
2980
2981                 if (uc >= 0x100 ||
2982                     (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
2983                     && !ANYOF_BITMAP_TEST(data->start_class, uc)
2984                     && (!(data->start_class->flags & ANYOF_FOLD)
2985                         || !ANYOF_BITMAP_TEST(data->start_class, PL_fold[uc])))
2986                     )
2987                     compat = 0;
2988                 ANYOF_CLASS_ZERO(data->start_class);
2989                 ANYOF_BITMAP_ZERO(data->start_class);
2990                 if (compat)
2991                     ANYOF_BITMAP_SET(data->start_class, uc);
2992                 data->start_class->flags &= ~ANYOF_EOS;
2993                 if (uc < 0x100)
2994                   data->start_class->flags &= ~ANYOF_UNICODE_ALL;
2995             }
2996             else if (flags & SCF_DO_STCLASS_OR) {
2997                 /* false positive possible if the class is case-folded */
2998                 if (uc < 0x100)
2999                     ANYOF_BITMAP_SET(data->start_class, uc);
3000                 else
3001                     data->start_class->flags |= ANYOF_UNICODE_ALL;
3002                 data->start_class->flags &= ~ANYOF_EOS;
3003                 cl_and(data->start_class, and_withp);
3004             }
3005             flags &= ~SCF_DO_STCLASS;
3006         }
3007         else if (PL_regkind[OP(scan)] == EXACT) { /* But OP != EXACT! */
3008             I32 l = STR_LEN(scan);
3009             UV uc = *((U8*)STRING(scan));
3010
3011             /* Search for fixed substrings supports EXACT only. */
3012             if (flags & SCF_DO_SUBSTR) {
3013                 assert(data);
3014                 SCAN_COMMIT(pRExC_state, data, minlenp);
3015             }
3016             if (UTF) {
3017                 const U8 * const s = (U8 *)STRING(scan);
3018                 l = utf8_length(s, s + l);
3019                 uc = utf8_to_uvchr(s, NULL);
3020             }
3021             min += l;
3022             if (flags & SCF_DO_SUBSTR)
3023                 data->pos_min += l;
3024             if (flags & SCF_DO_STCLASS_AND) {
3025                 /* Check whether it is compatible with what we know already! */
3026                 int compat = 1;
3027
3028                 if (uc >= 0x100 ||
3029                     (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
3030                     && !ANYOF_BITMAP_TEST(data->start_class, uc)
3031                      && !ANYOF_BITMAP_TEST(data->start_class, PL_fold[uc])))
3032                     compat = 0;
3033                 ANYOF_CLASS_ZERO(data->start_class);
3034                 ANYOF_BITMAP_ZERO(data->start_class);
3035                 if (compat) {
3036                     ANYOF_BITMAP_SET(data->start_class, uc);
3037                     data->start_class->flags &= ~ANYOF_EOS;
3038                     data->start_class->flags |= ANYOF_FOLD;
3039                     if (OP(scan) == EXACTFL)
3040                         data->start_class->flags |= ANYOF_LOCALE;
3041                 }
3042             }
3043             else if (flags & SCF_DO_STCLASS_OR) {
3044                 if (data->start_class->flags & ANYOF_FOLD) {
3045                     /* false positive possible if the class is case-folded.
3046                        Assume that the locale settings are the same... */
3047                     if (uc < 0x100)
3048                         ANYOF_BITMAP_SET(data->start_class, uc);
3049                     data->start_class->flags &= ~ANYOF_EOS;
3050                 }
3051                 cl_and(data->start_class, and_withp);
3052             }
3053             flags &= ~SCF_DO_STCLASS;
3054         }
3055         else if (strchr((const char*)PL_varies,OP(scan))) {
3056             I32 mincount, maxcount, minnext, deltanext, fl = 0;
3057             I32 f = flags, pos_before = 0;
3058             regnode * const oscan = scan;
3059             struct regnode_charclass_class this_class;
3060             struct regnode_charclass_class *oclass = NULL;
3061             I32 next_is_eval = 0;
3062
3063             switch (PL_regkind[OP(scan)]) {
3064             case WHILEM:                /* End of (?:...)* . */
3065                 scan = NEXTOPER(scan);
3066                 goto finish;
3067             case PLUS:
3068                 if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
3069                     next = NEXTOPER(scan);
3070                     if (OP(next) == EXACT || (flags & SCF_DO_STCLASS)) {
3071                         mincount = 1;
3072                         maxcount = REG_INFTY;
3073                         next = regnext(scan);
3074                         scan = NEXTOPER(scan);
3075                         goto do_curly;
3076                     }
3077                 }
3078                 if (flags & SCF_DO_SUBSTR)
3079                     data->pos_min++;
3080                 min++;
3081                 /* Fall through. */
3082             case STAR:
3083                 if (flags & SCF_DO_STCLASS) {
3084                     mincount = 0;
3085                     maxcount = REG_INFTY;
3086                     next = regnext(scan);
3087                     scan = NEXTOPER(scan);
3088                     goto do_curly;
3089                 }
3090                 is_inf = is_inf_internal = 1;
3091                 scan = regnext(scan);
3092                 if (flags & SCF_DO_SUBSTR) {
3093                     SCAN_COMMIT(pRExC_state, data, minlenp); /* Cannot extend fixed substrings */
3094                     data->longest = &(data->longest_float);
3095                 }
3096                 goto optimize_curly_tail;
3097             case CURLY:
3098                 if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM)
3099                     && (scan->flags == stopparen))
3100                 {
3101                     mincount = 1;
3102                     maxcount = 1;
3103                 } else {
3104                     mincount = ARG1(scan);
3105                     maxcount = ARG2(scan);
3106                 }
3107                 next = regnext(scan);
3108                 if (OP(scan) == CURLYX) {
3109                     I32 lp = (data ? *(data->last_closep) : 0);
3110                     scan->flags = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX);
3111                 }
3112                 scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
3113                 next_is_eval = (OP(scan) == EVAL);
3114               do_curly:
3115                 if (flags & SCF_DO_SUBSTR) {
3116                     if (mincount == 0) SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot extend fixed substrings */
3117                     pos_before = data->pos_min;
3118                 }
3119                 if (data) {
3120                     fl = data->flags;
3121                     data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
3122                     if (is_inf)
3123                         data->flags |= SF_IS_INF;
3124                 }
3125                 if (flags & SCF_DO_STCLASS) {
3126                     cl_init(pRExC_state, &this_class);
3127                     oclass = data->start_class;
3128                     data->start_class = &this_class;
3129                     f |= SCF_DO_STCLASS_AND;
3130                     f &= ~SCF_DO_STCLASS_OR;
3131                 }
3132                 /* These are the cases when once a subexpression
3133                    fails at a particular position, it cannot succeed
3134                    even after backtracking at the enclosing scope.
3135                 
3136                    XXXX what if minimal match and we are at the
3137                         initial run of {n,m}? */
3138                 if ((mincount != maxcount - 1) && (maxcount != REG_INFTY))
3139                     f &= ~SCF_WHILEM_VISITED_POS;
3140
3141                 /* This will finish on WHILEM, setting scan, or on NULL: */
3142                 minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext, 
3143                                       last, data, stopparen, recursed, NULL,
3144                                       (mincount == 0
3145                                         ? (f & ~SCF_DO_SUBSTR) : f),depth+1);
3146
3147                 if (flags & SCF_DO_STCLASS)
3148                     data->start_class = oclass;
3149                 if (mincount == 0 || minnext == 0) {
3150                     if (flags & SCF_DO_STCLASS_OR) {
3151                         cl_or(pRExC_state, data->start_class, &this_class);
3152                     }
3153                     else if (flags & SCF_DO_STCLASS_AND) {
3154                         /* Switch to OR mode: cache the old value of
3155                          * data->start_class */
3156                         INIT_AND_WITHP;
3157                         StructCopy(data->start_class, and_withp,
3158                                    struct regnode_charclass_class);
3159                         flags &= ~SCF_DO_STCLASS_AND;
3160                         StructCopy(&this_class, data->start_class,
3161                                    struct regnode_charclass_class);
3162                         flags |= SCF_DO_STCLASS_OR;
3163                         data->start_class->flags |= ANYOF_EOS;
3164                     }
3165                 } else {                /* Non-zero len */
3166                     if (flags & SCF_DO_STCLASS_OR) {
3167                         cl_or(pRExC_state, data->start_class, &this_class);
3168                         cl_and(data->start_class, and_withp);
3169                     }
3170                     else if (flags & SCF_DO_STCLASS_AND)
3171                         cl_and(data->start_class, &this_class);
3172                     flags &= ~SCF_DO_STCLASS;
3173                 }
3174                 if (!scan)              /* It was not CURLYX, but CURLY. */
3175                     scan = next;
3176                 if ( /* ? quantifier ok, except for (?{ ... }) */
3177                     (next_is_eval || !(mincount == 0 && maxcount == 1))
3178                     && (minnext == 0) && (deltanext == 0)
3179                     && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
3180                     && maxcount <= REG_INFTY/3 /* Complement check for big count */
3181                     && ckWARN(WARN_REGEXP))
3182                 {
3183                     vWARN(RExC_parse,
3184                           "Quantifier unexpected on zero-length expression");
3185                 }
3186
3187                 min += minnext * mincount;
3188                 is_inf_internal |= ((maxcount == REG_INFTY
3189                                      && (minnext + deltanext) > 0)
3190                                     || deltanext == I32_MAX);
3191                 is_inf |= is_inf_internal;
3192                 delta += (minnext + deltanext) * maxcount - minnext * mincount;
3193
3194                 /* Try powerful optimization CURLYX => CURLYN. */
3195                 if (  OP(oscan) == CURLYX && data
3196                       && data->flags & SF_IN_PAR
3197                       && !(data->flags & SF_HAS_EVAL)
3198                       && !deltanext && minnext == 1 ) {
3199                     /* Try to optimize to CURLYN.  */
3200                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
3201                     regnode * const nxt1 = nxt;
3202 #ifdef DEBUGGING
3203                     regnode *nxt2;
3204 #endif
3205
3206                     /* Skip open. */
3207                     nxt = regnext(nxt);
3208                     if (!strchr((const char*)PL_simple,OP(nxt))
3209                         && !(PL_regkind[OP(nxt)] == EXACT
3210                              && STR_LEN(nxt) == 1))
3211                         goto nogo;
3212 #ifdef DEBUGGING
3213                     nxt2 = nxt;
3214 #endif
3215                     nxt = regnext(nxt);
3216                     if (OP(nxt) != CLOSE)
3217                         goto nogo;
3218                     if (RExC_open_parens) {
3219                         RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
3220                         RExC_close_parens[ARG(nxt1)-1]=nxt+2; /*close->while*/
3221                     }
3222                     /* Now we know that nxt2 is the only contents: */
3223                     oscan->flags = (U8)ARG(nxt);
3224                     OP(oscan) = CURLYN;
3225                     OP(nxt1) = NOTHING; /* was OPEN. */
3226
3227 #ifdef DEBUGGING
3228                     OP(nxt1 + 1) = OPTIMIZED; /* was count. */
3229                     NEXT_OFF(nxt1+ 1) = 0; /* just for consistancy. */
3230                     NEXT_OFF(nxt2) = 0; /* just for consistancy with CURLY. */
3231                     OP(nxt) = OPTIMIZED;        /* was CLOSE. */
3232                     OP(nxt + 1) = OPTIMIZED; /* was count. */
3233                     NEXT_OFF(nxt+ 1) = 0; /* just for consistancy. */
3234 #endif
3235                 }
3236               nogo:
3237
3238                 /* Try optimization CURLYX => CURLYM. */
3239                 if (  OP(oscan) == CURLYX && data
3240                       && !(data->flags & SF_HAS_PAR)
3241                       && !(data->flags & SF_HAS_EVAL)
3242                       && !deltanext     /* atom is fixed width */
3243                       && minnext != 0   /* CURLYM can't handle zero width */
3244                 ) {
3245                     /* XXXX How to optimize if data == 0? */
3246                     /* Optimize to a simpler form.  */
3247                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
3248                     regnode *nxt2;
3249
3250                     OP(oscan) = CURLYM;
3251                     while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
3252                             && (OP(nxt2) != WHILEM))
3253                         nxt = nxt2;
3254                     OP(nxt2)  = SUCCEED; /* Whas WHILEM */
3255                     /* Need to optimize away parenths. */
3256                     if (data->flags & SF_IN_PAR) {
3257                         /* Set the parenth number.  */
3258                         regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
3259
3260                         if (OP(nxt) != CLOSE)
3261                             FAIL("Panic opt close");
3262                         oscan->flags = (U8)ARG(nxt);
3263                         if (RExC_open_parens) {
3264                             RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
3265                             RExC_close_parens[ARG(nxt1)-1]=nxt2+1; /*close->NOTHING*/
3266                         }
3267                         OP(nxt1) = OPTIMIZED;   /* was OPEN. */
3268                         OP(nxt) = OPTIMIZED;    /* was CLOSE. */
3269
3270 #ifdef DEBUGGING
3271                         OP(nxt1 + 1) = OPTIMIZED; /* was count. */
3272                         OP(nxt + 1) = OPTIMIZED; /* was count. */
3273                         NEXT_OFF(nxt1 + 1) = 0; /* just for consistancy. */
3274                         NEXT_OFF(nxt + 1) = 0; /* just for consistancy. */
3275 #endif
3276 #if 0
3277                         while ( nxt1 && (OP(nxt1) != WHILEM)) {
3278                             regnode *nnxt = regnext(nxt1);
3279                         
3280                             if (nnxt == nxt) {
3281                                 if (reg_off_by_arg[OP(nxt1)])
3282                                     ARG_SET(nxt1, nxt2 - nxt1);
3283                                 else if (nxt2 - nxt1 < U16_MAX)
3284                                     NEXT_OFF(nxt1) = nxt2 - nxt1;
3285                                 else
3286                                     OP(nxt) = NOTHING;  /* Cannot beautify */
3287                             }
3288                             nxt1 = nnxt;
3289                         }
3290 #endif
3291                         /* Optimize again: */
3292                         study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
3293                                     NULL, stopparen, recursed, NULL, 0,depth+1);
3294                     }
3295                     else
3296                         oscan->flags = 0;
3297                 }
3298                 else if ((OP(oscan) == CURLYX)
3299                          && (flags & SCF_WHILEM_VISITED_POS)
3300                          /* See the comment on a similar expression above.
3301                             However, this time it not a subexpression
3302                             we care about, but the expression itself. */
3303                          && (maxcount == REG_INFTY)
3304                          && data && ++data->whilem_c < 16) {
3305                     /* This stays as CURLYX, we can put the count/of pair. */
3306                     /* Find WHILEM (as in regexec.c) */
3307                     regnode *nxt = oscan + NEXT_OFF(oscan);
3308
3309                     if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
3310                         nxt += ARG(nxt);
3311                     PREVOPER(nxt)->flags = (U8)(data->whilem_c
3312                         | (RExC_whilem_seen << 4)); /* On WHILEM */
3313                 }
3314                 if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
3315                     pars++;
3316                 if (flags & SCF_DO_SUBSTR) {
3317                     SV *last_str = NULL;
3318                     int counted = mincount != 0;
3319
3320                     if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
3321 #if defined(SPARC64_GCC_WORKAROUND)
3322                         I32 b = 0;
3323                         STRLEN l = 0;
3324                         const char *s = NULL;
3325                         I32 old = 0;
3326
3327                         if (pos_before >= data->last_start_min)
3328                             b = pos_before;
3329                         else
3330                             b = data->last_start_min;
3331
3332                         l = 0;
3333                         s = SvPV_const(data->last_found, l);
3334                         old = b - data->last_start_min;
3335
3336 #else
3337                         I32 b = pos_before >= data->last_start_min
3338                             ? pos_before : data->last_start_min;
3339                         STRLEN l;
3340                         const char * const s = SvPV_const(data->last_found, l);
3341                         I32 old = b - data->last_start_min;
3342 #endif
3343
3344                         if (UTF)
3345                             old = utf8_hop((U8*)s, old) - (U8*)s;
3346                         
3347                         l -= old;
3348                         /* Get the added string: */
3349                         last_str = newSVpvn_utf8(s  + old, l, UTF);
3350                         if (deltanext == 0 && pos_before == b) {
3351                             /* What was added is a constant string */
3352                             if (mincount > 1) {
3353                                 SvGROW(last_str, (mincount * l) + 1);
3354                                 repeatcpy(SvPVX(last_str) + l,
3355                                           SvPVX_const(last_str), l, mincount - 1);
3356                                 SvCUR_set(last_str, SvCUR(last_str) * mincount);
3357                                 /* Add additional parts. */
3358                                 SvCUR_set(data->last_found,
3359                                           SvCUR(data->last_found) - l);
3360                                 sv_catsv(data->last_found, last_str);
3361                                 {
3362                                     SV * sv = data->last_found;
3363                                     MAGIC *mg =
3364                                         SvUTF8(sv) && SvMAGICAL(sv) ?
3365                                         mg_find(sv, PERL_MAGIC_utf8) : NULL;
3366                                     if (mg && mg->mg_len >= 0)
3367                                         mg->mg_len += CHR_SVLEN(last_str) - l;
3368                                 }
3369                                 data->last_end += l * (mincount - 1);
3370                             }
3371                         } else {
3372                             /* start offset must point into the last copy */
3373                             data->last_start_min += minnext * (mincount - 1);
3374                             data->last_start_max += is_inf ? I32_MAX
3375                                 : (maxcount - 1) * (minnext + data->pos_delta);
3376                         }
3377                     }
3378                     /* It is counted once already... */
3379                     data->pos_min += minnext * (mincount - counted);
3380                     data->pos_delta += - counted * deltanext +
3381                         (minnext + deltanext) * maxcount - minnext * mincount;
3382                     if (mincount != maxcount) {
3383                          /* Cannot extend fixed substrings found inside
3384                             the group.  */
3385                         SCAN_COMMIT(pRExC_state,data,minlenp);
3386                         if (mincount && last_str) {
3387                             SV * const sv = data->last_found;
3388                             MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
3389                                 mg_find(sv, PERL_MAGIC_utf8) : NULL;
3390
3391                             if (mg)
3392                                 mg->mg_len = -1;
3393                             sv_setsv(sv, last_str);
3394                             data->last_end = data->pos_min;
3395                             data->last_start_min =
3396                                 data->pos_min - CHR_SVLEN(last_str);
3397                             data->last_start_max = is_inf
3398                                 ? I32_MAX
3399                                 : data->pos_min + data->pos_delta
3400                                 - CHR_SVLEN(last_str);
3401                         }
3402                         data->longest = &(data->longest_float);
3403                     }
3404                     SvREFCNT_dec(last_str);
3405                 }
3406                 if (data && (fl & SF_HAS_EVAL))
3407                     data->flags |= SF_HAS_EVAL;
3408               optimize_curly_tail:
3409                 if (OP(oscan) != CURLYX) {
3410                     while (PL_regkind[OP(next = regnext(oscan))] == NOTHING
3411                            && NEXT_OFF(next))
3412                         NEXT_OFF(oscan) += NEXT_OFF(next);
3413                 }
3414                 continue;
3415             default:                    /* REF and CLUMP only? */
3416                 if (flags & SCF_DO_SUBSTR) {
3417                     SCAN_COMMIT(pRExC_state,data,minlenp);      /* Cannot expect anything... */
3418                     data->longest = &(data->longest_float);
3419                 }
3420                 is_inf = is_inf_internal = 1;
3421                 if (flags & SCF_DO_STCLASS_OR)
3422                     cl_anything(pRExC_state, data->start_class);
3423                 flags &= ~SCF_DO_STCLASS;
3424                 break;
3425             }
3426         }
3427         else if (OP(scan) == LNBREAK) {
3428             if (flags & SCF_DO_STCLASS) {
3429                 int value = 0;
3430                 data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
3431                 if (flags & SCF_DO_STCLASS_AND) {
3432                     for (value = 0; value < 256; value++)
3433                         if (!is_VERTWS_cp(value))
3434                             ANYOF_BITMAP_CLEAR(data->start_class, value);  
3435                 }                                                              
3436                 else {                                                         
3437                     for (value = 0; value < 256; value++)
3438                         if (is_VERTWS_cp(value))
3439                             ANYOF_BITMAP_SET(data->start_class, value);    
3440                 }                                                              
3441                 if (flags & SCF_DO_STCLASS_OR)
3442                     cl_and(data->start_class, and_withp);
3443                 flags &= ~SCF_DO_STCLASS;
3444             }
3445             min += 1;
3446             delta += 1;
3447             if (flags & SCF_DO_SUBSTR) {
3448                 SCAN_COMMIT(pRExC_state,data,minlenp);  /* Cannot expect anything... */
3449                 data->pos_min += 1;
3450                 data->pos_delta += 1;
3451                 data->longest = &(data->longest_float);
3452             }
3453             
3454         }
3455         else if (OP(scan) == FOLDCHAR) {
3456             int d = ARG(scan)==0xDF ? 1 : 2;
3457             flags &= ~SCF_DO_STCLASS;
3458             min += 1;
3459             delta += d;
3460             if (flags & SCF_DO_SUBSTR) {
3461                 SCAN_COMMIT(pRExC_state,data,minlenp);  /* Cannot expect anything... */
3462                 data->pos_min += 1;
3463                 data->pos_delta += d;
3464                 data->longest = &(data->longest_float);
3465             }
3466         }
3467         else if (strchr((const char*)PL_simple,OP(scan))) {
3468             int value = 0;
3469
3470             if (flags & SCF_DO_SUBSTR) {
3471                 SCAN_COMMIT(pRExC_state,data,minlenp);
3472                 data->pos_min++;
3473             }
3474             min++;
3475             if (flags & SCF_DO_STCLASS) {
3476                 data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
3477
3478                 /* Some of the logic below assumes that switching
3479                    locale on will only add false positives. */
3480                 switch (PL_regkind[OP(scan)]) {
3481                 case SANY:
3482                 default:
3483                   do_default:
3484                     /* Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", OP(scan)); */
3485                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
3486                         cl_anything(pRExC_state, data->start_class);
3487                     break;
3488                 case REG_ANY:
3489                     if (OP(scan) == SANY)
3490                         goto do_default;
3491                     if (flags & SCF_DO_STCLASS_OR) { /* Everything but \n */
3492                         value = (ANYOF_BITMAP_TEST(data->start_class,'\n')
3493                                  || (data->start_class->flags & ANYOF_CLASS));
3494                         cl_anything(pRExC_state, data->start_class);
3495                     }
3496                     if (flags & SCF_DO_STCLASS_AND || !value)
3497                         ANYOF_BITMAP_CLEAR(data->start_class,'\n');
3498                     break;
3499                 case ANYOF:
3500                     if (flags & SCF_DO_STCLASS_AND)
3501                         cl_and(data->start_class,
3502                                (struct regnode_charclass_class*)scan);
3503                     else
3504                         cl_or(pRExC_state, data->start_class,
3505                               (struct regnode_charclass_class*)scan);
3506                     break;
3507                 case ALNUM:
3508                     if (flags & SCF_DO_STCLASS_AND) {
3509                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3510                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
3511                             for (value = 0; value < 256; value++)
3512                                 if (!isALNUM(value))
3513                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3514                         }
3515                     }
3516                     else {
3517                         if (data->start_class->flags & ANYOF_LOCALE)
3518                             ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
3519                         else {
3520                             for (value = 0; value < 256; value++)
3521                                 if (isALNUM(value))
3522                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3523                         }
3524                     }
3525                     break;
3526                 case ALNUML:
3527                     if (flags & SCF_DO_STCLASS_AND) {
3528                         if (data->start_class->flags & ANYOF_LOCALE)
3529                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
3530                     }
3531                     else {
3532                         ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
3533                         data->start_class->flags |= ANYOF_LOCALE;
3534                     }
3535                     break;
3536                 case NALNUM:
3537                     if (flags & SCF_DO_STCLASS_AND) {
3538                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3539                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
3540                             for (value = 0; value < 256; value++)
3541                                 if (isALNUM(value))
3542                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3543                         }
3544                     }
3545                     else {
3546                         if (data->start_class->flags & ANYOF_LOCALE)
3547                             ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
3548                         else {
3549                             for (value = 0; value < 256; value++)
3550                                 if (!isALNUM(value))
3551                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3552                         }
3553                     }
3554                     break;
3555                 case NALNUML:
3556                     if (flags & SCF_DO_STCLASS_AND) {
3557                         if (data->start_class->flags & ANYOF_LOCALE)
3558                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
3559                     }
3560                     else {
3561                         data->start_class->flags |= ANYOF_LOCALE;
3562                         ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
3563                     }
3564                     break;
3565                 case SPACE:
3566                     if (flags & SCF_DO_STCLASS_AND) {
3567                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3568                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
3569                             for (value = 0; value < 256; value++)
3570                                 if (!isSPACE(value))
3571                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3572                         }
3573                     }
3574                     else {
3575                         if (data->start_class->flags & ANYOF_LOCALE)
3576                             ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
3577                         else {
3578                             for (value = 0; value < 256; value++)
3579                                 if (isSPACE(value))
3580                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3581                         }
3582                     }
3583                     break;
3584                 case SPACEL:
3585                     if (flags & SCF_DO_STCLASS_AND) {
3586                         if (data->start_class->flags & ANYOF_LOCALE)
3587                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
3588                     }
3589                     else {
3590                         data->start_class->flags |= ANYOF_LOCALE;
3591                         ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
3592                     }
3593                     break;
3594                 case NSPACE:
3595                     if (flags & SCF_DO_STCLASS_AND) {
3596                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3597                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
3598                             for (value = 0; value < 256; value++)
3599                                 if (isSPACE(value))
3600                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3601                         }
3602                     }
3603                     else {
3604                         if (data->start_class->flags & ANYOF_LOCALE)
3605                             ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
3606                         else {
3607                             for (value = 0; value < 256; value++)
3608                                 if (!isSPACE(value))
3609                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3610                         }
3611                     }
3612                     break;
3613                 case NSPACEL:
3614                     if (flags & SCF_DO_STCLASS_AND) {
3615                         if (data->start_class->flags & ANYOF_LOCALE) {
3616                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
3617                             for (value = 0; value < 256; value++)
3618                                 if (!isSPACE(value))
3619                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3620                         }
3621                     }
3622                     else {
3623                         data->start_class->flags |= ANYOF_LOCALE;
3624                         ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
3625                     }
3626                     break;
3627                 case DIGIT:
3628                     if (flags & SCF_DO_STCLASS_AND) {
3629                         ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NDIGIT);
3630                         for (value = 0; value < 256; value++)
3631                             if (!isDIGIT(value))
3632                                 ANYOF_BITMAP_CLEAR(data->start_class, value);
3633                     }
3634                     else {
3635                         if (data->start_class->flags & ANYOF_LOCALE)
3636                             ANYOF_CLASS_SET(data->start_class,ANYOF_DIGIT);
3637                         else {
3638                             for (value = 0; value < 256; value++)
3639                                 if (isDIGIT(value))
3640                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3641                         }
3642                     }
3643                     break;
3644                 case NDIGIT:
3645                     if (flags & SCF_DO_STCLASS_AND) {
3646                         ANYOF_CLASS_CLEAR(data->start_class,ANYOF_DIGIT);
3647                         for (value = 0; value < 256; value++)
3648                             if (isDIGIT(value))
3649                                 ANYOF_BITMAP_CLEAR(data->start_class, value);
3650                     }
3651                     else {
3652                         if (data->start_class->flags & ANYOF_LOCALE)
3653                             ANYOF_CLASS_SET(data->start_class,ANYOF_NDIGIT);
3654                         else {
3655                             for (value = 0; value < 256; value++)
3656                                 if (!isDIGIT(value))
3657                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3658                         }
3659                     }
3660                     break;
3661                 CASE_SYNST_FNC(VERTWS);
3662                 CASE_SYNST_FNC(HORIZWS);
3663                 
3664                 }
3665                 if (flags & SCF_DO_STCLASS_OR)
3666                     cl_and(data->start_class, and_withp);
3667                 flags &= ~SCF_DO_STCLASS;
3668             }
3669         }
3670         else if (PL_regkind[OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
3671             data->flags |= (OP(scan) == MEOL
3672                             ? SF_BEFORE_MEOL
3673                             : SF_BEFORE_SEOL);
3674         }
3675         else if (  PL_regkind[OP(scan)] == BRANCHJ
3676                  /* Lookbehind, or need to calculate parens/evals/stclass: */
3677                    && (scan->flags || data || (flags & SCF_DO_STCLASS))
3678                    && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
3679             if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY 
3680                 || OP(scan) == UNLESSM )
3681             {
3682                 /* Negative Lookahead/lookbehind
3683                    In this case we can't do fixed string optimisation.
3684                 */
3685
3686                 I32 deltanext, minnext, fake = 0;
3687                 regnode *nscan;
3688                 struct regnode_charclass_class intrnl;
3689                 int f = 0;
3690
3691                 data_fake.flags = 0;
3692                 if (data) {
3693                     data_fake.whilem_c = data->whilem_c;
3694                     data_fake.last_closep = data->last_closep;
3695                 }
3696                 else
3697                     data_fake.last_closep = &fake;
3698                 data_fake.pos_delta = delta;
3699                 if ( flags & SCF_DO_STCLASS && !scan->flags
3700                      && OP(scan) == IFMATCH ) { /* Lookahead */
3701                     cl_init(pRExC_state, &intrnl);
3702                     data_fake.start_class = &intrnl;
3703                     f |= SCF_DO_STCLASS_AND;
3704                 }
3705                 if (flags & SCF_WHILEM_VISITED_POS)
3706                     f |= SCF_WHILEM_VISITED_POS;
3707                 next = regnext(scan);
3708                 nscan = NEXTOPER(NEXTOPER(scan));
3709                 minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext, 
3710                     last, &data_fake, stopparen, recursed, NULL, f, depth+1);
3711                 if (scan->flags) {
3712                     if (deltanext) {
3713                         FAIL("Variable length lookbehind not implemented");
3714                     }
3715                     else if (minnext > (I32)U8_MAX) {
3716                         FAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
3717                     }
3718                     scan->flags = (U8)minnext;
3719                 }
3720                 if (data) {
3721                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3722                         pars++;
3723                     if (data_fake.flags & SF_HAS_EVAL)
3724                         data->flags |= SF_HAS_EVAL;
3725                     data->whilem_c = data_fake.whilem_c;
3726                 }
3727                 if (f & SCF_DO_STCLASS_AND) {
3728                     if (flags & SCF_DO_STCLASS_OR) {
3729                         /* OR before, AND after: ideally we would recurse with
3730                          * data_fake to get the AND applied by study of the
3731                          * remainder of the pattern, and then derecurse;
3732                          * *** HACK *** for now just treat as "no information".
3733                          * See [perl #56690].
3734                          */
3735                         cl_init(pRExC_state, data->start_class);
3736                     }  else {
3737                         /* AND before and after: combine and continue */
3738                         const int was = (data->start_class->flags & ANYOF_EOS);
3739
3740                         cl_and(data->start_class, &intrnl);
3741                         if (was)
3742                             data->start_class->flags |= ANYOF_EOS;
3743                     }
3744                 }
3745             }
3746 #if PERL_ENABLE_POSITIVE_ASSERTION_STUDY
3747             else {
3748                 /* Positive Lookahead/lookbehind
3749                    In this case we can do fixed string optimisation,
3750                    but we must be careful about it. Note in the case of
3751                    lookbehind the positions will be offset by the minimum
3752                    length of the pattern, something we won't know about
3753                    until after the recurse.
3754                 */
3755                 I32 deltanext, fake = 0;
3756                 regnode *nscan;
3757                 struct regnode_charclass_class intrnl;
3758                 int f = 0;
3759                 /* We use SAVEFREEPV so that when the full compile 
3760                     is finished perl will clean up the allocated 
3761                     minlens when its all done. This was we don't
3762                     have to worry about freeing them when we know
3763                     they wont be used, which would be a pain.
3764                  */
3765                 I32 *minnextp;
3766                 Newx( minnextp, 1, I32 );
3767                 SAVEFREEPV(minnextp);
3768
3769                 if (data) {
3770                     StructCopy(data, &data_fake, scan_data_t);
3771                     if ((flags & SCF_DO_SUBSTR) && data->last_found) {
3772                         f |= SCF_DO_SUBSTR;
3773                         if (scan->flags) 
3774                             SCAN_COMMIT(pRExC_state, &data_fake,minlenp);
3775                         data_fake.last_found=newSVsv(data->last_found);
3776                     }
3777                 }
3778                 else
3779                     data_fake.last_closep = &fake;
3780                 data_fake.flags = 0;
3781                 data_fake.pos_delta = delta;
3782                 if (is_inf)
3783                     data_fake.flags |= SF_IS_INF;
3784                 if ( flags & SCF_DO_STCLASS && !scan->flags
3785                      && OP(scan) == IFMATCH ) { /* Lookahead */
3786                     cl_init(pRExC_state, &intrnl);
3787                     data_fake.start_class = &intrnl;
3788                     f |= SCF_DO_STCLASS_AND;
3789                 }
3790                 if (flags & SCF_WHILEM_VISITED_POS)
3791                     f |= SCF_WHILEM_VISITED_POS;
3792                 next = regnext(scan);
3793                 nscan = NEXTOPER(NEXTOPER(scan));
3794
3795                 *minnextp = study_chunk(pRExC_state, &nscan, minnextp, &deltanext, 
3796                     last, &data_fake, stopparen, recursed, NULL, f,depth+1);
3797                 if (scan->flags) {
3798                     if (deltanext) {
3799                         FAIL("Variable length lookbehind not implemented");
3800                     }
3801                     else if (*minnextp > (I32)U8_MAX) {
3802                         FAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
3803                     }
3804                     scan->flags = (U8)*minnextp;
3805                 }
3806
3807                 *minnextp += min;
3808
3809                 if (f & SCF_DO_STCLASS_AND) {
3810                     const int was = (data->start_class->flags & ANYOF_EOS);
3811
3812                     cl_and(data->start_class, &intrnl);
3813                     if (was)
3814                         data->start_class->flags |= ANYOF_EOS;
3815                 }
3816                 if (data) {
3817                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3818                         pars++;
3819                     if (data_fake.flags & SF_HAS_EVAL)
3820                         data->flags |= SF_HAS_EVAL;
3821                     data->whilem_c = data_fake.whilem_c;
3822                     if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) {
3823                         if (RExC_rx->minlen<*minnextp)
3824                             RExC_rx->minlen=*minnextp;
3825                         SCAN_COMMIT(pRExC_state, &data_fake, minnextp);
3826                         SvREFCNT_dec(data_fake.last_found);
3827                         
3828                         if ( data_fake.minlen_fixed != minlenp ) 
3829                         {
3830                             data->offset_fixed= data_fake.offset_fixed;
3831                             data->minlen_fixed= data_fake.minlen_fixed;
3832                             data->lookbehind_fixed+= scan->flags;
3833                         }
3834                         if ( data_fake.minlen_float != minlenp )
3835                         {
3836                             data->minlen_float= data_fake.minlen_float;
3837                             data->offset_float_min=data_fake.offset_float_min;
3838                             data->offset_float_max=data_fake.offset_float_max;
3839                             data->lookbehind_float+= scan->flags;
3840                         }
3841                     }
3842                 }
3843
3844
3845             }
3846 #endif
3847         }
3848         else if (OP(scan) == OPEN) {
3849             if (stopparen != (I32)ARG(scan))
3850                 pars++;
3851         }
3852         else if (OP(scan) == CLOSE) {
3853             if (stopparen == (I32)ARG(scan)) {
3854                 break;
3855             }
3856             if ((I32)ARG(scan) == is_par) {
3857                 next = regnext(scan);
3858
3859                 if ( next && (OP(next) != WHILEM) && next < last)
3860                     is_par = 0;         /* Disable optimization */
3861             }
3862             if (data)
3863                 *(data->last_closep) = ARG(scan);
3864         }
3865         else if (OP(scan) == EVAL) {
3866                 if (data)
3867                     data->flags |= SF_HAS_EVAL;
3868         }
3869         else if ( PL_regkind[OP(scan)] == ENDLIKE ) {
3870             if (flags & SCF_DO_SUBSTR) {
3871                 SCAN_COMMIT(pRExC_state,data,minlenp);
3872                 flags &= ~SCF_DO_SUBSTR;
3873             }
3874             if (data && OP(scan)==ACCEPT) {
3875                 data->flags |= SCF_SEEN_ACCEPT;
3876                 if (stopmin > min)
3877                     stopmin = min;
3878             }
3879         }
3880         else if (OP(scan) == LOGICAL && scan->flags == 2) /* Embedded follows */
3881         {
3882                 if (flags & SCF_DO_SUBSTR) {
3883                     SCAN_COMMIT(pRExC_state,data,minlenp);
3884                     data->longest = &(data->longest_float);
3885                 }
3886                 is_inf = is_inf_internal = 1;
3887                 if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
3888                     cl_anything(pRExC_state, data->start_class);
3889                 flags &= ~SCF_DO_STCLASS;
3890         }
3891         else if (OP(scan) == GPOS) {
3892             if (!(RExC_rx->extflags & RXf_GPOS_FLOAT) &&
3893                 !(delta || is_inf || (data && data->pos_delta))) 
3894             {
3895                 if (!(RExC_rx->extflags & RXf_ANCH) && (flags & SCF_DO_SUBSTR))
3896                     RExC_rx->extflags |= RXf_ANCH_GPOS;
3897                 if (RExC_rx->gofs < (U32)min)
3898                     RExC_rx->gofs = min;
3899             } else {
3900                 RExC_rx->extflags |= RXf_GPOS_FLOAT;
3901                 RExC_rx->gofs = 0;
3902             }       
3903         }
3904 #ifdef TRIE_STUDY_OPT
3905 #ifdef FULL_TRIE_STUDY
3906         else if (PL_regkind[OP(scan)] == TRIE) {
3907             /* NOTE - There is similar code to this block above for handling
3908                BRANCH nodes on the initial study.  If you change stuff here
3909                check there too. */
3910             regnode *trie_node= scan;
3911             regnode *tail= regnext(scan);
3912             reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
3913             I32 max1 = 0, min1 = I32_MAX;
3914             struct regnode_charclass_class accum;
3915
3916             if (flags & SCF_DO_SUBSTR) /* XXXX Add !SUSPEND? */
3917                 SCAN_COMMIT(pRExC_state, data,minlenp); /* Cannot merge strings after this. */
3918             if (flags & SCF_DO_STCLASS)
3919                 cl_init_zero(pRExC_state, &accum);
3920                 
3921             if (!trie->jump) {
3922                 min1= trie->minlen;
3923                 max1= trie->maxlen;
3924             } else {
3925                 const regnode *nextbranch= NULL;
3926                 U32 word;
3927                 
3928                 for ( word=1 ; word <= trie->wordcount ; word++) 
3929                 {
3930                     I32 deltanext=0, minnext=0, f = 0, fake;
3931                     struct regnode_charclass_class this_class;
3932                     
3933                     data_fake.flags = 0;
3934                     if (data) {
3935                         data_fake.whilem_c = data->whilem_c;
3936                         data_fake.last_closep = data->last_closep;
3937                     }
3938                     else
3939                         data_fake.last_closep = &fake;
3940                     data_fake.pos_delta = delta;
3941                     if (flags & SCF_DO_STCLASS) {
3942                         cl_init(pRExC_state, &this_class);
3943                         data_fake.start_class = &this_class;
3944                         f = SCF_DO_STCLASS_AND;
3945                     }
3946                     if (flags & SCF_WHILEM_VISITED_POS)
3947                         f |= SCF_WHILEM_VISITED_POS;
3948     
3949                     if (trie->jump[word]) {
3950                         if (!nextbranch)
3951                             nextbranch = trie_node + trie->jump[0];
3952                         scan= trie_node + trie->jump[word];
3953                         /* We go from the jump point to the branch that follows
3954                            it. Note this means we need the vestigal unused branches
3955                            even though they arent otherwise used.
3956                          */
3957                         minnext = study_chunk(pRExC_state, &scan, minlenp, 
3958                             &deltanext, (regnode *)nextbranch, &data_fake, 
3959                             stopparen, recursed, NULL, f,depth+1);
3960                     }
3961                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
3962                         nextbranch= regnext((regnode*)nextbranch);
3963                     
3964                     if (min1 > (I32)(minnext + trie->minlen))
3965                         min1 = minnext + trie->minlen;
3966                     if (max1 < (I32)(minnext + deltanext + trie->maxlen))
3967                         max1 = minnext + deltanext + trie->maxlen;
3968                     if (deltanext == I32_MAX)
3969                         is_inf = is_inf_internal = 1;
3970                     
3971                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3972                         pars++;
3973                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
3974                         if ( stopmin > min + min1) 
3975                             stopmin = min + min1;
3976                         flags &= ~SCF_DO_SUBSTR;
3977                         if (data)
3978                             data->flags |= SCF_SEEN_ACCEPT;
3979                     }
3980                     if (data) {
3981                         if (data_fake.flags & SF_HAS_EVAL)
3982                             data->flags |= SF_HAS_EVAL;
3983                         data->whilem_c = data_fake.whilem_c;
3984                     }
3985                     if (flags & SCF_DO_STCLASS)
3986                         cl_or(pRExC_state, &accum, &this_class);
3987                 }
3988             }
3989             if (flags & SCF_DO_SUBSTR) {
3990                 data->pos_min += min1;
3991                 data->pos_delta += max1 - min1;
3992                 if (max1 != min1 || is_inf)
3993                     data->longest = &(data->longest_float);
3994             }
3995             min += min1;
3996             delta += max1 - min1;
3997             if (flags & SCF_DO_STCLASS_OR) {
3998                 cl_or(pRExC_state, data->start_class, &accum);
3999                 if (min1) {
4000                     cl_and(data->start_class, and_withp);
4001                     flags &= ~SCF_DO_STCLASS;
4002                 }
4003             }
4004             else if (flags & SCF_DO_STCLASS_AND) {
4005                 if (min1) {
4006                     cl_and(data->start_class, &accum);
4007                     flags &= ~SCF_DO_STCLASS;
4008                 }
4009                 else {
4010                     /* Switch to OR mode: cache the old value of
4011                      * data->start_class */
4012                     INIT_AND_WITHP;
4013                     StructCopy(data->start_class, and_withp,
4014                                struct regnode_charclass_class);
4015                     flags &= ~SCF_DO_STCLASS_AND;
4016                     StructCopy(&accum, data->start_class,
4017                                struct regnode_charclass_class);
4018                     flags |= SCF_DO_STCLASS_OR;
4019                     data->start_class->flags |= ANYOF_EOS;
4020                 }
4021             }
4022             scan= tail;
4023             continue;
4024         }
4025 #else
4026         else if (PL_regkind[OP(scan)] == TRIE) {
4027             reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
4028             U8*bang=NULL;
4029             
4030             min += trie->minlen;
4031             delta += (trie->maxlen - trie->minlen);
4032             flags &= ~SCF_DO_STCLASS; /* xxx */
4033             if (flags & SCF_DO_SUBSTR) {
4034                 SCAN_COMMIT(pRExC_state,data,minlenp);  /* Cannot expect anything... */
4035                 data->pos_min += trie->minlen;
4036                 data->pos_delta += (trie->maxlen - trie->minlen);
4037                 if (trie->maxlen != trie->minlen)
4038                     data->longest = &(data->longest_float);
4039             }
4040             if (trie->jump) /* no more substrings -- for now /grr*/
4041                 flags &= ~SCF_DO_SUBSTR; 
4042         }
4043 #endif /* old or new */
4044 #endif /* TRIE_STUDY_OPT */     
4045
4046         /* Else: zero-length, ignore. */
4047         scan = regnext(scan);
4048     }
4049     if (frame) {
4050         last = frame->last;
4051         scan = frame->next;
4052         stopparen = frame->stop;
4053         frame = frame->prev;
4054         goto fake_study_recurse;
4055     }
4056
4057   finish:
4058     assert(!frame);
4059     DEBUG_STUDYDATA("pre-fin:",data,depth);
4060
4061     *scanp = scan;
4062     *deltap = is_inf_internal ? I32_MAX : delta;
4063     if (flags & SCF_DO_SUBSTR && is_inf)
4064         data->pos_delta = I32_MAX - data->pos_min;
4065     if (is_par > (I32)U8_MAX)
4066         is_par = 0;
4067     if (is_par && pars==1 && data) {
4068         data->flags |= SF_IN_PAR;
4069         data->flags &= ~SF_HAS_PAR;
4070     }
4071     else if (pars && data) {
4072         data->flags |= SF_HAS_PAR;
4073         data->flags &= ~SF_IN_PAR;
4074     }
4075     if (flags & SCF_DO_STCLASS_OR)
4076         cl_and(data->start_class, and_withp);
4077     if (flags & SCF_TRIE_RESTUDY)
4078         data->flags |=  SCF_TRIE_RESTUDY;
4079     
4080     DEBUG_STUDYDATA("post-fin:",data,depth);
4081     
4082     return min < stopmin ? min : stopmin;
4083 }
4084
4085 STATIC U32
4086 S_add_data(RExC_state_t *pRExC_state, U32 n, const char *s)
4087 {
4088     U32 count = RExC_rxi->data ? RExC_rxi->data->count : 0;
4089
4090     PERL_ARGS_ASSERT_ADD_DATA;
4091
4092     Renewc(RExC_rxi->data,
4093            sizeof(*RExC_rxi->data) + sizeof(void*) * (count + n - 1),
4094            char, struct reg_data);
4095     if(count)
4096         Renew(RExC_rxi->data->what, count + n, U8);
4097     else
4098         Newx(RExC_rxi->data->what, n, U8);
4099     RExC_rxi->data->count = count + n;
4100     Copy(s, RExC_rxi->data->what + count, n, U8);
4101     return count;
4102 }
4103
4104 /*XXX: todo make this not included in a non debugging perl */
4105 #ifndef PERL_IN_XSUB_RE
4106 void
4107 Perl_reginitcolors(pTHX)
4108 {
4109     dVAR;
4110     const char * const s = PerlEnv_getenv("PERL_RE_COLORS");
4111     if (s) {
4112         char *t = savepv(s);
4113         int i = 0;
4114         PL_colors[0] = t;
4115         while (++i < 6) {
4116             t = strchr(t, '\t');
4117             if (t) {
4118                 *t = '\0';
4119                 PL_colors[i] = ++t;
4120             }
4121             else
4122                 PL_colors[i] = t = (char *)"";
4123         }
4124     } else {
4125         int i = 0;
4126         while (i < 6)
4127             PL_colors[i++] = (char *)"";
4128     }
4129     PL_colorset = 1;
4130 }
4131 #endif
4132
4133
4134 #ifdef TRIE_STUDY_OPT
4135 #define CHECK_RESTUDY_GOTO                                  \
4136         if (                                                \
4137               (data.flags & SCF_TRIE_RESTUDY)               \
4138               && ! restudied++                              \
4139         )     goto reStudy
4140 #else
4141 #define CHECK_RESTUDY_GOTO
4142 #endif        
4143
4144 /*
4145  - pregcomp - compile a regular expression into internal code
4146  *
4147  * We can't allocate space until we know how big the compiled form will be,
4148  * but we can't compile it (and thus know how big it is) until we've got a
4149  * place to put the code.  So we cheat:  we compile it twice, once with code
4150  * generation turned off and size counting turned on, and once "for real".
4151  * This also means that we don't allocate space until we are sure that the
4152  * thing really will compile successfully, and we never have to move the
4153  * code and thus invalidate pointers into it.  (Note that it has to be in
4154  * one piece because free() must be able to free it all.) [NB: not true in perl]
4155  *
4156  * Beware that the optimization-preparation code in here knows about some
4157  * of the structure of the compiled regexp.  [I'll say.]
4158  */
4159
4160
4161
4162 #ifndef PERL_IN_XSUB_RE
4163 #define RE_ENGINE_PTR &PL_core_reg_engine
4164 #else
4165 extern const struct regexp_engine my_reg_engine;
4166 #define RE_ENGINE_PTR &my_reg_engine
4167 #endif
4168
4169 #ifndef PERL_IN_XSUB_RE 
4170 REGEXP *
4171 Perl_pregcomp(pTHX_ const SV * const pattern, const U32 flags)
4172 {
4173     dVAR;
4174     HV * const table = GvHV(PL_hintgv);
4175
4176     PERL_ARGS_ASSERT_PREGCOMP;
4177
4178     /* Dispatch a request to compile a regexp to correct 
4179        regexp engine. */
4180     if (table) {
4181         SV **ptr= hv_fetchs(table, "regcomp", FALSE);
4182         GET_RE_DEBUG_FLAGS_DECL;
4183         if (ptr && SvIOK(*ptr) && SvIV(*ptr)) {
4184             const regexp_engine *eng=INT2PTR(regexp_engine*,SvIV(*ptr));
4185             DEBUG_COMPILE_r({
4186                 PerlIO_printf(Perl_debug_log, "Using engine %"UVxf"\n",
4187                     SvIV(*ptr));
4188             });            
4189             return CALLREGCOMP_ENG(eng, pattern, flags);
4190         } 
4191     }
4192     return Perl_re_compile(aTHX_ pattern, flags);
4193 }
4194 #endif
4195
4196 REGEXP *
4197 Perl_re_compile(pTHX_ const SV * const pattern, const U32 pm_flags)
4198 {
4199     dVAR;
4200     register REGEXP *r;
4201     register regexp_internal *ri;
4202     STRLEN plen;
4203     char*  exp = SvPV((SV*)pattern, plen);
4204     char* xend = exp + plen;
4205     regnode *scan;
4206     I32 flags;
4207     I32 minlen = 0;
4208     I32 sawplus = 0;
4209     I32 sawopen = 0;
4210     scan_data_t data;
4211     RExC_state_t RExC_state;
4212     RExC_state_t * const pRExC_state = &RExC_state;
4213 #ifdef TRIE_STUDY_OPT    
4214     int restudied= 0;
4215     RExC_state_t copyRExC_state;
4216 #endif    
4217     GET_RE_DEBUG_FLAGS_DECL;
4218
4219     PERL_ARGS_ASSERT_RE_COMPILE;
4220
4221     DEBUG_r(if (!PL_colorset) reginitcolors());
4222
4223     RExC_utf8 = RExC_orig_utf8 = pm_flags & RXf_UTF8;
4224
4225     DEBUG_COMPILE_r({
4226         SV *dsv= sv_newmortal();
4227         RE_PV_QUOTED_DECL(s, RExC_utf8,
4228             dsv, exp, plen, 60);
4229         PerlIO_printf(Perl_debug_log, "%sCompiling REx%s %s\n",
4230                        PL_colors[4],PL_colors[5],s);
4231     });
4232
4233 redo_first_pass:
4234     RExC_precomp = exp;
4235     RExC_flags = pm_flags;
4236     RExC_sawback = 0;
4237
4238     RExC_seen = 0;
4239     RExC_seen_zerolen = *exp == '^' ? -1 : 0;
4240     RExC_seen_evals = 0;
4241     RExC_extralen = 0;
4242
4243     /* First pass: determine size, legality. */
4244     RExC_parse = exp;
4245     RExC_start = exp;
4246     RExC_end = xend;
4247     RExC_naughty = 0;
4248     RExC_npar = 1;
4249     RExC_nestroot = 0;
4250     RExC_size = 0L;
4251     RExC_emit = &PL_regdummy;
4252     RExC_whilem_seen = 0;
4253     RExC_charnames = NULL;
4254     RExC_open_parens = NULL;
4255     RExC_close_parens = NULL;
4256     RExC_opend = NULL;
4257     RExC_paren_names = NULL;
4258 #ifdef DEBUGGING
4259     RExC_paren_name_list = NULL;
4260 #endif
4261     RExC_recurse = NULL;
4262     RExC_recurse_count = 0;
4263
4264 #if 0 /* REGC() is (currently) a NOP at the first pass.
4265        * Clever compilers notice this and complain. --jhi */
4266     REGC((U8)REG_MAGIC, (char*)RExC_emit);
4267 #endif
4268     DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "Starting first pass (sizing)\n"));
4269     if (reg(pRExC_state, 0, &flags,1) == NULL) {
4270         RExC_precomp = NULL;
4271         return(NULL);
4272     }
4273     if (RExC_utf8 && !RExC_orig_utf8) {
4274         /* It's possible to write a regexp in ascii that represents Unicode
4275         codepoints outside of the byte range, such as via \x{100}. If we
4276         detect such a sequence we have to convert the entire pattern to utf8
4277         and then recompile, as our sizing calculation will have been based
4278         on 1 byte == 1 character, but we will need to use utf8 to encode
4279         at least some part of the pattern, and therefore must convert the whole
4280         thing.
4281         XXX: somehow figure out how to make this less expensive...
4282         -- dmq */
4283         STRLEN len = plen;
4284         DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log,
4285             "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
4286         exp = (char*)Perl_bytes_to_utf8(aTHX_ (U8*)exp, &len);
4287         xend = exp + len;
4288         RExC_orig_utf8 = RExC_utf8;
4289         SAVEFREEPV(exp);
4290         goto redo_first_pass;
4291     }
4292     DEBUG_PARSE_r({
4293         PerlIO_printf(Perl_debug_log, 
4294             "Required size %"IVdf" nodes\n"
4295             "Starting second pass (creation)\n", 
4296             (IV)RExC_size);
4297         RExC_lastnum=0; 
4298         RExC_lastparse=NULL; 
4299     });
4300     /* Small enough for pointer-storage convention?
4301        If extralen==0, this means that we will not need long jumps. */
4302     if (RExC_size >= 0x10000L && RExC_extralen)
4303         RExC_size += RExC_extralen;
4304     else
4305         RExC_extralen = 0;
4306     if (RExC_whilem_seen > 15)
4307         RExC_whilem_seen = 15;
4308
4309     /* Allocate space and zero-initialize. Note, the two step process 
4310        of zeroing when in debug mode, thus anything assigned has to 
4311        happen after that */
4312     Newxz(r, 1, regexp);
4313     Newxc(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode),
4314          char, regexp_internal);
4315     if ( r == NULL || ri == NULL )
4316         FAIL("Regexp out of space");
4317 #ifdef DEBUGGING
4318     /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
4319     Zero(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode), char);
4320 #else 
4321     /* bulk initialize base fields with 0. */
4322     Zero(ri, sizeof(regexp_internal), char);        
4323 #endif
4324
4325     /* non-zero initialization begins here */
4326     RXi_SET( r, ri );
4327     r->engine= RE_ENGINE_PTR;
4328     r->refcnt = 1;
4329     RX_PRELEN(r) = plen;
4330     r->extflags = pm_flags;
4331     {
4332         bool has_p     = ((r->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY);
4333         bool has_minus = ((r->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD);
4334         bool has_runon = ((RExC_seen & REG_SEEN_RUN_ON_COMMENT)==REG_SEEN_RUN_ON_COMMENT);
4335         U16 reganch = (U16)((r->extflags & RXf_PMf_STD_PMMOD)
4336                             >> RXf_PMf_STD_PMMOD_SHIFT);
4337         const char *fptr = STD_PAT_MODS;        /*"msix"*/
4338         char *p;
4339         RX_WRAPLEN(r) = plen + has_minus + has_p + has_runon
4340             + (sizeof(STD_PAT_MODS) - 1)
4341             + (sizeof("(?:)") - 1);
4342
4343         Newx(RX_WRAPPED(r), RX_WRAPLEN(r) + 1, char );
4344         p = RX_WRAPPED(r);
4345         *p++='('; *p++='?';
4346         if (has_p)
4347             *p++ = KEEPCOPY_PAT_MOD; /*'p'*/
4348         {
4349             char *r = p + (sizeof(STD_PAT_MODS) - 1) + has_minus - 1;
4350             char *colon = r + 1;
4351             char ch;
4352
4353             while((ch = *fptr++)) {
4354                 if(reganch & 1)
4355                     *p++ = ch;
4356                 else
4357                     *r-- = ch;
4358                 reganch >>= 1;
4359             }
4360             if(has_minus) {
4361                 *r = '-';
4362                 p = colon;
4363             }
4364         }
4365
4366         *p++ = ':';
4367         Copy(RExC_precomp, p, plen, char);
4368         RX_PRECOMP(r) = p;
4369         p += plen;
4370         if (has_runon)
4371             *p++ = '\n';
4372         *p++ = ')';
4373         *p = 0;
4374     }
4375
4376     r->intflags = 0;
4377     r->nparens = RExC_npar - 1; /* set early to validate backrefs */
4378     
4379     if (RExC_seen & REG_SEEN_RECURSE) {
4380         Newxz(RExC_open_parens, RExC_npar,regnode *);
4381         SAVEFREEPV(RExC_open_parens);
4382         Newxz(RExC_close_parens,RExC_npar,regnode *);
4383         SAVEFREEPV(RExC_close_parens);
4384     }
4385
4386     /* Useful during FAIL. */
4387 #ifdef RE_TRACK_PATTERN_OFFSETS
4388     Newxz(ri->u.offsets, 2*RExC_size+1, U32); /* MJD 20001228 */
4389     DEBUG_OFFSETS_r(PerlIO_printf(Perl_debug_log,
4390                           "%s %"UVuf" bytes for offset annotations.\n",
4391                           ri->u.offsets ? "Got" : "Couldn't get",
4392                           (UV)((2*RExC_size+1) * sizeof(U32))));
4393 #endif
4394     SetProgLen(ri,RExC_size);
4395     RExC_rx = r;
4396     RExC_rxi = ri;
4397     REH_CALL_COMP_BEGIN_HOOK(pRExC_state->rx);
4398
4399     /* Second pass: emit code. */
4400     RExC_flags = pm_flags;      /* don't let top level (?i) bleed */
4401     RExC_parse = exp;
4402     RExC_end = xend;
4403     RExC_naughty = 0;
4404     RExC_npar = 1;
4405     RExC_emit_start = ri->program;
4406     RExC_emit = ri->program;
4407     RExC_emit_bound = ri->program + RExC_size + 1;
4408
4409     /* Store the count of eval-groups for security checks: */
4410     RExC_rx->seen_evals = RExC_seen_evals;
4411     REGC((U8)REG_MAGIC, (char*) RExC_emit++);
4412     if (reg(pRExC_state, 0, &flags,1) == NULL) {
4413         ReREFCNT_dec(r);   
4414         return(NULL);
4415     }
4416     /* XXXX To minimize changes to RE engine we always allocate
4417        3-units-long substrs field. */
4418     Newx(r->substrs, 1, struct reg_substr_data);
4419     if (RExC_recurse_count) {
4420         Newxz(RExC_recurse,RExC_recurse_count,regnode *);
4421         SAVEFREEPV(RExC_recurse);
4422     }
4423
4424 reStudy:
4425     r->minlen = minlen = sawplus = sawopen = 0;
4426     Zero(r->substrs, 1, struct reg_substr_data);
4427
4428 #ifdef TRIE_STUDY_OPT
4429     if (!restudied) {
4430         StructCopy(&zero_scan_data, &data, scan_data_t);
4431         copyRExC_state = RExC_state;
4432     } else {
4433         U32 seen=RExC_seen;
4434         DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log,"Restudying\n"));
4435         
4436         RExC_state = copyRExC_state;
4437         if (seen & REG_TOP_LEVEL_BRANCHES) 
4438             RExC_seen |= REG_TOP_LEVEL_BRANCHES;
4439         else
4440             RExC_seen &= ~REG_TOP_LEVEL_BRANCHES;
4441         if (data.last_found) {
4442             SvREFCNT_dec(data.longest_fixed);
4443             SvREFCNT_dec(data.longest_float);
4444             SvREFCNT_dec(data.last_found);
4445         }
4446         StructCopy(&zero_scan_data, &data, scan_data_t);
4447     }
4448 #else
4449     StructCopy(&zero_scan_data, &data, scan_data_t);
4450 #endif    
4451
4452     /* Dig out information for optimizations. */
4453     r->extflags = RExC_flags; /* was pm_op */
4454     /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */
4455  
4456     if (UTF)
4457         r->extflags |= RXf_UTF8;        /* Unicode in it? */
4458     ri->regstclass = NULL;
4459     if (RExC_naughty >= 10)     /* Probably an expensive pattern. */
4460         r->intflags |= PREGf_NAUGHTY;
4461     scan = ri->program + 1;             /* First BRANCH. */
4462
4463     /* testing for BRANCH here tells us whether there is "must appear"
4464        data in the pattern. If there is then we can use it for optimisations */
4465     if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES)) { /*  Only one top-level choice. */
4466         I32 fake;
4467         STRLEN longest_float_length, longest_fixed_length;
4468         struct regnode_charclass_class ch_class; /* pointed to by data */
4469         int stclass_flag;
4470         I32 last_close = 0; /* pointed to by data */
4471         regnode *first= scan;
4472         regnode *first_next= regnext(first);
4473         
4474         /*
4475          * Skip introductions and multiplicators >= 1
4476          * so that we can extract the 'meat' of the pattern that must 
4477          * match in the large if() sequence following.
4478          * NOTE that EXACT is NOT covered here, as it is normally
4479          * picked up by the optimiser separately. 
4480          *
4481          * This is unfortunate as the optimiser isnt handling lookahead
4482          * properly currently.
4483          *
4484          */
4485         while ((OP(first) == OPEN && (sawopen = 1)) ||
4486                /* An OR of *one* alternative - should not happen now. */
4487             (OP(first) == BRANCH && OP(first_next) != BRANCH) ||
4488             /* for now we can't handle lookbehind IFMATCH*/
4489             (OP(first) == IFMATCH && !first->flags) || 
4490             (OP(first) == PLUS) ||
4491             (OP(first) == MINMOD) ||
4492                /* An {n,m} with n>0 */
4493             (PL_regkind[OP(first)] == CURLY && ARG1(first) > 0) ||
4494             (OP(first) == NOTHING && PL_regkind[OP(first_next)] != END ))
4495         {
4496                 /* 
4497                  * the only op that could be a regnode is PLUS, all the rest
4498                  * will be regnode_1 or regnode_2.
4499                  *
4500                  */
4501                 if (OP(first) == PLUS)
4502                     sawplus = 1;
4503                 else
4504                     first += regarglen[OP(first)];
4505                 
4506                 first = NEXTOPER(first);
4507                 first_next= regnext(first);
4508         }
4509
4510         /* Starting-point info. */
4511       again:
4512         DEBUG_PEEP("first:",first,0);
4513         /* Ignore EXACT as we deal with it later. */
4514         if (PL_regkind[OP(first)] == EXACT) {
4515             if (OP(first) == EXACT)
4516                 NOOP;   /* Empty, get anchored substr later. */
4517             else if ((OP(first) == EXACTF || OP(first) == EXACTFL))
4518                 ri->regstclass = first;
4519         }
4520 #ifdef TRIE_STCLASS     
4521         else if (PL_regkind[OP(first)] == TRIE &&
4522                 ((reg_trie_data *)ri->data->data[ ARG(first) ])->minlen>0) 
4523         {
4524             regnode *trie_op;
4525             /* this can happen only on restudy */
4526             if ( OP(first) == TRIE ) {
4527                 struct regnode_1 *trieop = (struct regnode_1 *)
4528                     PerlMemShared_calloc(1, sizeof(struct regnode_1));
4529                 StructCopy(first,trieop,struct regnode_1);
4530                 trie_op=(regnode *)trieop;
4531             } else {
4532                 struct regnode_charclass *trieop = (struct regnode_charclass *)
4533                     PerlMemShared_calloc(1, sizeof(struct regnode_charclass));
4534                 StructCopy(first,trieop,struct regnode_charclass);
4535                 trie_op=(regnode *)trieop;
4536             }
4537             OP(trie_op)+=2;
4538             make_trie_failtable(pRExC_state, (regnode *)first, trie_op, 0);
4539             ri->regstclass = trie_op;
4540         }
4541 #endif  
4542         else if (strchr((const char*)PL_simple,OP(first)))
4543             ri->regstclass = first;
4544         else if (PL_regkind[OP(first)] == BOUND ||
4545                  PL_regkind[OP(first)] == NBOUND)
4546             ri->regstclass = first;
4547         else if (PL_regkind[OP(first)] == BOL) {
4548             r->extflags |= (OP(first) == MBOL
4549                            ? RXf_ANCH_MBOL
4550                            : (OP(first) == SBOL
4551                               ? RXf_ANCH_SBOL
4552                               : RXf_ANCH_BOL));
4553             first = NEXTOPER(first);
4554             goto again;
4555         }
4556         else if (OP(first) == GPOS) {
4557             r->extflags |= RXf_ANCH_GPOS;
4558             first = NEXTOPER(first);
4559             goto again;
4560         }
4561         else if ((!sawopen || !RExC_sawback) &&
4562             (OP(first) == STAR &&
4563             PL_regkind[OP(NEXTOPER(first))] == REG_ANY) &&
4564             !(r->extflags & RXf_ANCH) && !(RExC_seen & REG_SEEN_EVAL))
4565         {
4566             /* turn .* into ^.* with an implied $*=1 */
4567             const int type =
4568                 (OP(NEXTOPER(first)) == REG_ANY)
4569                     ? RXf_ANCH_MBOL
4570                     : RXf_ANCH_SBOL;
4571             r->extflags |= type;
4572             r->intflags |= PREGf_IMPLICIT;
4573             first = NEXTOPER(first);
4574             goto again;
4575         }
4576         if (sawplus && (!sawopen || !RExC_sawback)
4577             && !(RExC_seen & REG_SEEN_EVAL)) /* May examine pos and $& */
4578             /* x+ must match at the 1st pos of run of x's */
4579             r->intflags |= PREGf_SKIP;
4580
4581         /* Scan is after the zeroth branch, first is atomic matcher. */
4582 #ifdef TRIE_STUDY_OPT
4583         DEBUG_PARSE_r(
4584             if (!restudied)
4585                 PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
4586                               (IV)(first - scan + 1))
4587         );
4588 #else
4589         DEBUG_PARSE_r(
4590             PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
4591                 (IV)(first - scan + 1))
4592         );
4593 #endif
4594
4595
4596         /*
4597         * If there's something expensive in the r.e., find the
4598         * longest literal string that must appear and make it the
4599         * regmust.  Resolve ties in favor of later strings, since
4600         * the regstart check works with the beginning of the r.e.
4601         * and avoiding duplication strengthens checking.  Not a
4602         * strong reason, but sufficient in the absence of others.
4603         * [Now we resolve ties in favor of the earlier string if
4604         * it happens that c_offset_min has been invalidated, since the
4605         * earlier string may buy us something the later one won't.]
4606         */
4607         
4608         data.longest_fixed = newSVpvs("");
4609         data.longest_float = newSVpvs("");
4610         data.last_found = newSVpvs("");
4611         data.longest = &(data.longest_fixed);
4612         first = scan;
4613         if (!ri->regstclass) {
4614             cl_init(pRExC_state, &ch_class);
4615             data.start_class = &ch_class;
4616             stclass_flag = SCF_DO_STCLASS_AND;
4617         } else                          /* XXXX Check for BOUND? */
4618             stclass_flag = 0;
4619         data.last_closep = &last_close;
4620         
4621         minlen = study_chunk(pRExC_state, &first, &minlen, &fake, scan + RExC_size, /* Up to end */
4622             &data, -1, NULL, NULL,
4623             SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag,0);
4624
4625         
4626         CHECK_RESTUDY_GOTO;
4627
4628
4629         if ( RExC_npar == 1 && data.longest == &(data.longest_fixed)
4630              && data.last_start_min == 0 && data.last_end > 0
4631              && !RExC_seen_zerolen
4632              && !(RExC_seen & REG_SEEN_VERBARG)
4633              && (!(RExC_seen & REG_SEEN_GPOS) || (r->extflags & RXf_ANCH_GPOS)))
4634             r->extflags |= RXf_CHECK_ALL;
4635         scan_commit(pRExC_state, &data,&minlen,0);
4636         SvREFCNT_dec(data.last_found);
4637
4638         /* Note that code very similar to this but for anchored string 
4639            follows immediately below, changes may need to be made to both. 
4640            Be careful. 
4641          */
4642         longest_float_length = CHR_SVLEN(data.longest_float);
4643         if (longest_float_length
4644             || (data.flags & SF_FL_BEFORE_EOL
4645                 && (!(data.flags & SF_FL_BEFORE_MEOL)
4646                     || (RExC_flags & RXf_PMf_MULTILINE)))) 
4647         {
4648             I32 t,ml;
4649
4650             if (SvCUR(data.longest_fixed)  /* ok to leave SvCUR */
4651                 && data.offset_fixed == data.offset_float_min
4652                 && SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
4653                     goto remove_float;          /* As in (a)+. */
4654
4655             /* copy the information about the longest float from the reg_scan_data
4656                over to the program. */
4657             if (SvUTF8(data.longest_float)) {
4658                 r->float_utf8 = data.longest_float;
4659                 r->float_substr = NULL;
4660             } else {
4661                 r->float_substr = data.longest_float;
4662                 r->float_utf8 = NULL;
4663             }
4664             /* float_end_shift is how many chars that must be matched that 
4665                follow this item. We calculate it ahead of time as once the
4666                lookbehind offset is added in we lose the ability to correctly
4667                calculate it.*/
4668             ml = data.minlen_float ? *(data.minlen_float) 
4669                                    : (I32)longest_float_length;
4670             r->float_end_shift = ml - data.offset_float_min
4671                 - longest_float_length + (SvTAIL(data.longest_float) != 0)
4672                 + data.lookbehind_float;
4673             r->float_min_offset = data.offset_float_min - data.lookbehind_float;
4674             r->float_max_offset = data.offset_float_max;
4675             if (data.offset_float_max < I32_MAX) /* Don't offset infinity */
4676                 r->float_max_offset -= data.lookbehind_float;
4677             
4678             t = (data.flags & SF_FL_BEFORE_EOL /* Can't have SEOL and MULTI */
4679                        && (!(data.flags & SF_FL_BEFORE_MEOL)
4680                            || (RExC_flags & RXf_PMf_MULTILINE)));
4681             fbm_compile(data.longest_float, t ? FBMcf_TAIL : 0);
4682         }
4683         else {
4684           remove_float:
4685             r->float_substr = r->float_utf8 = NULL;
4686             SvREFCNT_dec(data.longest_float);
4687             longest_float_length = 0;
4688         }
4689
4690         /* Note that code very similar to this but for floating string 
4691            is immediately above, changes may need to be made to both. 
4692            Be careful. 
4693          */
4694         longest_fixed_length = CHR_SVLEN(data.longest_fixed);
4695         if (longest_fixed_length
4696             || (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
4697                 && (!(data.flags & SF_FIX_BEFORE_MEOL)
4698                     || (RExC_flags & RXf_PMf_MULTILINE)))) 
4699         {
4700             I32 t,ml;
4701
4702             /* copy the information about the longest fixed 
4703                from the reg_scan_data over to the program. */
4704             if (SvUTF8(data.longest_fixed)) {
4705                 r->anchored_utf8 = data.longest_fixed;
4706                 r->anchored_substr = NULL;
4707             } else {
4708                 r->anchored_substr = data.longest_fixed;
4709                 r->anchored_utf8 = NULL;
4710             }
4711             /* fixed_end_shift is how many chars that must be matched that 
4712                follow this item. We calculate it ahead of time as once the
4713                lookbehind offset is added in we lose the ability to correctly
4714                calculate it.*/
4715             ml = data.minlen_fixed ? *(data.minlen_fixed) 
4716                                    : (I32)longest_fixed_length;
4717             r->anchored_end_shift = ml - data.offset_fixed
4718                 - longest_fixed_length + (SvTAIL(data.longest_fixed) != 0)
4719                 + data.lookbehind_fixed;
4720             r->anchored_offset = data.offset_fixed - data.lookbehind_fixed;
4721
4722             t = (data.flags & SF_FIX_BEFORE_EOL /* Can't have SEOL and MULTI */
4723                  && (!(data.flags & SF_FIX_BEFORE_MEOL)
4724                      || (RExC_flags & RXf_PMf_MULTILINE)));
4725             fbm_compile(data.longest_fixed, t ? FBMcf_TAIL : 0);
4726         }
4727         else {
4728             r->anchored_substr = r->anchored_utf8 = NULL;
4729             SvREFCNT_dec(data.longest_fixed);
4730             longest_fixed_length = 0;
4731         }
4732         if (ri->regstclass
4733             && (OP(ri->regstclass) == REG_ANY || OP(ri->regstclass) == SANY))
4734             ri->regstclass = NULL;
4735         if ((!(r->anchored_substr || r->anchored_utf8) || r->anchored_offset)
4736             && stclass_flag
4737             && !(data.start_class->flags & ANYOF_EOS)
4738             && !cl_is_anything(data.start_class))
4739         {
4740             const U32 n = add_data(pRExC_state, 1, "f");
4741
4742             Newx(RExC_rxi->data->data[n], 1,
4743                 struct regnode_charclass_class);
4744             StructCopy(data.start_class,
4745                        (struct regnode_charclass_class*)RExC_rxi->data->data[n],
4746                        struct regnode_charclass_class);
4747             ri->regstclass = (regnode*)RExC_rxi->data->data[n];
4748             r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
4749             DEBUG_COMPILE_r({ SV *sv = sv_newmortal();
4750                       regprop(r, sv, (regnode*)data.start_class);
4751                       PerlIO_printf(Perl_debug_log,
4752                                     "synthetic stclass \"%s\".\n",
4753                                     SvPVX_const(sv));});
4754         }
4755
4756         /* A temporary algorithm prefers floated substr to fixed one to dig more info. */
4757         if (longest_fixed_length > longest_float_length) {
4758             r->check_end_shift = r->anchored_end_shift;
4759             r->check_substr = r->anchored_substr;
4760             r->check_utf8 = r->anchored_utf8;
4761             r->check_offset_min = r->check_offset_max = r->anchored_offset;
4762             if (r->extflags & RXf_ANCH_SINGLE)
4763                 r->extflags |= RXf_NOSCAN;
4764         }
4765         else {
4766             r->check_end_shift = r->float_end_shift;
4767             r->check_substr = r->float_substr;
4768             r->check_utf8 = r->float_utf8;
4769             r->check_offset_min = r->float_min_offset;
4770             r->check_offset_max = r->float_max_offset;
4771         }
4772         /* XXXX Currently intuiting is not compatible with ANCH_GPOS.
4773            This should be changed ASAP!  */
4774         if ((r->check_substr || r->check_utf8) && !(r->extflags & RXf_ANCH_GPOS)) {
4775             r->extflags |= RXf_USE_INTUIT;
4776             if (SvTAIL(r->check_substr ? r->check_substr : r->check_utf8))
4777                 r->extflags |= RXf_INTUIT_TAIL;
4778         }
4779         /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere)
4780         if ( (STRLEN)minlen < longest_float_length )
4781             minlen= longest_float_length;
4782         if ( (STRLEN)minlen < longest_fixed_length )
4783             minlen= longest_fixed_length;     
4784         */
4785     }
4786     else {
4787         /* Several toplevels. Best we can is to set minlen. */
4788         I32 fake;
4789         struct regnode_charclass_class ch_class;
4790         I32 last_close = 0;
4791         
4792         DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "\nMulti Top Level\n"));
4793
4794         scan = ri->program + 1;
4795         cl_init(pRExC_state, &ch_class);
4796         data.start_class = &ch_class;
4797         data.last_closep = &last_close;
4798
4799         
4800         minlen = study_chunk(pRExC_state, &scan, &minlen, &fake, scan + RExC_size,
4801             &data, -1, NULL, NULL, SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS,0);
4802         
4803         CHECK_RESTUDY_GOTO;
4804
4805         r->check_substr = r->check_utf8 = r->anchored_substr = r->anchored_utf8
4806                 = r->float_substr = r->float_utf8 = NULL;
4807         if (!(data.start_class->flags & ANYOF_EOS)
4808             && !cl_is_anything(data.start_class))
4809         {
4810             const U32 n = add_data(pRExC_state, 1, "f");
4811
4812             Newx(RExC_rxi->data->data[n], 1,
4813                 struct regnode_charclass_class);
4814             StructCopy(data.start_class,
4815                        (struct regnode_charclass_class*)RExC_rxi->data->data[n],
4816                        struct regnode_charclass_class);
4817             ri->regstclass = (regnode*)RExC_rxi->data->data[n];
4818             r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
4819             DEBUG_COMPILE_r({ SV* sv = sv_newmortal();
4820                       regprop(r, sv, (regnode*)data.start_class);
4821                       PerlIO_printf(Perl_debug_log,
4822                                     "synthetic stclass \"%s\".\n",
4823                                     SvPVX_const(sv));});
4824         }
4825     }
4826
4827     /* Guard against an embedded (?=) or (?<=) with a longer minlen than
4828        the "real" pattern. */
4829     DEBUG_OPTIMISE_r({
4830         PerlIO_printf(Perl_debug_log,"minlen: %"IVdf" r->minlen:%"IVdf"\n",
4831                       (IV)minlen, (IV)r->minlen);
4832     });
4833     r->minlenret = minlen;
4834     if (r->minlen < minlen) 
4835         r->minlen = minlen;
4836     
4837     if (RExC_seen & REG_SEEN_GPOS)
4838         r->extflags |= RXf_GPOS_SEEN;
4839     if (RExC_seen & REG_SEEN_LOOKBEHIND)
4840         r->extflags |= RXf_LOOKBEHIND_SEEN;
4841     if (RExC_seen & REG_SEEN_EVAL)
4842         r->extflags |= RXf_EVAL_SEEN;
4843     if (RExC_seen & REG_SEEN_CANY)
4844         r->extflags |= RXf_CANY_SEEN;
4845     if (RExC_seen & REG_SEEN_VERBARG)
4846         r->intflags |= PREGf_VERBARG_SEEN;
4847     if (RExC_seen & REG_SEEN_CUTGROUP)
4848         r->intflags |= PREGf_CUTGROUP_SEEN;
4849     if (RExC_paren_names)
4850         RXp_PAREN_NAMES(r) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names));
4851     else
4852         RXp_PAREN_NAMES(r) = NULL;
4853
4854 #ifdef STUPID_PATTERN_CHECKS            
4855     if (RX_PRELEN(r) == 0)
4856         r->extflags |= RXf_NULL;
4857     if (r->extflags & RXf_SPLIT && RX_PRELEN(r) == 1 && RX_PRECOMP(r)[0] == ' ')
4858         /* XXX: this should happen BEFORE we compile */
4859         r->extflags |= (RXf_SKIPWHITE|RXf_WHITE); 
4860     else if (RX_PRELEN(r) == 3 && memEQ("\\s+", RX_PRECOMP(r), 3))
4861         r->extflags |= RXf_WHITE;
4862     else if (RX_PRELEN(r) == 1 && RXp_PRECOMP(r)[0] == '^')
4863         r->extflags |= RXf_START_ONLY;
4864 #else
4865     if (r->extflags & RXf_SPLIT && RX_PRELEN(r) == 1 && RX_PRECOMP(r)[0] == ' ')
4866             /* XXX: this should happen BEFORE we compile */
4867             r->extflags |= (RXf_SKIPWHITE|RXf_WHITE); 
4868     else {
4869         regnode *first = ri->program + 1;
4870         U8 fop = OP(first);
4871         U8 nop = OP(NEXTOPER(first));
4872         
4873         if (PL_regkind[fop] == NOTHING && nop == END)
4874             r->extflags |= RXf_NULL;
4875         else if (PL_regkind[fop] == BOL && nop == END)
4876             r->extflags |= RXf_START_ONLY;
4877         else if (fop == PLUS && nop ==SPACE && OP(regnext(first))==END)
4878             r->extflags |= RXf_WHITE;    
4879     }
4880 #endif
4881 #ifdef DEBUGGING
4882     if (RExC_paren_names) {
4883         ri->name_list_idx = add_data( pRExC_state, 1, "p" );
4884         ri->data->data[ri->name_list_idx] = (void*)SvREFCNT_inc(RExC_paren_name_list);
4885     } else
4886 #endif
4887         ri->name_list_idx = 0;
4888
4889     if (RExC_recurse_count) {
4890         for ( ; RExC_recurse_count ; RExC_recurse_count-- ) {
4891             const regnode *scan = RExC_recurse[RExC_recurse_count-1];
4892             ARG2L_SET( scan, RExC_open_parens[ARG(scan)-1] - scan );
4893         }
4894     }
4895     Newxz(r->offs, RExC_npar, regexp_paren_pair);
4896     /* assume we don't need to swap parens around before we match */
4897
4898     DEBUG_DUMP_r({
4899         PerlIO_printf(Perl_debug_log,"Final program:\n");
4900         regdump(r);
4901     });
4902 #ifdef RE_TRACK_PATTERN_OFFSETS
4903     DEBUG_OFFSETS_r(if (ri->u.offsets) {
4904         const U32 len = ri->u.offsets[0];
4905         U32 i;
4906         GET_RE_DEBUG_FLAGS_DECL;
4907         PerlIO_printf(Perl_debug_log, "Offsets: [%"UVuf"]\n\t", (UV)ri->u.offsets[0]);
4908         for (i = 1; i <= len; i++) {
4909             if (ri->u.offsets[i*2-1] || ri->u.offsets[i*2])
4910                 PerlIO_printf(Perl_debug_log, "%"UVuf":%"UVuf"[%"UVuf"] ",
4911                 (UV)i, (UV)ri->u.offsets[i*2-1], (UV)ri->u.offsets[i*2]);
4912             }
4913         PerlIO_printf(Perl_debug_log, "\n");
4914     });
4915 #endif
4916     return(r);
4917 }
4918
4919 #undef RE_ENGINE_PTR
4920
4921
4922 SV*
4923 Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value,
4924                     const U32 flags)
4925 {
4926     PERL_ARGS_ASSERT_REG_NAMED_BUFF;
4927
4928     PERL_UNUSED_ARG(value);
4929
4930     if (flags & RXapif_FETCH) {
4931         return reg_named_buff_fetch(rx, key, flags);
4932     } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) {
4933         Perl_croak(aTHX_ "%s", PL_no_modify);
4934         return NULL;
4935     } else if (flags & RXapif_EXISTS) {
4936         return reg_named_buff_exists(rx, key, flags)
4937             ? &PL_sv_yes
4938             : &PL_sv_no;
4939     } else if (flags & RXapif_REGNAMES) {
4940         return reg_named_buff_all(rx, flags);
4941     } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) {
4942         return reg_named_buff_scalar(rx, flags);
4943     } else {
4944         Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags);
4945         return NULL;
4946     }
4947 }
4948
4949 SV*
4950 Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey,
4951                          const U32 flags)
4952 {
4953     PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER;
4954     PERL_UNUSED_ARG(lastkey);
4955
4956     if (flags & RXapif_FIRSTKEY)
4957         return reg_named_buff_firstkey(rx, flags);
4958     else if (flags & RXapif_NEXTKEY)
4959         return reg_named_buff_nextkey(rx, flags);
4960     else {
4961         Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter", (int)flags);
4962         return NULL;
4963     }
4964 }
4965
4966 SV*
4967 Perl_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const namesv, const U32 flags)
4968 {
4969     AV *retarray = NULL;
4970     SV *ret;
4971
4972     PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH;
4973
4974     if (flags & RXapif_ALL)
4975         retarray=newAV();
4976
4977     if (rx && RXp_PAREN_NAMES(rx)) {
4978         HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 );
4979         if (he_str) {
4980             IV i;
4981             SV* sv_dat=HeVAL(he_str);
4982             I32 *nums=(I32*)SvPVX(sv_dat);
4983             for ( i=0; i<SvIVX(sv_dat); i++ ) {
4984                 if ((I32)(rx->nparens) >= nums[i]
4985                     && rx->offs[nums[i]].start != -1
4986                     && rx->offs[nums[i]].end != -1)
4987                 {
4988                     ret = newSVpvs("");
4989                     CALLREG_NUMBUF_FETCH(rx,nums[i],ret);
4990                     if (!retarray)
4991                         return ret;
4992                 } else {
4993                     ret = newSVsv(&PL_sv_undef);
4994                 }
4995                 if (retarray)
4996                     av_push(retarray, ret);
4997             }
4998             if (retarray)
4999                 return newRV_noinc(MUTABLE_SV(retarray));
5000         }
5001     }
5002     return NULL;
5003 }
5004
5005 bool
5006 Perl_reg_named_buff_exists(pTHX_ REGEXP * const rx, SV * const key,
5007                            const U32 flags)
5008 {
5009
5010     PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS;
5011
5012     if (rx && RXp_PAREN_NAMES(rx)) {
5013         if (flags & RXapif_ALL) {
5014             return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0);
5015         } else {
5016             SV *sv = CALLREG_NAMED_BUFF_FETCH(rx, key, flags);
5017             if (sv) {
5018                 SvREFCNT_dec(sv);
5019                 return TRUE;
5020             } else {
5021                 return FALSE;
5022             }
5023         }
5024     } else {
5025         return FALSE;
5026     }
5027 }
5028
5029 SV*
5030 Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const rx, const U32 flags)
5031 {
5032
5033     PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY;
5034
5035     if ( rx && RXp_PAREN_NAMES(rx) ) {
5036         (void)hv_iterinit(RXp_PAREN_NAMES(rx));
5037
5038         return CALLREG_NAMED_BUFF_NEXTKEY(rx, NULL, flags & ~RXapif_FIRSTKEY);
5039     } else {
5040         return FALSE;
5041     }
5042 }
5043
5044 SV*
5045 Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const rx, const U32 flags)
5046 {
5047     GET_RE_DEBUG_FLAGS_DECL;
5048
5049     PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY;
5050
5051     if (rx && RXp_PAREN_NAMES(rx)) {
5052         HV *hv = RXp_PAREN_NAMES(rx);
5053         HE *temphe;
5054         while ( (temphe = hv_iternext_flags(hv,0)) ) {
5055             IV i;
5056             IV parno = 0;
5057             SV* sv_dat = HeVAL(temphe);
5058             I32 *nums = (I32*)SvPVX(sv_dat);
5059             for ( i = 0; i < SvIVX(sv_dat); i++ ) {
5060                 if ((I32)(rx->lastparen) >= nums[i] &&
5061                     rx->offs[nums[i]].start != -1 &&
5062                     rx->offs[nums[i]].end != -1)
5063                 {
5064                     parno = nums[i];
5065                     break;
5066                 }
5067             }
5068             if (parno || flags & RXapif_ALL) {
5069                 return newSVhek(HeKEY_hek(temphe));
5070             }
5071         }
5072     }
5073     return NULL;
5074 }
5075
5076 SV*
5077 Perl_reg_named_buff_scalar(pTHX_ REGEXP * const rx, const U32 flags)
5078 {
5079     SV *ret;
5080     AV *av;
5081     I32 length;
5082
5083     PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR;
5084
5085     if (rx && RXp_PAREN_NAMES(rx)) {
5086         if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) {
5087             return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx)));
5088         } else if (flags & RXapif_ONE) {
5089             ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
5090             av = MUTABLE_AV(SvRV(ret));
5091             length = av_len(av);
5092             SvREFCNT_dec(ret);
5093             return newSViv(length + 1);
5094         } else {
5095             Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar", (int)flags);
5096             return NULL;
5097         }
5098     }
5099     return &PL_sv_undef;
5100 }
5101
5102 SV*
5103 Perl_reg_named_buff_all(pTHX_ REGEXP * const rx, const U32 flags)
5104 {
5105     AV *av = newAV();
5106
5107     PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL;
5108
5109     if (rx && RXp_PAREN_NAMES(rx)) {
5110         HV *hv= RXp_PAREN_NAMES(rx);
5111         HE *temphe;
5112         (void)hv_iterinit(hv);
5113         while ( (temphe = hv_iternext_flags(hv,0)) ) {
5114             IV i;
5115             IV parno = 0;
5116             SV* sv_dat = HeVAL(temphe);
5117             I32 *nums = (I32*)SvPVX(sv_dat);
5118             for ( i = 0; i < SvIVX(sv_dat); i++ ) {
5119                 if ((I32)(rx->lastparen) >= nums[i] &&
5120                     rx->offs[nums[i]].start != -1 &&
5121                     rx->offs[nums[i]].end != -1)
5122                 {
5123                     parno = nums[i];
5124                     break;
5125                 }
5126             }
5127             if (parno || flags & RXapif_ALL) {
5128                 av_push(av, newSVhek(HeKEY_hek(temphe)));
5129             }
5130         }
5131     }
5132
5133     return newRV_noinc(MUTABLE_SV(av));
5134 }
5135
5136 void
5137 Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren, SV * const sv)
5138 {
5139     char *s = NULL;
5140     I32 i = 0;
5141     I32 s1, t1;
5142
5143     PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH;
5144         
5145     if (!rx->subbeg) {
5146         sv_setsv(sv,&PL_sv_undef);
5147         return;
5148     } 
5149     else               
5150     if (paren == RX_BUFF_IDX_PREMATCH && rx->offs[0].start != -1) {
5151         /* $` */
5152         i = rx->offs[0].start;
5153         s = rx->subbeg;
5154     }
5155     else 
5156     if (paren == RX_BUFF_IDX_POSTMATCH && rx->offs[0].end != -1) {
5157         /* $' */
5158         s = rx->subbeg + rx->offs[0].end;
5159         i = rx->sublen - rx->offs[0].end;
5160     } 
5161     else
5162     if ( 0 <= paren && paren <= (I32)rx->nparens &&
5163         (s1 = rx->offs[paren].start) != -1 &&
5164         (t1 = rx->offs[paren].end) != -1)
5165     {
5166         /* $& $1 ... */
5167         i = t1 - s1;
5168         s = rx->subbeg + s1;
5169     } else {
5170         sv_setsv(sv,&PL_sv_undef);
5171         return;
5172     }          
5173     assert(rx->sublen >= (s - rx->subbeg) + i );
5174     if (i >= 0) {
5175         const int oldtainted = PL_tainted;
5176         TAINT_NOT;
5177         sv_setpvn(sv, s, i);
5178         PL_tainted = oldtainted;
5179         if ( (rx->extflags & RXf_CANY_SEEN)
5180             ? (RXp_MATCH_UTF8(rx)
5181                         && (!i || is_utf8_string((U8*)s, i)))
5182             : (RXp_MATCH_UTF8(rx)) )
5183         {
5184             SvUTF8_on(sv);
5185         }
5186         else
5187             SvUTF8_off(sv);
5188         if (PL_tainting) {
5189             if (RXp_MATCH_TAINTED(rx)) {
5190                 if (SvTYPE(sv) >= SVt_PVMG) {
5191                     MAGIC* const mg = SvMAGIC(sv);
5192                     MAGIC* mgt;
5193                     PL_tainted = 1;
5194                     SvMAGIC_set(sv, mg->mg_moremagic);
5195                     SvTAINT(sv);
5196                     if ((mgt = SvMAGIC(sv))) {
5197                         mg->mg_moremagic = mgt;
5198                         SvMAGIC_set(sv, mg);
5199                     }
5200                 } else {
5201                     PL_tainted = 1;
5202                     SvTAINT(sv);
5203                 }
5204             } else 
5205                 SvTAINTED_off(sv);
5206         }
5207     } else {
5208         sv_setsv(sv,&PL_sv_undef);
5209         return;
5210     }
5211 }
5212
5213 void
5214 Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren,
5215                                                          SV const * const value)
5216 {
5217     PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE;
5218
5219     PERL_UNUSED_ARG(rx);
5220     PERL_UNUSED_ARG(paren);
5221     PERL_UNUSED_ARG(value);
5222
5223     if (!PL_localizing)
5224         Perl_croak(aTHX_ "%s", PL_no_modify);
5225 }
5226
5227 I32
5228 Perl_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const SV * const sv,
5229                               const I32 paren)
5230 {
5231     I32 i;
5232     I32 s1, t1;
5233
5234     PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH;
5235
5236     /* Some of this code was originally in C<Perl_magic_len> in F<mg.c> */
5237         switch (paren) {
5238       /* $` / ${^PREMATCH} */
5239       case RX_BUFF_IDX_PREMATCH:
5240         if (rx->offs[0].start != -1) {
5241                         i = rx->offs[0].start;
5242                         if (i > 0) {
5243                                 s1 = 0;
5244                                 t1 = i;
5245                                 goto getlen;
5246                         }
5247             }
5248         return 0;
5249       /* $' / ${^POSTMATCH} */
5250       case RX_BUFF_IDX_POSTMATCH:
5251             if (rx->offs[0].end != -1) {
5252                         i = rx->sublen - rx->offs[0].end;
5253                         if (i > 0) {
5254                                 s1 = rx->offs[0].end;
5255                                 t1 = rx->sublen;
5256                                 goto getlen;
5257                         }
5258             }
5259         return 0;
5260       /* $& / ${^MATCH}, $1, $2, ... */
5261       default:
5262             if (paren <= (I32)rx->nparens &&
5263             (s1 = rx->offs[paren].start) != -1 &&
5264             (t1 = rx->offs[paren].end) != -1)
5265             {
5266             i = t1 - s1;
5267             goto getlen;
5268         } else {
5269             if (ckWARN(WARN_UNINITIALIZED))
5270                 report_uninit((SV *)sv);
5271             return 0;
5272         }
5273     }
5274   getlen:
5275     if (i > 0 && RXp_MATCH_UTF8(rx)) {
5276         const char * const s = rx->subbeg + s1;
5277         const U8 *ep;
5278         STRLEN el;
5279
5280         i = t1 - s1;
5281         if (is_utf8_string_loclen((U8*)s, i, &ep, &el))
5282                         i = el;
5283     }
5284     return i;
5285 }
5286
5287 SV*
5288 Perl_reg_qr_package(pTHX_ REGEXP * const rx)
5289 {
5290     PERL_ARGS_ASSERT_REG_QR_PACKAGE;
5291         PERL_UNUSED_ARG(rx);
5292         return newSVpvs("Regexp");
5293 }
5294
5295 /* Scans the name of a named buffer from the pattern.
5296  * If flags is REG_RSN_RETURN_NULL returns null.
5297  * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
5298  * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
5299  * to the parsed name as looked up in the RExC_paren_names hash.
5300  * If there is an error throws a vFAIL().. type exception.
5301  */
5302
5303 #define REG_RSN_RETURN_NULL    0
5304 #define REG_RSN_RETURN_NAME    1
5305 #define REG_RSN_RETURN_DATA    2
5306
5307 STATIC SV*
5308 S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags)
5309 {
5310     char *name_start = RExC_parse;
5311
5312     PERL_ARGS_ASSERT_REG_SCAN_NAME;
5313
5314     if (isIDFIRST_lazy_if(RExC_parse, UTF)) {
5315          /* skip IDFIRST by using do...while */
5316         if (UTF)
5317             do {
5318                 RExC_parse += UTF8SKIP(RExC_parse);
5319             } while (isALNUM_utf8((U8*)RExC_parse));
5320         else
5321             do {
5322                 RExC_parse++;
5323             } while (isALNUM(*RExC_parse));
5324     }
5325
5326     if ( flags ) {
5327         SV* sv_name
5328             = newSVpvn_flags(name_start, (int)(RExC_parse - name_start),
5329                              SVs_TEMP | (UTF ? SVf_UTF8 : 0));
5330         if ( flags == REG_RSN_RETURN_NAME)
5331             return sv_name;
5332         else if (flags==REG_RSN_RETURN_DATA) {
5333             HE *he_str = NULL;
5334             SV *sv_dat = NULL;
5335             if ( ! sv_name )      /* should not happen*/
5336                 Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
5337             if (RExC_paren_names)
5338                 he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
5339             if ( he_str )
5340                 sv_dat = HeVAL(he_str);
5341             if ( ! sv_dat )
5342                 vFAIL("Reference to nonexistent named group");
5343             return sv_dat;
5344         }
5345         else {
5346             Perl_croak(aTHX_ "panic: bad flag in reg_scan_name");
5347         }
5348         /* NOT REACHED */
5349     }
5350     return NULL;
5351 }
5352
5353 #define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
5354     int rem=(int)(RExC_end - RExC_parse);                       \
5355     int cut;                                                    \
5356     int num;                                                    \
5357     int iscut=0;                                                \
5358     if (rem>10) {                                               \
5359         rem=10;                                                 \
5360         iscut=1;                                                \
5361     }                                                           \
5362     cut=10-rem;                                                 \
5363     if (RExC_lastparse!=RExC_parse)                             \
5364         PerlIO_printf(Perl_debug_log," >%.*s%-*s",              \
5365             rem, RExC_parse,                                    \
5366             cut + 4,                                            \
5367             iscut ? "..." : "<"                                 \
5368         );                                                      \
5369     else                                                        \
5370         PerlIO_printf(Perl_debug_log,"%16s","");                \
5371                                                                 \
5372     if (SIZE_ONLY)                                              \
5373        num = RExC_size + 1;                                     \
5374     else                                                        \
5375        num=REG_NODE_NUM(RExC_emit);                             \
5376     if (RExC_lastnum!=num)                                      \
5377        PerlIO_printf(Perl_debug_log,"|%4d",num);                \
5378     else                                                        \
5379        PerlIO_printf(Perl_debug_log,"|%4s","");                 \
5380     PerlIO_printf(Perl_debug_log,"|%*s%-4s",                    \
5381         (int)((depth*2)), "",                                   \
5382         (funcname)                                              \
5383     );                                                          \
5384     RExC_lastnum=num;                                           \
5385     RExC_lastparse=RExC_parse;                                  \
5386 })
5387
5388
5389
5390 #define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
5391     DEBUG_PARSE_MSG((funcname));                            \
5392     PerlIO_printf(Perl_debug_log,"%4s","\n");               \
5393 })
5394 #define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({           \
5395     DEBUG_PARSE_MSG((funcname));                            \
5396     PerlIO_printf(Perl_debug_log,fmt "\n",args);               \
5397 })
5398 /*
5399  - reg - regular expression, i.e. main body or parenthesized thing
5400  *
5401  * Caller must absorb opening parenthesis.
5402  *
5403  * Combining parenthesis handling with the base level of regular expression
5404  * is a trifle forced, but the need to tie the tails of the branches to what
5405  * follows makes it hard to avoid.
5406  */
5407 #define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1)
5408 #ifdef DEBUGGING
5409 #define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1)
5410 #else
5411 #define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
5412 #endif
5413
5414 STATIC regnode *
5415 S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
5416     /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
5417 {
5418     dVAR;
5419     register regnode *ret;              /* Will be the head of the group. */
5420     register regnode *br;
5421     register regnode *lastbr;
5422     register regnode *ender = NULL;
5423     register I32 parno = 0;
5424     I32 flags;
5425     U32 oregflags = RExC_flags;
5426     bool have_branch = 0;
5427     bool is_open = 0;
5428     I32 freeze_paren = 0;
5429     I32 after_freeze = 0;
5430
5431     /* for (?g), (?gc), and (?o) warnings; warning
5432        about (?c) will warn about (?g) -- japhy    */
5433
5434 #define WASTED_O  0x01
5435 #define WASTED_G  0x02
5436 #define WASTED_C  0x04
5437 #define WASTED_GC (0x02|0x04)
5438     I32 wastedflags = 0x00;
5439
5440     char * parse_start = RExC_parse; /* MJD */
5441     char * const oregcomp_parse = RExC_parse;
5442
5443     GET_RE_DEBUG_FLAGS_DECL;
5444
5445     PERL_ARGS_ASSERT_REG;
5446     DEBUG_PARSE("reg ");
5447
5448     *flagp = 0;                         /* Tentatively. */
5449
5450
5451     /* Make an OPEN node, if parenthesized. */
5452     if (paren) {
5453         if ( *RExC_parse == '*') { /* (*VERB:ARG) */
5454             char *start_verb = RExC_parse;
5455             STRLEN verb_len = 0;
5456             char *start_arg = NULL;
5457             unsigned char op = 0;
5458             int argok = 1;
5459             int internal_argval = 0; /* internal_argval is only useful if !argok */
5460             while ( *RExC_parse && *RExC_parse != ')' ) {
5461                 if ( *RExC_parse == ':' ) {
5462                     start_arg = RExC_parse + 1;
5463                     break;
5464                 }
5465                 RExC_parse++;
5466             }
5467             ++start_verb;
5468             verb_len = RExC_parse - start_verb;
5469             if ( start_arg ) {
5470                 RExC_parse++;
5471                 while ( *RExC_parse && *RExC_parse != ')' ) 
5472                     RExC_parse++;
5473                 if ( *RExC_parse != ')' ) 
5474                     vFAIL("Unterminated verb pattern argument");
5475                 if ( RExC_parse == start_arg )
5476                     start_arg = NULL;
5477             } else {
5478                 if ( *RExC_parse != ')' )
5479                     vFAIL("Unterminated verb pattern");
5480             }
5481             
5482             switch ( *start_verb ) {
5483             case 'A':  /* (*ACCEPT) */
5484                 if ( memEQs(start_verb,verb_len,"ACCEPT") ) {
5485                     op = ACCEPT;
5486                     internal_argval = RExC_nestroot;
5487                 }
5488                 break;
5489             case 'C':  /* (*COMMIT) */
5490                 if ( memEQs(start_verb,verb_len,"COMMIT") )
5491                     op = COMMIT;
5492                 break;
5493             case 'F':  /* (*FAIL) */
5494                 if ( verb_len==1 || memEQs(start_verb,verb_len,"FAIL") ) {
5495                     op = OPFAIL;
5496                     argok = 0;
5497                 }
5498                 break;
5499             case ':':  /* (*:NAME) */
5500             case 'M':  /* (*MARK:NAME) */
5501                 if ( verb_len==0 || memEQs(start_verb,verb_len,"MARK") ) {
5502                     op = MARKPOINT;
5503                     argok = -1;
5504                 }
5505                 break;
5506             case 'P':  /* (*PRUNE) */
5507                 if ( memEQs(start_verb,verb_len,"PRUNE") )
5508                     op = PRUNE;
5509                 break;
5510             case 'S':   /* (*SKIP) */  
5511                 if ( memEQs(start_verb,verb_len,"SKIP") ) 
5512                     op = SKIP;
5513                 break;
5514             case 'T':  /* (*THEN) */
5515                 /* [19:06] <TimToady> :: is then */
5516                 if ( memEQs(start_verb,verb_len,"THEN") ) {
5517                     op = CUTGROUP;
5518                     RExC_seen |= REG_SEEN_CUTGROUP;
5519                 }
5520                 break;
5521             }
5522             if ( ! op ) {
5523                 RExC_parse++;
5524                 vFAIL3("Unknown verb pattern '%.*s'",
5525                     verb_len, start_verb);
5526             }
5527             if ( argok ) {
5528                 if ( start_arg && internal_argval ) {
5529                     vFAIL3("Verb pattern '%.*s' may not have an argument",
5530                         verb_len, start_verb); 
5531                 } else if ( argok < 0 && !start_arg ) {
5532                     vFAIL3("Verb pattern '%.*s' has a mandatory argument",
5533                         verb_len, start_verb);    
5534                 } else {
5535                     ret = reganode(pRExC_state, op, internal_argval);
5536                     if ( ! internal_argval && ! SIZE_ONLY ) {
5537                         if (start_arg) {
5538                             SV *sv = newSVpvn( start_arg, RExC_parse - start_arg);
5539                             ARG(ret) = add_data( pRExC_state, 1, "S" );
5540                             RExC_rxi->data->data[ARG(ret)]=(void*)sv;
5541                             ret->flags = 0;
5542                         } else {
5543                             ret->flags = 1; 
5544                         }
5545                     }               
5546                 }
5547                 if (!internal_argval)
5548                     RExC_seen |= REG_SEEN_VERBARG;
5549             } else if ( start_arg ) {
5550                 vFAIL3("Verb pattern '%.*s' may not have an argument",
5551                         verb_len, start_verb);    
5552             } else {
5553                 ret = reg_node(pRExC_state, op);
5554             }
5555             nextchar(pRExC_state);
5556             return ret;
5557         } else 
5558         if (*RExC_parse == '?') { /* (?...) */
5559             bool is_logical = 0;
5560             const char * const seqstart = RExC_parse;
5561
5562             RExC_parse++;
5563             paren = *RExC_parse++;
5564             ret = NULL;                 /* For look-ahead/behind. */
5565             switch (paren) {
5566
5567             case 'P':   /* (?P...) variants for those used to PCRE/Python */
5568                 paren = *RExC_parse++;
5569                 if ( paren == '<')         /* (?P<...>) named capture */
5570                     goto named_capture;
5571                 else if (paren == '>') {   /* (?P>name) named recursion */
5572                     goto named_recursion;
5573                 }
5574                 else if (paren == '=') {   /* (?P=...)  named backref */
5575                     /* this pretty much dupes the code for \k<NAME> in regatom(), if
5576                        you change this make sure you change that */
5577                     char* name_start = RExC_parse;
5578                     U32 num = 0;
5579                     SV *sv_dat = reg_scan_name(pRExC_state,
5580                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5581                     if (RExC_parse == name_start || *RExC_parse != ')')
5582                         vFAIL2("Sequence %.3s... not terminated",parse_start);
5583
5584                     if (!SIZE_ONLY) {
5585                         num = add_data( pRExC_state, 1, "S" );
5586                         RExC_rxi->data->data[num]=(void*)sv_dat;
5587                         SvREFCNT_inc_simple_void(sv_dat);
5588                     }
5589                     RExC_sawback = 1;
5590                     ret = reganode(pRExC_state,
5591                            (U8)(FOLD ? (LOC ? NREFFL : NREFF) : NREF),
5592                            num);
5593                     *flagp |= HASWIDTH;
5594
5595                     Set_Node_Offset(ret, parse_start+1);
5596                     Set_Node_Cur_Length(ret); /* MJD */
5597
5598                     nextchar(pRExC_state);
5599                     return ret;
5600                 }
5601                 RExC_parse++;
5602                 vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5603                 /*NOTREACHED*/
5604             case '<':           /* (?<...) */
5605                 if (*RExC_parse == '!')
5606                     paren = ',';
5607                 else if (*RExC_parse != '=') 
5608               named_capture:
5609                 {               /* (?<...>) */
5610                     char *name_start;
5611                     SV *svname;
5612                     paren= '>';
5613             case '\'':          /* (?'...') */
5614                     name_start= RExC_parse;
5615                     svname = reg_scan_name(pRExC_state,
5616                         SIZE_ONLY ?  /* reverse test from the others */
5617                         REG_RSN_RETURN_NAME : 
5618                         REG_RSN_RETURN_NULL);
5619                     if (RExC_parse == name_start) {
5620                         RExC_parse++;
5621                         vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5622                         /*NOTREACHED*/
5623                     }
5624                     if (*RExC_parse != paren)
5625                         vFAIL2("Sequence (?%c... not terminated",
5626                             paren=='>' ? '<' : paren);
5627                     if (SIZE_ONLY) {
5628                         HE *he_str;
5629                         SV *sv_dat = NULL;
5630                         if (!svname) /* shouldnt happen */
5631                             Perl_croak(aTHX_
5632                                 "panic: reg_scan_name returned NULL");
5633                         if (!RExC_paren_names) {
5634                             RExC_paren_names= newHV();
5635                             sv_2mortal(MUTABLE_SV(RExC_paren_names));
5636 #ifdef DEBUGGING
5637                             RExC_paren_name_list= newAV();
5638                             sv_2mortal(MUTABLE_SV(RExC_paren_name_list));
5639 #endif
5640                         }
5641                         he_str = hv_fetch_ent( RExC_paren_names, svname, 1, 0 );
5642                         if ( he_str )
5643                             sv_dat = HeVAL(he_str);
5644                         if ( ! sv_dat ) {
5645                             /* croak baby croak */
5646                             Perl_croak(aTHX_
5647                                 "panic: paren_name hash element allocation failed");
5648                         } else if ( SvPOK(sv_dat) ) {
5649                             /* (?|...) can mean we have dupes so scan to check
5650                                its already been stored. Maybe a flag indicating
5651                                we are inside such a construct would be useful,
5652                                but the arrays are likely to be quite small, so
5653                                for now we punt -- dmq */
5654                             IV count = SvIV(sv_dat);
5655                             I32 *pv = (I32*)SvPVX(sv_dat);
5656                             IV i;
5657                             for ( i = 0 ; i < count ; i++ ) {
5658                                 if ( pv[i] == RExC_npar ) {
5659                                     count = 0;
5660                                     break;
5661                                 }
5662                             }
5663                             if ( count ) {
5664                                 pv = (I32*)SvGROW(sv_dat, SvCUR(sv_dat) + sizeof(I32)+1);
5665                                 SvCUR_set(sv_dat, SvCUR(sv_dat) + sizeof(I32));
5666                                 pv[count] = RExC_npar;
5667                                 SvIV_set(sv_dat, SvIVX(sv_dat) + 1);
5668                             }
5669                         } else {
5670                             (void)SvUPGRADE(sv_dat,SVt_PVNV);
5671                             sv_setpvn(sv_dat, (char *)&(RExC_npar), sizeof(I32));
5672                             SvIOK_on(sv_dat);
5673                             SvIV_set(sv_dat, 1);
5674                         }
5675 #ifdef DEBUGGING
5676                         if (!av_store(RExC_paren_name_list, RExC_npar, SvREFCNT_inc(svname)))
5677                             SvREFCNT_dec(svname);
5678 #endif
5679
5680                         /*sv_dump(sv_dat);*/
5681                     }
5682                     nextchar(pRExC_state);
5683                     paren = 1;
5684                     goto capturing_parens;
5685                 }
5686                 RExC_seen |= REG_SEEN_LOOKBEHIND;
5687                 RExC_parse++;
5688             case '=':           /* (?=...) */
5689                 RExC_seen_zerolen++;
5690                         break;
5691             case '!':           /* (?!...) */
5692                 RExC_seen_zerolen++;
5693                 if (*RExC_parse == ')') {
5694                     ret=reg_node(pRExC_state, OPFAIL);
5695                     nextchar(pRExC_state);
5696                     return ret;
5697                 }
5698                 break;
5699             case '|':           /* (?|...) */
5700                 /* branch reset, behave like a (?:...) except that
5701                    buffers in alternations share the same numbers */
5702                 paren = ':'; 
5703                 after_freeze = freeze_paren = RExC_npar;
5704                 break;
5705             case ':':           /* (?:...) */
5706             case '>':           /* (?>...) */
5707                 break;
5708             case '$':           /* (?$...) */
5709             case '@':           /* (?@...) */
5710                 vFAIL2("Sequence (?%c...) not implemented", (int)paren);
5711                 break;
5712             case '#':           /* (?#...) */
5713                 while (*RExC_parse && *RExC_parse != ')')
5714                     RExC_parse++;
5715                 if (*RExC_parse != ')')
5716                     FAIL("Sequence (?#... not terminated");
5717                 nextchar(pRExC_state);
5718                 *flagp = TRYAGAIN;
5719                 return NULL;
5720             case '0' :           /* (?0) */
5721             case 'R' :           /* (?R) */
5722                 if (*RExC_parse != ')')
5723                     FAIL("Sequence (?R) not terminated");
5724                 ret = reg_node(pRExC_state, GOSTART);
5725                 *flagp |= POSTPONED;
5726                 nextchar(pRExC_state);
5727                 return ret;
5728                 /*notreached*/
5729             { /* named and numeric backreferences */
5730                 I32 num;
5731             case '&':            /* (?&NAME) */
5732                 parse_start = RExC_parse - 1;
5733               named_recursion:
5734                 {
5735                     SV *sv_dat = reg_scan_name(pRExC_state,
5736                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5737                      num = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
5738                 }
5739                 goto gen_recurse_regop;
5740                 /* NOT REACHED */
5741             case '+':
5742                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
5743                     RExC_parse++;
5744                     vFAIL("Illegal pattern");
5745                 }
5746                 goto parse_recursion;
5747                 /* NOT REACHED*/
5748             case '-': /* (?-1) */
5749                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
5750                     RExC_parse--; /* rewind to let it be handled later */
5751                     goto parse_flags;
5752                 } 
5753                 /*FALLTHROUGH */
5754             case '1': case '2': case '3': case '4': /* (?1) */
5755             case '5': case '6': case '7': case '8': case '9':
5756                 RExC_parse--;
5757               parse_recursion:
5758                 num = atoi(RExC_parse);
5759                 parse_start = RExC_parse - 1; /* MJD */
5760                 if (*RExC_parse == '-')
5761                     RExC_parse++;
5762                 while (isDIGIT(*RExC_parse))
5763                         RExC_parse++;
5764                 if (*RExC_parse!=')') 
5765                     vFAIL("Expecting close bracket");
5766                         
5767               gen_recurse_regop:
5768                 if ( paren == '-' ) {
5769                     /*
5770                     Diagram of capture buffer numbering.
5771                     Top line is the normal capture buffer numbers
5772                     Botton line is the negative indexing as from
5773                     the X (the (?-2))
5774
5775                     +   1 2    3 4 5 X          6 7
5776                        /(a(x)y)(a(b(c(?-2)d)e)f)(g(h))/
5777                     -   5 4    3 2 1 X          x x
5778
5779                     */
5780                     num = RExC_npar + num;
5781                     if (num < 1)  {
5782                         RExC_parse++;
5783                         vFAIL("Reference to nonexistent group");
5784                     }
5785                 } else if ( paren == '+' ) {
5786                     num = RExC_npar + num - 1;
5787                 }
5788
5789                 ret = reganode(pRExC_state, GOSUB, num);
5790                 if (!SIZE_ONLY) {
5791                     if (num > (I32)RExC_rx->nparens) {
5792                         RExC_parse++;
5793                         vFAIL("Reference to nonexistent group");
5794                     }
5795                     ARG2L_SET( ret, RExC_recurse_count++);
5796                     RExC_emit++;
5797                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5798                         "Recurse #%"UVuf" to %"IVdf"\n", (UV)ARG(ret), (IV)ARG2L(ret)));
5799                 } else {
5800                     RExC_size++;
5801                 }
5802                 RExC_seen |= REG_SEEN_RECURSE;
5803                 Set_Node_Length(ret, 1 + regarglen[OP(ret)]); /* MJD */
5804                 Set_Node_Offset(ret, parse_start); /* MJD */
5805
5806                 *flagp |= POSTPONED;
5807                 nextchar(pRExC_state);
5808                 return ret;
5809             } /* named and numeric backreferences */
5810             /* NOT REACHED */
5811
5812             case '?':           /* (??...) */
5813                 is_logical = 1;
5814                 if (*RExC_parse != '{') {
5815                     RExC_parse++;
5816                     vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5817                     /*NOTREACHED*/
5818                 }
5819                 *flagp |= POSTPONED;
5820                 paren = *RExC_parse++;
5821                 /* FALL THROUGH */
5822             case '{':           /* (?{...}) */
5823             {
5824                 I32 count = 1;
5825                 U32 n = 0;
5826                 char c;
5827                 char *s = RExC_parse;
5828
5829                 RExC_seen_zerolen++;
5830                 RExC_seen |= REG_SEEN_EVAL;
5831                 while (count && (c = *RExC_parse)) {
5832                     if (c == '\\') {
5833                         if (RExC_parse[1])
5834                             RExC_parse++;
5835                     }
5836                     else if (c == '{')
5837                         count++;
5838                     else if (c == '}')
5839                         count--;
5840                     RExC_parse++;
5841                 }
5842                 if (*RExC_parse != ')') {
5843                     RExC_parse = s;             
5844                     vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
5845                 }
5846                 if (!SIZE_ONLY) {
5847                     PAD *pad;
5848                     OP_4tree *sop, *rop;
5849                     SV * const sv = newSVpvn(s, RExC_parse - 1 - s);
5850
5851                     ENTER;
5852                     Perl_save_re_context(aTHX);
5853                     rop = sv_compile_2op(sv, &sop, "re", &pad);
5854                     sop->op_private |= OPpREFCOUNTED;
5855                     /* re_dup will OpREFCNT_inc */
5856                     OpREFCNT_set(sop, 1);
5857                     LEAVE;
5858
5859                     n = add_data(pRExC_state, 3, "nop");
5860                     RExC_rxi->data->data[n] = (void*)rop;
5861                     RExC_rxi->data->data[n+1] = (void*)sop;
5862                     RExC_rxi->data->data[n+2] = (void*)pad;
5863                     SvREFCNT_dec(sv);
5864                 }
5865                 else {                                          /* First pass */
5866                     if (PL_reginterp_cnt < ++RExC_seen_evals
5867                         && IN_PERL_RUNTIME)
5868                         /* No compiled RE interpolated, has runtime
5869                            components ===> unsafe.  */
5870                         FAIL("Eval-group not allowed at runtime, use re 'eval'");
5871                     if (PL_tainting && PL_tainted)
5872                         FAIL("Eval-group in insecure regular expression");
5873 #if PERL_VERSION > 8
5874                     if (IN_PERL_COMPILETIME)
5875                         PL_cv_has_eval = 1;
5876 #endif
5877                 }
5878
5879                 nextchar(pRExC_state);
5880                 if (is_logical) {
5881                     ret = reg_node(pRExC_state, LOGICAL);
5882                     if (!SIZE_ONLY)
5883                         ret->flags = 2;
5884                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, EVAL, n));
5885                     /* deal with the length of this later - MJD */
5886                     return ret;
5887                 }
5888                 ret = reganode(pRExC_state, EVAL, n);
5889                 Set_Node_Length(ret, RExC_parse - parse_start + 1);
5890                 Set_Node_Offset(ret, parse_start);
5891                 return ret;
5892             }
5893             case '(':           /* (?(?{...})...) and (?(?=...)...) */
5894             {
5895                 int is_define= 0;
5896                 if (RExC_parse[0] == '?') {        /* (?(?...)) */
5897                     if (RExC_parse[1] == '=' || RExC_parse[1] == '!'
5898                         || RExC_parse[1] == '<'
5899                         || RExC_parse[1] == '{') { /* Lookahead or eval. */
5900                         I32 flag;
5901                         
5902                         ret = reg_node(pRExC_state, LOGICAL);
5903                         if (!SIZE_ONLY)
5904                             ret->flags = 1;
5905                         REGTAIL(pRExC_state, ret, reg(pRExC_state, 1, &flag,depth+1));
5906                         goto insert_if;
5907                     }
5908                 }
5909                 else if ( RExC_parse[0] == '<'     /* (?(<NAME>)...) */
5910                          || RExC_parse[0] == '\'' ) /* (?('NAME')...) */
5911                 {
5912                     char ch = RExC_parse[0] == '<' ? '>' : '\'';
5913                     char *name_start= RExC_parse++;
5914                     U32 num = 0;
5915                     SV *sv_dat=reg_scan_name(pRExC_state,
5916                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5917                     if (RExC_parse == name_start || *RExC_parse != ch)
5918                         vFAIL2("Sequence (?(%c... not terminated",
5919                             (ch == '>' ? '<' : ch));
5920                     RExC_parse++;
5921                     if (!SIZE_ONLY) {
5922                         num = add_data( pRExC_state, 1, "S" );
5923                         RExC_rxi->data->data[num]=(void*)sv_dat;
5924                         SvREFCNT_inc_simple_void(sv_dat);
5925                     }
5926                     ret = reganode(pRExC_state,NGROUPP,num);
5927                     goto insert_if_check_paren;
5928                 }
5929                 else if (RExC_parse[0] == 'D' &&
5930                          RExC_parse[1] == 'E' &&
5931                          RExC_parse[2] == 'F' &&
5932                          RExC_parse[3] == 'I' &&
5933                          RExC_parse[4] == 'N' &&
5934                          RExC_parse[5] == 'E')
5935                 {
5936                     ret = reganode(pRExC_state,DEFINEP,0);
5937                     RExC_parse +=6 ;
5938                     is_define = 1;
5939                     goto insert_if_check_paren;
5940                 }
5941                 else if (RExC_parse[0] == 'R') {
5942                     RExC_parse++;
5943                     parno = 0;
5944                     if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
5945                         parno = atoi(RExC_parse++);
5946                         while (isDIGIT(*RExC_parse))
5947                             RExC_parse++;
5948                     } else if (RExC_parse[0] == '&') {
5949                         SV *sv_dat;
5950                         RExC_parse++;
5951                         sv_dat = reg_scan_name(pRExC_state,
5952                             SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5953                         parno = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
5954                     }
5955                     ret = reganode(pRExC_state,INSUBP,parno); 
5956                     goto insert_if_check_paren;
5957                 }
5958                 else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
5959                     /* (?(1)...) */
5960                     char c;
5961                     parno = atoi(RExC_parse++);
5962
5963                     while (isDIGIT(*RExC_parse))
5964                         RExC_parse++;
5965                     ret = reganode(pRExC_state, GROUPP, parno);
5966
5967                  insert_if_check_paren:
5968                     if ((c = *nextchar(pRExC_state)) != ')')
5969                         vFAIL("Switch condition not recognized");
5970                   insert_if:
5971                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, IFTHEN, 0));
5972                     br = regbranch(pRExC_state, &flags, 1,depth+1);
5973                     if (br == NULL)
5974                         br = reganode(pRExC_state, LONGJMP, 0);
5975                     else
5976                         REGTAIL(pRExC_state, br, reganode(pRExC_state, LONGJMP, 0));
5977                     c = *nextchar(pRExC_state);
5978                     if (flags&HASWIDTH)
5979                         *flagp |= HASWIDTH;
5980                     if (c == '|') {
5981                         if (is_define) 
5982                             vFAIL("(?(DEFINE)....) does not allow branches");
5983                         lastbr = reganode(pRExC_state, IFTHEN, 0); /* Fake one for optimizer. */
5984                         regbranch(pRExC_state, &flags, 1,depth+1);
5985                         REGTAIL(pRExC_state, ret, lastbr);
5986                         if (flags&HASWIDTH)
5987                             *flagp |= HASWIDTH;
5988                         c = *nextchar(pRExC_state);
5989                     }
5990                     else
5991                         lastbr = NULL;
5992                     if (c != ')')
5993                         vFAIL("Switch (?(condition)... contains too many branches");
5994                     ender = reg_node(pRExC_state, TAIL);
5995                     REGTAIL(pRExC_state, br, ender);
5996                     if (lastbr) {
5997                         REGTAIL(pRExC_state, lastbr, ender);
5998                         REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
5999                     }
6000                     else
6001                         REGTAIL(pRExC_state, ret, ender);
6002                     RExC_size++; /* XXX WHY do we need this?!!
6003                                     For large programs it seems to be required
6004                                     but I can't figure out why. -- dmq*/
6005                     return ret;
6006                 }
6007                 else {
6008                     vFAIL2("Unknown switch condition (?(%.2s", RExC_parse);
6009                 }
6010             }
6011             case 0:
6012                 RExC_parse--; /* for vFAIL to print correctly */
6013                 vFAIL("Sequence (? incomplete");
6014                 break;
6015             default:
6016                 --RExC_parse;
6017                 parse_flags:      /* (?i) */  
6018             {
6019                 U32 posflags = 0, negflags = 0;
6020                 U32 *flagsp = &posflags;
6021
6022                 while (*RExC_parse) {
6023                     /* && strchr("iogcmsx", *RExC_parse) */
6024                     /* (?g), (?gc) and (?o) are useless here
6025                        and must be globally applied -- japhy */
6026                     switch (*RExC_parse) {
6027                     CASE_STD_PMMOD_FLAGS_PARSE_SET(flagsp);
6028                     case ONCE_PAT_MOD: /* 'o' */
6029                     case GLOBAL_PAT_MOD: /* 'g' */
6030                         if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6031                             const I32 wflagbit = *RExC_parse == 'o' ? WASTED_O : WASTED_G;
6032                             if (! (wastedflags & wflagbit) ) {
6033                                 wastedflags |= wflagbit;
6034                                 vWARN5(
6035                                     RExC_parse + 1,
6036                                     "Useless (%s%c) - %suse /%c modifier",
6037                                     flagsp == &negflags ? "?-" : "?",
6038                                     *RExC_parse,
6039                                     flagsp == &negflags ? "don't " : "",
6040                                     *RExC_parse
6041                                 );
6042                             }
6043                         }
6044                         break;
6045                         
6046                     case CONTINUE_PAT_MOD: /* 'c' */
6047                         if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6048                             if (! (wastedflags & WASTED_C) ) {
6049                                 wastedflags |= WASTED_GC;
6050                                 vWARN3(
6051                                     RExC_parse + 1,
6052                                     "Useless (%sc) - %suse /gc modifier",
6053                                     flagsp == &negflags ? "?-" : "?",
6054                                     flagsp == &negflags ? "don't " : ""
6055                                 );
6056                             }
6057                         }
6058                         break;
6059                     case KEEPCOPY_PAT_MOD: /* 'p' */
6060                         if (flagsp == &negflags) {
6061                             if (SIZE_ONLY && ckWARN(WARN_REGEXP))
6062                                 vWARN(RExC_parse + 1,"Useless use of (?-p)");
6063                         } else {
6064                             *flagsp |= RXf_PMf_KEEPCOPY;
6065                         }
6066                         break;
6067                     case '-':
6068                         if (flagsp == &negflags) {
6069                             RExC_parse++;
6070                             vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
6071                             /*NOTREACHED*/
6072                         }
6073                         flagsp = &negflags;
6074                         wastedflags = 0;  /* reset so (?g-c) warns twice */
6075                         break;
6076                     case ':':
6077                         paren = ':';
6078                         /*FALLTHROUGH*/
6079                     case ')':
6080                         RExC_flags |= posflags;
6081                         RExC_flags &= ~negflags;
6082                         if (paren != ':') {
6083                             oregflags |= posflags;
6084                             oregflags &= ~negflags;
6085                         }
6086                         nextchar(pRExC_state);
6087                         if (paren != ':') {
6088                             *flagp = TRYAGAIN;
6089                             return NULL;
6090                         } else {
6091                             ret = NULL;
6092                             goto parse_rest;
6093                         }
6094                         /*NOTREACHED*/
6095                     default:
6096                         RExC_parse++;
6097                         vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
6098                         /*NOTREACHED*/
6099                     }                           
6100                     ++RExC_parse;
6101                 }
6102             }} /* one for the default block, one for the switch */
6103         }
6104         else {                  /* (...) */
6105           capturing_parens:
6106             parno = RExC_npar;
6107             RExC_npar++;
6108             
6109             ret = reganode(pRExC_state, OPEN, parno);
6110             if (!SIZE_ONLY ){
6111                 if (!RExC_nestroot) 
6112                     RExC_nestroot = parno;
6113                 if (RExC_seen & REG_SEEN_RECURSE
6114                     && !RExC_open_parens[parno-1])
6115                 {
6116                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
6117                         "Setting open paren #%"IVdf" to %d\n", 
6118                         (IV)parno, REG_NODE_NUM(ret)));
6119                     RExC_open_parens[parno-1]= ret;
6120                 }
6121             }
6122             Set_Node_Length(ret, 1); /* MJD */
6123             Set_Node_Offset(ret, RExC_parse); /* MJD */
6124             is_open = 1;
6125         }
6126     }
6127     else                        /* ! paren */
6128         ret = NULL;
6129    
6130    parse_rest:
6131     /* Pick up the branches, linking them together. */
6132     parse_start = RExC_parse;   /* MJD */
6133     br = regbranch(pRExC_state, &flags, 1,depth+1);
6134
6135     if (freeze_paren) {
6136         if (RExC_npar > after_freeze)
6137             after_freeze = RExC_npar;
6138         RExC_npar = freeze_paren;
6139     }
6140
6141     /*     branch_len = (paren != 0); */
6142
6143     if (br == NULL)
6144         return(NULL);
6145     if (*RExC_parse == '|') {
6146         if (!SIZE_ONLY && RExC_extralen) {
6147             reginsert(pRExC_state, BRANCHJ, br, depth+1);
6148         }
6149         else {                  /* MJD */
6150             reginsert(pRExC_state, BRANCH, br, depth+1);
6151             Set_Node_Length(br, paren != 0);
6152             Set_Node_Offset_To_R(br-RExC_emit_start, parse_start-RExC_start);
6153         }
6154         have_branch = 1;
6155         if (SIZE_ONLY)
6156             RExC_extralen += 1;         /* For BRANCHJ-BRANCH. */
6157     }
6158     else if (paren == ':') {
6159         *flagp |= flags&SIMPLE;
6160     }
6161     if (is_open) {                              /* Starts with OPEN. */
6162         REGTAIL(pRExC_state, ret, br);          /* OPEN -> first. */
6163     }
6164     else if (paren != '?')              /* Not Conditional */
6165         ret = br;
6166     *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
6167     lastbr = br;
6168     while (*RExC_parse == '|') {
6169         if (!SIZE_ONLY && RExC_extralen) {
6170             ender = reganode(pRExC_state, LONGJMP,0);
6171             REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
6172         }
6173         if (SIZE_ONLY)
6174             RExC_extralen += 2;         /* Account for LONGJMP. */
6175         nextchar(pRExC_state);
6176         if (freeze_paren) {
6177             if (RExC_npar > after_freeze)
6178                 after_freeze = RExC_npar;
6179             RExC_npar = freeze_paren;       
6180         }
6181         br = regbranch(pRExC_state, &flags, 0, depth+1);
6182
6183         if (br == NULL)
6184             return(NULL);
6185         REGTAIL(pRExC_state, lastbr, br);               /* BRANCH -> BRANCH. */
6186         lastbr = br;
6187         *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
6188     }
6189
6190     if (have_branch || paren != ':') {
6191         /* Make a closing node, and hook it on the end. */
6192         switch (paren) {
6193         case ':':
6194             ender = reg_node(pRExC_state, TAIL);
6195             break;
6196         case 1:
6197             ender = reganode(pRExC_state, CLOSE, parno);
6198             if (!SIZE_ONLY && RExC_seen & REG_SEEN_RECURSE) {
6199                 DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
6200                         "Setting close paren #%"IVdf" to %d\n", 
6201                         (IV)parno, REG_NODE_NUM(ender)));
6202                 RExC_close_parens[parno-1]= ender;
6203                 if (RExC_nestroot == parno) 
6204                     RExC_nestroot = 0;
6205             }       
6206             Set_Node_Offset(ender,RExC_parse+1); /* MJD */
6207             Set_Node_Length(ender,1); /* MJD */
6208             break;
6209         case '<':
6210         case ',':
6211         case '=':
6212         case '!':
6213             *flagp &= ~HASWIDTH;
6214             /* FALL THROUGH */
6215         case '>':
6216             ender = reg_node(pRExC_state, SUCCEED);
6217             break;
6218         case 0:
6219             ender = reg_node(pRExC_state, END);
6220             if (!SIZE_ONLY) {
6221                 assert(!RExC_opend); /* there can only be one! */
6222                 RExC_opend = ender;
6223             }
6224             break;
6225         }
6226         REGTAIL(pRExC_state, lastbr, ender);
6227
6228         if (have_branch && !SIZE_ONLY) {
6229             if (depth==1)
6230                 RExC_seen |= REG_TOP_LEVEL_BRANCHES;
6231
6232             /* Hook the tails of the branches to the closing node. */
6233             for (br = ret; br; br = regnext(br)) {
6234                 const U8 op = PL_regkind[OP(br)];
6235                 if (op == BRANCH) {
6236                     REGTAIL_STUDY(pRExC_state, NEXTOPER(br), ender);
6237                 }
6238                 else if (op == BRANCHJ) {
6239                     REGTAIL_STUDY(pRExC_state, NEXTOPER(NEXTOPER(br)), ender);
6240                 }
6241             }
6242         }
6243     }
6244
6245     {
6246         const char *p;
6247         static const char parens[] = "=!<,>";
6248
6249         if (paren && (p = strchr(parens, paren))) {
6250             U8 node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
6251             int flag = (p - parens) > 1;
6252
6253             if (paren == '>')
6254                 node = SUSPEND, flag = 0;
6255             reginsert(pRExC_state, node,ret, depth+1);
6256             Set_Node_Cur_Length(ret);
6257             Set_Node_Offset(ret, parse_start + 1);
6258             ret->flags = flag;
6259             REGTAIL_STUDY(pRExC_state, ret, reg_node(pRExC_state, TAIL));
6260         }
6261     }
6262
6263     /* Check for proper termination. */
6264     if (paren) {
6265         RExC_flags = oregflags;
6266         if (RExC_parse >= RExC_end || *nextchar(pRExC_state) != ')') {
6267             RExC_parse = oregcomp_parse;
6268             vFAIL("Unmatched (");
6269         }
6270     }
6271     else if (!paren && RExC_parse < RExC_end) {
6272         if (*RExC_parse == ')') {
6273             RExC_parse++;
6274             vFAIL("Unmatched )");
6275         }
6276         else
6277             FAIL("Junk on end of regexp");      /* "Can't happen". */
6278         /* NOTREACHED */
6279     }
6280     if (after_freeze)
6281         RExC_npar = after_freeze;
6282     return(ret);
6283 }
6284
6285 /*
6286  - regbranch - one alternative of an | operator
6287  *
6288  * Implements the concatenation operator.
6289  */
6290 STATIC regnode *
6291 S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
6292 {
6293     dVAR;
6294     register regnode *ret;
6295     register regnode *chain = NULL;
6296     register regnode *latest;
6297     I32 flags = 0, c = 0;
6298     GET_RE_DEBUG_FLAGS_DECL;
6299
6300     PERL_ARGS_ASSERT_REGBRANCH;
6301
6302     DEBUG_PARSE("brnc");
6303
6304     if (first)
6305         ret = NULL;
6306     else {
6307         if (!SIZE_ONLY && RExC_extralen)
6308             ret = reganode(pRExC_state, BRANCHJ,0);
6309         else {
6310             ret = reg_node(pRExC_state, BRANCH);
6311             Set_Node_Length(ret, 1);
6312         }
6313     }
6314         
6315     if (!first && SIZE_ONLY)
6316         RExC_extralen += 1;                     /* BRANCHJ */
6317
6318     *flagp = WORST;                     /* Tentatively. */
6319
6320     RExC_parse--;
6321     nextchar(pRExC_state);
6322     while (RExC_parse < RExC_end && *RExC_parse != '|' && *RExC_parse != ')') {
6323         flags &= ~TRYAGAIN;
6324         latest = regpiece(pRExC_state, &flags,depth+1);
6325         if (latest == NULL) {
6326             if (flags & TRYAGAIN)
6327                 continue;
6328             return(NULL);
6329         }
6330         else if (ret == NULL)
6331             ret = latest;
6332         *flagp |= flags&(HASWIDTH|POSTPONED);
6333         if (chain == NULL)      /* First piece. */
6334             *flagp |= flags&SPSTART;
6335         else {
6336             RExC_naughty++;
6337             REGTAIL(pRExC_state, chain, latest);
6338         }
6339         chain = latest;
6340         c++;
6341     }
6342     if (chain == NULL) {        /* Loop ran zero times. */
6343         chain = reg_node(pRExC_state, NOTHING);
6344         if (ret == NULL)
6345             ret = chain;
6346     }
6347     if (c == 1) {
6348         *flagp |= flags&SIMPLE;
6349     }
6350
6351     return ret;
6352 }
6353
6354 /*
6355  - regpiece - something followed by possible [*+?]
6356  *
6357  * Note that the branching code sequences used for ? and the general cases
6358  * of * and + are somewhat optimized:  they use the same NOTHING node as
6359  * both the endmarker for their branch list and the body of the last branch.
6360  * It might seem that this node could be dispensed with entirely, but the
6361  * endmarker role is not redundant.
6362  */
6363 STATIC regnode *
6364 S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
6365 {
6366     dVAR;
6367     register regnode *ret;
6368     register char op;
6369     register char *next;
6370     I32 flags;
6371     const char * const origparse = RExC_parse;
6372     I32 min;
6373     I32 max = REG_INFTY;
6374     char *parse_start;
6375     const char *maxpos = NULL;
6376     GET_RE_DEBUG_FLAGS_DECL;
6377
6378     PERL_ARGS_ASSERT_REGPIECE;
6379
6380     DEBUG_PARSE("piec");
6381
6382     ret = regatom(pRExC_state, &flags,depth+1);
6383     if (ret == NULL) {
6384         if (flags & TRYAGAIN)
6385             *flagp |= TRYAGAIN;
6386         return(NULL);
6387     }
6388
6389     op = *RExC_parse;
6390
6391     if (op == '{' && regcurly(RExC_parse)) {
6392         maxpos = NULL;
6393         parse_start = RExC_parse; /* MJD */
6394         next = RExC_parse + 1;
6395         while (isDIGIT(*next) || *next == ',') {
6396             if (*next == ',') {
6397                 if (maxpos)
6398                     break;
6399                 else
6400                     maxpos = next;
6401             }
6402             next++;
6403         }
6404         if (*next == '}') {             /* got one */
6405             if (!maxpos)
6406                 maxpos = next;
6407             RExC_parse++;
6408             min = atoi(RExC_parse);
6409             if (*maxpos == ',')
6410                 maxpos++;
6411             else
6412                 maxpos = RExC_parse;
6413             max = atoi(maxpos);
6414             if (!max && *maxpos != '0')
6415                 max = REG_INFTY;                /* meaning "infinity" */
6416             else if (max >= REG_INFTY)
6417                 vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
6418             RExC_parse = next;
6419             nextchar(pRExC_state);
6420
6421         do_curly:
6422             if ((flags&SIMPLE)) {
6423                 RExC_naughty += 2 + RExC_naughty / 2;
6424                 reginsert(pRExC_state, CURLY, ret, depth+1);
6425                 Set_Node_Offset(ret, parse_start+1); /* MJD */
6426                 Set_Node_Cur_Length(ret);
6427             }
6428             else {
6429                 regnode * const w = reg_node(pRExC_state, WHILEM);
6430
6431                 w->flags = 0;
6432                 REGTAIL(pRExC_state, ret, w);
6433                 if (!SIZE_ONLY && RExC_extralen) {
6434                     reginsert(pRExC_state, LONGJMP,ret, depth+1);
6435                     reginsert(pRExC_state, NOTHING,ret, depth+1);
6436                     NEXT_OFF(ret) = 3;  /* Go over LONGJMP. */
6437                 }
6438                 reginsert(pRExC_state, CURLYX,ret, depth+1);
6439                                 /* MJD hk */
6440                 Set_Node_Offset(ret, parse_start+1);
6441                 Set_Node_Length(ret,
6442                                 op == '{' ? (RExC_parse - parse_start) : 1);
6443
6444                 if (!SIZE_ONLY && RExC_extralen)
6445                     NEXT_OFF(ret) = 3;  /* Go over NOTHING to LONGJMP. */
6446                 REGTAIL(pRExC_state, ret, reg_node(pRExC_state, NOTHING));
6447                 if (SIZE_ONLY)
6448                     RExC_whilem_seen++, RExC_extralen += 3;
6449                 RExC_naughty += 4 + RExC_naughty;       /* compound interest */
6450             }
6451             ret->flags = 0;
6452
6453             if (min > 0)
6454                 *flagp = WORST;
6455             if (max > 0)
6456                 *flagp |= HASWIDTH;
6457             if (max < min)
6458                 vFAIL("Can't do {n,m} with n > m");
6459             if (!SIZE_ONLY) {
6460                 ARG1_SET(ret, (U16)min);
6461                 ARG2_SET(ret, (U16)max);
6462             }
6463
6464             goto nest_check;
6465         }
6466     }
6467
6468     if (!ISMULT1(op)) {
6469         *flagp = flags;
6470         return(ret);
6471     }
6472
6473 #if 0                           /* Now runtime fix should be reliable. */
6474
6475     /* if this is reinstated, don't forget to put this back into perldiag:
6476
6477             =item Regexp *+ operand could be empty at {#} in regex m/%s/
6478
6479            (F) The part of the regexp subject to either the * or + quantifier
6480            could match an empty string. The {#} shows in the regular
6481            expression about where the problem was discovered.
6482
6483     */
6484
6485     if (!(flags&HASWIDTH) && op != '?')
6486       vFAIL("Regexp *+ operand could be empty");
6487 #endif
6488
6489     parse_start = RExC_parse;
6490     nextchar(pRExC_state);
6491
6492     *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
6493
6494     if (op == '*' && (flags&SIMPLE)) {
6495         reginsert(pRExC_state, STAR, ret, depth+1);
6496         ret->flags = 0;
6497         RExC_naughty += 4;
6498     }
6499     else if (op == '*') {
6500         min = 0;
6501         goto do_curly;
6502     }
6503     else if (op == '+' && (flags&SIMPLE)) {
6504         reginsert(pRExC_state, PLUS, ret, depth+1);
6505         ret->flags = 0;
6506         RExC_naughty += 3;
6507     }
6508     else if (op == '+') {
6509         min = 1;
6510         goto do_curly;
6511     }
6512     else if (op == '?') {
6513         min = 0; max = 1;
6514         goto do_curly;
6515     }
6516   nest_check:
6517     if (!SIZE_ONLY && !(flags&(HASWIDTH|POSTPONED)) && max > REG_INFTY/3 && ckWARN(WARN_REGEXP)) {
6518         vWARN3(RExC_parse,
6519                "%.*s matches null string many times",
6520                (int)(RExC_parse >= origparse ? RExC_parse - origparse : 0),
6521                origparse);
6522     }
6523
6524     if (RExC_parse < RExC_end && *RExC_parse == '?') {
6525         nextchar(pRExC_state);
6526         reginsert(pRExC_state, MINMOD, ret, depth+1);
6527         REGTAIL(pRExC_state, ret, ret + NODE_STEP_REGNODE);
6528     }
6529 #ifndef REG_ALLOW_MINMOD_SUSPEND
6530     else
6531 #endif
6532     if (RExC_parse < RExC_end && *RExC_parse == '+') {
6533         regnode *ender;
6534         nextchar(pRExC_state);
6535         ender = reg_node(pRExC_state, SUCCEED);
6536         REGTAIL(pRExC_state, ret, ender);
6537         reginsert(pRExC_state, SUSPEND, ret, depth+1);
6538         ret->flags = 0;
6539         ender = reg_node(pRExC_state, TAIL);
6540         REGTAIL(pRExC_state, ret, ender);
6541         /*ret= ender;*/
6542     }
6543
6544     if (RExC_parse < RExC_end && ISMULT2(RExC_parse)) {
6545         RExC_parse++;
6546         vFAIL("Nested quantifiers");
6547     }
6548
6549     return(ret);
6550 }
6551
6552
6553 /* reg_namedseq(pRExC_state,UVp)
6554    
6555    This is expected to be called by a parser routine that has 
6556    recognized'\N' and needs to handle the rest. RExC_parse is 
6557    expected to point at the first char following the N at the time
6558    of the call.
6559    
6560    If valuep is non-null then it is assumed that we are parsing inside 
6561    of a charclass definition and the first codepoint in the resolved
6562    string is returned via *valuep and the routine will return NULL. 
6563    In this mode if a multichar string is returned from the charnames 
6564    handler a warning will be issued, and only the first char in the 
6565    sequence will be examined. If the string returned is zero length
6566    then the value of *valuep is undefined and NON-NULL will 
6567    be returned to indicate failure. (This will NOT be a valid pointer 
6568    to a regnode.)
6569    
6570    If value is null then it is assumed that we are parsing normal text
6571    and inserts a new EXACT node into the program containing the resolved
6572    string and returns a pointer to the new node. If the string is 
6573    zerolength a NOTHING node is emitted.
6574    
6575    On success RExC_parse is set to the char following the endbrace.
6576    Parsing failures will generate a fatal errorvia vFAIL(...)
6577    
6578    NOTE: We cache all results from the charnames handler locally in 
6579    the RExC_charnames hash (created on first use) to prevent a charnames 
6580    handler from playing silly-buggers and returning a short string and 
6581    then a long string for a given pattern. Since the regexp program 
6582    size is calculated during an initial parse this would result
6583    in a buffer overrun so we cache to prevent the charname result from
6584    changing during the course of the parse.
6585    
6586  */
6587 STATIC regnode *
6588 S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep) 
6589 {
6590     char * name;        /* start of the content of the name */
6591     char * endbrace;    /* endbrace following the name */
6592     SV *sv_str = NULL;  
6593     SV *sv_name = NULL;
6594     STRLEN len; /* this has various purposes throughout the code */
6595     bool cached = 0; /* if this is true then we shouldn't refcount dev sv_str */
6596     regnode *ret = NULL;
6597  
6598     PERL_ARGS_ASSERT_REG_NAMEDSEQ;
6599    
6600     if (*RExC_parse != '{') {
6601         vFAIL("Missing braces on \\N{}");
6602     }
6603     name = RExC_parse+1;
6604     endbrace = strchr(RExC_parse, '}');
6605     if ( ! endbrace ) {
6606         RExC_parse++;
6607         vFAIL("Missing right brace on \\N{}");
6608     } 
6609     RExC_parse = endbrace + 1;  
6610     
6611     
6612     /* RExC_parse points at the beginning brace, 
6613        endbrace points at the last */
6614     if ( name[0]=='U' && name[1]=='+' ) {
6615         /* its a "Unicode hex" notation {U+89AB} */
6616         I32 fl = PERL_SCAN_ALLOW_UNDERSCORES
6617             | PERL_SCAN_DISALLOW_PREFIX
6618             | (SIZE_ONLY ? PERL_SCAN_SILENT_ILLDIGIT : 0);
6619         UV cp;
6620         len = (STRLEN)(endbrace - name - 2);
6621         cp = grok_hex(name + 2, &len, &fl, NULL);
6622         if ( len != (STRLEN)(endbrace - name - 2) ) {
6623             cp = 0xFFFD;
6624         }    
6625         if ( valuep ) {
6626             if (cp > 0xff) RExC_utf8 = 1;
6627             *valuep = cp;
6628             return NULL;
6629         }
6630
6631         /* Need to convert to utf8 if either: won't fit into a byte, or the re
6632          * is going to be in utf8 and the representation changes under utf8. */
6633         if (cp > 0xff || (RExC_utf8 && ! UNI_IS_INVARIANT(cp))) {
6634             U8 string[UTF8_MAXBYTES+1];
6635             U8 *tmps;
6636             RExC_utf8 = 1;
6637             tmps = uvuni_to_utf8(string, cp);
6638             sv_str = newSVpvn_utf8((char*)string, tmps - string, TRUE);
6639         } else {    /* Otherwise, no need for utf8, can skip that step */
6640             char string;
6641             string = (char)cp;
6642             sv_str= newSVpvn(&string, 1);
6643         }
6644     } else {
6645         /* fetch the charnames handler for this scope */
6646         HV * const table = GvHV(PL_hintgv);
6647         SV **cvp= table ? 
6648             hv_fetchs(table, "charnames", FALSE) :
6649             NULL;
6650         SV *cv= cvp ? *cvp : NULL;
6651         HE *he_str;
6652         int count;
6653         /* create an SV with the name as argument */
6654         sv_name = newSVpvn(name, endbrace - name);
6655         
6656         if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6657             vFAIL2("Constant(\\N{%s}) unknown: "
6658                   "(possibly a missing \"use charnames ...\")",
6659                   SvPVX(sv_name));
6660         }
6661         if (!cvp || !SvOK(*cvp)) { /* when $^H{charnames} = undef; */
6662             vFAIL2("Constant(\\N{%s}): "
6663                   "$^H{charnames} is not defined",SvPVX(sv_name));
6664         }
6665         
6666         
6667         
6668         if (!RExC_charnames) {
6669             /* make sure our cache is allocated */
6670             RExC_charnames = newHV();
6671             sv_2mortal(MUTABLE_SV(RExC_charnames));
6672         } 
6673             /* see if we have looked this one up before */
6674         he_str = hv_fetch_ent( RExC_charnames, sv_name, 0, 0 );
6675         if ( he_str ) {
6676             sv_str = HeVAL(he_str);
6677             cached = 1;
6678         } else {
6679             dSP ;
6680
6681             ENTER ;
6682             SAVETMPS ;
6683             PUSHMARK(SP) ;
6684             
6685             XPUSHs(sv_name);
6686             
6687             PUTBACK ;
6688             
6689             count= call_sv(cv, G_SCALAR);
6690             
6691             if (count == 1) { /* XXXX is this right? dmq */
6692                 sv_str = POPs;
6693                 SvREFCNT_inc_simple_void(sv_str);
6694             } 
6695             
6696             SPAGAIN ;
6697             PUTBACK ;
6698             FREETMPS ;
6699             LEAVE ;
6700             
6701             if ( !sv_str || !SvOK(sv_str) ) {
6702                 vFAIL2("Constant(\\N{%s}): Call to &{$^H{charnames}} "
6703                       "did not return a defined value",SvPVX(sv_name));
6704             }
6705             if (hv_store_ent( RExC_charnames, sv_name, sv_str, 0))
6706                 cached = 1;
6707         }
6708     }
6709     if (valuep) {
6710         char *p = SvPV(sv_str, len);
6711         if (len) {
6712             STRLEN numlen = 1;
6713             if ( SvUTF8(sv_str) ) {
6714                 *valuep = utf8_to_uvchr((U8*)p, &numlen);
6715                 if (*valuep > 0x7F)
6716                     RExC_utf8 = 1; 
6717                 /* XXXX
6718                   We have to turn on utf8 for high bit chars otherwise
6719                   we get failures with
6720                   
6721                    "ss" =~ /[\N{LATIN SMALL LETTER SHARP S}]/i
6722                    "SS" =~ /[\N{LATIN SMALL LETTER SHARP S}]/i
6723                 
6724                   This is different from what \x{} would do with the same
6725                   codepoint, where the condition is > 0xFF.
6726                   - dmq
6727                 */
6728                 
6729                 
6730             } else {
6731                 *valuep = (UV)*p;
6732                 /* warn if we havent used the whole string? */
6733             }
6734             if (numlen<len && SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6735                 vWARN2(RExC_parse,
6736                     "Ignoring excess chars from \\N{%s} in character class",
6737                     SvPVX(sv_name)
6738                 );
6739             }        
6740         } else if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6741             vWARN2(RExC_parse,
6742                     "Ignoring zero length \\N{%s} in character class",
6743                     SvPVX(sv_name)
6744                 );
6745         }
6746         if (sv_name)    
6747             SvREFCNT_dec(sv_name);    
6748         if (!cached)
6749             SvREFCNT_dec(sv_str);    
6750         return len ? NULL : (regnode *)&len;
6751     } else if(SvCUR(sv_str)) {     
6752         
6753         char *s; 
6754         char *p, *pend;        
6755         STRLEN charlen = 1;
6756 #ifdef DEBUGGING
6757         char * parse_start = name-3; /* needed for the offsets */
6758 #endif
6759         GET_RE_DEBUG_FLAGS_DECL;     /* needed for the offsets */
6760         
6761         ret = reg_node(pRExC_state,
6762             (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
6763         s= STRING(ret);
6764         
6765         if ( RExC_utf8 && !SvUTF8(sv_str) ) {
6766             sv_utf8_upgrade(sv_str);
6767         } else if ( !RExC_utf8 && SvUTF8(sv_str) ) {
6768             RExC_utf8= 1;
6769         }
6770         
6771         p = SvPV(sv_str, len);
6772         pend = p + len;
6773         /* len is the length written, charlen is the size the char read */
6774         for ( len = 0; p < pend; p += charlen ) {
6775             if (UTF) {
6776                 UV uvc = utf8_to_uvchr((U8*)p, &charlen);
6777                 if (FOLD) {
6778                     STRLEN foldlen,numlen;
6779                     U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
6780                     uvc = toFOLD_uni(uvc, tmpbuf, &foldlen);
6781                     /* Emit all the Unicode characters. */
6782                     
6783                     for (foldbuf = tmpbuf;
6784                         foldlen;
6785                         foldlen -= numlen) 
6786                     {
6787                         uvc = utf8_to_uvchr(foldbuf, &numlen);
6788                         if (numlen > 0) {
6789                             const STRLEN unilen = reguni(pRExC_state, uvc, s);
6790                             s       += unilen;
6791                             len     += unilen;
6792                             /* In EBCDIC the numlen
6793                             * and unilen can differ. */
6794                             foldbuf += numlen;
6795                             if (numlen >= foldlen)
6796                                 break;
6797                         }
6798                         else
6799                             break; /* "Can't happen." */
6800                     }                          
6801                 } else {
6802                     const STRLEN unilen = reguni(pRExC_state, uvc, s);
6803                     if (unilen > 0) {
6804                        s   += unilen;
6805                        len += unilen;
6806                     }
6807                 }
6808             } else {
6809                 len++;
6810                 REGC(*p, s++);
6811             }
6812         }
6813         if (SIZE_ONLY) {
6814             RExC_size += STR_SZ(len);
6815         } else {
6816             STR_LEN(ret) = len;
6817             RExC_emit += STR_SZ(len);
6818         }
6819         Set_Node_Cur_Length(ret); /* MJD */
6820         RExC_parse--; 
6821         nextchar(pRExC_state);
6822     } else {    /* zero length */
6823         ret = reg_node(pRExC_state,NOTHING);
6824     }
6825     if (!cached) {
6826         SvREFCNT_dec(sv_str);
6827     }
6828     if (sv_name) {
6829         SvREFCNT_dec(sv_name); 
6830     }
6831     return ret;
6832
6833 }
6834
6835
6836 /*
6837  * reg_recode
6838  *
6839  * It returns the code point in utf8 for the value in *encp.
6840  *    value: a code value in the source encoding
6841  *    encp:  a pointer to an Encode object
6842  *
6843  * If the result from Encode is not a single character,
6844  * it returns U+FFFD (Replacement character) and sets *encp to NULL.
6845  */
6846 STATIC UV
6847 S_reg_recode(pTHX_ const char value, SV **encp)
6848 {
6849     STRLEN numlen = 1;
6850     SV * const sv = newSVpvn_flags(&value, numlen, SVs_TEMP);
6851     const char * const s = *encp ? sv_recode_to_utf8(sv, *encp) : SvPVX(sv);
6852     const STRLEN newlen = SvCUR(sv);
6853     UV uv = UNICODE_REPLACEMENT;
6854
6855     PERL_ARGS_ASSERT_REG_RECODE;
6856
6857     if (newlen)
6858         uv = SvUTF8(sv)
6859              ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
6860              : *(U8*)s;
6861
6862     if (!newlen || numlen != newlen) {
6863         uv = UNICODE_REPLACEMENT;
6864         *encp = NULL;
6865     }
6866     return uv;
6867 }
6868
6869
6870 /*
6871  - regatom - the lowest level
6872
6873    Try to identify anything special at the start of the pattern. If there
6874    is, then handle it as required. This may involve generating a single regop,
6875    such as for an assertion; or it may involve recursing, such as to
6876    handle a () structure.
6877
6878    If the string doesn't start with something special then we gobble up
6879    as much literal text as we can.
6880
6881    Once we have been able to handle whatever type of thing started the
6882    sequence, we return.
6883
6884    Note: we have to be careful with escapes, as they can be both literal
6885    and special, and in the case of \10 and friends can either, depending
6886    on context. Specifically there are two seperate switches for handling
6887    escape sequences, with the one for handling literal escapes requiring
6888    a dummy entry for all of the special escapes that are actually handled
6889    by the other.
6890 */
6891
6892 STATIC regnode *
6893 S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
6894 {
6895     dVAR;
6896     register regnode *ret = NULL;
6897     I32 flags;
6898     char *parse_start = RExC_parse;
6899     GET_RE_DEBUG_FLAGS_DECL;
6900     DEBUG_PARSE("atom");
6901     *flagp = WORST;             /* Tentatively. */
6902
6903     PERL_ARGS_ASSERT_REGATOM;
6904
6905 tryagain:
6906     switch ((U8)*RExC_parse) {
6907     case '^':
6908         RExC_seen_zerolen++;
6909         nextchar(pRExC_state);
6910         if (RExC_flags & RXf_PMf_MULTILINE)
6911             ret = reg_node(pRExC_state, MBOL);
6912         else if (RExC_flags & RXf_PMf_SINGLELINE)
6913             ret = reg_node(pRExC_state, SBOL);
6914         else
6915             ret = reg_node(pRExC_state, BOL);
6916         Set_Node_Length(ret, 1); /* MJD */
6917         break;
6918     case '$':
6919         nextchar(pRExC_state);
6920         if (*RExC_parse)
6921             RExC_seen_zerolen++;
6922         if (RExC_flags & RXf_PMf_MULTILINE)
6923             ret = reg_node(pRExC_state, MEOL);
6924         else if (RExC_flags & RXf_PMf_SINGLELINE)
6925             ret = reg_node(pRExC_state, SEOL);
6926         else
6927             ret = reg_node(pRExC_state, EOL);
6928         Set_Node_Length(ret, 1); /* MJD */
6929         break;
6930     case '.':
6931         nextchar(pRExC_state);
6932         if (RExC_flags & RXf_PMf_SINGLELINE)
6933             ret = reg_node(pRExC_state, SANY);
6934         else
6935             ret = reg_node(pRExC_state, REG_ANY);
6936         *flagp |= HASWIDTH|SIMPLE;
6937         RExC_naughty++;
6938         Set_Node_Length(ret, 1); /* MJD */
6939         break;
6940     case '[':
6941     {
6942         char * const oregcomp_parse = ++RExC_parse;
6943         ret = regclass(pRExC_state,depth+1);
6944         if (*RExC_parse != ']') {
6945             RExC_parse = oregcomp_parse;
6946             vFAIL("Unmatched [");
6947         }
6948         nextchar(pRExC_state);
6949         *flagp |= HASWIDTH|SIMPLE;
6950         Set_Node_Length(ret, RExC_parse - oregcomp_parse + 1); /* MJD */
6951         break;
6952     }
6953     case '(':
6954         nextchar(pRExC_state);
6955         ret = reg(pRExC_state, 1, &flags,depth+1);
6956         if (ret == NULL) {
6957                 if (flags & TRYAGAIN) {
6958                     if (RExC_parse == RExC_end) {
6959                          /* Make parent create an empty node if needed. */
6960                         *flagp |= TRYAGAIN;
6961                         return(NULL);
6962                     }
6963                     goto tryagain;
6964                 }
6965                 return(NULL);
6966         }
6967         *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE|POSTPONED);
6968         break;
6969     case '|':
6970     case ')':
6971         if (flags & TRYAGAIN) {
6972             *flagp |= TRYAGAIN;
6973             return NULL;
6974         }
6975         vFAIL("Internal urp");
6976                                 /* Supposed to be caught earlier. */
6977         break;
6978     case '{':
6979         if (!regcurly(RExC_parse)) {
6980             RExC_parse++;
6981             goto defchar;
6982         }
6983         /* FALL THROUGH */
6984     case '?':
6985     case '+':
6986     case '*':
6987         RExC_parse++;
6988         vFAIL("Quantifier follows nothing");
6989         break;
6990     case 0xDF:
6991     case 0xC3:
6992     case 0xCE:
6993         do_foldchar:
6994         if (!LOC && FOLD) {
6995             U32 len,cp;
6996             len=0; /* silence a spurious compiler warning */
6997             if ((cp = what_len_TRICKYFOLD_safe(RExC_parse,RExC_end,UTF,len))) {
6998                 *flagp |= HASWIDTH; /* could be SIMPLE too, but needs a handler in regexec.regrepeat */
6999                 RExC_parse+=len-1; /* we get one from nextchar() as well. :-( */
7000                 ret = reganode(pRExC_state, FOLDCHAR, cp);
7001                 Set_Node_Length(ret, 1); /* MJD */
7002                 nextchar(pRExC_state); /* kill whitespace under /x */
7003                 return ret;
7004             }
7005         }
7006         goto outer_default;
7007     case '\\':
7008         /* Special Escapes
7009
7010            This switch handles escape sequences that resolve to some kind
7011            of special regop and not to literal text. Escape sequnces that
7012            resolve to literal text are handled below in the switch marked
7013            "Literal Escapes".
7014
7015            Every entry in this switch *must* have a corresponding entry
7016            in the literal escape switch. However, the opposite is not
7017            required, as the default for this switch is to jump to the
7018            literal text handling code.
7019         */
7020         switch ((U8)*++RExC_parse) {
7021         case 0xDF:
7022         case 0xC3:
7023         case 0xCE:
7024                    goto do_foldchar;        
7025         /* Special Escapes */
7026         case 'A':
7027             RExC_seen_zerolen++;
7028             ret = reg_node(pRExC_state, SBOL);
7029             *flagp |= SIMPLE;
7030             goto finish_meta_pat;
7031         case 'G':
7032             ret = reg_node(pRExC_state, GPOS);
7033             RExC_seen |= REG_SEEN_GPOS;
7034             *flagp |= SIMPLE;
7035             goto finish_meta_pat;
7036         case 'K':
7037             RExC_seen_zerolen++;
7038             ret = reg_node(pRExC_state, KEEPS);
7039             *flagp |= SIMPLE;
7040             /* XXX:dmq : disabling in-place substitution seems to
7041              * be necessary here to avoid cases of memory corruption, as
7042              * with: C<$_="x" x 80; s/x\K/y/> -- rgs
7043              */
7044             RExC_seen |= REG_SEEN_LOOKBEHIND;
7045             goto finish_meta_pat;
7046         case 'Z':
7047             ret = reg_node(pRExC_state, SEOL);
7048             *flagp |= SIMPLE;
7049             RExC_seen_zerolen++;                /* Do not optimize RE away */
7050             goto finish_meta_pat;
7051         case 'z':
7052             ret = reg_node(pRExC_state, EOS);
7053             *flagp |= SIMPLE;
7054             RExC_seen_zerolen++;                /* Do not optimize RE away */
7055             goto finish_meta_pat;
7056         case 'C':
7057             ret = reg_node(pRExC_state, CANY);
7058             RExC_seen |= REG_SEEN_CANY;
7059             *flagp |= HASWIDTH|SIMPLE;
7060             goto finish_meta_pat;
7061         case 'X':
7062             ret = reg_node(pRExC_state, CLUMP);
7063             *flagp |= HASWIDTH;
7064             goto finish_meta_pat;
7065         case 'w':
7066             ret = reg_node(pRExC_state, (U8)(LOC ? ALNUML     : ALNUM));
7067             *flagp |= HASWIDTH|SIMPLE;
7068             goto finish_meta_pat;
7069         case 'W':
7070             ret = reg_node(pRExC_state, (U8)(LOC ? NALNUML    : NALNUM));
7071             *flagp |= HASWIDTH|SIMPLE;
7072             goto finish_meta_pat;
7073         case 'b':
7074             RExC_seen_zerolen++;
7075             RExC_seen |= REG_SEEN_LOOKBEHIND;
7076             ret = reg_node(pRExC_state, (U8)(LOC ? BOUNDL     : BOUND));
7077             *flagp |= SIMPLE;
7078             goto finish_meta_pat;
7079         case 'B':
7080             RExC_seen_zerolen++;
7081             RExC_seen |= REG_SEEN_LOOKBEHIND;
7082             ret = reg_node(pRExC_state, (U8)(LOC ? NBOUNDL    : NBOUND));
7083             *flagp |= SIMPLE;
7084             goto finish_meta_pat;
7085         case 's':
7086             ret = reg_node(pRExC_state, (U8)(LOC ? SPACEL     : SPACE));
7087             *flagp |= HASWIDTH|SIMPLE;
7088             goto finish_meta_pat;
7089         case 'S':
7090             ret = reg_node(pRExC_state, (U8)(LOC ? NSPACEL    : NSPACE));
7091             *flagp |= HASWIDTH|SIMPLE;
7092             goto finish_meta_pat;
7093         case 'd':
7094             ret = reg_node(pRExC_state, DIGIT);
7095             *flagp |= HASWIDTH|SIMPLE;
7096             goto finish_meta_pat;
7097         case 'D':
7098             ret = reg_node(pRExC_state, NDIGIT);
7099             *flagp |= HASWIDTH|SIMPLE;
7100             goto finish_meta_pat;
7101         case 'R':
7102             ret = reg_node(pRExC_state, LNBREAK);
7103             *flagp |= HASWIDTH|SIMPLE;
7104             goto finish_meta_pat;
7105         case 'h':
7106             ret = reg_node(pRExC_state, HORIZWS);
7107             *flagp |= HASWIDTH|SIMPLE;
7108             goto finish_meta_pat;
7109         case 'H':
7110             ret = reg_node(pRExC_state, NHORIZWS);
7111             *flagp |= HASWIDTH|SIMPLE;
7112             goto finish_meta_pat;
7113         case 'v':
7114             ret = reg_node(pRExC_state, VERTWS);
7115             *flagp |= HASWIDTH|SIMPLE;
7116             goto finish_meta_pat;
7117         case 'V':
7118             ret = reg_node(pRExC_state, NVERTWS);
7119             *flagp |= HASWIDTH|SIMPLE;
7120          finish_meta_pat:           
7121             nextchar(pRExC_state);
7122             Set_Node_Length(ret, 2); /* MJD */
7123             break;          
7124         case 'p':
7125         case 'P':
7126             {   
7127                 char* const oldregxend = RExC_end;
7128 #ifdef DEBUGGING
7129                 char* parse_start = RExC_parse - 2;
7130 #endif
7131
7132                 if (RExC_parse[1] == '{') {
7133                   /* a lovely hack--pretend we saw [\pX] instead */
7134                     RExC_end = strchr(RExC_parse, '}');
7135                     if (!RExC_end) {
7136                         const U8 c = (U8)*RExC_parse;
7137                         RExC_parse += 2;
7138                         RExC_end = oldregxend;
7139                         vFAIL2("Missing right brace on \\%c{}", c);
7140                     }
7141                     RExC_end++;
7142                 }
7143                 else {
7144                     RExC_end = RExC_parse + 2;
7145                     if (RExC_end > oldregxend)
7146                         RExC_end = oldregxend;
7147                 }
7148                 RExC_parse--;
7149
7150                 ret = regclass(pRExC_state,depth+1);
7151
7152                 RExC_end = oldregxend;
7153                 RExC_parse--;
7154
7155                 Set_Node_Offset(ret, parse_start + 2);
7156                 Set_Node_Cur_Length(ret);
7157                 nextchar(pRExC_state);
7158                 *flagp |= HASWIDTH|SIMPLE;
7159             }
7160             break;
7161         case 'N': 
7162             /* Handle \N{NAME} here and not below because it can be 
7163             multicharacter. join_exact() will join them up later on. 
7164             Also this makes sure that things like /\N{BLAH}+/ and 
7165             \N{BLAH} being multi char Just Happen. dmq*/
7166             ++RExC_parse;
7167             ret= reg_namedseq(pRExC_state, NULL); 
7168             break;
7169         case 'k':    /* Handle \k<NAME> and \k'NAME' */
7170         parse_named_seq:
7171         {   
7172             char ch= RExC_parse[1];         
7173             if (ch != '<' && ch != '\'' && ch != '{') {
7174                 RExC_parse++;
7175                 vFAIL2("Sequence %.2s... not terminated",parse_start);
7176             } else {
7177                 /* this pretty much dupes the code for (?P=...) in reg(), if
7178                    you change this make sure you change that */
7179                 char* name_start = (RExC_parse += 2);
7180                 U32 num = 0;
7181                 SV *sv_dat = reg_scan_name(pRExC_state,
7182                     SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
7183                 ch= (ch == '<') ? '>' : (ch == '{') ? '}' : '\'';
7184                 if (RExC_parse == name_start || *RExC_parse != ch)
7185                     vFAIL2("Sequence %.3s... not terminated",parse_start);
7186
7187                 if (!SIZE_ONLY) {
7188                     num = add_data( pRExC_state, 1, "S" );
7189                     RExC_rxi->data->data[num]=(void*)sv_dat;
7190                     SvREFCNT_inc_simple_void(sv_dat);
7191                 }
7192
7193                 RExC_sawback = 1;
7194                 ret = reganode(pRExC_state,
7195                            (U8)(FOLD ? (LOC ? NREFFL : NREFF) : NREF),
7196                            num);
7197                 *flagp |= HASWIDTH;
7198
7199                 /* override incorrect value set in reganode MJD */
7200                 Set_Node_Offset(ret, parse_start+1);
7201                 Set_Node_Cur_Length(ret); /* MJD */
7202                 nextchar(pRExC_state);
7203
7204             }
7205             break;
7206         }
7207         case 'g': 
7208         case '1': case '2': case '3': case '4':
7209         case '5': case '6': case '7': case '8': case '9':
7210             {
7211                 I32 num;
7212                 bool isg = *RExC_parse == 'g';
7213                 bool isrel = 0; 
7214                 bool hasbrace = 0;
7215                 if (isg) {
7216                     RExC_parse++;
7217                     if (*RExC_parse == '{') {
7218                         RExC_parse++;
7219                         hasbrace = 1;
7220                     }
7221                     if (*RExC_parse == '-') {
7222                         RExC_parse++;
7223                         isrel = 1;
7224                     }
7225                     if (hasbrace && !isDIGIT(*RExC_parse)) {
7226                         if (isrel) RExC_parse--;
7227                         RExC_parse -= 2;                            
7228                         goto parse_named_seq;
7229                 }   }
7230                 num = atoi(RExC_parse);
7231                 if (isg && num == 0)
7232                     vFAIL("Reference to invalid group 0");
7233                 if (isrel) {
7234                     num = RExC_npar - num;
7235                     if (num < 1)
7236                         vFAIL("Reference to nonexistent or unclosed group");
7237                 }
7238                 if (!isg && num > 9 && num >= RExC_npar)
7239                     goto defchar;
7240                 else {
7241                     char * const parse_start = RExC_parse - 1; /* MJD */
7242                     while (isDIGIT(*RExC_parse))
7243                         RExC_parse++;
7244                     if (parse_start == RExC_parse - 1) 
7245                         vFAIL("Unterminated \\g... pattern");
7246                     if (hasbrace) {
7247                         if (*RExC_parse != '}') 
7248                             vFAIL("Unterminated \\g{...} pattern");
7249                         RExC_parse++;
7250                     }    
7251                     if (!SIZE_ONLY) {
7252                         if (num > (I32)RExC_rx->nparens)
7253                             vFAIL("Reference to nonexistent group");
7254                     }
7255                     RExC_sawback = 1;
7256                     ret = reganode(pRExC_state,
7257                                    (U8)(FOLD ? (LOC ? REFFL : REFF) : REF),
7258                                    num);
7259                     *flagp |= HASWIDTH;
7260
7261                     /* override incorrect value set in reganode MJD */
7262                     Set_Node_Offset(ret, parse_start+1);
7263                     Set_Node_Cur_Length(ret); /* MJD */
7264                     RExC_parse--;
7265                     nextchar(pRExC_state);
7266                 }
7267             }
7268             break;
7269         case '\0':
7270             if (RExC_parse >= RExC_end)
7271                 FAIL("Trailing \\");
7272             /* FALL THROUGH */
7273         default:
7274             /* Do not generate "unrecognized" warnings here, we fall
7275                back into the quick-grab loop below */
7276             parse_start--;
7277             goto defchar;
7278         }
7279         break;
7280
7281     case '#':
7282         if (RExC_flags & RXf_PMf_EXTENDED) {
7283             if ( reg_skipcomment( pRExC_state ) )
7284                 goto tryagain;
7285         }
7286         /* FALL THROUGH */
7287
7288     default:
7289         outer_default:{
7290             register STRLEN len;
7291             register UV ender;
7292             register char *p;
7293             char *s;
7294             STRLEN foldlen;
7295             U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
7296
7297             parse_start = RExC_parse - 1;
7298
7299             RExC_parse++;
7300
7301         defchar:
7302             ender = 0;
7303             ret = reg_node(pRExC_state,
7304                            (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
7305             s = STRING(ret);
7306             for (len = 0, p = RExC_parse - 1;
7307               len < 127 && p < RExC_end;
7308               len++)
7309             {
7310                 char * const oldp = p;
7311
7312                 if (RExC_flags & RXf_PMf_EXTENDED)
7313                     p = regwhite( pRExC_state, p );
7314                 switch ((U8)*p) {
7315                 case 0xDF:
7316                 case 0xC3:
7317                 case 0xCE:
7318                            if (LOC || !FOLD || !is_TRICKYFOLD_safe(p,RExC_end,UTF))
7319                                 goto normal_default;
7320                 case '^':
7321                 case '$':
7322                 case '.':
7323                 case '[':
7324                 case '(':
7325                 case ')':
7326                 case '|':
7327                     goto loopdone;
7328                 case '\\':
7329                     /* Literal Escapes Switch
7330
7331                        This switch is meant to handle escape sequences that
7332                        resolve to a literal character.
7333
7334                        Every escape sequence that represents something
7335                        else, like an assertion or a char class, is handled
7336                        in the switch marked 'Special Escapes' above in this
7337                        routine, but also has an entry here as anything that
7338                        isn't explicitly mentioned here will be treated as
7339                        an unescaped equivalent literal.
7340                     */
7341
7342                     switch ((U8)*++p) {
7343                     /* These are all the special escapes. */
7344                     case 0xDF:
7345                     case 0xC3:
7346                     case 0xCE:
7347                            if (LOC || !FOLD || !is_TRICKYFOLD_safe(p,RExC_end,UTF))
7348                                 goto normal_default;                
7349                     case 'A':             /* Start assertion */
7350                     case 'b': case 'B':   /* Word-boundary assertion*/
7351                     case 'C':             /* Single char !DANGEROUS! */
7352                     case 'd': case 'D':   /* digit class */
7353                     case 'g': case 'G':   /* generic-backref, pos assertion */
7354                     case 'h': case 'H':   /* HORIZWS */
7355                     case 'k': case 'K':   /* named backref, keep marker */
7356                     case 'N':             /* named char sequence */
7357                     case 'p': case 'P':   /* Unicode property */
7358                               case 'R':   /* LNBREAK */
7359                     case 's': case 'S':   /* space class */
7360                     case 'v': case 'V':   /* VERTWS */
7361                     case 'w': case 'W':   /* word class */
7362                     case 'X':             /* eXtended Unicode "combining character sequence" */
7363                     case 'z': case 'Z':   /* End of line/string assertion */
7364                         --p;
7365                         goto loopdone;
7366
7367                     /* Anything after here is an escape that resolves to a
7368                        literal. (Except digits, which may or may not)
7369                      */
7370                     case 'n':
7371                         ender = '\n';
7372                         p++;
7373                         break;
7374                     case 'r':
7375                         ender = '\r';
7376                         p++;
7377                         break;
7378                     case 't':
7379                         ender = '\t';
7380                         p++;
7381                         break;
7382                     case 'f':
7383                         ender = '\f';
7384                         p++;
7385                         break;
7386                     case 'e':
7387                           ender = ASCII_TO_NATIVE('\033');
7388                         p++;
7389                         break;
7390                     case 'a':
7391                           ender = ASCII_TO_NATIVE('\007');
7392                         p++;
7393                         break;
7394                     case 'x':
7395                         if (*++p == '{') {
7396                             char* const e = strchr(p, '}');
7397         
7398                             if (!e) {
7399                                 RExC_parse = p + 1;
7400                                 vFAIL("Missing right brace on \\x{}");
7401                             }
7402                             else {
7403                                 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
7404                                     | PERL_SCAN_DISALLOW_PREFIX;
7405                                 STRLEN numlen = e - p - 1;
7406                                 ender = grok_hex(p + 1, &numlen, &flags, NULL);
7407                                 if (ender > 0xff)
7408                                     RExC_utf8 = 1;
7409                                 p = e + 1;
7410                             }
7411                         }
7412                         else {
7413                             I32 flags = PERL_SCAN_DISALLOW_PREFIX;
7414                             STRLEN numlen = 2;
7415                             ender = grok_hex(p, &numlen, &flags, NULL);
7416                             p += numlen;
7417                         }
7418                         if (PL_encoding && ender < 0x100)
7419                             goto recode_encoding;
7420                         break;
7421                     case 'c':
7422                         p++;
7423                         ender = UCHARAT(p++);
7424                         ender = toCTRL(ender);
7425                         break;
7426                     case '0': case '1': case '2': case '3':case '4':
7427                     case '5': case '6': case '7': case '8':case '9':
7428                         if (*p == '0' ||
7429                           (isDIGIT(p[1]) && atoi(p) >= RExC_npar) ) {
7430                             I32 flags = 0;
7431                             STRLEN numlen = 3;
7432                             ender = grok_oct(p, &numlen, &flags, NULL);
7433                             p += numlen;
7434                         }
7435                         else {
7436                             --p;
7437                             goto loopdone;
7438                         }
7439                         if (PL_encoding && ender < 0x100)
7440                             goto recode_encoding;
7441                         break;
7442                     recode_encoding:
7443                         {
7444                             SV* enc = PL_encoding;
7445                             ender = reg_recode((const char)(U8)ender, &enc);
7446                             if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
7447                                 vWARN(p, "Invalid escape in the specified encoding");
7448                             RExC_utf8 = 1;
7449                         }
7450                         break;
7451                     case '\0':
7452                         if (p >= RExC_end)
7453                             FAIL("Trailing \\");
7454                         /* FALL THROUGH */
7455                     default:
7456                         if (!SIZE_ONLY&& isALPHA(*p) && ckWARN(WARN_REGEXP))
7457                             vWARN2(p + 1, "Unrecognized escape \\%c passed through", UCHARAT(p));
7458                         goto normal_default;
7459                     }
7460                     break;
7461                 default:
7462                   normal_default:
7463                     if (UTF8_IS_START(*p) && UTF) {
7464                         STRLEN numlen;
7465                         ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
7466                                                &numlen, UTF8_ALLOW_DEFAULT);
7467                         p += numlen;
7468                     }
7469                     else
7470                         ender = *p++;
7471                     break;
7472                 }
7473                 if ( RExC_flags & RXf_PMf_EXTENDED)
7474                     p = regwhite( pRExC_state, p );
7475                 if (UTF && FOLD) {
7476                     /* Prime the casefolded buffer. */
7477                     ender = toFOLD_uni(ender, tmpbuf, &foldlen);
7478                 }
7479                 if (p < RExC_end && ISMULT2(p)) { /* Back off on ?+*. */
7480                     if (len)
7481                         p = oldp;
7482                     else if (UTF) {
7483                          if (FOLD) {
7484                               /* Emit all the Unicode characters. */
7485                               STRLEN numlen;
7486                               for (foldbuf = tmpbuf;
7487                                    foldlen;
7488                                    foldlen -= numlen) {
7489                                    ender = utf8_to_uvchr(foldbuf, &numlen);
7490                                    if (numlen > 0) {
7491                                         const STRLEN unilen = reguni(pRExC_state, ender, s);
7492                                         s       += unilen;
7493                                         len     += unilen;
7494                                         /* In EBCDIC the numlen
7495                                          * and unilen can differ. */
7496                                         foldbuf += numlen;
7497                                         if (numlen >= foldlen)
7498                                              break;
7499                                    }
7500                                    else
7501                                         break; /* "Can't happen." */
7502                               }
7503                          }
7504                          else {
7505                               const STRLEN unilen = reguni(pRExC_state, ender, s);
7506                               if (unilen > 0) {
7507                                    s   += unilen;
7508                                    len += unilen;
7509                               }
7510                          }
7511                     }
7512                     else {
7513                         len++;
7514                         REGC((char)ender, s++);
7515                     }
7516                     break;
7517                 }
7518                 if (UTF) {
7519                      if (FOLD) {
7520                           /* Emit all the Unicode characters. */
7521                           STRLEN numlen;
7522                           for (foldbuf = tmpbuf;
7523                                foldlen;
7524                                foldlen -= numlen) {
7525                                ender = utf8_to_uvchr(foldbuf, &numlen);
7526                                if (numlen > 0) {
7527                                     const STRLEN unilen = reguni(pRExC_state, ender, s);
7528                                     len     += unilen;
7529                                     s       += unilen;
7530                                     /* In EBCDIC the numlen
7531                                      * and unilen can differ. */
7532                                     foldbuf += numlen;
7533                                     if (numlen >= foldlen)
7534                                          break;
7535                                }
7536                                else
7537                                     break;
7538                           }
7539                      }
7540                      else {
7541                           const STRLEN unilen = reguni(pRExC_state, ender, s);
7542                           if (unilen > 0) {
7543                                s   += unilen;
7544                                len += unilen;
7545                           }
7546                      }
7547                      len--;
7548                 }
7549                 else
7550                     REGC((char)ender, s++);
7551             }
7552         loopdone:
7553             RExC_parse = p - 1;
7554             Set_Node_Cur_Length(ret); /* MJD */
7555             nextchar(pRExC_state);
7556             {
7557                 /* len is STRLEN which is unsigned, need to copy to signed */
7558                 IV iv = len;
7559                 if (iv < 0)
7560                     vFAIL("Internal disaster");
7561             }
7562             if (len > 0)
7563                 *flagp |= HASWIDTH;
7564             if (len == 1 && UNI_IS_INVARIANT(ender))
7565                 *flagp |= SIMPLE;
7566                 
7567             if (SIZE_ONLY)
7568                 RExC_size += STR_SZ(len);
7569             else {
7570                 STR_LEN(ret) = len;
7571                 RExC_emit += STR_SZ(len);
7572             }
7573         }
7574         break;
7575     }
7576
7577     return(ret);
7578 }
7579
7580 STATIC char *
7581 S_regwhite( RExC_state_t *pRExC_state, char *p )
7582 {
7583     const char *e = RExC_end;
7584
7585     PERL_ARGS_ASSERT_REGWHITE;
7586
7587     while (p < e) {
7588         if (isSPACE(*p))
7589             ++p;
7590         else if (*p == '#') {
7591             bool ended = 0;
7592             do {
7593                 if (*p++ == '\n') {
7594                     ended = 1;
7595                     break;
7596                 }
7597             } while (p < e);
7598             if (!ended)
7599                 RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
7600         }
7601         else
7602             break;
7603     }
7604     return p;
7605 }
7606
7607 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
7608    Character classes ([:foo:]) can also be negated ([:^foo:]).
7609    Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
7610    Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
7611    but trigger failures because they are currently unimplemented. */
7612
7613 #define POSIXCC_DONE(c)   ((c) == ':')
7614 #define POSIXCC_NOTYET(c) ((c) == '=' || (c) == '.')
7615 #define POSIXCC(c) (POSIXCC_DONE(c) || POSIXCC_NOTYET(c))
7616
7617 STATIC I32
7618 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value)
7619 {
7620     dVAR;
7621     I32 namedclass = OOB_NAMEDCLASS;
7622
7623     PERL_ARGS_ASSERT_REGPPOSIXCC;
7624
7625     if (value == '[' && RExC_parse + 1 < RExC_end &&
7626         /* I smell either [: or [= or [. -- POSIX has been here, right? */
7627         POSIXCC(UCHARAT(RExC_parse))) {
7628         const char c = UCHARAT(RExC_parse);
7629         char* const s = RExC_parse++;
7630         
7631         while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != c)
7632             RExC_parse++;
7633         if (RExC_parse == RExC_end)
7634             /* Grandfather lone [:, [=, [. */
7635             RExC_parse = s;
7636         else {
7637             const char* const t = RExC_parse++; /* skip over the c */
7638             assert(*t == c);
7639
7640             if (UCHARAT(RExC_parse) == ']') {
7641                 const char *posixcc = s + 1;
7642                 RExC_parse++; /* skip over the ending ] */
7643
7644                 if (*s == ':') {
7645                     const I32 complement = *posixcc == '^' ? *posixcc++ : 0;
7646                     const I32 skip = t - posixcc;
7647
7648                     /* Initially switch on the length of the name.  */
7649                     switch (skip) {
7650                     case 4:
7651                         if (memEQ(posixcc, "word", 4)) /* this is not POSIX, this is the Perl \w */
7652                             namedclass = complement ? ANYOF_NALNUM : ANYOF_ALNUM;
7653                         break;
7654                     case 5:
7655                         /* Names all of length 5.  */
7656                         /* alnum alpha ascii blank cntrl digit graph lower
7657                            print punct space upper  */
7658                         /* Offset 4 gives the best switch position.  */
7659                         switch (posixcc[4]) {
7660                         case 'a':
7661                             if (memEQ(posixcc, "alph", 4)) /* alpha */
7662                                 namedclass = complement ? ANYOF_NALPHA : ANYOF_ALPHA;
7663                             break;
7664                         case 'e':
7665                             if (memEQ(posixcc, "spac", 4)) /* space */
7666                                 namedclass = complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
7667                             break;
7668                         case 'h':
7669                             if (memEQ(posixcc, "grap", 4)) /* graph */
7670                                 namedclass = complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
7671                             break;
7672                         case 'i':
7673                             if (memEQ(posixcc, "asci", 4)) /* ascii */
7674                                 namedclass = complement ? ANYOF_NASCII : ANYOF_ASCII;
7675                             break;
7676                         case 'k':
7677                             if (memEQ(posixcc, "blan", 4)) /* blank */
7678                                 namedclass = complement ? ANYOF_NBLANK : ANYOF_BLANK;
7679                             break;
7680                         case 'l':
7681                             if (memEQ(posixcc, "cntr", 4)) /* cntrl */
7682                                 namedclass = complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
7683                             break;
7684                         case 'm':
7685                             if (memEQ(posixcc, "alnu", 4)) /* alnum */
7686                                 namedclass = complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
7687                             break;
7688                         case 'r':
7689                             if (memEQ(posixcc, "lowe", 4)) /* lower */
7690                                 namedclass = complement ? ANYOF_NLOWER : ANYOF_LOWER;
7691                             else if (memEQ(posixcc, "uppe", 4)) /* upper */
7692                                 namedclass = complement ? ANYOF_NUPPER : ANYOF_UPPER;
7693                             break;
7694                         case 't':
7695                             if (memEQ(posixcc, "digi", 4)) /* digit */
7696                                 namedclass = complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
7697                             else if (memEQ(posixcc, "prin", 4)) /* print */
7698                                 namedclass = complement ? ANYOF_NPRINT : ANYOF_PRINT;
7699                             else if (memEQ(posixcc, "punc", 4)) /* punct */
7700                                 namedclass = complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
7701                             break;
7702                         }
7703                         break;
7704                     case 6:
7705                         if (memEQ(posixcc, "xdigit", 6))
7706                             namedclass = complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
7707                         break;
7708                     }
7709
7710                     if (namedclass == OOB_NAMEDCLASS)
7711                         Simple_vFAIL3("POSIX class [:%.*s:] unknown",
7712                                       t - s - 1, s + 1);
7713                     assert (posixcc[skip] == ':');
7714                     assert (posixcc[skip+1] == ']');
7715                 } else if (!SIZE_ONLY) {
7716                     /* [[=foo=]] and [[.foo.]] are still future. */
7717
7718                     /* adjust RExC_parse so the warning shows after
7719                        the class closes */
7720                     while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse) != ']')
7721                         RExC_parse++;
7722                     Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
7723                 }
7724             } else {
7725                 /* Maternal grandfather:
7726                  * "[:" ending in ":" but not in ":]" */
7727                 RExC_parse = s;
7728             }
7729         }
7730     }
7731
7732     return namedclass;
7733 }
7734
7735 STATIC void
7736 S_checkposixcc(pTHX_ RExC_state_t *pRExC_state)
7737 {
7738     dVAR;
7739
7740     PERL_ARGS_ASSERT_CHECKPOSIXCC;
7741
7742     if (POSIXCC(UCHARAT(RExC_parse))) {
7743         const char *s = RExC_parse;
7744         const char  c = *s++;
7745
7746         while (isALNUM(*s))
7747             s++;
7748         if (*s && c == *s && s[1] == ']') {
7749             if (ckWARN(WARN_REGEXP))
7750                 vWARN3(s+2,
7751                         "POSIX syntax [%c %c] belongs inside character classes",
7752                         c, c);
7753
7754             /* [[=foo=]] and [[.foo.]] are still future. */
7755             if (POSIXCC_NOTYET(c)) {
7756                 /* adjust RExC_parse so the error shows after
7757                    the class closes */
7758                 while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse++) != ']')
7759                     NOOP;
7760                 Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
7761             }
7762         }
7763     }
7764 }
7765
7766
7767 #define _C_C_T_(NAME,TEST,WORD)                         \
7768 ANYOF_##NAME:                                           \
7769     if (LOC)                                            \
7770         ANYOF_CLASS_SET(ret, ANYOF_##NAME);             \
7771     else {                                              \
7772         for (value = 0; value < 256; value++)           \
7773             if (TEST)                                   \
7774                 ANYOF_BITMAP_SET(ret, value);           \
7775     }                                                   \
7776     yesno = '+';                                        \
7777     what = WORD;                                        \
7778     break;                                              \
7779 case ANYOF_N##NAME:                                     \
7780     if (LOC)                                            \
7781         ANYOF_CLASS_SET(ret, ANYOF_N##NAME);            \
7782     else {                                              \
7783         for (value = 0; value < 256; value++)           \
7784             if (!TEST)                                  \
7785                 ANYOF_BITMAP_SET(ret, value);           \
7786     }                                                   \
7787     yesno = '!';                                        \
7788     what = WORD;                                        \
7789     break
7790
7791 #define _C_C_T_NOLOC_(NAME,TEST,WORD)                   \
7792 ANYOF_##NAME:                                           \
7793         for (value = 0; value < 256; value++)           \
7794             if (TEST)                                   \
7795                 ANYOF_BITMAP_SET(ret, value);           \
7796     yesno = '+';                                        \
7797     what = WORD;                                        \
7798     break;                                              \
7799 case ANYOF_N##NAME:                                     \
7800         for (value = 0; value < 256; value++)           \
7801             if (!TEST)                                  \
7802                 ANYOF_BITMAP_SET(ret, value);           \
7803     yesno = '!';                                        \
7804     what = WORD;                                        \
7805     break
7806
7807 /* 
7808    We dont use PERL_LEGACY_UNICODE_CHARCLASS_MAPPINGS as the direct test
7809    so that it is possible to override the option here without having to 
7810    rebuild the entire core. as we are required to do if we change regcomp.h
7811    which is where PERL_LEGACY_UNICODE_CHARCLASS_MAPPINGS is defined.
7812 */
7813 #if PERL_LEGACY_UNICODE_CHARCLASS_MAPPINGS
7814 #define BROKEN_UNICODE_CHARCLASS_MAPPINGS
7815 #endif
7816
7817 #ifdef BROKEN_UNICODE_CHARCLASS_MAPPINGS
7818 #define POSIX_CC_UNI_NAME(CCNAME) CCNAME
7819 #else
7820 #define POSIX_CC_UNI_NAME(CCNAME) "Posix" CCNAME
7821 #endif
7822
7823 /*
7824    parse a class specification and produce either an ANYOF node that
7825    matches the pattern or if the pattern matches a single char only and
7826    that char is < 256 and we are case insensitive then we produce an 
7827    EXACT node instead.
7828 */
7829
7830 STATIC regnode *
7831 S_regclass(pTHX_ RExC_state_t *pRExC_state, U32 depth)
7832 {
7833     dVAR;
7834     register UV nextvalue;
7835     register IV prevvalue = OOB_UNICODE;
7836     register IV range = 0;
7837     UV value = 0; /* XXX:dmq: needs to be referenceable (unfortunately) */
7838     register regnode *ret;
7839     STRLEN numlen;
7840     IV namedclass;
7841     char *rangebegin = NULL;
7842     bool need_class = 0;
7843     SV *listsv = NULL;
7844     UV n;
7845     bool optimize_invert   = TRUE;
7846     AV* unicode_alternate  = NULL;
7847 #ifdef EBCDIC
7848     UV literal_endpoint = 0;
7849 #endif
7850     UV stored = 0;  /* number of chars stored in the class */
7851
7852     regnode * const orig_emit = RExC_emit; /* Save the original RExC_emit in
7853         case we need to change the emitted regop to an EXACT. */
7854     const char * orig_parse = RExC_parse;
7855     GET_RE_DEBUG_FLAGS_DECL;
7856
7857     PERL_ARGS_ASSERT_REGCLASS;
7858 #ifndef DEBUGGING
7859     PERL_UNUSED_ARG(depth);
7860 #endif
7861
7862     DEBUG_PARSE("clas");
7863
7864     /* Assume we are going to generate an ANYOF node. */
7865     ret = reganode(pRExC_state, ANYOF, 0);
7866
7867     if (!SIZE_ONLY)
7868         ANYOF_FLAGS(ret) = 0;
7869
7870     if (UCHARAT(RExC_parse) == '^') {   /* Complement of range. */
7871         RExC_naughty++;
7872         RExC_parse++;
7873         if (!SIZE_ONLY)
7874             ANYOF_FLAGS(ret) |= ANYOF_INVERT;
7875     }
7876
7877     if (SIZE_ONLY) {
7878         RExC_size += ANYOF_SKIP;
7879         listsv = &PL_sv_undef; /* For code scanners: listsv always non-NULL. */
7880     }
7881     else {
7882         RExC_emit += ANYOF_SKIP;
7883         if (FOLD)
7884             ANYOF_FLAGS(ret) |= ANYOF_FOLD;
7885         if (LOC)
7886             ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
7887         ANYOF_BITMAP_ZERO(ret);
7888         listsv = newSVpvs("# comment\n");
7889     }
7890
7891     nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
7892
7893     if (!SIZE_ONLY && POSIXCC(nextvalue))
7894         checkposixcc(pRExC_state);
7895
7896     /* allow 1st char to be ] (allowing it to be - is dealt with later) */
7897     if (UCHARAT(RExC_parse) == ']')
7898         goto charclassloop;
7899
7900 parseit:
7901     while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
7902
7903     charclassloop:
7904
7905         namedclass = OOB_NAMEDCLASS; /* initialize as illegal */
7906
7907         if (!range)
7908             rangebegin = RExC_parse;
7909         if (UTF) {
7910             value = utf8n_to_uvchr((U8*)RExC_parse,
7911                                    RExC_end - RExC_parse,
7912                                    &numlen, UTF8_ALLOW_DEFAULT);
7913             RExC_parse += numlen;
7914         }
7915         else
7916             value = UCHARAT(RExC_parse++);
7917
7918         nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
7919         if (value == '[' && POSIXCC(nextvalue))
7920             namedclass = regpposixcc(pRExC_state, value);
7921         else if (value == '\\') {
7922             if (UTF) {
7923                 value = utf8n_to_uvchr((U8*)RExC_parse,
7924                                    RExC_end - RExC_parse,
7925                                    &numlen, UTF8_ALLOW_DEFAULT);
7926                 RExC_parse += numlen;
7927             }
7928             else
7929                 value = UCHARAT(RExC_parse++);
7930             /* Some compilers cannot handle switching on 64-bit integer
7931              * values, therefore value cannot be an UV.  Yes, this will
7932              * be a problem later if we want switch on Unicode.
7933              * A similar issue a little bit later when switching on
7934              * namedclass. --jhi */
7935             switch ((I32)value) {
7936             case 'w':   namedclass = ANYOF_ALNUM;       break;
7937             case 'W':   namedclass = ANYOF_NALNUM;      break;
7938             case 's':   namedclass = ANYOF_SPACE;       break;
7939             case 'S':   namedclass = ANYOF_NSPACE;      break;
7940             case 'd':   namedclass = ANYOF_DIGIT;       break;
7941             case 'D':   namedclass = ANYOF_NDIGIT;      break;
7942             case 'v':   namedclass = ANYOF_VERTWS;      break;
7943             case 'V':   namedclass = ANYOF_NVERTWS;     break;
7944             case 'h':   namedclass = ANYOF_HORIZWS;     break;
7945             case 'H':   namedclass = ANYOF_NHORIZWS;    break;
7946             case 'N':  /* Handle \N{NAME} in class */
7947                 {
7948                     /* We only pay attention to the first char of 
7949                     multichar strings being returned. I kinda wonder
7950                     if this makes sense as it does change the behaviour
7951                     from earlier versions, OTOH that behaviour was broken
7952                     as well. */
7953                     UV v; /* value is register so we cant & it /grrr */
7954                     if (reg_namedseq(pRExC_state, &v)) {
7955                         goto parseit;
7956                     }
7957                     value= v; 
7958                 }
7959                 break;
7960             case 'p':
7961             case 'P':
7962                 {
7963                 char *e;
7964                 if (RExC_parse >= RExC_end)
7965                     vFAIL2("Empty \\%c{}", (U8)value);
7966                 if (*RExC_parse == '{') {
7967                     const U8 c = (U8)value;
7968                     e = strchr(RExC_parse++, '}');
7969                     if (!e)
7970                         vFAIL2("Missing right brace on \\%c{}", c);
7971                     while (isSPACE(UCHARAT(RExC_parse)))
7972                         RExC_parse++;
7973                     if (e == RExC_parse)
7974                         vFAIL2("Empty \\%c{}", c);
7975                     n = e - RExC_parse;
7976                     while (isSPACE(UCHARAT(RExC_parse + n - 1)))
7977                         n--;
7978                 }
7979                 else {
7980                     e = RExC_parse;
7981                     n = 1;
7982                 }
7983                 if (!SIZE_ONLY) {
7984                     if (UCHARAT(RExC_parse) == '^') {
7985                          RExC_parse++;
7986                          n--;
7987                          value = value == 'p' ? 'P' : 'p'; /* toggle */
7988                          while (isSPACE(UCHARAT(RExC_parse))) {
7989                               RExC_parse++;
7990                               n--;
7991                          }
7992                     }
7993                     Perl_sv_catpvf(aTHX_ listsv, "%cutf8::%.*s\n",
7994                         (value=='p' ? '+' : '!'), (int)n, RExC_parse);
7995                 }
7996                 RExC_parse = e + 1;
7997                 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7998                 namedclass = ANYOF_MAX;  /* no official name, but it's named */
7999                 }
8000                 break;
8001             case 'n':   value = '\n';                   break;
8002             case 'r':   value = '\r';                   break;
8003             case 't':   value = '\t';                   break;
8004             case 'f':   value = '\f';                   break;
8005             case 'b':   value = '\b';                   break;
8006             case 'e':   value = ASCII_TO_NATIVE('\033');break;
8007             case 'a':   value = ASCII_TO_NATIVE('\007');break;
8008             case 'x':
8009                 if (*RExC_parse == '{') {
8010                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
8011                         | PERL_SCAN_DISALLOW_PREFIX;
8012                     char * const e = strchr(RExC_parse++, '}');
8013                     if (!e)
8014                         vFAIL("Missing right brace on \\x{}");
8015
8016                     numlen = e - RExC_parse;
8017                     value = grok_hex(RExC_parse, &numlen, &flags, NULL);
8018                     RExC_parse = e + 1;
8019                 }
8020                 else {
8021                     I32 flags = PERL_SCAN_DISALLOW_PREFIX;
8022                     numlen = 2;
8023                     value = grok_hex(RExC_parse, &numlen, &flags, NULL);
8024                     RExC_parse += numlen;
8025                 }
8026                 if (PL_encoding && value < 0x100)
8027                     goto recode_encoding;
8028                 break;
8029             case 'c':
8030                 value = UCHARAT(RExC_parse++);
8031                 value = toCTRL(value);
8032                 break;
8033             case '0': case '1': case '2': case '3': case '4':
8034             case '5': case '6': case '7': case '8': case '9':
8035                 {
8036                     I32 flags = 0;
8037                     numlen = 3;
8038                     value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
8039                     RExC_parse += numlen;
8040                     if (PL_encoding && value < 0x100)
8041                         goto recode_encoding;
8042                     break;
8043                 }
8044             recode_encoding:
8045                 {
8046                     SV* enc = PL_encoding;
8047                     value = reg_recode((const char)(U8)value, &enc);
8048                     if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
8049                         vWARN(RExC_parse,
8050                               "Invalid escape in the specified encoding");
8051                     break;
8052                 }
8053             default:
8054                 if (!SIZE_ONLY && isALPHA(value) && ckWARN(WARN_REGEXP))
8055                     vWARN2(RExC_parse,
8056                            "Unrecognized escape \\%c in character class passed through",
8057                            (int)value);
8058                 break;
8059             }
8060         } /* end of \blah */
8061 #ifdef EBCDIC
8062         else
8063             literal_endpoint++;
8064 #endif
8065
8066         if (namedclass > OOB_NAMEDCLASS) { /* this is a named class \blah */
8067
8068             if (!SIZE_ONLY && !need_class)
8069                 ANYOF_CLASS_ZERO(ret);
8070
8071             need_class = 1;
8072
8073             /* a bad range like a-\d, a-[:digit:] ? */
8074             if (range) {
8075                 if (!SIZE_ONLY) {
8076                     if (ckWARN(WARN_REGEXP)) {
8077                         const int w =
8078                             RExC_parse >= rangebegin ?
8079                             RExC_parse - rangebegin : 0;
8080                         vWARN4(RExC_parse,
8081                                "False [] range \"%*.*s\"",
8082                                w, w, rangebegin);
8083                     }
8084                     if (prevvalue < 256) {
8085                         ANYOF_BITMAP_SET(ret, prevvalue);
8086                         ANYOF_BITMAP_SET(ret, '-');
8087                     }
8088                     else {
8089                         ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
8090                         Perl_sv_catpvf(aTHX_ listsv,
8091                                        "%04"UVxf"\n%04"UVxf"\n", (UV)prevvalue, (UV) '-');
8092                     }
8093                 }
8094
8095                 range = 0; /* this was not a true range */
8096             }
8097
8098
8099     
8100             if (!SIZE_ONLY) {
8101                 const char *what = NULL;
8102                 char yesno = 0;
8103
8104                 if (namedclass > OOB_NAMEDCLASS)
8105                     optimize_invert = FALSE;
8106                 /* Possible truncation here but in some 64-bit environments
8107                  * the compiler gets heartburn about switch on 64-bit values.
8108                  * A similar issue a little earlier when switching on value.
8109                  * --jhi */
8110                 switch ((I32)namedclass) {
8111                 
8112                 case _C_C_T_(ALNUMC, isALNUMC(value), POSIX_CC_UNI_NAME("Alnum"));
8113                 case _C_C_T_(ALPHA, isALPHA(value), POSIX_CC_UNI_NAME("Alpha"));
8114                 case _C_C_T_(BLANK, isBLANK(value), POSIX_CC_UNI_NAME("Blank"));
8115                 case _C_C_T_(CNTRL, isCNTRL(value), POSIX_CC_UNI_NAME("Cntrl"));
8116                 case _C_C_T_(GRAPH, isGRAPH(value), POSIX_CC_UNI_NAME("Graph"));
8117                 case _C_C_T_(LOWER, isLOWER(value), POSIX_CC_UNI_NAME("Lower"));
8118                 case _C_C_T_(PRINT, isPRINT(value), POSIX_CC_UNI_NAME("Print"));
8119                 case _C_C_T_(PSXSPC, isPSXSPC(value), POSIX_CC_UNI_NAME("Space"));
8120                 case _C_C_T_(PUNCT, isPUNCT(value), POSIX_CC_UNI_NAME("Punct"));
8121                 case _C_C_T_(UPPER, isUPPER(value), POSIX_CC_UNI_NAME("Upper"));
8122 #ifdef BROKEN_UNICODE_CHARCLASS_MAPPINGS
8123                 case _C_C_T_(ALNUM, isALNUM(value), "Word");
8124                 case _C_C_T_(SPACE, isSPACE(value), "SpacePerl");
8125 #else
8126                 case _C_C_T_(SPACE, isSPACE(value), "PerlSpace");
8127                 case _C_C_T_(ALNUM, isALNUM(value), "PerlWord");
8128 #endif          
8129                 case _C_C_T_(XDIGIT, isXDIGIT(value), "XDigit");
8130                 case _C_C_T_NOLOC_(VERTWS, is_VERTWS_latin1(&value), "VertSpace");
8131                 case _C_C_T_NOLOC_(HORIZWS, is_HORIZWS_latin1(&value), "HorizSpace");
8132                 case ANYOF_ASCII:
8133                     if (LOC)
8134                         ANYOF_CLASS_SET(ret, ANYOF_ASCII);
8135                     else {
8136 #ifndef EBCDIC
8137                         for (value = 0; value < 128; value++)
8138                             ANYOF_BITMAP_SET(ret, value);
8139 #else  /* EBCDIC */
8140                         for (value = 0; value < 256; value++) {
8141                             if (isASCII(value))
8142                                 ANYOF_BITMAP_SET(ret, value);
8143                         }
8144 #endif /* EBCDIC */
8145                     }
8146                     yesno = '+';
8147                     what = "ASCII";
8148                     break;
8149                 case ANYOF_NASCII:
8150                     if (LOC)
8151                         ANYOF_CLASS_SET(ret, ANYOF_NASCII);
8152                     else {
8153 #ifndef EBCDIC
8154                         for (value = 128; value < 256; value++)
8155                             ANYOF_BITMAP_SET(ret, value);
8156 #else  /* EBCDIC */
8157                         for (value = 0; value < 256; value++) {
8158                             if (!isASCII(value))
8159                                 ANYOF_BITMAP_SET(ret, value);
8160                         }
8161 #endif /* EBCDIC */
8162                     }
8163                     yesno = '!';
8164                     what = "ASCII";
8165                     break;              
8166                 case ANYOF_DIGIT:
8167                     if (LOC)
8168                         ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
8169                     else {
8170                         /* consecutive digits assumed */
8171                         for (value = '0'; value <= '9'; value++)
8172                             ANYOF_BITMAP_SET(ret, value);
8173                     }
8174                     yesno = '+';
8175                     what = POSIX_CC_UNI_NAME("Digit");
8176                     break;
8177                 case ANYOF_NDIGIT:
8178                     if (LOC)
8179                         ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
8180                     else {
8181                         /* consecutive digits assumed */
8182                         for (value = 0; value < '0'; value++)
8183                             ANYOF_BITMAP_SET(ret, value);
8184                         for (value = '9' + 1; value < 256; value++)
8185                             ANYOF_BITMAP_SET(ret, value);
8186                     }
8187                     yesno = '!';
8188                     what = POSIX_CC_UNI_NAME("Digit");
8189                     break;              
8190                 case ANYOF_MAX:
8191                     /* this is to handle \p and \P */
8192                     break;
8193                 default:
8194                     vFAIL("Invalid [::] class");
8195                     break;
8196                 }
8197                 if (what) {
8198                     /* Strings such as "+utf8::isWord\n" */
8199                     Perl_sv_catpvf(aTHX_ listsv, "%cutf8::Is%s\n", yesno, what);
8200                 }
8201                 if (LOC)
8202                     ANYOF_FLAGS(ret) |= ANYOF_CLASS;
8203                 continue;
8204             }
8205         } /* end of namedclass \blah */
8206
8207         if (range) {
8208             if (prevvalue > (IV)value) /* b-a */ {
8209                 const int w = RExC_parse - rangebegin;
8210                 Simple_vFAIL4("Invalid [] range \"%*.*s\"", w, w, rangebegin);
8211                 range = 0; /* not a valid range */
8212             }
8213         }
8214         else {
8215             prevvalue = value; /* save the beginning of the range */
8216             if (*RExC_parse == '-' && RExC_parse+1 < RExC_end &&
8217                 RExC_parse[1] != ']') {
8218                 RExC_parse++;
8219
8220                 /* a bad range like \w-, [:word:]- ? */
8221                 if (namedclass > OOB_NAMEDCLASS) {
8222                     if (ckWARN(WARN_REGEXP)) {
8223                         const int w =
8224                             RExC_parse >= rangebegin ?
8225                             RExC_parse - rangebegin : 0;
8226                         vWARN4(RExC_parse,
8227                                "False [] range \"%*.*s\"",
8228                                w, w, rangebegin);
8229                     }
8230                     if (!SIZE_ONLY)
8231                         ANYOF_BITMAP_SET(ret, '-');
8232                 } else
8233                     range = 1;  /* yeah, it's a range! */
8234                 continue;       /* but do it the next time */
8235             }
8236         }
8237
8238         /* now is the next time */
8239         /*stored += (value - prevvalue + 1);*/
8240         if (!SIZE_ONLY) {
8241             if (prevvalue < 256) {
8242                 const IV ceilvalue = value < 256 ? value : 255;
8243                 IV i;
8244 #ifdef EBCDIC
8245                 /* In EBCDIC [\x89-\x91] should include
8246                  * the \x8e but [i-j] should not. */
8247                 if (literal_endpoint == 2 &&
8248                     ((isLOWER(prevvalue) && isLOWER(ceilvalue)) ||
8249                      (isUPPER(prevvalue) && isUPPER(ceilvalue))))
8250                 {
8251                     if (isLOWER(prevvalue)) {
8252                         for (i = prevvalue; i <= ceilvalue; i++)
8253                             if (isLOWER(i) && !ANYOF_BITMAP_TEST(ret,i)) {
8254                                 stored++;
8255                                 ANYOF_BITMAP_SET(ret, i);
8256                             }
8257                     } else {
8258                         for (i = prevvalue; i <= ceilvalue; i++)
8259                             if (isUPPER(i) && !ANYOF_BITMAP_TEST(ret,i)) {
8260                                 stored++;
8261                                 ANYOF_BITMAP_SET(ret, i);
8262                             }
8263                     }
8264                 }
8265                 else
8266 #endif
8267                       for (i = prevvalue; i <= ceilvalue; i++) {
8268                         if (!ANYOF_BITMAP_TEST(ret,i)) {
8269                             stored++;  
8270                             ANYOF_BITMAP_SET(ret, i);
8271                         }
8272                       }
8273           }
8274           if (value > 255 || UTF) {
8275                 const UV prevnatvalue  = NATIVE_TO_UNI(prevvalue);
8276                 const UV natvalue      = NATIVE_TO_UNI(value);
8277                 stored+=2; /* can't optimize this class */
8278                 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
8279                 if (prevnatvalue < natvalue) { /* what about > ? */
8280                     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
8281                                    prevnatvalue, natvalue);
8282                 }
8283                 else if (prevnatvalue == natvalue) {
8284                     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", natvalue);
8285                     if (FOLD) {
8286                          U8 foldbuf[UTF8_MAXBYTES_CASE+1];
8287                          STRLEN foldlen;
8288                          const UV f = to_uni_fold(natvalue, foldbuf, &foldlen);
8289
8290 #ifdef EBCDIC /* RD t/uni/fold ff and 6b */
8291                          if (RExC_precomp[0] == ':' &&
8292                              RExC_precomp[1] == '[' &&
8293                              (f == 0xDF || f == 0x92)) {
8294                              f = NATIVE_TO_UNI(f);
8295                         }
8296 #endif
8297                          /* If folding and foldable and a single
8298                           * character, insert also the folded version
8299                           * to the charclass. */
8300                          if (f != value) {
8301 #ifdef EBCDIC /* RD tunifold ligatures s,t fb05, fb06 */
8302                              if ((RExC_precomp[0] == ':' &&
8303                                   RExC_precomp[1] == '[' &&
8304                                   (f == 0xA2 &&
8305                                    (value == 0xFB05 || value == 0xFB06))) ?
8306                                  foldlen == ((STRLEN)UNISKIP(f) - 1) :
8307                                  foldlen == (STRLEN)UNISKIP(f) )
8308 #else
8309                               if (foldlen == (STRLEN)UNISKIP(f))
8310 #endif
8311                                   Perl_sv_catpvf(aTHX_ listsv,
8312                                                  "%04"UVxf"\n", f);
8313                               else {
8314                                   /* Any multicharacter foldings
8315                                    * require the following transform:
8316                                    * [ABCDEF] -> (?:[ABCabcDEFd]|pq|rst)
8317                                    * where E folds into "pq" and F folds
8318                                    * into "rst", all other characters
8319                                    * fold to single characters.  We save
8320                                    * away these multicharacter foldings,
8321                                    * to be later saved as part of the
8322                                    * additional "s" data. */
8323                                   SV *sv;
8324
8325                                   if (!unicode_alternate)
8326                                       unicode_alternate = newAV();
8327                                   sv = newSVpvn_utf8((char*)foldbuf, foldlen,
8328                                                      TRUE);
8329                                   av_push(unicode_alternate, sv);
8330                               }
8331                          }
8332
8333                          /* If folding and the value is one of the Greek
8334                           * sigmas insert a few more sigmas to make the
8335                           * folding rules of the sigmas to work right.
8336                           * Note that not all the possible combinations
8337                           * are handled here: some of them are handled
8338                           * by the standard folding rules, and some of
8339                           * them (literal or EXACTF cases) are handled
8340                           * during runtime in regexec.c:S_find_byclass(). */
8341                          if (value == UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA) {
8342                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
8343                                              (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA);
8344                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
8345                                              (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
8346                          }
8347                          else if (value == UNICODE_GREEK_CAPITAL_LETTER_SIGMA)
8348                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
8349                                              (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
8350                     }
8351                 }
8352             }
8353 #ifdef EBCDIC
8354             literal_endpoint = 0;
8355 #endif
8356         }
8357
8358         range = 0; /* this range (if it was one) is done now */
8359     }
8360
8361     if (need_class) {
8362         ANYOF_FLAGS(ret) |= ANYOF_LARGE;
8363         if (SIZE_ONLY)
8364             RExC_size += ANYOF_CLASS_ADD_SKIP;
8365         else
8366             RExC_emit += ANYOF_CLASS_ADD_SKIP;
8367     }
8368
8369
8370     if (SIZE_ONLY)
8371         return ret;
8372     /****** !SIZE_ONLY AFTER HERE *********/
8373
8374     if( stored == 1 && (value < 128 || (value < 256 && !UTF))
8375         && !( ANYOF_FLAGS(ret) & ( ANYOF_FLAGS_ALL ^ ANYOF_FOLD ) )
8376     ) {
8377         /* optimize single char class to an EXACT node
8378            but *only* when its not a UTF/high char  */
8379         const char * cur_parse= RExC_parse;
8380         RExC_emit = (regnode *)orig_emit;
8381         RExC_parse = (char *)orig_parse;
8382         ret = reg_node(pRExC_state,
8383                        (U8)((ANYOF_FLAGS(ret) & ANYOF_FOLD) ? EXACTF : EXACT));
8384         RExC_parse = (char *)cur_parse;
8385         *STRING(ret)= (char)value;
8386         STR_LEN(ret)= 1;
8387         RExC_emit += STR_SZ(1);
8388         if (listsv) {
8389             SvREFCNT_dec(listsv);
8390         }
8391         return ret;
8392     }
8393     /* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
8394     if ( /* If the only flag is folding (plus possibly inversion). */
8395         ((ANYOF_FLAGS(ret) & (ANYOF_FLAGS_ALL ^ ANYOF_INVERT)) == ANYOF_FOLD)
8396        ) {
8397         for (value = 0; value < 256; ++value) {
8398             if (ANYOF_BITMAP_TEST(ret, value)) {
8399                 UV fold = PL_fold[value];
8400
8401                 if (fold != value)
8402                     ANYOF_BITMAP_SET(ret, fold);
8403             }
8404         }
8405         ANYOF_FLAGS(ret) &= ~ANYOF_FOLD;
8406     }
8407
8408     /* optimize inverted simple patterns (e.g. [^a-z]) */
8409     if (optimize_invert &&
8410         /* If the only flag is inversion. */
8411         (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT) {
8412         for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
8413             ANYOF_BITMAP(ret)[value] ^= ANYOF_FLAGS_ALL;
8414         ANYOF_FLAGS(ret) = ANYOF_UNICODE_ALL;
8415     }
8416     {
8417         AV * const av = newAV();
8418         SV *rv;
8419         /* The 0th element stores the character class description
8420          * in its textual form: used later (regexec.c:Perl_regclass_swash())
8421          * to initialize the appropriate swash (which gets stored in
8422          * the 1st element), and also useful for dumping the regnode.
8423          * The 2nd element stores the multicharacter foldings,
8424          * used later (regexec.c:S_reginclass()). */
8425         av_store(av, 0, listsv);
8426         av_store(av, 1, NULL);
8427         av_store(av, 2, MUTABLE_SV(unicode_alternate));
8428         rv = newRV_noinc(MUTABLE_SV(av));
8429         n = add_data(pRExC_state, 1, "s");
8430         RExC_rxi->data->data[n] = (void*)rv;
8431         ARG_SET(ret, n);
8432     }
8433     return ret;
8434 }
8435 #undef _C_C_T_
8436
8437
8438 /* reg_skipcomment()
8439
8440    Absorbs an /x style # comments from the input stream.
8441    Returns true if there is more text remaining in the stream.
8442    Will set the REG_SEEN_RUN_ON_COMMENT flag if the comment
8443    terminates the pattern without including a newline.
8444
8445    Note its the callers responsibility to ensure that we are
8446    actually in /x mode
8447
8448 */
8449
8450 STATIC bool
8451 S_reg_skipcomment(pTHX_ RExC_state_t *pRExC_state)
8452 {
8453     bool ended = 0;
8454
8455     PERL_ARGS_ASSERT_REG_SKIPCOMMENT;
8456
8457     while (RExC_parse < RExC_end)
8458         if (*RExC_parse++ == '\n') {
8459             ended = 1;
8460             break;
8461         }
8462     if (!ended) {
8463         /* we ran off the end of the pattern without ending
8464            the comment, so we have to add an \n when wrapping */
8465         RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
8466         return 0;
8467     } else
8468         return 1;
8469 }
8470
8471 /* nextchar()
8472
8473    Advance that parse position, and optionall absorbs
8474    "whitespace" from the inputstream.
8475
8476    Without /x "whitespace" means (?#...) style comments only,
8477    with /x this means (?#...) and # comments and whitespace proper.
8478
8479    Returns the RExC_parse point from BEFORE the scan occurs.
8480
8481    This is the /x friendly way of saying RExC_parse++.
8482 */
8483
8484 STATIC char*
8485 S_nextchar(pTHX_ RExC_state_t *pRExC_state)
8486 {
8487     char* const retval = RExC_parse++;
8488
8489     PERL_ARGS_ASSERT_NEXTCHAR;
8490
8491     for (;;) {
8492         if (*RExC_parse == '(' && RExC_parse[1] == '?' &&
8493                 RExC_parse[2] == '#') {
8494             while (*RExC_parse != ')') {
8495                 if (RExC_parse == RExC_end)
8496                     FAIL("Sequence (?#... not terminated");
8497                 RExC_parse++;
8498             }
8499             RExC_parse++;
8500             continue;
8501         }
8502         if (RExC_flags & RXf_PMf_EXTENDED) {
8503             if (isSPACE(*RExC_parse)) {
8504                 RExC_parse++;
8505                 continue;
8506             }
8507             else if (*RExC_parse == '#') {
8508                 if ( reg_skipcomment( pRExC_state ) )
8509                     continue;
8510             }
8511         }
8512         return retval;
8513     }
8514 }
8515
8516 /*
8517 - reg_node - emit a node
8518 */
8519 STATIC regnode *                        /* Location. */
8520 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
8521 {
8522     dVAR;
8523     register regnode *ptr;
8524     regnode * const ret = RExC_emit;
8525     GET_RE_DEBUG_FLAGS_DECL;
8526
8527     PERL_ARGS_ASSERT_REG_NODE;
8528
8529     if (SIZE_ONLY) {
8530         SIZE_ALIGN(RExC_size);
8531         RExC_size += 1;
8532         return(ret);
8533     }
8534     if (RExC_emit >= RExC_emit_bound)
8535         Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d", op);
8536
8537     NODE_ALIGN_FILL(ret);
8538     ptr = ret;
8539     FILL_ADVANCE_NODE(ptr, op);
8540     REH_CALL_REGCOMP_HOOK(pRExC_state->rx, (ptr) - 1);
8541 #ifdef RE_TRACK_PATTERN_OFFSETS
8542     if (RExC_offsets) {         /* MJD */
8543         MJD_OFFSET_DEBUG(("%s:%d: (op %s) %s %"UVuf" (len %"UVuf") (max %"UVuf").\n", 
8544               "reg_node", __LINE__, 
8545               PL_reg_name[op],
8546               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] 
8547                 ? "Overwriting end of array!\n" : "OK",
8548               (UV)(RExC_emit - RExC_emit_start),
8549               (UV)(RExC_parse - RExC_start),
8550               (UV)RExC_offsets[0])); 
8551         Set_Node_Offset(RExC_emit, RExC_parse + (op == END));
8552     }
8553 #endif
8554     RExC_emit = ptr;
8555     return(ret);
8556 }
8557
8558 /*
8559 - reganode - emit a node with an argument
8560 */
8561 STATIC regnode *                        /* Location. */
8562 S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
8563 {
8564     dVAR;
8565     register regnode *ptr;
8566     regnode * const ret = RExC_emit;
8567     GET_RE_DEBUG_FLAGS_DECL;
8568
8569     PERL_ARGS_ASSERT_REGANODE;
8570
8571     if (SIZE_ONLY) {
8572         SIZE_ALIGN(RExC_size);
8573         RExC_size += 2;
8574         /* 
8575            We can't do this:
8576            
8577            assert(2==regarglen[op]+1); 
8578         
8579            Anything larger than this has to allocate the extra amount.
8580            If we changed this to be:
8581            
8582            RExC_size += (1 + regarglen[op]);
8583            
8584            then it wouldn't matter. Its not clear what side effect
8585            might come from that so its not done so far.
8586            -- dmq
8587         */
8588         return(ret);
8589     }
8590     if (RExC_emit >= RExC_emit_bound)
8591         Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d", op);
8592
8593     NODE_ALIGN_FILL(ret);
8594     ptr = ret;
8595     FILL_ADVANCE_NODE_ARG(ptr, op, arg);
8596     REH_CALL_REGCOMP_HOOK(pRExC_state->rx, (ptr) - 2);
8597 #ifdef RE_TRACK_PATTERN_OFFSETS
8598     if (RExC_offsets) {         /* MJD */
8599         MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n", 
8600               "reganode",
8601               __LINE__,
8602               PL_reg_name[op],
8603               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] ? 
8604               "Overwriting end of array!\n" : "OK",
8605               (UV)(RExC_emit - RExC_emit_start),
8606               (UV)(RExC_parse - RExC_start),
8607               (UV)RExC_offsets[0])); 
8608         Set_Cur_Node_Offset;
8609     }
8610 #endif            
8611     RExC_emit = ptr;
8612     return(ret);
8613 }
8614
8615 /*
8616 - reguni - emit (if appropriate) a Unicode character
8617 */
8618 STATIC STRLEN
8619 S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char* s)
8620 {
8621     dVAR;
8622
8623     PERL_ARGS_ASSERT_REGUNI;
8624
8625     return SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
8626 }
8627
8628 /*
8629 - reginsert - insert an operator in front of already-emitted operand
8630 *
8631 * Means relocating the operand.
8632 */
8633 STATIC void
8634 S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
8635 {
8636     dVAR;
8637     register regnode *src;
8638     register regnode *dst;
8639     register regnode *place;
8640     const int offset = regarglen[(U8)op];
8641     const int size = NODE_STEP_REGNODE + offset;
8642     GET_RE_DEBUG_FLAGS_DECL;
8643
8644     PERL_ARGS_ASSERT_REGINSERT;
8645     PERL_UNUSED_ARG(depth);
8646 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
8647     DEBUG_PARSE_FMT("inst"," - %s",PL_reg_name[op]);
8648     if (SIZE_ONLY) {
8649         RExC_size += size;
8650         return;
8651     }
8652
8653     src = RExC_emit;
8654     RExC_emit += size;
8655     dst = RExC_emit;
8656     if (RExC_open_parens) {
8657         int paren;
8658         /*DEBUG_PARSE_FMT("inst"," - %"IVdf, (IV)RExC_npar);*/
8659         for ( paren=0 ; paren < RExC_npar ; paren++ ) {
8660             if ( RExC_open_parens[paren] >= opnd ) {
8661                 /*DEBUG_PARSE_FMT("open"," - %d",size);*/
8662                 RExC_open_parens[paren] += size;
8663             } else {
8664                 /*DEBUG_PARSE_FMT("open"," - %s","ok");*/
8665             }
8666             if ( RExC_close_parens[paren] >= opnd ) {
8667                 /*DEBUG_PARSE_FMT("close"," - %d",size);*/
8668                 RExC_close_parens[paren] += size;
8669             } else {
8670                 /*DEBUG_PARSE_FMT("close"," - %s","ok");*/
8671             }
8672         }
8673     }
8674
8675     while (src > opnd) {
8676         StructCopy(--src, --dst, regnode);
8677 #ifdef RE_TRACK_PATTERN_OFFSETS
8678         if (RExC_offsets) {     /* MJD 20010112 */
8679             MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s copy %"UVuf" -> %"UVuf" (max %"UVuf").\n",
8680                   "reg_insert",
8681                   __LINE__,
8682                   PL_reg_name[op],
8683                   (UV)(dst - RExC_emit_start) > RExC_offsets[0] 
8684                     ? "Overwriting end of array!\n" : "OK",
8685                   (UV)(src - RExC_emit_start),
8686                   (UV)(dst - RExC_emit_start),
8687                   (UV)RExC_offsets[0])); 
8688             Set_Node_Offset_To_R(dst-RExC_emit_start, Node_Offset(src));
8689             Set_Node_Length_To_R(dst-RExC_emit_start, Node_Length(src));
8690         }
8691 #endif
8692     }
8693     
8694
8695     place = opnd;               /* Op node, where operand used to be. */
8696 #ifdef RE_TRACK_PATTERN_OFFSETS
8697     if (RExC_offsets) {         /* MJD */
8698         MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n", 
8699               "reginsert",
8700               __LINE__,
8701               PL_reg_name[op],
8702               (UV)(place - RExC_emit_start) > RExC_offsets[0] 
8703               ? "Overwriting end of array!\n" : "OK",
8704               (UV)(place - RExC_emit_start),
8705               (UV)(RExC_parse - RExC_start),
8706               (UV)RExC_offsets[0]));
8707         Set_Node_Offset(place, RExC_parse);
8708         Set_Node_Length(place, 1);
8709     }
8710 #endif    
8711     src = NEXTOPER(place);
8712     FILL_ADVANCE_NODE(place, op);
8713     REH_CALL_REGCOMP_HOOK(pRExC_state->rx, (place) - 1);
8714     Zero(src, offset, regnode);
8715 }
8716
8717 /*
8718 - regtail - set the next-pointer at the end of a node chain of p to val.
8719 - SEE ALSO: regtail_study
8720 */
8721 /* TODO: All three parms should be const */
8722 STATIC void
8723 S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
8724 {
8725     dVAR;
8726     register regnode *scan;
8727     GET_RE_DEBUG_FLAGS_DECL;
8728
8729     PERL_ARGS_ASSERT_REGTAIL;
8730 #ifndef DEBUGGING
8731     PERL_UNUSED_ARG(depth);
8732 #endif
8733
8734     if (SIZE_ONLY)
8735         return;
8736
8737     /* Find last node. */
8738     scan = p;
8739     for (;;) {
8740         regnode * const temp = regnext(scan);
8741         DEBUG_PARSE_r({
8742             SV * const mysv=sv_newmortal();
8743             DEBUG_PARSE_MSG((scan==p ? "tail" : ""));
8744             regprop(RExC_rx, mysv, scan);
8745             PerlIO_printf(Perl_debug_log, "~ %s (%d) %s %s\n",
8746                 SvPV_nolen_const(mysv), REG_NODE_NUM(scan),
8747                     (temp == NULL ? "->" : ""),
8748                     (temp == NULL ? PL_reg_name[OP(val)] : "")
8749             );
8750         });
8751         if (temp == NULL)
8752             break;
8753         scan = temp;
8754     }
8755
8756     if (reg_off_by_arg[OP(scan)]) {
8757         ARG_SET(scan, val - scan);
8758     }
8759     else {
8760         NEXT_OFF(scan) = val - scan;
8761     }
8762 }
8763
8764 #ifdef DEBUGGING
8765 /*
8766 - regtail_study - set the next-pointer at the end of a node chain of p to val.
8767 - Look for optimizable sequences at the same time.
8768 - currently only looks for EXACT chains.
8769
8770 This is expermental code. The idea is to use this routine to perform 
8771 in place optimizations on branches and groups as they are constructed,
8772 with the long term intention of removing optimization from study_chunk so
8773 that it is purely analytical.
8774
8775 Currently only used when in DEBUG mode. The macro REGTAIL_STUDY() is used
8776 to control which is which.
8777
8778 */
8779 /* TODO: All four parms should be const */
8780
8781 STATIC U8
8782 S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
8783 {
8784     dVAR;
8785     register regnode *scan;
8786     U8 exact = PSEUDO;
8787 #ifdef EXPERIMENTAL_INPLACESCAN
8788     I32 min = 0;
8789 #endif
8790     GET_RE_DEBUG_FLAGS_DECL;
8791
8792     PERL_ARGS_ASSERT_REGTAIL_STUDY;
8793
8794
8795     if (SIZE_ONLY)
8796         return exact;
8797
8798     /* Find last node. */
8799
8800     scan = p;
8801     for (;;) {
8802         regnode * const temp = regnext(scan);
8803 #ifdef EXPERIMENTAL_INPLACESCAN
8804         if (PL_regkind[OP(scan)] == EXACT)
8805             if (join_exact(pRExC_state,scan,&min,1,val,depth+1))
8806                 return EXACT;
8807 #endif
8808         if ( exact ) {
8809             switch (OP(scan)) {
8810                 case EXACT:
8811                 case EXACTF:
8812                 case EXACTFL:
8813                         if( exact == PSEUDO )
8814                             exact= OP(scan);
8815                         else if ( exact != OP(scan) )
8816                             exact= 0;
8817                 case NOTHING:
8818                     break;
8819                 default:
8820                     exact= 0;
8821             }
8822         }
8823         DEBUG_PARSE_r({
8824             SV * const mysv=sv_newmortal();
8825             DEBUG_PARSE_MSG((scan==p ? "tsdy" : ""));
8826             regprop(RExC_rx, mysv, scan);
8827             PerlIO_printf(Perl_debug_log, "~ %s (%d) -> %s\n",
8828                 SvPV_nolen_const(mysv),
8829                 REG_NODE_NUM(scan),
8830                 PL_reg_name[exact]);
8831         });
8832         if (temp == NULL)
8833             break;
8834         scan = temp;
8835     }
8836     DEBUG_PARSE_r({
8837         SV * const mysv_val=sv_newmortal();
8838         DEBUG_PARSE_MSG("");
8839         regprop(RExC_rx, mysv_val, val);
8840         PerlIO_printf(Perl_debug_log, "~ attach to %s (%"IVdf") offset to %"IVdf"\n",
8841                       SvPV_nolen_const(mysv_val),
8842                       (IV)REG_NODE_NUM(val),
8843                       (IV)(val - scan)
8844         );
8845     });
8846     if (reg_off_by_arg[OP(scan)]) {
8847         ARG_SET(scan, val - scan);
8848     }
8849     else {
8850         NEXT_OFF(scan) = val - scan;
8851     }
8852
8853     return exact;
8854 }
8855 #endif
8856
8857 /*
8858  - regcurly - a little FSA that accepts {\d+,?\d*}
8859  */
8860 STATIC I32
8861 S_regcurly(register const char *s)
8862 {
8863     PERL_ARGS_ASSERT_REGCURLY;
8864
8865     if (*s++ != '{')
8866         return FALSE;
8867     if (!isDIGIT(*s))
8868         return FALSE;
8869     while (isDIGIT(*s))
8870         s++;
8871     if (*s == ',')
8872         s++;
8873     while (isDIGIT(*s))
8874         s++;
8875     if (*s != '}')
8876         return FALSE;
8877     return TRUE;
8878 }
8879
8880
8881 /*
8882  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
8883  */
8884 #ifdef DEBUGGING
8885 void 
8886 S_regdump_extflags(pTHX_ const char *lead, const U32 flags)
8887 {
8888     int bit;
8889     int set=0;
8890
8891     for (bit=0; bit<32; bit++) {
8892         if (flags & (1<<bit)) {
8893             if (!set++ && lead) 
8894                 PerlIO_printf(Perl_debug_log, "%s",lead);
8895             PerlIO_printf(Perl_debug_log, "%s ",PL_reg_extflags_name[bit]);
8896         }               
8897     }      
8898     if (lead)  {
8899         if (set) 
8900             PerlIO_printf(Perl_debug_log, "\n");
8901         else 
8902             PerlIO_printf(Perl_debug_log, "%s[none-set]\n",lead);
8903     }            
8904 }   
8905 #endif
8906
8907 void
8908 Perl_regdump(pTHX_ const regexp *r)
8909 {
8910 #ifdef DEBUGGING
8911     dVAR;
8912     SV * const sv = sv_newmortal();
8913     SV *dsv= sv_newmortal();
8914     RXi_GET_DECL(r,ri);
8915     GET_RE_DEBUG_FLAGS_DECL;
8916
8917     PERL_ARGS_ASSERT_REGDUMP;
8918
8919     (void)dumpuntil(r, ri->program, ri->program + 1, NULL, NULL, sv, 0, 0);
8920
8921     /* Header fields of interest. */
8922     if (r->anchored_substr) {
8923         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->anchored_substr), 
8924             RE_SV_DUMPLEN(r->anchored_substr), 30);
8925         PerlIO_printf(Perl_debug_log,
8926                       "anchored %s%s at %"IVdf" ",
8927                       s, RE_SV_TAIL(r->anchored_substr),
8928                       (IV)r->anchored_offset);
8929     } else if (r->anchored_utf8) {
8930         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->anchored_utf8), 
8931             RE_SV_DUMPLEN(r->anchored_utf8), 30);
8932         PerlIO_printf(Perl_debug_log,
8933                       "anchored utf8 %s%s at %"IVdf" ",
8934                       s, RE_SV_TAIL(r->anchored_utf8),
8935                       (IV)r->anchored_offset);
8936     }                 
8937     if (r->float_substr) {
8938         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->float_substr), 
8939             RE_SV_DUMPLEN(r->float_substr), 30);
8940         PerlIO_printf(Perl_debug_log,
8941                       "floating %s%s at %"IVdf"..%"UVuf" ",
8942                       s, RE_SV_TAIL(r->float_substr),
8943                       (IV)r->float_min_offset, (UV)r->float_max_offset);
8944     } else if (r->float_utf8) {
8945         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->float_utf8), 
8946             RE_SV_DUMPLEN(r->float_utf8), 30);
8947         PerlIO_printf(Perl_debug_log,
8948                       "floating utf8 %s%s at %"IVdf"..%"UVuf" ",
8949                       s, RE_SV_TAIL(r->float_utf8),
8950                       (IV)r->float_min_offset, (UV)r->float_max_offset);
8951     }
8952     if (r->check_substr || r->check_utf8)
8953         PerlIO_printf(Perl_debug_log,
8954                       (const char *)
8955                       (r->check_substr == r->float_substr
8956                        && r->check_utf8 == r->float_utf8
8957                        ? "(checking floating" : "(checking anchored"));
8958     if (r->extflags & RXf_NOSCAN)
8959         PerlIO_printf(Perl_debug_log, " noscan");
8960     if (r->extflags & RXf_CHECK_ALL)
8961         PerlIO_printf(Perl_debug_log, " isall");
8962     if (r->check_substr || r->check_utf8)
8963         PerlIO_printf(Perl_debug_log, ") ");
8964
8965     if (ri->regstclass) {
8966         regprop(r, sv, ri->regstclass);
8967         PerlIO_printf(Perl_debug_log, "stclass %s ", SvPVX_const(sv));
8968     }
8969     if (r->extflags & RXf_ANCH) {
8970         PerlIO_printf(Perl_debug_log, "anchored");
8971         if (r->extflags & RXf_ANCH_BOL)
8972             PerlIO_printf(Perl_debug_log, "(BOL)");
8973         if (r->extflags & RXf_ANCH_MBOL)
8974             PerlIO_printf(Perl_debug_log, "(MBOL)");
8975         if (r->extflags & RXf_ANCH_SBOL)
8976             PerlIO_printf(Perl_debug_log, "(SBOL)");
8977         if (r->extflags & RXf_ANCH_GPOS)
8978             PerlIO_printf(Perl_debug_log, "(GPOS)");
8979         PerlIO_putc(Perl_debug_log, ' ');
8980     }
8981     if (r->extflags & RXf_GPOS_SEEN)
8982         PerlIO_printf(Perl_debug_log, "GPOS:%"UVuf" ", (UV)r->gofs);
8983     if (r->intflags & PREGf_SKIP)
8984         PerlIO_printf(Perl_debug_log, "plus ");
8985     if (r->intflags & PREGf_IMPLICIT)
8986         PerlIO_printf(Perl_debug_log, "implicit ");
8987     PerlIO_printf(Perl_debug_log, "minlen %"IVdf" ", (IV)r->minlen);
8988     if (r->extflags & RXf_EVAL_SEEN)
8989         PerlIO_printf(Perl_debug_log, "with eval ");
8990     PerlIO_printf(Perl_debug_log, "\n");
8991     DEBUG_FLAGS_r(regdump_extflags("r->extflags: ",r->extflags));            
8992 #else
8993     PERL_ARGS_ASSERT_REGDUMP;
8994     PERL_UNUSED_CONTEXT;
8995     PERL_UNUSED_ARG(r);
8996 #endif  /* DEBUGGING */
8997 }
8998
8999 /*
9000 - regprop - printable representation of opcode
9001 */
9002 #define EMIT_ANYOF_TEST_SEPARATOR(do_sep,sv,flags) \
9003 STMT_START { \
9004         if (do_sep) {                           \
9005             Perl_sv_catpvf(aTHX_ sv,"%s][%s",PL_colors[1],PL_colors[0]); \
9006             if (flags & ANYOF_INVERT)           \
9007                 /*make sure the invert info is in each */ \
9008                 sv_catpvs(sv, "^");             \
9009             do_sep = 0;                         \
9010         }                                       \
9011 } STMT_END
9012
9013 void
9014 Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o)
9015 {
9016 #ifdef DEBUGGING
9017     dVAR;
9018     register int k;
9019     RXi_GET_DECL(prog,progi);
9020     GET_RE_DEBUG_FLAGS_DECL;
9021     
9022     PERL_ARGS_ASSERT_REGPROP;
9023
9024     sv_setpvs(sv, "");
9025
9026     if (OP(o) > REGNODE_MAX)            /* regnode.type is unsigned */
9027         /* It would be nice to FAIL() here, but this may be called from
9028            regexec.c, and it would be hard to supply pRExC_state. */
9029         Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", (int)OP(o), (int)REGNODE_MAX);
9030     sv_catpv(sv, PL_reg_name[OP(o)]); /* Take off const! */
9031
9032     k = PL_regkind[OP(o)];
9033
9034     if (k == EXACT) {
9035         sv_catpvs(sv, " ");
9036         /* Using is_utf8_string() (via PERL_PV_UNI_DETECT) 
9037          * is a crude hack but it may be the best for now since 
9038          * we have no flag "this EXACTish node was UTF-8" 
9039          * --jhi */
9040         pv_pretty(sv, STRING(o), STR_LEN(o), 60, PL_colors[0], PL_colors[1],
9041                   PERL_PV_ESCAPE_UNI_DETECT |
9042                   PERL_PV_PRETTY_ELLIPSES   |
9043                   PERL_PV_PRETTY_LTGT       |
9044                   PERL_PV_PRETTY_NOCLEAR
9045                   );
9046     } else if (k == TRIE) {
9047         /* print the details of the trie in dumpuntil instead, as
9048          * progi->data isn't available here */
9049         const char op = OP(o);
9050         const U32 n = ARG(o);
9051         const reg_ac_data * const ac = IS_TRIE_AC(op) ?
9052                (reg_ac_data *)progi->data->data[n] :
9053                NULL;
9054         const reg_trie_data * const trie
9055             = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
9056         
9057         Perl_sv_catpvf(aTHX_ sv, "-%s",PL_reg_name[o->flags]);
9058         DEBUG_TRIE_COMPILE_r(
9059             Perl_sv_catpvf(aTHX_ sv,
9060                 "<S:%"UVuf"/%"IVdf" W:%"UVuf" L:%"UVuf"/%"UVuf" C:%"UVuf"/%"UVuf">",
9061                 (UV)trie->startstate,
9062                 (IV)trie->statecount-1, /* -1 because of the unused 0 element */
9063                 (UV)trie->wordcount,
9064                 (UV)trie->minlen,
9065                 (UV)trie->maxlen,
9066                 (UV)TRIE_CHARCOUNT(trie),
9067                 (UV)trie->uniquecharcount
9068             )
9069         );
9070         if ( IS_ANYOF_TRIE(op) || trie->bitmap ) {
9071             int i;
9072             int rangestart = -1;
9073             U8* bitmap = IS_ANYOF_TRIE(op) ? (U8*)ANYOF_BITMAP(o) : (U8*)TRIE_BITMAP(trie);
9074             sv_catpvs(sv, "[");
9075             for (i = 0; i <= 256; i++) {
9076                 if (i < 256 && BITMAP_TEST(bitmap,i)) {
9077                     if (rangestart == -1)
9078                         rangestart = i;
9079                 } else if (rangestart != -1) {
9080                     if (i <= rangestart + 3)
9081                         for (; rangestart < i; rangestart++)
9082                             put_byte(sv, rangestart);
9083                     else {
9084                         put_byte(sv, rangestart);
9085                         sv_catpvs(sv, "-");
9086                         put_byte(sv, i - 1);
9087                     }
9088                     rangestart = -1;
9089                 }
9090             }
9091             sv_catpvs(sv, "]");
9092         } 
9093          
9094     } else if (k == CURLY) {
9095         if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
9096             Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
9097         Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
9098     }
9099     else if (k == WHILEM && o->flags)                   /* Ordinal/of */
9100         Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
9101     else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP || OP(o)==ACCEPT) {
9102         Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o));    /* Parenth number */
9103         if ( RXp_PAREN_NAMES(prog) ) {
9104             if ( k != REF || OP(o) < NREF) {        
9105                 AV *list= MUTABLE_AV(progi->data->data[progi->name_list_idx]);
9106                 SV **name= av_fetch(list, ARG(o), 0 );
9107                 if (name)
9108                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
9109             }       
9110             else {
9111                 AV *list= MUTABLE_AV(progi->data->data[ progi->name_list_idx ]);
9112                 SV *sv_dat= MUTABLE_SV(progi->data->data[ ARG( o ) ]);
9113                 I32 *nums=(I32*)SvPVX(sv_dat);
9114                 SV **name= av_fetch(list, nums[0], 0 );
9115                 I32 n;
9116                 if (name) {
9117                     for ( n=0; n<SvIVX(sv_dat); n++ ) {
9118                         Perl_sv_catpvf(aTHX_ sv, "%s%"IVdf,
9119                                     (n ? "," : ""), (IV)nums[n]);
9120                     }
9121                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
9122                 }
9123             }
9124         }            
9125     } else if (k == GOSUB) 
9126         Perl_sv_catpvf(aTHX_ sv, "%d[%+d]", (int)ARG(o),(int)ARG2L(o)); /* Paren and offset */
9127     else if (k == VERB) {
9128         if (!o->flags) 
9129             Perl_sv_catpvf(aTHX_ sv, ":%"SVf, 
9130                            SVfARG((MUTABLE_SV(progi->data->data[ ARG( o ) ]))));
9131     } else if (k == LOGICAL)
9132         Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);     /* 2: embedded, otherwise 1 */
9133     else if (k == FOLDCHAR)
9134         Perl_sv_catpvf(aTHX_ sv, "[0x%"UVXf"]", PTR2UV(ARG(o)) );
9135     else if (k == ANYOF) {
9136         int i, rangestart = -1;
9137         const U8 flags = ANYOF_FLAGS(o);
9138         int do_sep = 0;
9139
9140         /* Should be synchronized with * ANYOF_ #xdefines in regcomp.h */
9141         static const char * const anyofs[] = {
9142             "\\w",
9143             "\\W",
9144             "\\s",
9145             "\\S",
9146             "\\d",
9147             "\\D",
9148             "[:alnum:]",
9149             "[:^alnum:]",
9150             "[:alpha:]",
9151             "[:^alpha:]",
9152             "[:ascii:]",
9153             "[:^ascii:]",
9154             "[:cntrl:]",
9155             "[:^cntrl:]",
9156             "[:graph:]",
9157             "[:^graph:]",
9158             "[:lower:]",
9159             "[:^lower:]",
9160             "[:print:]",
9161             "[:^print:]",
9162             "[:punct:]",
9163             "[:^punct:]",
9164             "[:upper:]",
9165             "[:^upper:]",
9166             "[:xdigit:]",
9167             "[:^xdigit:]",
9168             "[:space:]",
9169             "[:^space:]",
9170             "[:blank:]",
9171             "[:^blank:]"
9172         };
9173
9174         if (flags & ANYOF_LOCALE)
9175             sv_catpvs(sv, "{loc}");
9176         if (flags & ANYOF_FOLD)
9177             sv_catpvs(sv, "{i}");
9178         Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
9179         if (flags & ANYOF_INVERT)
9180             sv_catpvs(sv, "^");
9181         
9182         /* output what the standard cp 0-255 bitmap matches */
9183         for (i = 0; i <= 256; i++) {
9184             if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
9185                 if (rangestart == -1)
9186                     rangestart = i;
9187             } else if (rangestart != -1) {
9188                 if (i <= rangestart + 3)
9189                     for (; rangestart < i; rangestart++)
9190                         put_byte(sv, rangestart);
9191                 else {
9192                     put_byte(sv, rangestart);
9193                     sv_catpvs(sv, "-");
9194                     put_byte(sv, i - 1);
9195                 }
9196                 do_sep = 1;
9197                 rangestart = -1;
9198             }
9199         }
9200         
9201         EMIT_ANYOF_TEST_SEPARATOR(do_sep,sv,flags);
9202         /* output any special charclass tests (used mostly under use locale) */
9203         if (o->flags & ANYOF_CLASS)
9204             for (i = 0; i < (int)(sizeof(anyofs)/sizeof(char*)); i++)
9205                 if (ANYOF_CLASS_TEST(o,i)) {
9206                     sv_catpv(sv, anyofs[i]);
9207                     do_sep = 1;
9208                 }
9209         
9210         EMIT_ANYOF_TEST_SEPARATOR(do_sep,sv,flags);
9211         
9212         /* output information about the unicode matching */
9213         if (flags & ANYOF_UNICODE)
9214             sv_catpvs(sv, "{unicode}");
9215         else if (flags & ANYOF_UNICODE_ALL)
9216             sv_catpvs(sv, "{unicode_all}");
9217
9218         {
9219             SV *lv;
9220             SV * const sw = regclass_swash(prog, o, FALSE, &lv, 0);
9221         
9222             if (lv) {
9223                 if (sw) {
9224                     U8 s[UTF8_MAXBYTES_CASE+1];
9225
9226                     for (i = 0; i <= 256; i++) { /* just the first 256 */
9227                         uvchr_to_utf8(s, i);
9228                         
9229                         if (i < 256 && swash_fetch(sw, s, TRUE)) {
9230                             if (rangestart == -1)
9231                                 rangestart = i;
9232                         } else if (rangestart != -1) {
9233                             if (i <= rangestart + 3)
9234                                 for (; rangestart < i; rangestart++) {
9235                                     const U8 * const e = uvchr_to_utf8(s,rangestart);
9236                                     U8 *p;
9237                                     for(p = s; p < e; p++)
9238                                         put_byte(sv, *p);
9239                                 }
9240                             else {
9241                                 const U8 *e = uvchr_to_utf8(s,rangestart);
9242                                 U8 *p;
9243                                 for (p = s; p < e; p++)
9244                                     put_byte(sv, *p);
9245                                 sv_catpvs(sv, "-");
9246                                 e = uvchr_to_utf8(s, i-1);
9247                                 for (p = s; p < e; p++)
9248                                     put_byte(sv, *p);
9249                                 }
9250                                 rangestart = -1;
9251                             }
9252                         }
9253                         
9254                     sv_catpvs(sv, "..."); /* et cetera */
9255                 }
9256
9257                 {
9258                     char *s = savesvpv(lv);
9259                     char * const origs = s;
9260                 
9261                     while (*s && *s != '\n')
9262                         s++;
9263                 
9264                     if (*s == '\n') {
9265                         const char * const t = ++s;
9266                         
9267                         while (*s) {
9268                             if (*s == '\n')
9269                                 *s = ' ';
9270                             s++;
9271                         }
9272                         if (s[-1] == ' ')
9273                             s[-1] = 0;
9274                         
9275                         sv_catpv(sv, t);
9276                     }
9277                 
9278                     Safefree(origs);
9279                 }
9280             }
9281         }
9282
9283         Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
9284     }
9285     else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
9286         Perl_sv_catpvf(aTHX_ sv, "[%d]", -(o->flags));
9287 #else
9288     PERL_UNUSED_CONTEXT;
9289     PERL_UNUSED_ARG(sv);
9290     PERL_UNUSED_ARG(o);
9291     PERL_UNUSED_ARG(prog);
9292 #endif  /* DEBUGGING */
9293 }
9294
9295 SV *
9296 Perl_re_intuit_string(pTHX_ REGEXP * const prog)
9297 {                               /* Assume that RE_INTUIT is set */
9298     dVAR;
9299     GET_RE_DEBUG_FLAGS_DECL;
9300
9301     PERL_ARGS_ASSERT_RE_INTUIT_STRING;
9302     PERL_UNUSED_CONTEXT;
9303
9304     DEBUG_COMPILE_r(
9305         {
9306             const char * const s = SvPV_nolen_const(prog->check_substr
9307                       ? prog->check_substr : prog->check_utf8);
9308
9309             if (!PL_colorset) reginitcolors();
9310             PerlIO_printf(Perl_debug_log,
9311                       "%sUsing REx %ssubstr:%s \"%s%.60s%s%s\"\n",
9312                       PL_colors[4],
9313                       prog->check_substr ? "" : "utf8 ",
9314                       PL_colors[5],PL_colors[0],
9315                       s,
9316                       PL_colors[1],
9317                       (strlen(s) > 60 ? "..." : ""));
9318         } );
9319
9320     return prog->check_substr ? prog->check_substr : prog->check_utf8;
9321 }
9322
9323 /* 
9324    pregfree() 
9325    
9326    handles refcounting and freeing the perl core regexp structure. When 
9327    it is necessary to actually free the structure the first thing it 
9328    does is call the 'free' method of the regexp_engine associated to to 
9329    the regexp, allowing the handling of the void *pprivate; member 
9330    first. (This routine is not overridable by extensions, which is why 
9331    the extensions free is called first.)
9332    
9333    See regdupe and regdupe_internal if you change anything here. 
9334 */
9335 #ifndef PERL_IN_XSUB_RE
9336 void
9337 Perl_pregfree(pTHX_ REGEXP *r)
9338 {
9339     dVAR;
9340     GET_RE_DEBUG_FLAGS_DECL;
9341
9342     if (!r || (--r->refcnt > 0))
9343         return;
9344     if (r->mother_re) {
9345         ReREFCNT_dec(r->mother_re);
9346     } else {
9347         CALLREGFREE_PVT(r); /* free the private data */
9348         if (RXp_PAREN_NAMES(r))
9349             SvREFCNT_dec(RXp_PAREN_NAMES(r));
9350         Safefree(RX_WRAPPED(r));
9351     }        
9352     if (r->substrs) {
9353         if (r->anchored_substr)
9354             SvREFCNT_dec(r->anchored_substr);
9355         if (r->anchored_utf8)
9356             SvREFCNT_dec(r->anchored_utf8);
9357         if (r->float_substr)
9358             SvREFCNT_dec(r->float_substr);
9359         if (r->float_utf8)
9360             SvREFCNT_dec(r->float_utf8);
9361         Safefree(r->substrs);
9362     }
9363     RX_MATCH_COPY_FREE(r);
9364 #ifdef PERL_OLD_COPY_ON_WRITE
9365     if (r->saved_copy)
9366         SvREFCNT_dec(r->saved_copy);
9367 #endif
9368     Safefree(r->swap);
9369     Safefree(r->offs);
9370     Safefree(r);
9371 }
9372
9373 /*  reg_temp_copy()
9374     
9375     This is a hacky workaround to the structural issue of match results
9376     being stored in the regexp structure which is in turn stored in
9377     PL_curpm/PL_reg_curpm. The problem is that due to qr// the pattern
9378     could be PL_curpm in multiple contexts, and could require multiple
9379     result sets being associated with the pattern simultaneously, such
9380     as when doing a recursive match with (??{$qr})
9381     
9382     The solution is to make a lightweight copy of the regexp structure 
9383     when a qr// is returned from the code executed by (??{$qr}) this
9384     lightweight copy doesnt actually own any of its data except for
9385     the starp/end and the actual regexp structure itself. 
9386     
9387 */    
9388     
9389     
9390 REGEXP *
9391 Perl_reg_temp_copy (pTHX_ REGEXP *r) {
9392     regexp *ret;
9393     register const I32 npar = r->nparens+1;
9394
9395     PERL_ARGS_ASSERT_REG_TEMP_COPY;
9396
9397     (void)ReREFCNT_inc(r);
9398     Newx(ret, 1, regexp);
9399     StructCopy(r, ret, regexp);
9400     Newx(ret->offs, npar, regexp_paren_pair);
9401     Copy(r->offs, ret->offs, npar, regexp_paren_pair);
9402     ret->refcnt = 1;
9403     if (r->substrs) {
9404         Newx(ret->substrs, 1, struct reg_substr_data);
9405         StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
9406
9407         SvREFCNT_inc_void(ret->anchored_substr);
9408         SvREFCNT_inc_void(ret->anchored_utf8);
9409         SvREFCNT_inc_void(ret->float_substr);
9410         SvREFCNT_inc_void(ret->float_utf8);
9411
9412         /* check_substr and check_utf8, if non-NULL, point to either their
9413            anchored or float namesakes, and don't hold a second reference.  */
9414     }
9415     RX_MATCH_COPIED_off(ret);
9416 #ifdef PERL_OLD_COPY_ON_WRITE
9417     ret->saved_copy = NULL;
9418 #endif
9419     ret->mother_re = r; 
9420     ret->swap = NULL;
9421     
9422     return ret;
9423 }
9424 #endif
9425
9426 /* regfree_internal() 
9427
9428    Free the private data in a regexp. This is overloadable by 
9429    extensions. Perl takes care of the regexp structure in pregfree(), 
9430    this covers the *pprivate pointer which technically perldoesnt 
9431    know about, however of course we have to handle the 
9432    regexp_internal structure when no extension is in use. 
9433    
9434    Note this is called before freeing anything in the regexp 
9435    structure. 
9436  */
9437  
9438 void
9439 Perl_regfree_internal(pTHX_ REGEXP * const r)
9440 {
9441     dVAR;
9442     RXi_GET_DECL(r,ri);
9443     GET_RE_DEBUG_FLAGS_DECL;
9444
9445     PERL_ARGS_ASSERT_REGFREE_INTERNAL;
9446
9447     DEBUG_COMPILE_r({
9448         if (!PL_colorset)
9449             reginitcolors();
9450         {
9451             SV *dsv= sv_newmortal();
9452             RE_PV_QUOTED_DECL(s, RX_UTF8(r),
9453                 dsv, RX_PRECOMP(r), RX_PRELEN(r), 60);
9454             PerlIO_printf(Perl_debug_log,"%sFreeing REx:%s %s\n", 
9455                 PL_colors[4],PL_colors[5],s);
9456         }
9457     });
9458 #ifdef RE_TRACK_PATTERN_OFFSETS
9459     if (ri->u.offsets)
9460         Safefree(ri->u.offsets);             /* 20010421 MJD */
9461 #endif
9462     if (ri->data) {
9463         int n = ri->data->count;
9464         PAD* new_comppad = NULL;
9465         PAD* old_comppad;
9466         PADOFFSET refcnt;
9467
9468         while (--n >= 0) {
9469           /* If you add a ->what type here, update the comment in regcomp.h */
9470             switch (ri->data->what[n]) {
9471             case 's':
9472             case 'S':
9473             case 'u':
9474                 SvREFCNT_dec(MUTABLE_SV(ri->data->data[n]));
9475                 break;
9476             case 'f':
9477                 Safefree(ri->data->data[n]);
9478                 break;
9479             case 'p':
9480                 new_comppad = MUTABLE_AV(ri->data->data[n]);
9481                 break;
9482             case 'o':
9483                 if (new_comppad == NULL)
9484                     Perl_croak(aTHX_ "panic: pregfree comppad");
9485                 PAD_SAVE_LOCAL(old_comppad,
9486                     /* Watch out for global destruction's random ordering. */
9487                     (SvTYPE(new_comppad) == SVt_PVAV) ? new_comppad : NULL
9488                 );
9489                 OP_REFCNT_LOCK;
9490                 refcnt = OpREFCNT_dec((OP_4tree*)ri->data->data[n]);
9491                 OP_REFCNT_UNLOCK;
9492                 if (!refcnt)
9493                     op_free((OP_4tree*)ri->data->data[n]);
9494
9495                 PAD_RESTORE_LOCAL(old_comppad);
9496                 SvREFCNT_dec(MUTABLE_SV(new_comppad));
9497                 new_comppad = NULL;
9498                 break;
9499             case 'n':
9500                 break;
9501             case 'T':           
9502                 { /* Aho Corasick add-on structure for a trie node.
9503                      Used in stclass optimization only */
9504                     U32 refcount;
9505                     reg_ac_data *aho=(reg_ac_data*)ri->data->data[n];
9506                     OP_REFCNT_LOCK;
9507                     refcount = --aho->refcount;
9508                     OP_REFCNT_UNLOCK;
9509                     if ( !refcount ) {
9510                         PerlMemShared_free(aho->states);
9511                         PerlMemShared_free(aho->fail);
9512                          /* do this last!!!! */
9513                         PerlMemShared_free(ri->data->data[n]);
9514                         PerlMemShared_free(ri->regstclass);
9515                     }
9516                 }
9517                 break;
9518             case 't':
9519                 {
9520                     /* trie structure. */
9521                     U32 refcount;
9522                     reg_trie_data *trie=(reg_trie_data*)ri->data->data[n];
9523                     OP_REFCNT_LOCK;
9524                     refcount = --trie->refcount;
9525                     OP_REFCNT_UNLOCK;
9526                     if ( !refcount ) {
9527                         PerlMemShared_free(trie->charmap);
9528                         PerlMemShared_free(trie->states);
9529                         PerlMemShared_free(trie->trans);
9530                         if (trie->bitmap)
9531                             PerlMemShared_free(trie->bitmap);
9532                         if (trie->wordlen)
9533                             PerlMemShared_free(trie->wordlen);
9534                         if (trie->jump)
9535                             PerlMemShared_free(trie->jump);
9536                         if (trie->nextword)
9537                             PerlMemShared_free(trie->nextword);
9538                         /* do this last!!!! */
9539                         PerlMemShared_free(ri->data->data[n]);
9540                     }
9541                 }
9542                 break;
9543             default:
9544                 Perl_croak(aTHX_ "panic: regfree data code '%c'", ri->data->what[n]);
9545             }
9546         }
9547         Safefree(ri->data->what);
9548         Safefree(ri->data);
9549     }
9550
9551     Safefree(ri);
9552 }
9553
9554 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9555 #define av_dup_inc(s,t) MUTABLE_AV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
9556 #define hv_dup_inc(s,t) MUTABLE_HV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
9557 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
9558
9559 /* 
9560    re_dup - duplicate a regexp. 
9561    
9562    This routine is expected to clone a given regexp structure. It is only
9563    compiled under USE_ITHREADS.
9564
9565    After all of the core data stored in struct regexp is duplicated
9566    the regexp_engine.dupe method is used to copy any private data
9567    stored in the *pprivate pointer. This allows extensions to handle
9568    any duplication it needs to do.
9569
9570    See pregfree() and regfree_internal() if you change anything here. 
9571 */
9572 #if defined(USE_ITHREADS)
9573 #ifndef PERL_IN_XSUB_RE
9574 regexp *
9575 Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param)
9576 {
9577     dVAR;
9578     regexp *ret;
9579     I32 npar;
9580     U32 precomp_offset;
9581     
9582     PERL_ARGS_ASSERT_RE_DUP;
9583
9584     if (!r)
9585         return (REGEXP *)NULL;
9586
9587     if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9588         return ret;
9589
9590     npar = r->nparens+1;
9591     Newx(ret, 1, regexp);
9592     StructCopy(r, ret, regexp);
9593     Newx(ret->offs, npar, regexp_paren_pair);
9594     Copy(r->offs, ret->offs, npar, regexp_paren_pair);
9595     if(ret->swap) {
9596         /* no need to copy these */
9597         Newx(ret->swap, npar, regexp_paren_pair);
9598     }
9599
9600     if (ret->substrs) {
9601         /* Do it this way to avoid reading from *r after the StructCopy().
9602            That way, if any of the sv_dup_inc()s dislodge *r from the L1
9603            cache, it doesn't matter.  */
9604         const bool anchored = r->check_substr
9605             ? r->check_substr == r->anchored_substr
9606             : r->check_utf8 == r->anchored_utf8;
9607         Newx(ret->substrs, 1, struct reg_substr_data);
9608         StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
9609
9610         ret->anchored_substr = sv_dup_inc(ret->anchored_substr, param);
9611         ret->anchored_utf8 = sv_dup_inc(ret->anchored_utf8, param);
9612         ret->float_substr = sv_dup_inc(ret->float_substr, param);
9613         ret->float_utf8 = sv_dup_inc(ret->float_utf8, param);
9614
9615         /* check_substr and check_utf8, if non-NULL, point to either their
9616            anchored or float namesakes, and don't hold a second reference.  */
9617
9618         if (ret->check_substr) {
9619             if (anchored) {
9620                 assert(r->check_utf8 == r->anchored_utf8);
9621                 ret->check_substr = ret->anchored_substr;
9622                 ret->check_utf8 = ret->anchored_utf8;
9623             } else {
9624                 assert(r->check_substr == r->float_substr);
9625                 assert(r->check_utf8 == r->float_utf8);
9626                 ret->check_substr = ret->float_substr;
9627                 ret->check_utf8 = ret->float_utf8;
9628             }
9629         } else if (ret->check_utf8) {
9630             if (anchored) {
9631                 ret->check_utf8 = ret->anchored_utf8;
9632             } else {
9633                 ret->check_utf8 = ret->float_utf8;
9634             }
9635         }
9636     }
9637
9638     precomp_offset = RX_PRECOMP(ret) - ret->wrapped;
9639
9640     RX_WRAPPED(ret)     = SAVEPVN(RX_WRAPPED(ret), RX_WRAPLEN(ret)+1);
9641     RX_PRECOMP(ret)     = ret->wrapped + precomp_offset;
9642     RXp_PAREN_NAMES(ret) = hv_dup_inc(RXp_PAREN_NAMES(ret), param);
9643
9644     if (ret->pprivate)
9645         RXi_SET(ret,CALLREGDUPE_PVT(ret,param));
9646
9647     if (RX_MATCH_COPIED(ret))
9648         ret->subbeg  = SAVEPVN(ret->subbeg, ret->sublen);
9649     else
9650         ret->subbeg = NULL;
9651 #ifdef PERL_OLD_COPY_ON_WRITE
9652     ret->saved_copy = NULL;
9653 #endif
9654
9655     ret->mother_re      = NULL;
9656     ret->gofs = 0;
9657     
9658     ptr_table_store(PL_ptr_table, r, ret);
9659     return ret;
9660 }
9661 #endif /* PERL_IN_XSUB_RE */
9662
9663 /*
9664    regdupe_internal()
9665    
9666    This is the internal complement to regdupe() which is used to copy
9667    the structure pointed to by the *pprivate pointer in the regexp.
9668    This is the core version of the extension overridable cloning hook.
9669    The regexp structure being duplicated will be copied by perl prior
9670    to this and will be provided as the regexp *r argument, however 
9671    with the /old/ structures pprivate pointer value. Thus this routine
9672    may override any copying normally done by perl.
9673    
9674    It returns a pointer to the new regexp_internal structure.
9675 */
9676
9677 void *
9678 Perl_regdupe_internal(pTHX_ REGEXP * const r, CLONE_PARAMS *param)
9679 {
9680     dVAR;
9681     regexp_internal *reti;
9682     int len, npar;
9683     RXi_GET_DECL(r,ri);
9684
9685     PERL_ARGS_ASSERT_REGDUPE_INTERNAL;
9686     
9687     npar = r->nparens+1;
9688     len = ProgLen(ri);
9689     
9690     Newxc(reti, sizeof(regexp_internal) + len*sizeof(regnode), char, regexp_internal);
9691     Copy(ri->program, reti->program, len+1, regnode);
9692     
9693
9694     reti->regstclass = NULL;
9695
9696     if (ri->data) {
9697         struct reg_data *d;
9698         const int count = ri->data->count;
9699         int i;
9700
9701         Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
9702                 char, struct reg_data);
9703         Newx(d->what, count, U8);
9704
9705         d->count = count;
9706         for (i = 0; i < count; i++) {
9707             d->what[i] = ri->data->what[i];
9708             switch (d->what[i]) {
9709                 /* legal options are one of: sSfpontTu
9710                    see also regcomp.h and pregfree() */
9711             case 's':
9712             case 'S':
9713             case 'p': /* actually an AV, but the dup function is identical.  */
9714             case 'u': /* actually an HV, but the dup function is identical.  */
9715                 d->data[i] = sv_dup_inc((const SV *)ri->data->data[i], param);
9716                 break;
9717             case 'f':
9718                 /* This is cheating. */
9719                 Newx(d->data[i], 1, struct regnode_charclass_class);
9720                 StructCopy(ri->data->data[i], d->data[i],
9721                             struct regnode_charclass_class);
9722                 reti->regstclass = (regnode*)d->data[i];
9723                 break;
9724             case 'o':
9725                 /* Compiled op trees are readonly and in shared memory,
9726                    and can thus be shared without duplication. */
9727                 OP_REFCNT_LOCK;
9728                 d->data[i] = (void*)OpREFCNT_inc((OP*)ri->data->data[i]);
9729                 OP_REFCNT_UNLOCK;
9730                 break;
9731             case 'T':
9732                 /* Trie stclasses are readonly and can thus be shared
9733                  * without duplication. We free the stclass in pregfree
9734                  * when the corresponding reg_ac_data struct is freed.
9735                  */
9736                 reti->regstclass= ri->regstclass;
9737                 /* Fall through */
9738             case 't':
9739                 OP_REFCNT_LOCK;
9740                 ((reg_trie_data*)ri->data->data[i])->refcount++;
9741                 OP_REFCNT_UNLOCK;
9742                 /* Fall through */
9743             case 'n':
9744                 d->data[i] = ri->data->data[i];
9745                 break;
9746             default:
9747                 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", ri->data->what[i]);
9748             }
9749         }
9750
9751         reti->data = d;
9752     }
9753     else
9754         reti->data = NULL;
9755
9756     reti->name_list_idx = ri->name_list_idx;
9757
9758 #ifdef RE_TRACK_PATTERN_OFFSETS
9759     if (ri->u.offsets) {
9760         Newx(reti->u.offsets, 2*len+1, U32);
9761         Copy(ri->u.offsets, reti->u.offsets, 2*len+1, U32);
9762     }
9763 #else
9764     SetProgLen(reti,len);
9765 #endif
9766
9767     return (void*)reti;
9768 }
9769
9770 #endif    /* USE_ITHREADS */
9771
9772 /* 
9773    reg_stringify() 
9774    
9775    converts a regexp embedded in a MAGIC struct to its stringified form, 
9776    caching the converted form in the struct and returns the cached 
9777    string. 
9778
9779    If lp is nonnull then it is used to return the length of the 
9780    resulting string
9781    
9782    If flags is nonnull and the returned string contains UTF8 then 
9783    (*flags & 1) will be true.
9784    
9785    If haseval is nonnull then it is used to return whether the pattern 
9786    contains evals.
9787    
9788    Normally called via macro: 
9789    
9790         CALLREG_STRINGIFY(mg,&len,&utf8);
9791         
9792    And internally with
9793    
9794         CALLREG_AS_STR(mg,&lp,&flags,&haseval)        
9795     
9796    See sv_2pv_flags() in sv.c for an example of internal usage.
9797     
9798  */
9799 #ifndef PERL_IN_XSUB_RE
9800
9801 char *
9802 Perl_reg_stringify(pTHX_ MAGIC *mg, STRLEN *lp, U32 *flags, I32 *haseval ) {
9803     dVAR;
9804     const REGEXP * const re = (REGEXP *)mg->mg_obj;
9805     if (haseval) 
9806         *haseval = RX_SEEN_EVALS(re);
9807     if (flags)    
9808         *flags = RX_UTF8(re) ? 1 : 0;
9809     if (lp)
9810         *lp = RX_WRAPLEN(re);
9811     return RX_WRAPPED(re);
9812 }
9813
9814 /*
9815  - regnext - dig the "next" pointer out of a node
9816  */
9817 regnode *
9818 Perl_regnext(pTHX_ register regnode *p)
9819 {
9820     dVAR;
9821     register I32 offset;
9822
9823     if (!p)
9824         return(NULL);
9825
9826     offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
9827     if (offset == 0)
9828         return(NULL);
9829
9830     return(p+offset);
9831 }
9832 #endif
9833
9834 STATIC void     
9835 S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
9836 {
9837     va_list args;
9838     STRLEN l1 = strlen(pat1);
9839     STRLEN l2 = strlen(pat2);
9840     char buf[512];
9841     SV *msv;
9842     const char *message;
9843
9844     PERL_ARGS_ASSERT_RE_CROAK2;
9845
9846     if (l1 > 510)
9847         l1 = 510;
9848     if (l1 + l2 > 510)
9849         l2 = 510 - l1;
9850     Copy(pat1, buf, l1 , char);
9851     Copy(pat2, buf + l1, l2 , char);
9852     buf[l1 + l2] = '\n';
9853     buf[l1 + l2 + 1] = '\0';
9854 #ifdef I_STDARG
9855     /* ANSI variant takes additional second argument */
9856     va_start(args, pat2);
9857 #else
9858     va_start(args);
9859 #endif
9860     msv = vmess(buf, &args);
9861     va_end(args);
9862     message = SvPV_const(msv,l1);
9863     if (l1 > 512)
9864         l1 = 512;
9865     Copy(message, buf, l1 , char);
9866     buf[l1-1] = '\0';                   /* Overwrite \n */
9867     Perl_croak(aTHX_ "%s", buf);
9868 }
9869
9870 /* XXX Here's a total kludge.  But we need to re-enter for swash routines. */
9871
9872 #ifndef PERL_IN_XSUB_RE
9873 void
9874 Perl_save_re_context(pTHX)
9875 {
9876     dVAR;
9877
9878     struct re_save_state *state;
9879
9880     SAVEVPTR(PL_curcop);
9881     SSGROW(SAVESTACK_ALLOC_FOR_RE_SAVE_STATE + 1);
9882
9883     state = (struct re_save_state *)(PL_savestack + PL_savestack_ix);
9884     PL_savestack_ix += SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
9885     SSPUSHINT(SAVEt_RE_STATE);
9886
9887     Copy(&PL_reg_state, state, 1, struct re_save_state);
9888
9889     PL_reg_start_tmp = 0;
9890     PL_reg_start_tmpl = 0;
9891     PL_reg_oldsaved = NULL;
9892     PL_reg_oldsavedlen = 0;
9893     PL_reg_maxiter = 0;
9894     PL_reg_leftiter = 0;
9895     PL_reg_poscache = NULL;
9896     PL_reg_poscache_size = 0;
9897 #ifdef PERL_OLD_COPY_ON_WRITE
9898     PL_nrs = NULL;
9899 #endif
9900
9901     /* Save $1..$n (#18107: UTF-8 s/(\w+)/uc($1)/e); AMS 20021106. */
9902     if (PL_curpm) {
9903         const REGEXP * const rx = PM_GETRE(PL_curpm);
9904         if (rx) {
9905             U32 i;
9906             for (i = 1; i <= RX_NPARENS(rx); i++) {
9907                 char digits[TYPE_CHARS(long)];
9908                 const STRLEN len = my_snprintf(digits, sizeof(digits), "%lu", (long)i);
9909                 GV *const *const gvp
9910                     = (GV**)hv_fetch(PL_defstash, digits, len, 0);
9911
9912                 if (gvp) {
9913                     GV * const gv = *gvp;
9914                     if (SvTYPE(gv) == SVt_PVGV && GvSV(gv))
9915                         save_scalar(gv);
9916                 }
9917             }
9918         }
9919     }
9920 }
9921 #endif
9922
9923 static void
9924 clear_re(pTHX_ void *r)
9925 {
9926     dVAR;
9927     ReREFCNT_dec((REGEXP *)r);
9928 }
9929
9930 #ifdef DEBUGGING
9931
9932 STATIC void
9933 S_put_byte(pTHX_ SV *sv, int c)
9934 {
9935     PERL_ARGS_ASSERT_PUT_BYTE;
9936
9937     /* Our definition of isPRINT() ignores locales, so only bytes that are
9938        not part of UTF-8 are considered printable. I assume that the same
9939        holds for UTF-EBCDIC.
9940        Also, code point 255 is not printable in either (it's E0 in EBCDIC,
9941        which Wikipedia says:
9942
9943        EO, or Eight Ones, is an 8-bit EBCDIC character code represented as all
9944        ones (binary 1111 1111, hexadecimal FF). It is similar, but not
9945        identical, to the ASCII delete (DEL) or rubout control character.
9946        ) So the old condition can be simplified to !isPRINT(c)  */
9947     if (!isPRINT(c))
9948         Perl_sv_catpvf(aTHX_ sv, "\\%o", c);
9949     else {
9950         const char string = c;
9951         if (c == '-' || c == ']' || c == '\\' || c == '^')
9952             sv_catpvs(sv, "\\");
9953         sv_catpvn(sv, &string, 1);
9954     }
9955 }
9956
9957
9958 #define CLEAR_OPTSTART \
9959     if (optstart) STMT_START { \
9960             DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log, " (%"IVdf" nodes)\n", (IV)(node - optstart))); \
9961             optstart=NULL; \
9962     } STMT_END
9963
9964 #define DUMPUNTIL(b,e) CLEAR_OPTSTART; node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1);
9965
9966 STATIC const regnode *
9967 S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node,
9968             const regnode *last, const regnode *plast, 
9969             SV* sv, I32 indent, U32 depth)
9970 {
9971     dVAR;
9972     register U8 op = PSEUDO;    /* Arbitrary non-END op. */
9973     register const regnode *next;
9974     const regnode *optstart= NULL;
9975     
9976     RXi_GET_DECL(r,ri);
9977     GET_RE_DEBUG_FLAGS_DECL;
9978
9979     PERL_ARGS_ASSERT_DUMPUNTIL;
9980
9981 #ifdef DEBUG_DUMPUNTIL
9982     PerlIO_printf(Perl_debug_log, "--- %d : %d - %d - %d\n",indent,node-start,
9983         last ? last-start : 0,plast ? plast-start : 0);
9984 #endif
9985             
9986     if (plast && plast < last) 
9987         last= plast;
9988
9989     while (PL_regkind[op] != END && (!last || node < last)) {
9990         /* While that wasn't END last time... */
9991         NODE_ALIGN(node);
9992         op = OP(node);
9993         if (op == CLOSE || op == WHILEM)
9994             indent--;
9995         next = regnext((regnode *)node);
9996
9997         /* Where, what. */
9998         if (OP(node) == OPTIMIZED) {
9999             if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE))
10000                 optstart = node;
10001             else
10002                 goto after_print;
10003         } else
10004             CLEAR_OPTSTART;
10005         
10006         regprop(r, sv, node);
10007         PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
10008                       (int)(2*indent + 1), "", SvPVX_const(sv));
10009         
10010         if (OP(node) != OPTIMIZED) {                  
10011             if (next == NULL)           /* Next ptr. */
10012                 PerlIO_printf(Perl_debug_log, " (0)");
10013             else if (PL_regkind[(U8)op] == BRANCH && PL_regkind[OP(next)] != BRANCH )
10014                 PerlIO_printf(Perl_debug_log, " (FAIL)");
10015             else 
10016                 PerlIO_printf(Perl_debug_log, " (%"IVdf")", (IV)(next - start));
10017             (void)PerlIO_putc(Perl_debug_log, '\n'); 
10018         }
10019         
10020       after_print:
10021         if (PL_regkind[(U8)op] == BRANCHJ) {
10022             assert(next);
10023             {
10024                 register const regnode *nnode = (OP(next) == LONGJMP
10025                                              ? regnext((regnode *)next)
10026                                              : next);
10027                 if (last && nnode > last)
10028                     nnode = last;
10029                 DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode);
10030             }
10031         }
10032         else if (PL_regkind[(U8)op] == BRANCH) {
10033             assert(next);
10034             DUMPUNTIL(NEXTOPER(node), next);
10035         }
10036         else if ( PL_regkind[(U8)op]  == TRIE ) {
10037             const regnode *this_trie = node;
10038             const char op = OP(node);
10039             const U32 n = ARG(node);
10040             const reg_ac_data * const ac = op>=AHOCORASICK ?
10041                (reg_ac_data *)ri->data->data[n] :
10042                NULL;
10043             const reg_trie_data * const trie =
10044                 (reg_trie_data*)ri->data->data[op<AHOCORASICK ? n : ac->trie];
10045 #ifdef DEBUGGING
10046             AV *const trie_words = MUTABLE_AV(ri->data->data[n + TRIE_WORDS_OFFSET]);
10047 #endif
10048             const regnode *nextbranch= NULL;
10049             I32 word_idx;
10050             sv_setpvs(sv, "");
10051             for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) {
10052                 SV ** const elem_ptr = av_fetch(trie_words,word_idx,0);
10053                 
10054                 PerlIO_printf(Perl_debug_log, "%*s%s ",
10055                    (int)(2*(indent+3)), "",
10056                     elem_ptr ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr), SvCUR(*elem_ptr), 60,
10057                             PL_colors[0], PL_colors[1],
10058                             (SvUTF8(*elem_ptr) ? PERL_PV_ESCAPE_UNI : 0) |
10059                             PERL_PV_PRETTY_ELLIPSES    |
10060                             PERL_PV_PRETTY_LTGT
10061                             )
10062                             : "???"
10063                 );
10064                 if (trie->jump) {
10065                     U16 dist= trie->jump[word_idx+1];
10066                     PerlIO_printf(Perl_debug_log, "(%"UVuf")\n",
10067                                   (UV)((dist ? this_trie + dist : next) - start));
10068                     if (dist) {
10069                         if (!nextbranch)
10070                             nextbranch= this_trie + trie->jump[0];    
10071                         DUMPUNTIL(this_trie + dist, nextbranch);
10072                     }
10073                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
10074                         nextbranch= regnext((regnode *)nextbranch);
10075                 } else {
10076                     PerlIO_printf(Perl_debug_log, "\n");
10077                 }
10078             }
10079             if (last && next > last)
10080                 node= last;
10081             else
10082                 node= next;
10083         }
10084         else if ( op == CURLY ) {   /* "next" might be very big: optimizer */
10085             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS,
10086                     NEXTOPER(node) + EXTRA_STEP_2ARGS + 1);
10087         }
10088         else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
10089             assert(next);
10090             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next);
10091         }
10092         else if ( op == PLUS || op == STAR) {
10093             DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1);
10094         }
10095         else if (op == ANYOF) {
10096             /* arglen 1 + class block */
10097             node += 1 + ((ANYOF_FLAGS(node) & ANYOF_LARGE)
10098                     ? ANYOF_CLASS_SKIP : ANYOF_SKIP);
10099             node = NEXTOPER(node);
10100         }
10101         else if (PL_regkind[(U8)op] == EXACT) {
10102             /* Literal string, where present. */
10103             node += NODE_SZ_STR(node) - 1;
10104             node = NEXTOPER(node);
10105         }
10106         else {
10107             node = NEXTOPER(node);
10108             node += regarglen[(U8)op];
10109         }
10110         if (op == CURLYX || op == OPEN)
10111             indent++;
10112     }
10113     CLEAR_OPTSTART;
10114 #ifdef DEBUG_DUMPUNTIL    
10115     PerlIO_printf(Perl_debug_log, "--- %d\n", (int)indent);
10116 #endif
10117     return node;
10118 }
10119
10120 #endif  /* DEBUGGING */
10121
10122 /*
10123  * Local variables:
10124  * c-indentation-style: bsd
10125  * c-basic-offset: 4
10126  * indent-tabs-mode: t
10127  * End:
10128  *
10129  * ex: set ts=8 sts=4 sw=4 noet:
10130  */