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