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