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