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