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