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