This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Change boilerplate of regcharclass.h
[perl5.git] / regcomp.c
1 /*    regcomp.c
2  */
3
4 /*
5  * "A fair jaw-cracker dwarf-language must be."  --Samwise Gamgee
6  */
7
8 /* This file contains functions for compiling a regular expression.  See
9  * also regexec.c which funnily enough, contains functions for executing
10  * a regular expression.
11  *
12  * This file is also copied at build time to ext/re/re_comp.c, where
13  * it's built with -DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT.
14  * This causes the main functions to be compiled under new names and with
15  * debugging support added, which makes "use re 'debug'" work.
16  */
17
18 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
19  * confused with the original package (see point 3 below).  Thanks, Henry!
20  */
21
22 /* Additional note: this code is very heavily munged from Henry's version
23  * in places.  In some spots I've traded clarity for efficiency, so don't
24  * blame Henry for some of the lack of readability.
25  */
26
27 /* The names of the functions have been changed from regcomp and
28  * regexec to  pregcomp and pregexec in order to avoid conflicts
29  * with the POSIX routines of the same names.
30 */
31
32 #ifdef PERL_EXT_RE_BUILD
33 #include "re_top.h"
34 #endif
35
36 /*
37  * pregcomp and pregexec -- regsub and regerror are not used in perl
38  *
39  *      Copyright (c) 1986 by University of Toronto.
40  *      Written by Henry Spencer.  Not derived from licensed software.
41  *
42  *      Permission is granted to anyone to use this software for any
43  *      purpose on any computer system, and to redistribute it freely,
44  *      subject to the following restrictions:
45  *
46  *      1. The author is not responsible for the consequences of use of
47  *              this software, no matter how awful, even if they arise
48  *              from defects in it.
49  *
50  *      2. The origin of this software must not be misrepresented, either
51  *              by explicit claim or by omission.
52  *
53  *      3. Altered versions must be plainly marked as such, and must not
54  *              be misrepresented as being the original software.
55  *
56  *
57  ****    Alterations to Henry's code are...
58  ****
59  ****    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
60  ****    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others
61  ****
62  ****    You may distribute under the terms of either the GNU General Public
63  ****    License or the Artistic License, as specified in the README file.
64
65  *
66  * Beware that some of this code is subtly aware of the way operator
67  * precedence is structured in regular expressions.  Serious changes in
68  * regular-expression syntax might require a total rethink.
69  */
70 #include "EXTERN.h"
71 #define PERL_IN_REGCOMP_C
72 #include "perl.h"
73
74 #ifndef PERL_IN_XSUB_RE
75 #  include "INTERN.h"
76 #endif
77
78 #define REG_COMP_C
79 #ifdef PERL_IN_XSUB_RE
80 #  include "re_comp.h"
81 #else
82 #  include "regcomp.h"
83 #endif
84
85 #ifdef op
86 #undef op
87 #endif /* op */
88
89 #ifdef MSDOS
90 #  if defined(BUGGY_MSC6)
91  /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
92 #    pragma optimize("a",off)
93  /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
94 #    pragma optimize("w",on )
95 #  endif /* BUGGY_MSC6 */
96 #endif /* MSDOS */
97
98 #ifndef STATIC
99 #define STATIC  static
100 #endif
101
102 typedef struct RExC_state_t {
103     U32         flags;                  /* are we folding, multilining? */
104     char        *precomp;               /* uncompiled string. */
105     regexp      *rx;                    /* 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 #define CASE_SYNST_FNC(nAmE)                                       \
2404 case nAmE:                                                         \
2405     if (flags & SCF_DO_STCLASS_AND) {                              \
2406             for (value = 0; value < 256; value++)                  \
2407                 if (!is_ ## nAmE ## _cp(value))                       \
2408                     ANYOF_BITMAP_CLEAR(data->start_class, value);  \
2409     }                                                              \
2410     else {                                                         \
2411             for (value = 0; value < 256; value++)                  \
2412                 if (is_ ## nAmE ## _cp(value))                        \
2413                     ANYOF_BITMAP_SET(data->start_class, value);    \
2414     }                                                              \
2415     break;                                                         \
2416 case N ## nAmE:                                                    \
2417     if (flags & SCF_DO_STCLASS_AND) {                              \
2418             for (value = 0; value < 256; value++)                   \
2419                 if (is_ ## nAmE ## _cp(value))                         \
2420                     ANYOF_BITMAP_CLEAR(data->start_class, value);   \
2421     }                                                               \
2422     else {                                                          \
2423             for (value = 0; value < 256; value++)                   \
2424                 if (!is_ ## nAmE ## _cp(value))                        \
2425                     ANYOF_BITMAP_SET(data->start_class, value);     \
2426     }                                                               \
2427     break
2428
2429
2430
2431 STATIC I32
2432 S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
2433                         I32 *minlenp, I32 *deltap,
2434                         regnode *last,
2435                         scan_data_t *data,
2436                         I32 stopparen,
2437                         U8* recursed,
2438                         struct regnode_charclass_class *and_withp,
2439                         U32 flags, U32 depth)
2440                         /* scanp: Start here (read-write). */
2441                         /* deltap: Write maxlen-minlen here. */
2442                         /* last: Stop before this one. */
2443                         /* data: string data about the pattern */
2444                         /* stopparen: treat close N as END */
2445                         /* recursed: which subroutines have we recursed into */
2446                         /* and_withp: Valid if flags & SCF_DO_STCLASS_OR */
2447 {
2448     dVAR;
2449     I32 min = 0, pars = 0, code;
2450     regnode *scan = *scanp, *next;
2451     I32 delta = 0;
2452     int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
2453     int is_inf_internal = 0;            /* The studied chunk is infinite */
2454     I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
2455     scan_data_t data_fake;
2456     SV *re_trie_maxbuff = NULL;
2457     regnode *first_non_open = scan;
2458     I32 stopmin = I32_MAX;
2459     scan_frame *frame = NULL;
2460
2461     GET_RE_DEBUG_FLAGS_DECL;
2462
2463 #ifdef DEBUGGING
2464     StructCopy(&zero_scan_data, &data_fake, scan_data_t);
2465 #endif
2466
2467     if ( depth == 0 ) {
2468         while (first_non_open && OP(first_non_open) == OPEN)
2469             first_non_open=regnext(first_non_open);
2470     }
2471
2472
2473   fake_study_recurse:
2474     while ( scan && OP(scan) != END && scan < last ){
2475         /* Peephole optimizer: */
2476         DEBUG_STUDYDATA("Peep:", data,depth);
2477         DEBUG_PEEP("Peep",scan,depth);
2478         JOIN_EXACT(scan,&min,0);
2479
2480         /* Follow the next-chain of the current node and optimize
2481            away all the NOTHINGs from it.  */
2482         if (OP(scan) != CURLYX) {
2483             const int max = (reg_off_by_arg[OP(scan)]
2484                        ? I32_MAX
2485                        /* I32 may be smaller than U16 on CRAYs! */
2486                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
2487             int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
2488             int noff;
2489             regnode *n = scan;
2490         
2491             /* Skip NOTHING and LONGJMP. */
2492             while ((n = regnext(n))
2493                    && ((PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
2494                        || ((OP(n) == LONGJMP) && (noff = ARG(n))))
2495                    && off + noff < max)
2496                 off += noff;
2497             if (reg_off_by_arg[OP(scan)])
2498                 ARG(scan) = off;
2499             else
2500                 NEXT_OFF(scan) = off;
2501         }
2502
2503
2504
2505         /* The principal pseudo-switch.  Cannot be a switch, since we
2506            look into several different things.  */
2507         if (OP(scan) == BRANCH || OP(scan) == BRANCHJ
2508                    || OP(scan) == IFTHEN) {
2509             next = regnext(scan);
2510             code = OP(scan);
2511             /* demq: the op(next)==code check is to see if we have "branch-branch" AFAICT */
2512         
2513             if (OP(next) == code || code == IFTHEN) {
2514                 /* NOTE - There is similar code to this block below for handling
2515                    TRIE nodes on a re-study.  If you change stuff here check there
2516                    too. */
2517                 I32 max1 = 0, min1 = I32_MAX, num = 0;
2518                 struct regnode_charclass_class accum;
2519                 regnode * const startbranch=scan;
2520                 
2521                 if (flags & SCF_DO_SUBSTR)
2522                     SCAN_COMMIT(pRExC_state, data, minlenp); /* Cannot merge strings after this. */
2523                 if (flags & SCF_DO_STCLASS)
2524                     cl_init_zero(pRExC_state, &accum);
2525
2526                 while (OP(scan) == code) {
2527                     I32 deltanext, minnext, f = 0, fake;
2528                     struct regnode_charclass_class this_class;
2529
2530                     num++;
2531                     data_fake.flags = 0;
2532                     if (data) {
2533                         data_fake.whilem_c = data->whilem_c;
2534                         data_fake.last_closep = data->last_closep;
2535                     }
2536                     else
2537                         data_fake.last_closep = &fake;
2538
2539                     data_fake.pos_delta = delta;
2540                     next = regnext(scan);
2541                     scan = NEXTOPER(scan);
2542                     if (code != BRANCH)
2543                         scan = NEXTOPER(scan);
2544                     if (flags & SCF_DO_STCLASS) {
2545                         cl_init(pRExC_state, &this_class);
2546                         data_fake.start_class = &this_class;
2547                         f = SCF_DO_STCLASS_AND;
2548                     }
2549                     if (flags & SCF_WHILEM_VISITED_POS)
2550                         f |= SCF_WHILEM_VISITED_POS;
2551
2552                     /* we suppose the run is continuous, last=next...*/
2553                     minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext,
2554                                           next, &data_fake,
2555                                           stopparen, recursed, NULL, f,depth+1);
2556                     if (min1 > minnext)
2557                         min1 = minnext;
2558                     if (max1 < minnext + deltanext)
2559                         max1 = minnext + deltanext;
2560                     if (deltanext == I32_MAX)
2561                         is_inf = is_inf_internal = 1;
2562                     scan = next;
2563                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
2564                         pars++;
2565                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
2566                         if ( stopmin > minnext) 
2567                             stopmin = min + min1;
2568                         flags &= ~SCF_DO_SUBSTR;
2569                         if (data)
2570                             data->flags |= SCF_SEEN_ACCEPT;
2571                     }
2572                     if (data) {
2573                         if (data_fake.flags & SF_HAS_EVAL)
2574                             data->flags |= SF_HAS_EVAL;
2575                         data->whilem_c = data_fake.whilem_c;
2576                     }
2577                     if (flags & SCF_DO_STCLASS)
2578                         cl_or(pRExC_state, &accum, &this_class);
2579                 }
2580                 if (code == IFTHEN && num < 2) /* Empty ELSE branch */
2581                     min1 = 0;
2582                 if (flags & SCF_DO_SUBSTR) {
2583                     data->pos_min += min1;
2584                     data->pos_delta += max1 - min1;
2585                     if (max1 != min1 || is_inf)
2586                         data->longest = &(data->longest_float);
2587                 }
2588                 min += min1;
2589                 delta += max1 - min1;
2590                 if (flags & SCF_DO_STCLASS_OR) {
2591                     cl_or(pRExC_state, data->start_class, &accum);
2592                     if (min1) {
2593                         cl_and(data->start_class, and_withp);
2594                         flags &= ~SCF_DO_STCLASS;
2595                     }
2596                 }
2597                 else if (flags & SCF_DO_STCLASS_AND) {
2598                     if (min1) {
2599                         cl_and(data->start_class, &accum);
2600                         flags &= ~SCF_DO_STCLASS;
2601                     }
2602                     else {
2603                         /* Switch to OR mode: cache the old value of
2604                          * data->start_class */
2605                         INIT_AND_WITHP;
2606                         StructCopy(data->start_class, and_withp,
2607                                    struct regnode_charclass_class);
2608                         flags &= ~SCF_DO_STCLASS_AND;
2609                         StructCopy(&accum, data->start_class,
2610                                    struct regnode_charclass_class);
2611                         flags |= SCF_DO_STCLASS_OR;
2612                         data->start_class->flags |= ANYOF_EOS;
2613                     }
2614                 }
2615
2616                 if (PERL_ENABLE_TRIE_OPTIMISATION && OP( startbranch ) == BRANCH ) {
2617                 /* demq.
2618
2619                    Assuming this was/is a branch we are dealing with: 'scan' now
2620                    points at the item that follows the branch sequence, whatever
2621                    it is. We now start at the beginning of the sequence and look
2622                    for subsequences of
2623
2624                    BRANCH->EXACT=>x1
2625                    BRANCH->EXACT=>x2
2626                    tail
2627
2628                    which would be constructed from a pattern like /A|LIST|OF|WORDS/
2629
2630                    If we can find such a subseqence we need to turn the first
2631                    element into a trie and then add the subsequent branch exact
2632                    strings to the trie.
2633
2634                    We have two cases
2635
2636                      1. patterns where the whole set of branch can be converted. 
2637
2638                      2. patterns where only a subset can be converted.
2639
2640                    In case 1 we can replace the whole set with a single regop
2641                    for the trie. In case 2 we need to keep the start and end
2642                    branchs so
2643
2644                      'BRANCH EXACT; BRANCH EXACT; BRANCH X'
2645                      becomes BRANCH TRIE; BRANCH X;
2646
2647                   There is an additional case, that being where there is a 
2648                   common prefix, which gets split out into an EXACT like node
2649                   preceding the TRIE node.
2650
2651                   If x(1..n)==tail then we can do a simple trie, if not we make
2652                   a "jump" trie, such that when we match the appropriate word
2653                   we "jump" to the appopriate tail node. Essentailly we turn
2654                   a nested if into a case structure of sorts.
2655
2656                 */
2657                 
2658                     int made=0;
2659                     if (!re_trie_maxbuff) {
2660                         re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1);
2661                         if (!SvIOK(re_trie_maxbuff))
2662                             sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT);
2663                     }
2664                     if ( SvIV(re_trie_maxbuff)>=0  ) {
2665                         regnode *cur;
2666                         regnode *first = (regnode *)NULL;
2667                         regnode *last = (regnode *)NULL;
2668                         regnode *tail = scan;
2669                         U8 optype = 0;
2670                         U32 count=0;
2671
2672 #ifdef DEBUGGING
2673                         SV * const mysv = sv_newmortal();       /* for dumping */
2674 #endif
2675                         /* var tail is used because there may be a TAIL
2676                            regop in the way. Ie, the exacts will point to the
2677                            thing following the TAIL, but the last branch will
2678                            point at the TAIL. So we advance tail. If we
2679                            have nested (?:) we may have to move through several
2680                            tails.
2681                          */
2682
2683                         while ( OP( tail ) == TAIL ) {
2684                             /* this is the TAIL generated by (?:) */
2685                             tail = regnext( tail );
2686                         }
2687
2688                         
2689                         DEBUG_OPTIMISE_r({
2690                             regprop(RExC_rx, mysv, tail );
2691                             PerlIO_printf( Perl_debug_log, "%*s%s%s\n",
2692                                 (int)depth * 2 + 2, "", 
2693                                 "Looking for TRIE'able sequences. Tail node is: ", 
2694                                 SvPV_nolen_const( mysv )
2695                             );
2696                         });
2697                         
2698                         /*
2699
2700                            step through the branches, cur represents each
2701                            branch, noper is the first thing to be matched
2702                            as part of that branch and noper_next is the
2703                            regnext() of that node. if noper is an EXACT
2704                            and noper_next is the same as scan (our current
2705                            position in the regex) then the EXACT branch is
2706                            a possible optimization target. Once we have
2707                            two or more consequetive such branches we can
2708                            create a trie of the EXACT's contents and stich
2709                            it in place. If the sequence represents all of
2710                            the branches we eliminate the whole thing and
2711                            replace it with a single TRIE. If it is a
2712                            subsequence then we need to stitch it in. This
2713                            means the first branch has to remain, and needs
2714                            to be repointed at the item on the branch chain
2715                            following the last branch optimized. This could
2716                            be either a BRANCH, in which case the
2717                            subsequence is internal, or it could be the
2718                            item following the branch sequence in which
2719                            case the subsequence is at the end.
2720
2721                         */
2722
2723                         /* dont use tail as the end marker for this traverse */
2724                         for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) {
2725                             regnode * const noper = NEXTOPER( cur );
2726 #if defined(DEBUGGING) || defined(NOJUMPTRIE)
2727                             regnode * const noper_next = regnext( noper );
2728 #endif
2729
2730                             DEBUG_OPTIMISE_r({
2731                                 regprop(RExC_rx, mysv, cur);
2732                                 PerlIO_printf( Perl_debug_log, "%*s- %s (%d)",
2733                                    (int)depth * 2 + 2,"", SvPV_nolen_const( mysv ), REG_NODE_NUM(cur) );
2734
2735                                 regprop(RExC_rx, mysv, noper);
2736                                 PerlIO_printf( Perl_debug_log, " -> %s",
2737                                     SvPV_nolen_const(mysv));
2738
2739                                 if ( noper_next ) {
2740                                   regprop(RExC_rx, mysv, noper_next );
2741                                   PerlIO_printf( Perl_debug_log,"\t=> %s\t",
2742                                     SvPV_nolen_const(mysv));
2743                                 }
2744                                 PerlIO_printf( Perl_debug_log, "(First==%d,Last==%d,Cur==%d)\n",
2745                                    REG_NODE_NUM(first), REG_NODE_NUM(last), REG_NODE_NUM(cur) );
2746                             });
2747                             if ( (((first && optype!=NOTHING) ? OP( noper ) == optype
2748                                          : PL_regkind[ OP( noper ) ] == EXACT )
2749                                   || OP(noper) == NOTHING )
2750 #ifdef NOJUMPTRIE
2751                                   && noper_next == tail
2752 #endif
2753                                   && count < U16_MAX)
2754                             {
2755                                 count++;
2756                                 if ( !first || optype == NOTHING ) {
2757                                     if (!first) first = cur;
2758                                     optype = OP( noper );
2759                                 } else {
2760                                     last = cur;
2761                                 }
2762                             } else {
2763                                 if ( last ) {
2764                                     make_trie( pRExC_state, 
2765                                             startbranch, first, cur, tail, count, 
2766                                             optype, depth+1 );
2767                                 }
2768                                 if ( PL_regkind[ OP( noper ) ] == EXACT
2769 #ifdef NOJUMPTRIE
2770                                      && noper_next == tail
2771 #endif
2772                                 ){
2773                                     count = 1;
2774                                     first = cur;
2775                                     optype = OP( noper );
2776                                 } else {
2777                                     count = 0;
2778                                     first = NULL;
2779                                     optype = 0;
2780                                 }
2781                                 last = NULL;
2782                             }
2783                         }
2784                         DEBUG_OPTIMISE_r({
2785                             regprop(RExC_rx, mysv, cur);
2786                             PerlIO_printf( Perl_debug_log,
2787                               "%*s- %s (%d) <SCAN FINISHED>\n", (int)depth * 2 + 2,
2788                               "", SvPV_nolen_const( mysv ),REG_NODE_NUM(cur));
2789
2790                         });
2791                         if ( last ) {
2792                             made= make_trie( pRExC_state, startbranch, first, scan, tail, count, optype, depth+1 );
2793 #ifdef TRIE_STUDY_OPT   
2794                             if ( ((made == MADE_EXACT_TRIE && 
2795                                  startbranch == first) 
2796                                  || ( first_non_open == first )) && 
2797                                  depth==0 ) {
2798                                 flags |= SCF_TRIE_RESTUDY;
2799                                 if ( startbranch == first 
2800                                      && scan == tail ) 
2801                                 {
2802                                     RExC_seen &=~REG_TOP_LEVEL_BRANCHES;
2803                                 }
2804                             }
2805 #endif
2806                         }
2807                     }
2808                     
2809                 } /* do trie */
2810                 
2811             }
2812             else if ( code == BRANCHJ ) {  /* single branch is optimized. */
2813                 scan = NEXTOPER(NEXTOPER(scan));
2814             } else                      /* single branch is optimized. */
2815                 scan = NEXTOPER(scan);
2816             continue;
2817         } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB || OP(scan) == GOSTART) {
2818             scan_frame *newframe = NULL;
2819             I32 paren;
2820             regnode *start;
2821             regnode *end;
2822
2823             if (OP(scan) != SUSPEND) {
2824             /* set the pointer */
2825                 if (OP(scan) == GOSUB) {
2826                     paren = ARG(scan);
2827                     RExC_recurse[ARG2L(scan)] = scan;
2828                     start = RExC_open_parens[paren-1];
2829                     end   = RExC_close_parens[paren-1];
2830                 } else {
2831                     paren = 0;
2832                     start = RExC_rxi->program + 1;
2833                     end   = RExC_opend;
2834                 }
2835                 if (!recursed) {
2836                     Newxz(recursed, (((RExC_npar)>>3) +1), U8);
2837                     SAVEFREEPV(recursed);
2838                 }
2839                 if (!PAREN_TEST(recursed,paren+1)) {
2840                     PAREN_SET(recursed,paren+1);
2841                     Newx(newframe,1,scan_frame);
2842                 } else {
2843                     if (flags & SCF_DO_SUBSTR) {
2844                         SCAN_COMMIT(pRExC_state,data,minlenp);
2845                         data->longest = &(data->longest_float);
2846                     }
2847                     is_inf = is_inf_internal = 1;
2848                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
2849                         cl_anything(pRExC_state, data->start_class);
2850                     flags &= ~SCF_DO_STCLASS;
2851                 }
2852             } else {
2853                 Newx(newframe,1,scan_frame);
2854                 paren = stopparen;
2855                 start = scan+2;
2856                 end = regnext(scan);
2857             }
2858             if (newframe) {
2859                 assert(start);
2860                 assert(end);
2861                 SAVEFREEPV(newframe);
2862                 newframe->next = regnext(scan);
2863                 newframe->last = last;
2864                 newframe->stop = stopparen;
2865                 newframe->prev = frame;
2866
2867                 frame = newframe;
2868                 scan =  start;
2869                 stopparen = paren;
2870                 last = end;
2871
2872                 continue;
2873             }
2874         }
2875         else if (OP(scan) == EXACT) {
2876             I32 l = STR_LEN(scan);
2877             UV uc;
2878             if (UTF) {
2879                 const U8 * const s = (U8*)STRING(scan);
2880                 l = utf8_length(s, s + l);
2881                 uc = utf8_to_uvchr(s, NULL);
2882             } else {
2883                 uc = *((U8*)STRING(scan));
2884             }
2885             min += l;
2886             if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
2887                 /* The code below prefers earlier match for fixed
2888                    offset, later match for variable offset.  */
2889                 if (data->last_end == -1) { /* Update the start info. */
2890                     data->last_start_min = data->pos_min;
2891                     data->last_start_max = is_inf
2892                         ? I32_MAX : data->pos_min + data->pos_delta;
2893                 }
2894                 sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
2895                 if (UTF)
2896                     SvUTF8_on(data->last_found);
2897                 {
2898                     SV * const sv = data->last_found;
2899                     MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
2900                         mg_find(sv, PERL_MAGIC_utf8) : NULL;
2901                     if (mg && mg->mg_len >= 0)
2902                         mg->mg_len += utf8_length((U8*)STRING(scan),
2903                                                   (U8*)STRING(scan)+STR_LEN(scan));
2904                 }
2905                 data->last_end = data->pos_min + l;
2906                 data->pos_min += l; /* As in the first entry. */
2907                 data->flags &= ~SF_BEFORE_EOL;
2908             }
2909             if (flags & SCF_DO_STCLASS_AND) {
2910                 /* Check whether it is compatible with what we know already! */
2911                 int compat = 1;
2912
2913                 if (uc >= 0x100 ||
2914                     (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
2915                     && !ANYOF_BITMAP_TEST(data->start_class, uc)
2916                     && (!(data->start_class->flags & ANYOF_FOLD)
2917                         || !ANYOF_BITMAP_TEST(data->start_class, PL_fold[uc])))
2918                     )
2919                     compat = 0;
2920                 ANYOF_CLASS_ZERO(data->start_class);
2921                 ANYOF_BITMAP_ZERO(data->start_class);
2922                 if (compat)
2923                     ANYOF_BITMAP_SET(data->start_class, uc);
2924                 data->start_class->flags &= ~ANYOF_EOS;
2925                 if (uc < 0x100)
2926                   data->start_class->flags &= ~ANYOF_UNICODE_ALL;
2927             }
2928             else if (flags & SCF_DO_STCLASS_OR) {
2929                 /* false positive possible if the class is case-folded */
2930                 if (uc < 0x100)
2931                     ANYOF_BITMAP_SET(data->start_class, uc);
2932                 else
2933                     data->start_class->flags |= ANYOF_UNICODE_ALL;
2934                 data->start_class->flags &= ~ANYOF_EOS;
2935                 cl_and(data->start_class, and_withp);
2936             }
2937             flags &= ~SCF_DO_STCLASS;
2938         }
2939         else if (PL_regkind[OP(scan)] == EXACT) { /* But OP != EXACT! */
2940             I32 l = STR_LEN(scan);
2941             UV uc = *((U8*)STRING(scan));
2942
2943             /* Search for fixed substrings supports EXACT only. */
2944             if (flags & SCF_DO_SUBSTR) {
2945                 assert(data);
2946                 SCAN_COMMIT(pRExC_state, data, minlenp);
2947             }
2948             if (UTF) {
2949                 const U8 * const s = (U8 *)STRING(scan);
2950                 l = utf8_length(s, s + l);
2951                 uc = utf8_to_uvchr(s, NULL);
2952             }
2953             min += l;
2954             if (flags & SCF_DO_SUBSTR)
2955                 data->pos_min += l;
2956             if (flags & SCF_DO_STCLASS_AND) {
2957                 /* Check whether it is compatible with what we know already! */
2958                 int compat = 1;
2959
2960                 if (uc >= 0x100 ||
2961                     (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE))
2962                     && !ANYOF_BITMAP_TEST(data->start_class, uc)
2963                      && !ANYOF_BITMAP_TEST(data->start_class, PL_fold[uc])))
2964                     compat = 0;
2965                 ANYOF_CLASS_ZERO(data->start_class);
2966                 ANYOF_BITMAP_ZERO(data->start_class);
2967                 if (compat) {
2968                     ANYOF_BITMAP_SET(data->start_class, uc);
2969                     data->start_class->flags &= ~ANYOF_EOS;
2970                     data->start_class->flags |= ANYOF_FOLD;
2971                     if (OP(scan) == EXACTFL)
2972                         data->start_class->flags |= ANYOF_LOCALE;
2973                 }
2974             }
2975             else if (flags & SCF_DO_STCLASS_OR) {
2976                 if (data->start_class->flags & ANYOF_FOLD) {
2977                     /* false positive possible if the class is case-folded.
2978                        Assume that the locale settings are the same... */
2979                     if (uc < 0x100)
2980                         ANYOF_BITMAP_SET(data->start_class, uc);
2981                     data->start_class->flags &= ~ANYOF_EOS;
2982                 }
2983                 cl_and(data->start_class, and_withp);
2984             }
2985             flags &= ~SCF_DO_STCLASS;
2986         }
2987         else if (strchr((const char*)PL_varies,OP(scan))) {
2988             I32 mincount, maxcount, minnext, deltanext, fl = 0;
2989             I32 f = flags, pos_before = 0;
2990             regnode * const oscan = scan;
2991             struct regnode_charclass_class this_class;
2992             struct regnode_charclass_class *oclass = NULL;
2993             I32 next_is_eval = 0;
2994
2995             switch (PL_regkind[OP(scan)]) {
2996             case WHILEM:                /* End of (?:...)* . */
2997                 scan = NEXTOPER(scan);
2998                 goto finish;
2999             case PLUS:
3000                 if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
3001                     next = NEXTOPER(scan);
3002                     if (OP(next) == EXACT || (flags & SCF_DO_STCLASS)) {
3003                         mincount = 1;
3004                         maxcount = REG_INFTY;
3005                         next = regnext(scan);
3006                         scan = NEXTOPER(scan);
3007                         goto do_curly;
3008                     }
3009                 }
3010                 if (flags & SCF_DO_SUBSTR)
3011                     data->pos_min++;
3012                 min++;
3013                 /* Fall through. */
3014             case STAR:
3015                 if (flags & SCF_DO_STCLASS) {
3016                     mincount = 0;
3017                     maxcount = REG_INFTY;
3018                     next = regnext(scan);
3019                     scan = NEXTOPER(scan);
3020                     goto do_curly;
3021                 }
3022                 is_inf = is_inf_internal = 1;
3023                 scan = regnext(scan);
3024                 if (flags & SCF_DO_SUBSTR) {
3025                     SCAN_COMMIT(pRExC_state, data, minlenp); /* Cannot extend fixed substrings */
3026                     data->longest = &(data->longest_float);
3027                 }
3028                 goto optimize_curly_tail;
3029             case CURLY:
3030                 if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM)
3031                     && (scan->flags == stopparen))
3032                 {
3033                     mincount = 1;
3034                     maxcount = 1;
3035                 } else {
3036                     mincount = ARG1(scan);
3037                     maxcount = ARG2(scan);
3038                 }
3039                 next = regnext(scan);
3040                 if (OP(scan) == CURLYX) {
3041                     I32 lp = (data ? *(data->last_closep) : 0);
3042                     scan->flags = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX);
3043                 }
3044                 scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
3045                 next_is_eval = (OP(scan) == EVAL);
3046               do_curly:
3047                 if (flags & SCF_DO_SUBSTR) {
3048                     if (mincount == 0) SCAN_COMMIT(pRExC_state,data,minlenp); /* Cannot extend fixed substrings */
3049                     pos_before = data->pos_min;
3050                 }
3051                 if (data) {
3052                     fl = data->flags;
3053                     data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
3054                     if (is_inf)
3055                         data->flags |= SF_IS_INF;
3056                 }
3057                 if (flags & SCF_DO_STCLASS) {
3058                     cl_init(pRExC_state, &this_class);
3059                     oclass = data->start_class;
3060                     data->start_class = &this_class;
3061                     f |= SCF_DO_STCLASS_AND;
3062                     f &= ~SCF_DO_STCLASS_OR;
3063                 }
3064                 /* These are the cases when once a subexpression
3065                    fails at a particular position, it cannot succeed
3066                    even after backtracking at the enclosing scope.
3067                 
3068                    XXXX what if minimal match and we are at the
3069                         initial run of {n,m}? */
3070                 if ((mincount != maxcount - 1) && (maxcount != REG_INFTY))
3071                     f &= ~SCF_WHILEM_VISITED_POS;
3072
3073                 /* This will finish on WHILEM, setting scan, or on NULL: */
3074                 minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext, 
3075                                       last, data, stopparen, recursed, NULL,
3076                                       (mincount == 0
3077                                         ? (f & ~SCF_DO_SUBSTR) : f),depth+1);
3078
3079                 if (flags & SCF_DO_STCLASS)
3080                     data->start_class = oclass;
3081                 if (mincount == 0 || minnext == 0) {
3082                     if (flags & SCF_DO_STCLASS_OR) {
3083                         cl_or(pRExC_state, data->start_class, &this_class);
3084                     }
3085                     else if (flags & SCF_DO_STCLASS_AND) {
3086                         /* Switch to OR mode: cache the old value of
3087                          * data->start_class */
3088                         INIT_AND_WITHP;
3089                         StructCopy(data->start_class, and_withp,
3090                                    struct regnode_charclass_class);
3091                         flags &= ~SCF_DO_STCLASS_AND;
3092                         StructCopy(&this_class, data->start_class,
3093                                    struct regnode_charclass_class);
3094                         flags |= SCF_DO_STCLASS_OR;
3095                         data->start_class->flags |= ANYOF_EOS;
3096                     }
3097                 } else {                /* Non-zero len */
3098                     if (flags & SCF_DO_STCLASS_OR) {
3099                         cl_or(pRExC_state, data->start_class, &this_class);
3100                         cl_and(data->start_class, and_withp);
3101                     }
3102                     else if (flags & SCF_DO_STCLASS_AND)
3103                         cl_and(data->start_class, &this_class);
3104                     flags &= ~SCF_DO_STCLASS;
3105                 }
3106                 if (!scan)              /* It was not CURLYX, but CURLY. */
3107                     scan = next;
3108                 if ( /* ? quantifier ok, except for (?{ ... }) */
3109                     (next_is_eval || !(mincount == 0 && maxcount == 1))
3110                     && (minnext == 0) && (deltanext == 0)
3111                     && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
3112                     && maxcount <= REG_INFTY/3 /* Complement check for big count */
3113                     && ckWARN(WARN_REGEXP))
3114                 {
3115                     vWARN(RExC_parse,
3116                           "Quantifier unexpected on zero-length expression");
3117                 }
3118
3119                 min += minnext * mincount;
3120                 is_inf_internal |= ((maxcount == REG_INFTY
3121                                      && (minnext + deltanext) > 0)
3122                                     || deltanext == I32_MAX);
3123                 is_inf |= is_inf_internal;
3124                 delta += (minnext + deltanext) * maxcount - minnext * mincount;
3125
3126                 /* Try powerful optimization CURLYX => CURLYN. */
3127                 if (  OP(oscan) == CURLYX && data
3128                       && data->flags & SF_IN_PAR
3129                       && !(data->flags & SF_HAS_EVAL)
3130                       && !deltanext && minnext == 1 ) {
3131                     /* Try to optimize to CURLYN.  */
3132                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
3133                     regnode * const nxt1 = nxt;
3134 #ifdef DEBUGGING
3135                     regnode *nxt2;
3136 #endif
3137
3138                     /* Skip open. */
3139                     nxt = regnext(nxt);
3140                     if (!strchr((const char*)PL_simple,OP(nxt))
3141                         && !(PL_regkind[OP(nxt)] == EXACT
3142                              && STR_LEN(nxt) == 1))
3143                         goto nogo;
3144 #ifdef DEBUGGING
3145                     nxt2 = nxt;
3146 #endif
3147                     nxt = regnext(nxt);
3148                     if (OP(nxt) != CLOSE)
3149                         goto nogo;
3150                     if (RExC_open_parens) {
3151                         RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
3152                         RExC_close_parens[ARG(nxt1)-1]=nxt+2; /*close->while*/
3153                     }
3154                     /* Now we know that nxt2 is the only contents: */
3155                     oscan->flags = (U8)ARG(nxt);
3156                     OP(oscan) = CURLYN;
3157                     OP(nxt1) = NOTHING; /* was OPEN. */
3158
3159 #ifdef DEBUGGING
3160                     OP(nxt1 + 1) = OPTIMIZED; /* was count. */
3161                     NEXT_OFF(nxt1+ 1) = 0; /* just for consistancy. */
3162                     NEXT_OFF(nxt2) = 0; /* just for consistancy with CURLY. */
3163                     OP(nxt) = OPTIMIZED;        /* was CLOSE. */
3164                     OP(nxt + 1) = OPTIMIZED; /* was count. */
3165                     NEXT_OFF(nxt+ 1) = 0; /* just for consistancy. */
3166 #endif
3167                 }
3168               nogo:
3169
3170                 /* Try optimization CURLYX => CURLYM. */
3171                 if (  OP(oscan) == CURLYX && data
3172                       && !(data->flags & SF_HAS_PAR)
3173                       && !(data->flags & SF_HAS_EVAL)
3174                       && !deltanext     /* atom is fixed width */
3175                       && minnext != 0   /* CURLYM can't handle zero width */
3176                 ) {
3177                     /* XXXX How to optimize if data == 0? */
3178                     /* Optimize to a simpler form.  */
3179                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
3180                     regnode *nxt2;
3181
3182                     OP(oscan) = CURLYM;
3183                     while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
3184                             && (OP(nxt2) != WHILEM))
3185                         nxt = nxt2;
3186                     OP(nxt2)  = SUCCEED; /* Whas WHILEM */
3187                     /* Need to optimize away parenths. */
3188                     if (data->flags & SF_IN_PAR) {
3189                         /* Set the parenth number.  */
3190                         regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
3191
3192                         if (OP(nxt) != CLOSE)
3193                             FAIL("Panic opt close");
3194                         oscan->flags = (U8)ARG(nxt);
3195                         if (RExC_open_parens) {
3196                             RExC_open_parens[ARG(nxt1)-1]=oscan; /*open->CURLYM*/
3197                             RExC_close_parens[ARG(nxt1)-1]=nxt2+1; /*close->NOTHING*/
3198                         }
3199                         OP(nxt1) = OPTIMIZED;   /* was OPEN. */
3200                         OP(nxt) = OPTIMIZED;    /* was CLOSE. */
3201
3202 #ifdef DEBUGGING
3203                         OP(nxt1 + 1) = OPTIMIZED; /* was count. */
3204                         OP(nxt + 1) = OPTIMIZED; /* was count. */
3205                         NEXT_OFF(nxt1 + 1) = 0; /* just for consistancy. */
3206                         NEXT_OFF(nxt + 1) = 0; /* just for consistancy. */
3207 #endif
3208 #if 0
3209                         while ( nxt1 && (OP(nxt1) != WHILEM)) {
3210                             regnode *nnxt = regnext(nxt1);
3211                         
3212                             if (nnxt == nxt) {
3213                                 if (reg_off_by_arg[OP(nxt1)])
3214                                     ARG_SET(nxt1, nxt2 - nxt1);
3215                                 else if (nxt2 - nxt1 < U16_MAX)
3216                                     NEXT_OFF(nxt1) = nxt2 - nxt1;
3217                                 else
3218                                     OP(nxt) = NOTHING;  /* Cannot beautify */
3219                             }
3220                             nxt1 = nnxt;
3221                         }
3222 #endif
3223                         /* Optimize again: */
3224                         study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt,
3225                                     NULL, stopparen, recursed, NULL, 0,depth+1);
3226                     }
3227                     else
3228                         oscan->flags = 0;
3229                 }
3230                 else if ((OP(oscan) == CURLYX)
3231                          && (flags & SCF_WHILEM_VISITED_POS)
3232                          /* See the comment on a similar expression above.
3233                             However, this time it not a subexpression
3234                             we care about, but the expression itself. */
3235                          && (maxcount == REG_INFTY)
3236                          && data && ++data->whilem_c < 16) {
3237                     /* This stays as CURLYX, we can put the count/of pair. */
3238                     /* Find WHILEM (as in regexec.c) */
3239                     regnode *nxt = oscan + NEXT_OFF(oscan);
3240
3241                     if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
3242                         nxt += ARG(nxt);
3243                     PREVOPER(nxt)->flags = (U8)(data->whilem_c
3244                         | (RExC_whilem_seen << 4)); /* On WHILEM */
3245                 }
3246                 if (data && fl & (SF_HAS_PAR|SF_IN_PAR))
3247                     pars++;
3248                 if (flags & SCF_DO_SUBSTR) {
3249                     SV *last_str = NULL;
3250                     int counted = mincount != 0;
3251
3252                     if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
3253 #if defined(SPARC64_GCC_WORKAROUND)
3254                         I32 b = 0;
3255                         STRLEN l = 0;
3256                         const char *s = NULL;
3257                         I32 old = 0;
3258
3259                         if (pos_before >= data->last_start_min)
3260                             b = pos_before;
3261                         else
3262                             b = data->last_start_min;
3263
3264                         l = 0;
3265                         s = SvPV_const(data->last_found, l);
3266                         old = b - data->last_start_min;
3267
3268 #else
3269                         I32 b = pos_before >= data->last_start_min
3270                             ? pos_before : data->last_start_min;
3271                         STRLEN l;
3272                         const char * const s = SvPV_const(data->last_found, l);
3273                         I32 old = b - data->last_start_min;
3274 #endif
3275
3276                         if (UTF)
3277                             old = utf8_hop((U8*)s, old) - (U8*)s;
3278                         
3279                         l -= old;
3280                         /* Get the added string: */
3281                         last_str = newSVpvn(s  + old, l);
3282                         if (UTF)
3283                             SvUTF8_on(last_str);
3284                         if (deltanext == 0 && pos_before == b) {
3285                             /* What was added is a constant string */
3286                             if (mincount > 1) {
3287                                 SvGROW(last_str, (mincount * l) + 1);
3288                                 repeatcpy(SvPVX(last_str) + l,
3289                                           SvPVX_const(last_str), l, mincount - 1);
3290                                 SvCUR_set(last_str, SvCUR(last_str) * mincount);
3291                                 /* Add additional parts. */
3292                                 SvCUR_set(data->last_found,
3293                                           SvCUR(data->last_found) - l);
3294                                 sv_catsv(data->last_found, last_str);
3295                                 {
3296                                     SV * sv = data->last_found;
3297                                     MAGIC *mg =
3298                                         SvUTF8(sv) && SvMAGICAL(sv) ?
3299                                         mg_find(sv, PERL_MAGIC_utf8) : NULL;
3300                                     if (mg && mg->mg_len >= 0)
3301                                         mg->mg_len += CHR_SVLEN(last_str);
3302                                 }
3303                                 data->last_end += l * (mincount - 1);
3304                             }
3305                         } else {
3306                             /* start offset must point into the last copy */
3307                             data->last_start_min += minnext * (mincount - 1);
3308                             data->last_start_max += is_inf ? I32_MAX
3309                                 : (maxcount - 1) * (minnext + data->pos_delta);
3310                         }
3311                     }
3312                     /* It is counted once already... */
3313                     data->pos_min += minnext * (mincount - counted);
3314                     data->pos_delta += - counted * deltanext +
3315                         (minnext + deltanext) * maxcount - minnext * mincount;
3316                     if (mincount != maxcount) {
3317                          /* Cannot extend fixed substrings found inside
3318                             the group.  */
3319                         SCAN_COMMIT(pRExC_state,data,minlenp);
3320                         if (mincount && last_str) {
3321                             SV * const sv = data->last_found;
3322                             MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ?
3323                                 mg_find(sv, PERL_MAGIC_utf8) : NULL;
3324
3325                             if (mg)
3326                                 mg->mg_len = -1;
3327                             sv_setsv(sv, last_str);
3328                             data->last_end = data->pos_min;
3329                             data->last_start_min =
3330                                 data->pos_min - CHR_SVLEN(last_str);
3331                             data->last_start_max = is_inf
3332                                 ? I32_MAX
3333                                 : data->pos_min + data->pos_delta
3334                                 - CHR_SVLEN(last_str);
3335                         }
3336                         data->longest = &(data->longest_float);
3337                     }
3338                     SvREFCNT_dec(last_str);
3339                 }
3340                 if (data && (fl & SF_HAS_EVAL))
3341                     data->flags |= SF_HAS_EVAL;
3342               optimize_curly_tail:
3343                 if (OP(oscan) != CURLYX) {
3344                     while (PL_regkind[OP(next = regnext(oscan))] == NOTHING
3345                            && NEXT_OFF(next))
3346                         NEXT_OFF(oscan) += NEXT_OFF(next);
3347                 }
3348                 continue;
3349             default:                    /* REF and CLUMP only? */
3350                 if (flags & SCF_DO_SUBSTR) {
3351                     SCAN_COMMIT(pRExC_state,data,minlenp);      /* Cannot expect anything... */
3352                     data->longest = &(data->longest_float);
3353                 }
3354                 is_inf = is_inf_internal = 1;
3355                 if (flags & SCF_DO_STCLASS_OR)
3356                     cl_anything(pRExC_state, data->start_class);
3357                 flags &= ~SCF_DO_STCLASS;
3358                 break;
3359             }
3360         }
3361         else if (OP(scan) == LNBREAK) {
3362             if (flags & SCF_DO_STCLASS) {
3363                 int value = 0;
3364                 data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
3365                 if (flags & SCF_DO_STCLASS_AND) {
3366                     for (value = 0; value < 256; value++)
3367                         if (!is_LNBREAK_cp(value))                   
3368                             ANYOF_BITMAP_CLEAR(data->start_class, value);  
3369                 }                                                              
3370                 else {                                                         
3371                     for (value = 0; value < 256; value++)
3372                         if (is_LNBREAK_cp(value))                    
3373                             ANYOF_BITMAP_SET(data->start_class, value);    
3374                 }                                                              
3375                 if (flags & SCF_DO_STCLASS_OR)
3376                     cl_and(data->start_class, and_withp);
3377                 flags &= ~SCF_DO_STCLASS;
3378             }
3379             min += 1;
3380             delta += 2;
3381             if (flags & SCF_DO_SUBSTR) {
3382                 SCAN_COMMIT(pRExC_state,data,minlenp);  /* Cannot expect anything... */
3383                 data->pos_min += 1;
3384                 data->pos_delta += 2;
3385                 data->longest = &(data->longest_float);
3386             }
3387             
3388         }
3389         else if (strchr((const char*)PL_simple,OP(scan))) {
3390             int value = 0;
3391
3392             if (flags & SCF_DO_SUBSTR) {
3393                 SCAN_COMMIT(pRExC_state,data,minlenp);
3394                 data->pos_min++;
3395             }
3396             min++;
3397             if (flags & SCF_DO_STCLASS) {
3398                 data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
3399
3400                 /* Some of the logic below assumes that switching
3401                    locale on will only add false positives. */
3402                 switch (PL_regkind[OP(scan)]) {
3403                 case SANY:
3404                 default:
3405                   do_default:
3406                     /* Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", OP(scan)); */
3407                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
3408                         cl_anything(pRExC_state, data->start_class);
3409                     break;
3410                 case REG_ANY:
3411                     if (OP(scan) == SANY)
3412                         goto do_default;
3413                     if (flags & SCF_DO_STCLASS_OR) { /* Everything but \n */
3414                         value = (ANYOF_BITMAP_TEST(data->start_class,'\n')
3415                                  || (data->start_class->flags & ANYOF_CLASS));
3416                         cl_anything(pRExC_state, data->start_class);
3417                     }
3418                     if (flags & SCF_DO_STCLASS_AND || !value)
3419                         ANYOF_BITMAP_CLEAR(data->start_class,'\n');
3420                     break;
3421                 case ANYOF:
3422                     if (flags & SCF_DO_STCLASS_AND)
3423                         cl_and(data->start_class,
3424                                (struct regnode_charclass_class*)scan);
3425                     else
3426                         cl_or(pRExC_state, data->start_class,
3427                               (struct regnode_charclass_class*)scan);
3428                     break;
3429                 case ALNUM:
3430                     if (flags & SCF_DO_STCLASS_AND) {
3431                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3432                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
3433                             for (value = 0; value < 256; value++)
3434                                 if (!isALNUM(value))
3435                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3436                         }
3437                     }
3438                     else {
3439                         if (data->start_class->flags & ANYOF_LOCALE)
3440                             ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
3441                         else {
3442                             for (value = 0; value < 256; value++)
3443                                 if (isALNUM(value))
3444                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3445                         }
3446                     }
3447                     break;
3448                 case ALNUML:
3449                     if (flags & SCF_DO_STCLASS_AND) {
3450                         if (data->start_class->flags & ANYOF_LOCALE)
3451                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
3452                     }
3453                     else {
3454                         ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
3455                         data->start_class->flags |= ANYOF_LOCALE;
3456                     }
3457                     break;
3458                 case NALNUM:
3459                     if (flags & SCF_DO_STCLASS_AND) {
3460                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3461                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
3462                             for (value = 0; value < 256; value++)
3463                                 if (isALNUM(value))
3464                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3465                         }
3466                     }
3467                     else {
3468                         if (data->start_class->flags & ANYOF_LOCALE)
3469                             ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
3470                         else {
3471                             for (value = 0; value < 256; value++)
3472                                 if (!isALNUM(value))
3473                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3474                         }
3475                     }
3476                     break;
3477                 case NALNUML:
3478                     if (flags & SCF_DO_STCLASS_AND) {
3479                         if (data->start_class->flags & ANYOF_LOCALE)
3480                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
3481                     }
3482                     else {
3483                         data->start_class->flags |= ANYOF_LOCALE;
3484                         ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
3485                     }
3486                     break;
3487                 case SPACE:
3488                     if (flags & SCF_DO_STCLASS_AND) {
3489                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3490                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
3491                             for (value = 0; value < 256; value++)
3492                                 if (!isSPACE(value))
3493                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3494                         }
3495                     }
3496                     else {
3497                         if (data->start_class->flags & ANYOF_LOCALE)
3498                             ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
3499                         else {
3500                             for (value = 0; value < 256; value++)
3501                                 if (isSPACE(value))
3502                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3503                         }
3504                     }
3505                     break;
3506                 case SPACEL:
3507                     if (flags & SCF_DO_STCLASS_AND) {
3508                         if (data->start_class->flags & ANYOF_LOCALE)
3509                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
3510                     }
3511                     else {
3512                         data->start_class->flags |= ANYOF_LOCALE;
3513                         ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
3514                     }
3515                     break;
3516                 case NSPACE:
3517                     if (flags & SCF_DO_STCLASS_AND) {
3518                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
3519                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
3520                             for (value = 0; value < 256; value++)
3521                                 if (isSPACE(value))
3522                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3523                         }
3524                     }
3525                     else {
3526                         if (data->start_class->flags & ANYOF_LOCALE)
3527                             ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
3528                         else {
3529                             for (value = 0; value < 256; value++)
3530                                 if (!isSPACE(value))
3531                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3532                         }
3533                     }
3534                     break;
3535                 case NSPACEL:
3536                     if (flags & SCF_DO_STCLASS_AND) {
3537                         if (data->start_class->flags & ANYOF_LOCALE) {
3538                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
3539                             for (value = 0; value < 256; value++)
3540                                 if (!isSPACE(value))
3541                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
3542                         }
3543                     }
3544                     else {
3545                         data->start_class->flags |= ANYOF_LOCALE;
3546                         ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
3547                     }
3548                     break;
3549                 case DIGIT:
3550                     if (flags & SCF_DO_STCLASS_AND) {
3551                         ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NDIGIT);
3552                         for (value = 0; value < 256; value++)
3553                             if (!isDIGIT(value))
3554                                 ANYOF_BITMAP_CLEAR(data->start_class, value);
3555                     }
3556                     else {
3557                         if (data->start_class->flags & ANYOF_LOCALE)
3558                             ANYOF_CLASS_SET(data->start_class,ANYOF_DIGIT);
3559                         else {
3560                             for (value = 0; value < 256; value++)
3561                                 if (isDIGIT(value))
3562                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3563                         }
3564                     }
3565                     break;
3566                 case NDIGIT:
3567                     if (flags & SCF_DO_STCLASS_AND) {
3568                         ANYOF_CLASS_CLEAR(data->start_class,ANYOF_DIGIT);
3569                         for (value = 0; value < 256; value++)
3570                             if (isDIGIT(value))
3571                                 ANYOF_BITMAP_CLEAR(data->start_class, value);
3572                     }
3573                     else {
3574                         if (data->start_class->flags & ANYOF_LOCALE)
3575                             ANYOF_CLASS_SET(data->start_class,ANYOF_NDIGIT);
3576                         else {
3577                             for (value = 0; value < 256; value++)
3578                                 if (!isDIGIT(value))
3579                                     ANYOF_BITMAP_SET(data->start_class, value);                 
3580                         }
3581                     }
3582                     break;
3583                 CASE_SYNST_FNC(VERTWS);
3584                 CASE_SYNST_FNC(HORIZWS);
3585                 
3586                 }
3587                 if (flags & SCF_DO_STCLASS_OR)
3588                     cl_and(data->start_class, and_withp);
3589                 flags &= ~SCF_DO_STCLASS;
3590             }
3591         }
3592         else if (PL_regkind[OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
3593             data->flags |= (OP(scan) == MEOL
3594                             ? SF_BEFORE_MEOL
3595                             : SF_BEFORE_SEOL);
3596         }
3597         else if (  PL_regkind[OP(scan)] == BRANCHJ
3598                  /* Lookbehind, or need to calculate parens/evals/stclass: */
3599                    && (scan->flags || data || (flags & SCF_DO_STCLASS))
3600                    && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
3601             if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY 
3602                 || OP(scan) == UNLESSM )
3603             {
3604                 /* Negative Lookahead/lookbehind
3605                    In this case we can't do fixed string optimisation.
3606                 */
3607
3608                 I32 deltanext, minnext, fake = 0;
3609                 regnode *nscan;
3610                 struct regnode_charclass_class intrnl;
3611                 int f = 0;
3612
3613                 data_fake.flags = 0;
3614                 if (data) {
3615                     data_fake.whilem_c = data->whilem_c;
3616                     data_fake.last_closep = data->last_closep;
3617                 }
3618                 else
3619                     data_fake.last_closep = &fake;
3620                 data_fake.pos_delta = delta;
3621                 if ( flags & SCF_DO_STCLASS && !scan->flags
3622                      && OP(scan) == IFMATCH ) { /* Lookahead */
3623                     cl_init(pRExC_state, &intrnl);
3624                     data_fake.start_class = &intrnl;
3625                     f |= SCF_DO_STCLASS_AND;
3626                 }
3627                 if (flags & SCF_WHILEM_VISITED_POS)
3628                     f |= SCF_WHILEM_VISITED_POS;
3629                 next = regnext(scan);
3630                 nscan = NEXTOPER(NEXTOPER(scan));
3631                 minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext, 
3632                     last, &data_fake, stopparen, recursed, NULL, f, depth+1);
3633                 if (scan->flags) {
3634                     if (deltanext) {
3635                         FAIL("Variable length lookbehind not implemented");
3636                     }
3637                     else if (minnext > (I32)U8_MAX) {
3638                         FAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
3639                     }
3640                     scan->flags = (U8)minnext;
3641                 }
3642                 if (data) {
3643                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3644                         pars++;
3645                     if (data_fake.flags & SF_HAS_EVAL)
3646                         data->flags |= SF_HAS_EVAL;
3647                     data->whilem_c = data_fake.whilem_c;
3648                 }
3649                 if (f & SCF_DO_STCLASS_AND) {
3650                     const int was = (data->start_class->flags & ANYOF_EOS);
3651
3652                     cl_and(data->start_class, &intrnl);
3653                     if (was)
3654                         data->start_class->flags |= ANYOF_EOS;
3655                 }
3656             }
3657 #if PERL_ENABLE_POSITIVE_ASSERTION_STUDY
3658             else {
3659                 /* Positive Lookahead/lookbehind
3660                    In this case we can do fixed string optimisation,
3661                    but we must be careful about it. Note in the case of
3662                    lookbehind the positions will be offset by the minimum
3663                    length of the pattern, something we won't know about
3664                    until after the recurse.
3665                 */
3666                 I32 deltanext, fake = 0;
3667                 regnode *nscan;
3668                 struct regnode_charclass_class intrnl;
3669                 int f = 0;
3670                 /* We use SAVEFREEPV so that when the full compile 
3671                     is finished perl will clean up the allocated 
3672                     minlens when its all done. This was we don't
3673                     have to worry about freeing them when we know
3674                     they wont be used, which would be a pain.
3675                  */
3676                 I32 *minnextp;
3677                 Newx( minnextp, 1, I32 );
3678                 SAVEFREEPV(minnextp);
3679
3680                 if (data) {
3681                     StructCopy(data, &data_fake, scan_data_t);
3682                     if ((flags & SCF_DO_SUBSTR) && data->last_found) {
3683                         f |= SCF_DO_SUBSTR;
3684                         if (scan->flags) 
3685                             SCAN_COMMIT(pRExC_state, &data_fake,minlenp);
3686                         data_fake.last_found=newSVsv(data->last_found);
3687                     }
3688                 }
3689                 else
3690                     data_fake.last_closep = &fake;
3691                 data_fake.flags = 0;
3692                 data_fake.pos_delta = delta;
3693                 if (is_inf)
3694                     data_fake.flags |= SF_IS_INF;
3695                 if ( flags & SCF_DO_STCLASS && !scan->flags
3696                      && OP(scan) == IFMATCH ) { /* Lookahead */
3697                     cl_init(pRExC_state, &intrnl);
3698                     data_fake.start_class = &intrnl;
3699                     f |= SCF_DO_STCLASS_AND;
3700                 }
3701                 if (flags & SCF_WHILEM_VISITED_POS)
3702                     f |= SCF_WHILEM_VISITED_POS;
3703                 next = regnext(scan);
3704                 nscan = NEXTOPER(NEXTOPER(scan));
3705
3706                 *minnextp = study_chunk(pRExC_state, &nscan, minnextp, &deltanext, 
3707                     last, &data_fake, stopparen, recursed, NULL, f,depth+1);
3708                 if (scan->flags) {
3709                     if (deltanext) {
3710                         FAIL("Variable length lookbehind not implemented");
3711                     }
3712                     else if (*minnextp > (I32)U8_MAX) {
3713                         FAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
3714                     }
3715                     scan->flags = (U8)*minnextp;
3716                 }
3717
3718                 *minnextp += min;
3719
3720                 if (f & SCF_DO_STCLASS_AND) {
3721                     const int was = (data->start_class->flags & ANYOF_EOS);
3722
3723                     cl_and(data->start_class, &intrnl);
3724                     if (was)
3725                         data->start_class->flags |= ANYOF_EOS;
3726                 }
3727                 if (data) {
3728                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3729                         pars++;
3730                     if (data_fake.flags & SF_HAS_EVAL)
3731                         data->flags |= SF_HAS_EVAL;
3732                     data->whilem_c = data_fake.whilem_c;
3733                     if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) {
3734                         if (RExC_rx->minlen<*minnextp)
3735                             RExC_rx->minlen=*minnextp;
3736                         SCAN_COMMIT(pRExC_state, &data_fake, minnextp);
3737                         SvREFCNT_dec(data_fake.last_found);
3738                         
3739                         if ( data_fake.minlen_fixed != minlenp ) 
3740                         {
3741                             data->offset_fixed= data_fake.offset_fixed;
3742                             data->minlen_fixed= data_fake.minlen_fixed;
3743                             data->lookbehind_fixed+= scan->flags;
3744                         }
3745                         if ( data_fake.minlen_float != minlenp )
3746                         {
3747                             data->minlen_float= data_fake.minlen_float;
3748                             data->offset_float_min=data_fake.offset_float_min;
3749                             data->offset_float_max=data_fake.offset_float_max;
3750                             data->lookbehind_float+= scan->flags;
3751                         }
3752                     }
3753                 }
3754
3755
3756             }
3757 #endif
3758         }
3759         else if (OP(scan) == OPEN) {
3760             if (stopparen != (I32)ARG(scan))
3761                 pars++;
3762         }
3763         else if (OP(scan) == CLOSE) {
3764             if (stopparen == (I32)ARG(scan)) {
3765                 break;
3766             }
3767             if ((I32)ARG(scan) == is_par) {
3768                 next = regnext(scan);
3769
3770                 if ( next && (OP(next) != WHILEM) && next < last)
3771                     is_par = 0;         /* Disable optimization */
3772             }
3773             if (data)
3774                 *(data->last_closep) = ARG(scan);
3775         }
3776         else if (OP(scan) == EVAL) {
3777                 if (data)
3778                     data->flags |= SF_HAS_EVAL;
3779         }
3780         else if ( PL_regkind[OP(scan)] == ENDLIKE ) {
3781             if (flags & SCF_DO_SUBSTR) {
3782                 SCAN_COMMIT(pRExC_state,data,minlenp);
3783                 flags &= ~SCF_DO_SUBSTR;
3784             }
3785             if (data && OP(scan)==ACCEPT) {
3786                 data->flags |= SCF_SEEN_ACCEPT;
3787                 if (stopmin > min)
3788                     stopmin = min;
3789             }
3790         }
3791         else if (OP(scan) == LOGICAL && scan->flags == 2) /* Embedded follows */
3792         {
3793                 if (flags & SCF_DO_SUBSTR) {
3794                     SCAN_COMMIT(pRExC_state,data,minlenp);
3795                     data->longest = &(data->longest_float);
3796                 }
3797                 is_inf = is_inf_internal = 1;
3798                 if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
3799                     cl_anything(pRExC_state, data->start_class);
3800                 flags &= ~SCF_DO_STCLASS;
3801         }
3802         else if (OP(scan) == GPOS) {
3803             if (!(RExC_rx->extflags & RXf_GPOS_FLOAT) &&
3804                 !(delta || is_inf || (data && data->pos_delta))) 
3805             {
3806                 if (!(RExC_rx->extflags & RXf_ANCH) && (flags & SCF_DO_SUBSTR))
3807                     RExC_rx->extflags |= RXf_ANCH_GPOS;
3808                 if (RExC_rx->gofs < (U32)min)
3809                     RExC_rx->gofs = min;
3810             } else {
3811                 RExC_rx->extflags |= RXf_GPOS_FLOAT;
3812                 RExC_rx->gofs = 0;
3813             }       
3814         }
3815 #ifdef TRIE_STUDY_OPT
3816 #ifdef FULL_TRIE_STUDY
3817         else if (PL_regkind[OP(scan)] == TRIE) {
3818             /* NOTE - There is similar code to this block above for handling
3819                BRANCH nodes on the initial study.  If you change stuff here
3820                check there too. */
3821             regnode *trie_node= scan;
3822             regnode *tail= regnext(scan);
3823             reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
3824             I32 max1 = 0, min1 = I32_MAX;
3825             struct regnode_charclass_class accum;
3826
3827             if (flags & SCF_DO_SUBSTR) /* XXXX Add !SUSPEND? */
3828                 SCAN_COMMIT(pRExC_state, data,minlenp); /* Cannot merge strings after this. */
3829             if (flags & SCF_DO_STCLASS)
3830                 cl_init_zero(pRExC_state, &accum);
3831                 
3832             if (!trie->jump) {
3833                 min1= trie->minlen;
3834                 max1= trie->maxlen;
3835             } else {
3836                 const regnode *nextbranch= NULL;
3837                 U32 word;
3838                 
3839                 for ( word=1 ; word <= trie->wordcount ; word++) 
3840                 {
3841                     I32 deltanext=0, minnext=0, f = 0, fake;
3842                     struct regnode_charclass_class this_class;
3843                     
3844                     data_fake.flags = 0;
3845                     if (data) {
3846                         data_fake.whilem_c = data->whilem_c;
3847                         data_fake.last_closep = data->last_closep;
3848                     }
3849                     else
3850                         data_fake.last_closep = &fake;
3851                     data_fake.pos_delta = delta;
3852                     if (flags & SCF_DO_STCLASS) {
3853                         cl_init(pRExC_state, &this_class);
3854                         data_fake.start_class = &this_class;
3855                         f = SCF_DO_STCLASS_AND;
3856                     }
3857                     if (flags & SCF_WHILEM_VISITED_POS)
3858                         f |= SCF_WHILEM_VISITED_POS;
3859     
3860                     if (trie->jump[word]) {
3861                         if (!nextbranch)
3862                             nextbranch = trie_node + trie->jump[0];
3863                         scan= trie_node + trie->jump[word];
3864                         /* We go from the jump point to the branch that follows
3865                            it. Note this means we need the vestigal unused branches
3866                            even though they arent otherwise used.
3867                          */
3868                         minnext = study_chunk(pRExC_state, &scan, minlenp, 
3869                             &deltanext, (regnode *)nextbranch, &data_fake, 
3870                             stopparen, recursed, NULL, f,depth+1);
3871                     }
3872                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
3873                         nextbranch= regnext((regnode*)nextbranch);
3874                     
3875                     if (min1 > (I32)(minnext + trie->minlen))
3876                         min1 = minnext + trie->minlen;
3877                     if (max1 < (I32)(minnext + deltanext + trie->maxlen))
3878                         max1 = minnext + deltanext + trie->maxlen;
3879                     if (deltanext == I32_MAX)
3880                         is_inf = is_inf_internal = 1;
3881                     
3882                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
3883                         pars++;
3884                     if (data_fake.flags & SCF_SEEN_ACCEPT) {
3885                         if ( stopmin > min + min1) 
3886                             stopmin = min + min1;
3887                         flags &= ~SCF_DO_SUBSTR;
3888                         if (data)
3889                             data->flags |= SCF_SEEN_ACCEPT;
3890                     }
3891                     if (data) {
3892                         if (data_fake.flags & SF_HAS_EVAL)
3893                             data->flags |= SF_HAS_EVAL;
3894                         data->whilem_c = data_fake.whilem_c;
3895                     }
3896                     if (flags & SCF_DO_STCLASS)
3897                         cl_or(pRExC_state, &accum, &this_class);
3898                 }
3899             }
3900             if (flags & SCF_DO_SUBSTR) {
3901                 data->pos_min += min1;
3902                 data->pos_delta += max1 - min1;
3903                 if (max1 != min1 || is_inf)
3904                     data->longest = &(data->longest_float);
3905             }
3906             min += min1;
3907             delta += max1 - min1;
3908             if (flags & SCF_DO_STCLASS_OR) {
3909                 cl_or(pRExC_state, data->start_class, &accum);
3910                 if (min1) {
3911                     cl_and(data->start_class, and_withp);
3912                     flags &= ~SCF_DO_STCLASS;
3913                 }
3914             }
3915             else if (flags & SCF_DO_STCLASS_AND) {
3916                 if (min1) {
3917                     cl_and(data->start_class, &accum);
3918                     flags &= ~SCF_DO_STCLASS;
3919                 }
3920                 else {
3921                     /* Switch to OR mode: cache the old value of
3922                      * data->start_class */
3923                     INIT_AND_WITHP;
3924                     StructCopy(data->start_class, and_withp,
3925                                struct regnode_charclass_class);
3926                     flags &= ~SCF_DO_STCLASS_AND;
3927                     StructCopy(&accum, data->start_class,
3928                                struct regnode_charclass_class);
3929                     flags |= SCF_DO_STCLASS_OR;
3930                     data->start_class->flags |= ANYOF_EOS;
3931                 }
3932             }
3933             scan= tail;
3934             continue;
3935         }
3936 #else
3937         else if (PL_regkind[OP(scan)] == TRIE) {
3938             reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ];
3939             U8*bang=NULL;
3940             
3941             min += trie->minlen;
3942             delta += (trie->maxlen - trie->minlen);
3943             flags &= ~SCF_DO_STCLASS; /* xxx */
3944             if (flags & SCF_DO_SUBSTR) {
3945                 SCAN_COMMIT(pRExC_state,data,minlenp);  /* Cannot expect anything... */
3946                 data->pos_min += trie->minlen;
3947                 data->pos_delta += (trie->maxlen - trie->minlen);
3948                 if (trie->maxlen != trie->minlen)
3949                     data->longest = &(data->longest_float);
3950             }
3951             if (trie->jump) /* no more substrings -- for now /grr*/
3952                 flags &= ~SCF_DO_SUBSTR; 
3953         }
3954 #endif /* old or new */
3955 #endif /* TRIE_STUDY_OPT */     
3956
3957         /* Else: zero-length, ignore. */
3958         scan = regnext(scan);
3959     }
3960     if (frame) {
3961         last = frame->last;
3962         scan = frame->next;
3963         stopparen = frame->stop;
3964         frame = frame->prev;
3965         goto fake_study_recurse;
3966     }
3967
3968   finish:
3969     assert(!frame);
3970     DEBUG_STUDYDATA("pre-fin:",data,depth);
3971
3972     *scanp = scan;
3973     *deltap = is_inf_internal ? I32_MAX : delta;
3974     if (flags & SCF_DO_SUBSTR && is_inf)
3975         data->pos_delta = I32_MAX - data->pos_min;
3976     if (is_par > (I32)U8_MAX)
3977         is_par = 0;
3978     if (is_par && pars==1 && data) {
3979         data->flags |= SF_IN_PAR;
3980         data->flags &= ~SF_HAS_PAR;
3981     }
3982     else if (pars && data) {
3983         data->flags |= SF_HAS_PAR;
3984         data->flags &= ~SF_IN_PAR;
3985     }
3986     if (flags & SCF_DO_STCLASS_OR)
3987         cl_and(data->start_class, and_withp);
3988     if (flags & SCF_TRIE_RESTUDY)
3989         data->flags |=  SCF_TRIE_RESTUDY;
3990     
3991     DEBUG_STUDYDATA("post-fin:",data,depth);
3992     
3993     return min < stopmin ? min : stopmin;
3994 }
3995
3996 STATIC U32
3997 S_add_data(RExC_state_t *pRExC_state, U32 n, const char *s)
3998 {
3999     U32 count = RExC_rxi->data ? RExC_rxi->data->count : 0;
4000
4001     Renewc(RExC_rxi->data,
4002            sizeof(*RExC_rxi->data) + sizeof(void*) * (count + n - 1),
4003            char, struct reg_data);
4004     if(count)
4005         Renew(RExC_rxi->data->what, count + n, U8);
4006     else
4007         Newx(RExC_rxi->data->what, n, U8);
4008     RExC_rxi->data->count = count + n;
4009     Copy(s, RExC_rxi->data->what + count, n, U8);
4010     return count;
4011 }
4012
4013 /*XXX: todo make this not included in a non debugging perl */
4014 #ifndef PERL_IN_XSUB_RE
4015 void
4016 Perl_reginitcolors(pTHX)
4017 {
4018     dVAR;
4019     const char * const s = PerlEnv_getenv("PERL_RE_COLORS");
4020     if (s) {
4021         char *t = savepv(s);
4022         int i = 0;
4023         PL_colors[0] = t;
4024         while (++i < 6) {
4025             t = strchr(t, '\t');
4026             if (t) {
4027                 *t = '\0';
4028                 PL_colors[i] = ++t;
4029             }
4030             else
4031                 PL_colors[i] = t = (char *)"";
4032         }
4033     } else {
4034         int i = 0;
4035         while (i < 6)
4036             PL_colors[i++] = (char *)"";
4037     }
4038     PL_colorset = 1;
4039 }
4040 #endif
4041
4042
4043 #ifdef TRIE_STUDY_OPT
4044 #define CHECK_RESTUDY_GOTO                                  \
4045         if (                                                \
4046               (data.flags & SCF_TRIE_RESTUDY)               \
4047               && ! restudied++                              \
4048         )     goto reStudy
4049 #else
4050 #define CHECK_RESTUDY_GOTO
4051 #endif        
4052
4053 /*
4054  - pregcomp - compile a regular expression into internal code
4055  *
4056  * We can't allocate space until we know how big the compiled form will be,
4057  * but we can't compile it (and thus know how big it is) until we've got a
4058  * place to put the code.  So we cheat:  we compile it twice, once with code
4059  * generation turned off and size counting turned on, and once "for real".
4060  * This also means that we don't allocate space until we are sure that the
4061  * thing really will compile successfully, and we never have to move the
4062  * code and thus invalidate pointers into it.  (Note that it has to be in
4063  * one piece because free() must be able to free it all.) [NB: not true in perl]
4064  *
4065  * Beware that the optimization-preparation code in here knows about some
4066  * of the structure of the compiled regexp.  [I'll say.]
4067  */
4068
4069
4070
4071 #ifndef PERL_IN_XSUB_RE
4072 #define RE_ENGINE_PTR &PL_core_reg_engine
4073 #else
4074 extern const struct regexp_engine my_reg_engine;
4075 #define RE_ENGINE_PTR &my_reg_engine
4076 #endif
4077
4078 #ifndef PERL_IN_XSUB_RE 
4079 REGEXP *
4080 Perl_pregcomp(pTHX_ const SV * const pattern, const U32 flags)
4081 {
4082     dVAR;
4083     HV * const table = GvHV(PL_hintgv);
4084     /* Dispatch a request to compile a regexp to correct 
4085        regexp engine. */
4086     if (table) {
4087         SV **ptr= hv_fetchs(table, "regcomp", FALSE);
4088         GET_RE_DEBUG_FLAGS_DECL;
4089         if (ptr && SvIOK(*ptr) && SvIV(*ptr)) {
4090             const regexp_engine *eng=INT2PTR(regexp_engine*,SvIV(*ptr));
4091             DEBUG_COMPILE_r({
4092                 PerlIO_printf(Perl_debug_log, "Using engine %"UVxf"\n",
4093                     SvIV(*ptr));
4094             });            
4095             return CALLREGCOMP_ENG(eng, pattern, flags);
4096         } 
4097     }
4098     return Perl_re_compile(aTHX_ pattern, flags);
4099 }
4100 #endif
4101
4102 REGEXP *
4103 Perl_re_compile(pTHX_ const SV * const pattern, const U32 pm_flags)
4104 {
4105     dVAR;
4106     register REGEXP *r;
4107     register regexp_internal *ri;
4108     STRLEN plen;
4109     char*  exp = SvPV((SV*)pattern, plen);
4110     char* xend = exp + plen;
4111     regnode *scan;
4112     regnode *first;
4113     I32 flags;
4114     I32 minlen = 0;
4115     I32 sawplus = 0;
4116     I32 sawopen = 0;
4117     scan_data_t data;
4118     RExC_state_t RExC_state;
4119     RExC_state_t * const pRExC_state = &RExC_state;
4120 #ifdef TRIE_STUDY_OPT    
4121     int restudied= 0;
4122     RExC_state_t copyRExC_state;
4123 #endif    
4124     GET_RE_DEBUG_FLAGS_DECL;
4125     DEBUG_r(if (!PL_colorset) reginitcolors());
4126
4127     RExC_utf8 = RExC_orig_utf8 = pm_flags & RXf_UTF8;
4128
4129     DEBUG_COMPILE_r({
4130         SV *dsv= sv_newmortal();
4131         RE_PV_QUOTED_DECL(s, RExC_utf8,
4132             dsv, exp, plen, 60);
4133         PerlIO_printf(Perl_debug_log, "%sCompiling REx%s %s\n",
4134                        PL_colors[4],PL_colors[5],s);
4135     });
4136
4137 redo_first_pass:
4138     RExC_precomp = exp;
4139     RExC_flags = pm_flags;
4140     RExC_sawback = 0;
4141
4142     RExC_seen = 0;
4143     RExC_seen_zerolen = *exp == '^' ? -1 : 0;
4144     RExC_seen_evals = 0;
4145     RExC_extralen = 0;
4146
4147     /* First pass: determine size, legality. */
4148     RExC_parse = exp;
4149     RExC_start = exp;
4150     RExC_end = xend;
4151     RExC_naughty = 0;
4152     RExC_npar = 1;
4153     RExC_nestroot = 0;
4154     RExC_size = 0L;
4155     RExC_emit = &PL_regdummy;
4156     RExC_whilem_seen = 0;
4157     RExC_charnames = NULL;
4158     RExC_open_parens = NULL;
4159     RExC_close_parens = NULL;
4160     RExC_opend = NULL;
4161     RExC_paren_names = NULL;
4162 #ifdef DEBUGGING
4163     RExC_paren_name_list = NULL;
4164 #endif
4165     RExC_recurse = NULL;
4166     RExC_recurse_count = 0;
4167
4168 #if 0 /* REGC() is (currently) a NOP at the first pass.
4169        * Clever compilers notice this and complain. --jhi */
4170     REGC((U8)REG_MAGIC, (char*)RExC_emit);
4171 #endif
4172     DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "Starting first pass (sizing)\n"));
4173     if (reg(pRExC_state, 0, &flags,1) == NULL) {
4174         RExC_precomp = NULL;
4175         return(NULL);
4176     }
4177     if (RExC_utf8 && !RExC_orig_utf8) {
4178         /* It's possible to write a regexp in ascii that represents unicode
4179         codepoints outside of the byte range, such as via \x{100}. If we
4180         detect such a sequence we have to convert the entire pattern to utf8
4181         and then recompile, as our sizing calculation will have been based
4182         on 1 byte == 1 character, but we will need to use utf8 to encode
4183         at least some part of the pattern, and therefore must convert the whole
4184         thing.
4185         XXX: somehow figure out how to make this less expensive...
4186         -- dmq */
4187         STRLEN len = plen;
4188         DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log,
4189             "UTF8 mismatch! Converting to utf8 for resizing and compile\n"));
4190         exp = (char*)Perl_bytes_to_utf8(aTHX_ (U8*)exp, &len);
4191         xend = exp + len;
4192         RExC_orig_utf8 = RExC_utf8;
4193         SAVEFREEPV(exp);
4194         goto redo_first_pass;
4195     }
4196     DEBUG_PARSE_r({
4197         PerlIO_printf(Perl_debug_log, 
4198             "Required size %"IVdf" nodes\n"
4199             "Starting second pass (creation)\n", 
4200             (IV)RExC_size);
4201         RExC_lastnum=0; 
4202         RExC_lastparse=NULL; 
4203     });
4204     /* Small enough for pointer-storage convention?
4205        If extralen==0, this means that we will not need long jumps. */
4206     if (RExC_size >= 0x10000L && RExC_extralen)
4207         RExC_size += RExC_extralen;
4208     else
4209         RExC_extralen = 0;
4210     if (RExC_whilem_seen > 15)
4211         RExC_whilem_seen = 15;
4212
4213     /* Allocate space and zero-initialize. Note, the two step process 
4214        of zeroing when in debug mode, thus anything assigned has to 
4215        happen after that */
4216     Newxz(r, 1, regexp);
4217     Newxc(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode),
4218          char, regexp_internal);
4219     if ( r == NULL || ri == NULL )
4220         FAIL("Regexp out of space");
4221 #ifdef DEBUGGING
4222     /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
4223     Zero(ri, sizeof(regexp_internal) + (unsigned)RExC_size * sizeof(regnode), char);
4224 #else 
4225     /* bulk initialize base fields with 0. */
4226     Zero(ri, sizeof(regexp_internal), char);        
4227 #endif
4228
4229     /* non-zero initialization begins here */
4230     RXi_SET( r, ri );
4231     r->engine= RE_ENGINE_PTR;
4232     r->refcnt = 1;
4233     r->prelen = plen;
4234     r->extflags = pm_flags;
4235     {
4236         bool has_k     = ((r->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY);
4237         bool has_minus = ((r->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD);
4238         bool has_runon = ((RExC_seen & REG_SEEN_RUN_ON_COMMENT)==REG_SEEN_RUN_ON_COMMENT);
4239         U16 reganch = (U16)((r->extflags & RXf_PMf_STD_PMMOD) >> 12);
4240         const char *fptr = STD_PAT_MODS;        /*"msix"*/
4241         char *p;
4242         r->wraplen = r->prelen + has_minus + has_k + has_runon
4243             + (sizeof(STD_PAT_MODS) - 1)
4244             + (sizeof("(?:)") - 1);
4245
4246         Newx(r->wrapped, r->wraplen + 1, char );
4247         p = r->wrapped;
4248         *p++='('; *p++='?';
4249         if (has_k)
4250             *p++ = KEEPCOPY_PAT_MOD; /*'k'*/
4251         {
4252             char *r = p + (sizeof(STD_PAT_MODS) - 1) + has_minus - 1;
4253             char *colon = r + 1;
4254             char ch;
4255
4256             while((ch = *fptr++)) {
4257                 if(reganch & 1)
4258                     *p++ = ch;
4259                 else
4260                     *r-- = ch;
4261                 reganch >>= 1;
4262             }
4263             if(has_minus) {
4264                 *r = '-';
4265                 p = colon;
4266             }
4267         }
4268
4269         *p++ = ':';
4270         Copy(RExC_precomp, p, r->prelen, char);
4271         r->precomp = p;
4272         p += r->prelen;
4273         if (has_runon)
4274             *p++ = '\n';
4275         *p++ = ')';
4276         *p = 0;
4277     }
4278
4279     r->intflags = 0;
4280     r->nparens = RExC_npar - 1; /* set early to validate backrefs */
4281     
4282     if (RExC_seen & REG_SEEN_RECURSE) {
4283         Newxz(RExC_open_parens, RExC_npar,regnode *);
4284         SAVEFREEPV(RExC_open_parens);
4285         Newxz(RExC_close_parens,RExC_npar,regnode *);
4286         SAVEFREEPV(RExC_close_parens);
4287     }
4288
4289     /* Useful during FAIL. */
4290 #ifdef RE_TRACK_PATTERN_OFFSETS
4291     Newxz(ri->u.offsets, 2*RExC_size+1, U32); /* MJD 20001228 */
4292     DEBUG_OFFSETS_r(PerlIO_printf(Perl_debug_log,
4293                           "%s %"UVuf" bytes for offset annotations.\n",
4294                           ri->u.offsets ? "Got" : "Couldn't get",
4295                           (UV)((2*RExC_size+1) * sizeof(U32))));
4296 #endif
4297     SetProgLen(ri,RExC_size);
4298     RExC_rx = r;
4299     RExC_rxi = ri;
4300
4301     /* Second pass: emit code. */
4302     RExC_flags = pm_flags;      /* don't let top level (?i) bleed */
4303     RExC_parse = exp;
4304     RExC_end = xend;
4305     RExC_naughty = 0;
4306     RExC_npar = 1;
4307     RExC_emit_start = ri->program;
4308     RExC_emit = ri->program;
4309     RExC_emit_bound = ri->program + RExC_size + 1;
4310
4311     /* Store the count of eval-groups for security checks: */
4312     RExC_rx->seen_evals = RExC_seen_evals;
4313     REGC((U8)REG_MAGIC, (char*) RExC_emit++);
4314     if (reg(pRExC_state, 0, &flags,1) == NULL)
4315         return(NULL);
4316
4317     /* XXXX To minimize changes to RE engine we always allocate
4318        3-units-long substrs field. */
4319     Newx(r->substrs, 1, struct reg_substr_data);
4320     if (RExC_recurse_count) {
4321         Newxz(RExC_recurse,RExC_recurse_count,regnode *);
4322         SAVEFREEPV(RExC_recurse);
4323     }
4324
4325 reStudy:
4326     r->minlen = minlen = sawplus = sawopen = 0;
4327     Zero(r->substrs, 1, struct reg_substr_data);
4328
4329 #ifdef TRIE_STUDY_OPT
4330     if ( restudied ) {
4331         U32 seen=RExC_seen;
4332         DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log,"Restudying\n"));
4333         
4334         RExC_state = copyRExC_state;
4335         if (seen & REG_TOP_LEVEL_BRANCHES) 
4336             RExC_seen |= REG_TOP_LEVEL_BRANCHES;
4337         else
4338             RExC_seen &= ~REG_TOP_LEVEL_BRANCHES;
4339         if (data.last_found) {
4340             SvREFCNT_dec(data.longest_fixed);
4341             SvREFCNT_dec(data.longest_float);
4342             SvREFCNT_dec(data.last_found);
4343         }
4344         StructCopy(&zero_scan_data, &data, scan_data_t);
4345     } else {
4346         StructCopy(&zero_scan_data, &data, scan_data_t);
4347         copyRExC_state = RExC_state;
4348     }
4349 #else
4350     StructCopy(&zero_scan_data, &data, scan_data_t);
4351 #endif    
4352
4353     /* Dig out information for optimizations. */
4354     r->extflags = pm_flags; /* Again? */
4355     /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */
4356  
4357     if (UTF)
4358         r->extflags |= RXf_UTF8;        /* Unicode in it? */
4359     ri->regstclass = NULL;
4360     if (RExC_naughty >= 10)     /* Probably an expensive pattern. */
4361         r->intflags |= PREGf_NAUGHTY;
4362     scan = ri->program + 1;             /* First BRANCH. */
4363
4364     /* testing for BRANCH here tells us whether there is "must appear"
4365        data in the pattern. If there is then we can use it for optimisations */
4366     if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES)) { /*  Only one top-level choice. */
4367         I32 fake;
4368         STRLEN longest_float_length, longest_fixed_length;
4369         struct regnode_charclass_class ch_class; /* pointed to by data */
4370         int stclass_flag;
4371         I32 last_close = 0; /* pointed to by data */
4372
4373         first = scan;
4374         /* Skip introductions and multiplicators >= 1. */
4375         while ((OP(first) == OPEN && (sawopen = 1)) ||
4376                /* An OR of *one* alternative - should not happen now. */
4377             (OP(first) == BRANCH && OP(regnext(first)) != BRANCH) ||
4378             /* for now we can't handle lookbehind IFMATCH*/
4379             (OP(first) == IFMATCH && !first->flags) || 
4380             (OP(first) == PLUS) ||
4381             (OP(first) == MINMOD) ||
4382                /* An {n,m} with n>0 */
4383             (PL_regkind[OP(first)] == CURLY && ARG1(first) > 0) ) 
4384         {
4385                 
4386                 if (OP(first) == PLUS)
4387                     sawplus = 1;
4388                 else
4389                     first += regarglen[OP(first)];
4390                 if (OP(first) == IFMATCH) {
4391                     first = NEXTOPER(first);
4392                     first += EXTRA_STEP_2ARGS;
4393                 } else  /* XXX possible optimisation for /(?=)/  */
4394                     first = NEXTOPER(first);
4395         }
4396
4397         /* Starting-point info. */
4398       again:
4399         DEBUG_PEEP("first:",first,0);
4400         /* Ignore EXACT as we deal with it later. */
4401         if (PL_regkind[OP(first)] == EXACT) {
4402             if (OP(first) == EXACT)
4403                 NOOP;   /* Empty, get anchored substr later. */
4404             else if ((OP(first) == EXACTF || OP(first) == EXACTFL))
4405                 ri->regstclass = first;
4406         }
4407 #ifdef TRIE_STCLASS     
4408         else if (PL_regkind[OP(first)] == TRIE &&
4409                 ((reg_trie_data *)ri->data->data[ ARG(first) ])->minlen>0) 
4410         {
4411             regnode *trie_op;
4412             /* this can happen only on restudy */
4413             if ( OP(first) == TRIE ) {
4414                 struct regnode_1 *trieop = (struct regnode_1 *)
4415                     PerlMemShared_calloc(1, sizeof(struct regnode_1));
4416                 StructCopy(first,trieop,struct regnode_1);
4417                 trie_op=(regnode *)trieop;
4418             } else {
4419                 struct regnode_charclass *trieop = (struct regnode_charclass *)
4420                     PerlMemShared_calloc(1, sizeof(struct regnode_charclass));
4421                 StructCopy(first,trieop,struct regnode_charclass);
4422                 trie_op=(regnode *)trieop;
4423             }
4424             OP(trie_op)+=2;
4425             make_trie_failtable(pRExC_state, (regnode *)first, trie_op, 0);
4426             ri->regstclass = trie_op;
4427         }
4428 #endif  
4429         else if (strchr((const char*)PL_simple,OP(first)))
4430             ri->regstclass = first;
4431         else if (PL_regkind[OP(first)] == BOUND ||
4432                  PL_regkind[OP(first)] == NBOUND)
4433             ri->regstclass = first;
4434         else if (PL_regkind[OP(first)] == BOL) {
4435             r->extflags |= (OP(first) == MBOL
4436                            ? RXf_ANCH_MBOL
4437                            : (OP(first) == SBOL
4438                               ? RXf_ANCH_SBOL
4439                               : RXf_ANCH_BOL));
4440             first = NEXTOPER(first);
4441             goto again;
4442         }
4443         else if (OP(first) == GPOS) {
4444             r->extflags |= RXf_ANCH_GPOS;
4445             first = NEXTOPER(first);
4446             goto again;
4447         }
4448         else if ((!sawopen || !RExC_sawback) &&
4449             (OP(first) == STAR &&
4450             PL_regkind[OP(NEXTOPER(first))] == REG_ANY) &&
4451             !(r->extflags & RXf_ANCH) && !(RExC_seen & REG_SEEN_EVAL))
4452         {
4453             /* turn .* into ^.* with an implied $*=1 */
4454             const int type =
4455                 (OP(NEXTOPER(first)) == REG_ANY)
4456                     ? RXf_ANCH_MBOL
4457                     : RXf_ANCH_SBOL;
4458             r->extflags |= type;
4459             r->intflags |= PREGf_IMPLICIT;
4460             first = NEXTOPER(first);
4461             goto again;
4462         }
4463         if (sawplus && (!sawopen || !RExC_sawback)
4464             && !(RExC_seen & REG_SEEN_EVAL)) /* May examine pos and $& */
4465             /* x+ must match at the 1st pos of run of x's */
4466             r->intflags |= PREGf_SKIP;
4467
4468         /* Scan is after the zeroth branch, first is atomic matcher. */
4469 #ifdef TRIE_STUDY_OPT
4470         DEBUG_PARSE_r(
4471             if (!restudied)
4472                 PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
4473                               (IV)(first - scan + 1))
4474         );
4475 #else
4476         DEBUG_PARSE_r(
4477             PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n",
4478                 (IV)(first - scan + 1))
4479         );
4480 #endif
4481
4482
4483         /*
4484         * If there's something expensive in the r.e., find the
4485         * longest literal string that must appear and make it the
4486         * regmust.  Resolve ties in favor of later strings, since
4487         * the regstart check works with the beginning of the r.e.
4488         * and avoiding duplication strengthens checking.  Not a
4489         * strong reason, but sufficient in the absence of others.
4490         * [Now we resolve ties in favor of the earlier string if
4491         * it happens that c_offset_min has been invalidated, since the
4492         * earlier string may buy us something the later one won't.]
4493         */
4494         
4495         data.longest_fixed = newSVpvs("");
4496         data.longest_float = newSVpvs("");
4497         data.last_found = newSVpvs("");
4498         data.longest = &(data.longest_fixed);
4499         first = scan;
4500         if (!ri->regstclass) {
4501             cl_init(pRExC_state, &ch_class);
4502             data.start_class = &ch_class;
4503             stclass_flag = SCF_DO_STCLASS_AND;
4504         } else                          /* XXXX Check for BOUND? */
4505             stclass_flag = 0;
4506         data.last_closep = &last_close;
4507         
4508         minlen = study_chunk(pRExC_state, &first, &minlen, &fake, scan + RExC_size, /* Up to end */
4509             &data, -1, NULL, NULL,
4510             SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag,0);
4511
4512         
4513         CHECK_RESTUDY_GOTO;
4514
4515
4516         if ( RExC_npar == 1 && data.longest == &(data.longest_fixed)
4517              && data.last_start_min == 0 && data.last_end > 0
4518              && !RExC_seen_zerolen
4519              && !(RExC_seen & REG_SEEN_VERBARG)
4520              && (!(RExC_seen & REG_SEEN_GPOS) || (r->extflags & RXf_ANCH_GPOS)))
4521             r->extflags |= RXf_CHECK_ALL;
4522         scan_commit(pRExC_state, &data,&minlen,0);
4523         SvREFCNT_dec(data.last_found);
4524
4525         /* Note that code very similar to this but for anchored string 
4526            follows immediately below, changes may need to be made to both. 
4527            Be careful. 
4528          */
4529         longest_float_length = CHR_SVLEN(data.longest_float);
4530         if (longest_float_length
4531             || (data.flags & SF_FL_BEFORE_EOL
4532                 && (!(data.flags & SF_FL_BEFORE_MEOL)
4533                     || (RExC_flags & RXf_PMf_MULTILINE)))) 
4534         {
4535             I32 t,ml;
4536
4537             if (SvCUR(data.longest_fixed)  /* ok to leave SvCUR */
4538                 && data.offset_fixed == data.offset_float_min
4539                 && SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
4540                     goto remove_float;          /* As in (a)+. */
4541
4542             /* copy the information about the longest float from the reg_scan_data
4543                over to the program. */
4544             if (SvUTF8(data.longest_float)) {
4545                 r->float_utf8 = data.longest_float;
4546                 r->float_substr = NULL;
4547             } else {
4548                 r->float_substr = data.longest_float;
4549                 r->float_utf8 = NULL;
4550             }
4551             /* float_end_shift is how many chars that must be matched that 
4552                follow this item. We calculate it ahead of time as once the
4553                lookbehind offset is added in we lose the ability to correctly
4554                calculate it.*/
4555             ml = data.minlen_float ? *(data.minlen_float) 
4556                                    : (I32)longest_float_length;
4557             r->float_end_shift = ml - data.offset_float_min
4558                 - longest_float_length + (SvTAIL(data.longest_float) != 0)
4559                 + data.lookbehind_float;
4560             r->float_min_offset = data.offset_float_min - data.lookbehind_float;
4561             r->float_max_offset = data.offset_float_max;
4562             if (data.offset_float_max < I32_MAX) /* Don't offset infinity */
4563                 r->float_max_offset -= data.lookbehind_float;
4564             
4565             t = (data.flags & SF_FL_BEFORE_EOL /* Can't have SEOL and MULTI */
4566                        && (!(data.flags & SF_FL_BEFORE_MEOL)
4567                            || (RExC_flags & RXf_PMf_MULTILINE)));
4568             fbm_compile(data.longest_float, t ? FBMcf_TAIL : 0);
4569         }
4570         else {
4571           remove_float:
4572             r->float_substr = r->float_utf8 = NULL;
4573             SvREFCNT_dec(data.longest_float);
4574             longest_float_length = 0;
4575         }
4576
4577         /* Note that code very similar to this but for floating string 
4578            is immediately above, changes may need to be made to both. 
4579            Be careful. 
4580          */
4581         longest_fixed_length = CHR_SVLEN(data.longest_fixed);
4582         if (longest_fixed_length
4583             || (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
4584                 && (!(data.flags & SF_FIX_BEFORE_MEOL)
4585                     || (RExC_flags & RXf_PMf_MULTILINE)))) 
4586         {
4587             I32 t,ml;
4588
4589             /* copy the information about the longest fixed 
4590                from the reg_scan_data over to the program. */
4591             if (SvUTF8(data.longest_fixed)) {
4592                 r->anchored_utf8 = data.longest_fixed;
4593                 r->anchored_substr = NULL;
4594             } else {
4595                 r->anchored_substr = data.longest_fixed;
4596                 r->anchored_utf8 = NULL;
4597             }
4598             /* fixed_end_shift is how many chars that must be matched that 
4599                follow this item. We calculate it ahead of time as once the
4600                lookbehind offset is added in we lose the ability to correctly
4601                calculate it.*/
4602             ml = data.minlen_fixed ? *(data.minlen_fixed) 
4603                                    : (I32)longest_fixed_length;
4604             r->anchored_end_shift = ml - data.offset_fixed
4605                 - longest_fixed_length + (SvTAIL(data.longest_fixed) != 0)
4606                 + data.lookbehind_fixed;
4607             r->anchored_offset = data.offset_fixed - data.lookbehind_fixed;
4608
4609             t = (data.flags & SF_FIX_BEFORE_EOL /* Can't have SEOL and MULTI */
4610                  && (!(data.flags & SF_FIX_BEFORE_MEOL)
4611                      || (RExC_flags & RXf_PMf_MULTILINE)));
4612             fbm_compile(data.longest_fixed, t ? FBMcf_TAIL : 0);
4613         }
4614         else {
4615             r->anchored_substr = r->anchored_utf8 = NULL;
4616             SvREFCNT_dec(data.longest_fixed);
4617             longest_fixed_length = 0;
4618         }
4619         if (ri->regstclass
4620             && (OP(ri->regstclass) == REG_ANY || OP(ri->regstclass) == SANY))
4621             ri->regstclass = NULL;
4622         if ((!(r->anchored_substr || r->anchored_utf8) || r->anchored_offset)
4623             && stclass_flag
4624             && !(data.start_class->flags & ANYOF_EOS)
4625             && !cl_is_anything(data.start_class))
4626         {
4627             const U32 n = add_data(pRExC_state, 1, "f");
4628
4629             Newx(RExC_rxi->data->data[n], 1,
4630                 struct regnode_charclass_class);
4631             StructCopy(data.start_class,
4632                        (struct regnode_charclass_class*)RExC_rxi->data->data[n],
4633                        struct regnode_charclass_class);
4634             ri->regstclass = (regnode*)RExC_rxi->data->data[n];
4635             r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
4636             DEBUG_COMPILE_r({ SV *sv = sv_newmortal();
4637                       regprop(r, sv, (regnode*)data.start_class);
4638                       PerlIO_printf(Perl_debug_log,
4639                                     "synthetic stclass \"%s\".\n",
4640                                     SvPVX_const(sv));});
4641         }
4642
4643         /* A temporary algorithm prefers floated substr to fixed one to dig more info. */
4644         if (longest_fixed_length > longest_float_length) {
4645             r->check_end_shift = r->anchored_end_shift;
4646             r->check_substr = r->anchored_substr;
4647             r->check_utf8 = r->anchored_utf8;
4648             r->check_offset_min = r->check_offset_max = r->anchored_offset;
4649             if (r->extflags & RXf_ANCH_SINGLE)
4650                 r->extflags |= RXf_NOSCAN;
4651         }
4652         else {
4653             r->check_end_shift = r->float_end_shift;
4654             r->check_substr = r->float_substr;
4655             r->check_utf8 = r->float_utf8;
4656             r->check_offset_min = r->float_min_offset;
4657             r->check_offset_max = r->float_max_offset;
4658         }
4659         /* XXXX Currently intuiting is not compatible with ANCH_GPOS.
4660            This should be changed ASAP!  */
4661         if ((r->check_substr || r->check_utf8) && !(r->extflags & RXf_ANCH_GPOS)) {
4662             r->extflags |= RXf_USE_INTUIT;
4663             if (SvTAIL(r->check_substr ? r->check_substr : r->check_utf8))
4664                 r->extflags |= RXf_INTUIT_TAIL;
4665         }
4666         /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere)
4667         if ( (STRLEN)minlen < longest_float_length )
4668             minlen= longest_float_length;
4669         if ( (STRLEN)minlen < longest_fixed_length )
4670             minlen= longest_fixed_length;     
4671         */
4672     }
4673     else {
4674         /* Several toplevels. Best we can is to set minlen. */
4675         I32 fake;
4676         struct regnode_charclass_class ch_class;
4677         I32 last_close = 0;
4678         
4679         DEBUG_PARSE_r(PerlIO_printf(Perl_debug_log, "\nMulti Top Level\n"));
4680
4681         scan = ri->program + 1;
4682         cl_init(pRExC_state, &ch_class);
4683         data.start_class = &ch_class;
4684         data.last_closep = &last_close;
4685
4686         
4687         minlen = study_chunk(pRExC_state, &scan, &minlen, &fake, scan + RExC_size,
4688             &data, -1, NULL, NULL, SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS,0);
4689         
4690         CHECK_RESTUDY_GOTO;
4691
4692         r->check_substr = r->check_utf8 = r->anchored_substr = r->anchored_utf8
4693                 = r->float_substr = r->float_utf8 = NULL;
4694         if (!(data.start_class->flags & ANYOF_EOS)
4695             && !cl_is_anything(data.start_class))
4696         {
4697             const U32 n = add_data(pRExC_state, 1, "f");
4698
4699             Newx(RExC_rxi->data->data[n], 1,
4700                 struct regnode_charclass_class);
4701             StructCopy(data.start_class,
4702                        (struct regnode_charclass_class*)RExC_rxi->data->data[n],
4703                        struct regnode_charclass_class);
4704             ri->regstclass = (regnode*)RExC_rxi->data->data[n];
4705             r->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */
4706             DEBUG_COMPILE_r({ SV* sv = sv_newmortal();
4707                       regprop(r, sv, (regnode*)data.start_class);
4708                       PerlIO_printf(Perl_debug_log,
4709                                     "synthetic stclass \"%s\".\n",
4710                                     SvPVX_const(sv));});
4711         }
4712     }
4713
4714     /* Guard against an embedded (?=) or (?<=) with a longer minlen than
4715        the "real" pattern. */
4716     DEBUG_OPTIMISE_r({
4717         PerlIO_printf(Perl_debug_log,"minlen: %"IVdf" r->minlen:%"IVdf"\n",
4718                       (IV)minlen, (IV)r->minlen);
4719     });
4720     r->minlenret = minlen;
4721     if (r->minlen < minlen) 
4722         r->minlen = minlen;
4723     
4724     if (RExC_seen & REG_SEEN_GPOS)
4725         r->extflags |= RXf_GPOS_SEEN;
4726     if (RExC_seen & REG_SEEN_LOOKBEHIND)
4727         r->extflags |= RXf_LOOKBEHIND_SEEN;
4728     if (RExC_seen & REG_SEEN_EVAL)
4729         r->extflags |= RXf_EVAL_SEEN;
4730     if (RExC_seen & REG_SEEN_CANY)
4731         r->extflags |= RXf_CANY_SEEN;
4732     if (RExC_seen & REG_SEEN_VERBARG)
4733         r->intflags |= PREGf_VERBARG_SEEN;
4734     if (RExC_seen & REG_SEEN_CUTGROUP)
4735         r->intflags |= PREGf_CUTGROUP_SEEN;
4736     if (RExC_paren_names)
4737         r->paren_names = (HV*)SvREFCNT_inc(RExC_paren_names);
4738     else
4739         r->paren_names = NULL;
4740     if (r->prelen == 3 && strnEQ("\\s+", r->precomp, 3)) /* precomp = "\\s+)" */
4741         r->extflags |= RXf_WHITE;
4742     else if (r->prelen == 1 && r->precomp[0] == '^')
4743         r->extflags |= RXf_START_ONLY;
4744
4745 #ifdef DEBUGGING
4746     if (RExC_paren_names) {
4747         ri->name_list_idx = add_data( pRExC_state, 1, "p" );
4748         ri->data->data[ri->name_list_idx] = (void*)SvREFCNT_inc(RExC_paren_name_list);
4749     } else
4750 #endif
4751         ri->name_list_idx = 0;
4752
4753     if (RExC_recurse_count) {
4754         for ( ; RExC_recurse_count ; RExC_recurse_count-- ) {
4755             const regnode *scan = RExC_recurse[RExC_recurse_count-1];
4756             ARG2L_SET( scan, RExC_open_parens[ARG(scan)-1] - scan );
4757         }
4758     }
4759     Newxz(r->offs, RExC_npar, regexp_paren_pair);
4760     /* assume we don't need to swap parens around before we match */
4761
4762     DEBUG_DUMP_r({
4763         PerlIO_printf(Perl_debug_log,"Final program:\n");
4764         regdump(r);
4765     });
4766 #ifdef RE_TRACK_PATTERN_OFFSETS
4767     DEBUG_OFFSETS_r(if (ri->u.offsets) {
4768         const U32 len = ri->u.offsets[0];
4769         U32 i;
4770         GET_RE_DEBUG_FLAGS_DECL;
4771         PerlIO_printf(Perl_debug_log, "Offsets: [%"UVuf"]\n\t", (UV)ri->u.offsets[0]);
4772         for (i = 1; i <= len; i++) {
4773             if (ri->u.offsets[i*2-1] || ri->u.offsets[i*2])
4774                 PerlIO_printf(Perl_debug_log, "%"UVuf":%"UVuf"[%"UVuf"] ",
4775                 (UV)i, (UV)ri->u.offsets[i*2-1], (UV)ri->u.offsets[i*2]);
4776             }
4777         PerlIO_printf(Perl_debug_log, "\n");
4778     });
4779 #endif
4780     return(r);
4781 }
4782
4783 #undef RE_ENGINE_PTR
4784
4785
4786 SV*
4787 Perl_reg_named_buff_get(pTHX_ const REGEXP * const rx, SV* namesv, U32 flags)
4788 {
4789     AV *retarray = NULL;
4790     SV *ret;
4791     if (flags & 1) 
4792         retarray=newAV();
4793
4794     if (rx && rx->paren_names) {
4795         HE *he_str = hv_fetch_ent( rx->paren_names, namesv, 0, 0 );
4796         if (he_str) {
4797             IV i;
4798             SV* sv_dat=HeVAL(he_str);
4799             I32 *nums=(I32*)SvPVX(sv_dat);
4800             for ( i=0; i<SvIVX(sv_dat); i++ ) {
4801                 if ((I32)(rx->nparens) >= nums[i]
4802                         && rx->offs[nums[i]].start != -1
4803                         && rx->offs[nums[i]].end != -1)
4804                 {
4805                     ret = CALLREG_NUMBUF(rx,nums[i],NULL);
4806                     if (!retarray)
4807                         return ret;
4808                 } else {
4809                     ret = newSVsv(&PL_sv_undef);
4810                 }
4811                 if (retarray) {
4812                     SvREFCNT_inc_simple_void(ret);
4813                     av_push(retarray, ret);
4814                 }
4815             }
4816             if (retarray)
4817                 return (SV*)retarray;
4818         }
4819     }
4820     return NULL;
4821 }
4822
4823 SV*
4824 Perl_reg_numbered_buff_get(pTHX_ const REGEXP * const rx, I32 paren, SV* usesv)
4825 {
4826     char *s = NULL;
4827     I32 i = 0;
4828     I32 s1, t1;
4829     SV *sv = usesv ? usesv : newSVpvs("");
4830         
4831     if (!rx->subbeg) {
4832         sv_setsv(sv,&PL_sv_undef);
4833         return sv;
4834     } 
4835     else               
4836     if (paren == -2 && rx->offs[0].start != -1) {
4837         /* $` */
4838         i = rx->offs[0].start;
4839         s = rx->subbeg;
4840     }
4841     else 
4842     if (paren == -1 && rx->offs[0].end != -1) {
4843         /* $' */
4844         s = rx->subbeg + rx->offs[0].end;
4845         i = rx->sublen - rx->offs[0].end;
4846     } 
4847     else
4848     if ( 0 <= paren && paren <= (I32)rx->nparens &&
4849         (s1 = rx->offs[paren].start) != -1 &&
4850         (t1 = rx->offs[paren].end) != -1)
4851     {
4852         /* $& $1 ... */
4853         i = t1 - s1;
4854         s = rx->subbeg + s1;
4855     } else {
4856         sv_setsv(sv,&PL_sv_undef);
4857         return sv;
4858     }          
4859     assert(rx->sublen >= (s - rx->subbeg) + i );
4860     if (i >= 0) {
4861         const int oldtainted = PL_tainted;
4862         TAINT_NOT;
4863         sv_setpvn(sv, s, i);
4864         PL_tainted = oldtainted;
4865         if ( (rx->extflags & RXf_CANY_SEEN)
4866             ? (RX_MATCH_UTF8(rx)
4867                         && (!i || is_utf8_string((U8*)s, i)))
4868             : (RX_MATCH_UTF8(rx)) )
4869         {
4870             SvUTF8_on(sv);
4871         }
4872         else
4873             SvUTF8_off(sv);
4874         if (PL_tainting) {
4875             if (RX_MATCH_TAINTED(rx)) {
4876                 if (SvTYPE(sv) >= SVt_PVMG) {
4877                     MAGIC* const mg = SvMAGIC(sv);
4878                     MAGIC* mgt;
4879                     PL_tainted = 1;
4880                     SvMAGIC_set(sv, mg->mg_moremagic);
4881                     SvTAINT(sv);
4882                     if ((mgt = SvMAGIC(sv))) {
4883                         mg->mg_moremagic = mgt;
4884                         SvMAGIC_set(sv, mg);
4885                     }
4886                 } else {
4887                     PL_tainted = 1;
4888                     SvTAINT(sv);
4889                 }
4890             } else 
4891                 SvTAINTED_off(sv);
4892         }
4893     } else {
4894         sv_setsv(sv,&PL_sv_undef);
4895     }
4896     return sv;
4897 }
4898
4899 SV*
4900 Perl_reg_qr_pkg(pTHX_ const REGEXP * const rx)
4901 {
4902         PERL_UNUSED_ARG(rx);
4903         return newSVpvs("Regexp");
4904 }
4905
4906 /* Scans the name of a named buffer from the pattern.
4907  * If flags is REG_RSN_RETURN_NULL returns null.
4908  * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
4909  * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
4910  * to the parsed name as looked up in the RExC_paren_names hash.
4911  * If there is an error throws a vFAIL().. type exception.
4912  */
4913
4914 #define REG_RSN_RETURN_NULL    0
4915 #define REG_RSN_RETURN_NAME    1
4916 #define REG_RSN_RETURN_DATA    2
4917
4918 STATIC SV*
4919 S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags) {
4920     char *name_start = RExC_parse;
4921
4922     if (isIDFIRST_lazy_if(RExC_parse, UTF)) {
4923          /* skip IDFIRST by using do...while */
4924         if (UTF)
4925             do {
4926                 RExC_parse += UTF8SKIP(RExC_parse);
4927             } while (isALNUM_utf8((U8*)RExC_parse));
4928         else
4929             do {
4930                 RExC_parse++;
4931             } while (isALNUM(*RExC_parse));
4932     }
4933
4934     if ( flags ) {
4935         SV* sv_name = sv_2mortal(Perl_newSVpvn(aTHX_ name_start,
4936             (int)(RExC_parse - name_start)));
4937         if (UTF)
4938             SvUTF8_on(sv_name);
4939         if ( flags == REG_RSN_RETURN_NAME)
4940             return sv_name;
4941         else if (flags==REG_RSN_RETURN_DATA) {
4942             HE *he_str = NULL;
4943             SV *sv_dat = NULL;
4944             if ( ! sv_name )      /* should not happen*/
4945                 Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
4946             if (RExC_paren_names)
4947                 he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
4948             if ( he_str )
4949                 sv_dat = HeVAL(he_str);
4950             if ( ! sv_dat )
4951                 vFAIL("Reference to nonexistent named group");
4952             return sv_dat;
4953         }
4954         else {
4955             Perl_croak(aTHX_ "panic: bad flag in reg_scan_name");
4956         }
4957         /* NOT REACHED */
4958     }
4959     return NULL;
4960 }
4961
4962 #define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
4963     int rem=(int)(RExC_end - RExC_parse);                       \
4964     int cut;                                                    \
4965     int num;                                                    \
4966     int iscut=0;                                                \
4967     if (rem>10) {                                               \
4968         rem=10;                                                 \
4969         iscut=1;                                                \
4970     }                                                           \
4971     cut=10-rem;                                                 \
4972     if (RExC_lastparse!=RExC_parse)                             \
4973         PerlIO_printf(Perl_debug_log," >%.*s%-*s",              \
4974             rem, RExC_parse,                                    \
4975             cut + 4,                                            \
4976             iscut ? "..." : "<"                                 \
4977         );                                                      \
4978     else                                                        \
4979         PerlIO_printf(Perl_debug_log,"%16s","");                \
4980                                                                 \
4981     if (SIZE_ONLY)                                              \
4982        num = RExC_size + 1;                                     \
4983     else                                                        \
4984        num=REG_NODE_NUM(RExC_emit);                             \
4985     if (RExC_lastnum!=num)                                      \
4986        PerlIO_printf(Perl_debug_log,"|%4d",num);                \
4987     else                                                        \
4988        PerlIO_printf(Perl_debug_log,"|%4s","");                 \
4989     PerlIO_printf(Perl_debug_log,"|%*s%-4s",                    \
4990         (int)((depth*2)), "",                                   \
4991         (funcname)                                              \
4992     );                                                          \
4993     RExC_lastnum=num;                                           \
4994     RExC_lastparse=RExC_parse;                                  \
4995 })
4996
4997
4998
4999 #define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
5000     DEBUG_PARSE_MSG((funcname));                            \
5001     PerlIO_printf(Perl_debug_log,"%4s","\n");               \
5002 })
5003 #define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({           \
5004     DEBUG_PARSE_MSG((funcname));                            \
5005     PerlIO_printf(Perl_debug_log,fmt "\n",args);               \
5006 })
5007 /*
5008  - reg - regular expression, i.e. main body or parenthesized thing
5009  *
5010  * Caller must absorb opening parenthesis.
5011  *
5012  * Combining parenthesis handling with the base level of regular expression
5013  * is a trifle forced, but the need to tie the tails of the branches to what
5014  * follows makes it hard to avoid.
5015  */
5016 #define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1)
5017 #ifdef DEBUGGING
5018 #define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1)
5019 #else
5020 #define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
5021 #endif
5022
5023 STATIC regnode *
5024 S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
5025     /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
5026 {
5027     dVAR;
5028     register regnode *ret;              /* Will be the head of the group. */
5029     register regnode *br;
5030     register regnode *lastbr;
5031     register regnode *ender = NULL;
5032     register I32 parno = 0;
5033     I32 flags;
5034     const I32 oregflags = RExC_flags;
5035     bool have_branch = 0;
5036     bool is_open = 0;
5037     I32 freeze_paren = 0;
5038     I32 after_freeze = 0;
5039
5040     /* for (?g), (?gc), and (?o) warnings; warning
5041        about (?c) will warn about (?g) -- japhy    */
5042
5043 #define WASTED_O  0x01
5044 #define WASTED_G  0x02
5045 #define WASTED_C  0x04
5046 #define WASTED_GC (0x02|0x04)
5047     I32 wastedflags = 0x00;
5048
5049     char * parse_start = RExC_parse; /* MJD */
5050     char * const oregcomp_parse = RExC_parse;
5051
5052     GET_RE_DEBUG_FLAGS_DECL;
5053     DEBUG_PARSE("reg ");
5054
5055     *flagp = 0;                         /* Tentatively. */
5056
5057
5058     /* Make an OPEN node, if parenthesized. */
5059     if (paren) {
5060         if ( *RExC_parse == '*') { /* (*VERB:ARG) */
5061             char *start_verb = RExC_parse;
5062             STRLEN verb_len = 0;
5063             char *start_arg = NULL;
5064             unsigned char op = 0;
5065             int argok = 1;
5066             int internal_argval = 0; /* internal_argval is only useful if !argok */
5067             while ( *RExC_parse && *RExC_parse != ')' ) {
5068                 if ( *RExC_parse == ':' ) {
5069                     start_arg = RExC_parse + 1;
5070                     break;
5071                 }
5072                 RExC_parse++;
5073             }
5074             ++start_verb;
5075             verb_len = RExC_parse - start_verb;
5076             if ( start_arg ) {
5077                 RExC_parse++;
5078                 while ( *RExC_parse && *RExC_parse != ')' ) 
5079                     RExC_parse++;
5080                 if ( *RExC_parse != ')' ) 
5081                     vFAIL("Unterminated verb pattern argument");
5082                 if ( RExC_parse == start_arg )
5083                     start_arg = NULL;
5084             } else {
5085                 if ( *RExC_parse != ')' )
5086                     vFAIL("Unterminated verb pattern");
5087             }
5088             
5089             switch ( *start_verb ) {
5090             case 'A':  /* (*ACCEPT) */
5091                 if ( memEQs(start_verb,verb_len,"ACCEPT") ) {
5092                     op = ACCEPT;
5093                     internal_argval = RExC_nestroot;
5094                 }
5095                 break;
5096             case 'C':  /* (*COMMIT) */
5097                 if ( memEQs(start_verb,verb_len,"COMMIT") )
5098                     op = COMMIT;
5099                 break;
5100             case 'F':  /* (*FAIL) */
5101                 if ( verb_len==1 || memEQs(start_verb,verb_len,"FAIL") ) {
5102                     op = OPFAIL;
5103                     argok = 0;
5104                 }
5105                 break;
5106             case ':':  /* (*:NAME) */
5107             case 'M':  /* (*MARK:NAME) */
5108                 if ( verb_len==0 || memEQs(start_verb,verb_len,"MARK") ) {
5109                     op = MARKPOINT;
5110                     argok = -1;
5111                 }
5112                 break;
5113             case 'P':  /* (*PRUNE) */
5114                 if ( memEQs(start_verb,verb_len,"PRUNE") )
5115                     op = PRUNE;
5116                 break;
5117             case 'S':   /* (*SKIP) */  
5118                 if ( memEQs(start_verb,verb_len,"SKIP") ) 
5119                     op = SKIP;
5120                 break;
5121             case 'T':  /* (*THEN) */
5122                 /* [19:06] <TimToady> :: is then */
5123                 if ( memEQs(start_verb,verb_len,"THEN") ) {
5124                     op = CUTGROUP;
5125                     RExC_seen |= REG_SEEN_CUTGROUP;
5126                 }
5127                 break;
5128             }
5129             if ( ! op ) {
5130                 RExC_parse++;
5131                 vFAIL3("Unknown verb pattern '%.*s'",
5132                     verb_len, start_verb);
5133             }
5134             if ( argok ) {
5135                 if ( start_arg && internal_argval ) {
5136                     vFAIL3("Verb pattern '%.*s' may not have an argument",
5137                         verb_len, start_verb); 
5138                 } else if ( argok < 0 && !start_arg ) {
5139                     vFAIL3("Verb pattern '%.*s' has a mandatory argument",
5140                         verb_len, start_verb);    
5141                 } else {
5142                     ret = reganode(pRExC_state, op, internal_argval);
5143                     if ( ! internal_argval && ! SIZE_ONLY ) {
5144                         if (start_arg) {
5145                             SV *sv = newSVpvn( start_arg, RExC_parse - start_arg);
5146                             ARG(ret) = add_data( pRExC_state, 1, "S" );
5147                             RExC_rxi->data->data[ARG(ret)]=(void*)sv;
5148                             ret->flags = 0;
5149                         } else {
5150                             ret->flags = 1; 
5151                         }
5152                     }               
5153                 }
5154                 if (!internal_argval)
5155                     RExC_seen |= REG_SEEN_VERBARG;
5156             } else if ( start_arg ) {
5157                 vFAIL3("Verb pattern '%.*s' may not have an argument",
5158                         verb_len, start_verb);    
5159             } else {
5160                 ret = reg_node(pRExC_state, op);
5161             }
5162             nextchar(pRExC_state);
5163             return ret;
5164         } else 
5165         if (*RExC_parse == '?') { /* (?...) */
5166             bool is_logical = 0;
5167             const char * const seqstart = RExC_parse;
5168
5169             RExC_parse++;
5170             paren = *RExC_parse++;
5171             ret = NULL;                 /* For look-ahead/behind. */
5172             switch (paren) {
5173
5174             case 'P':   /* (?P...) variants for those used to PCRE/Python */
5175                 paren = *RExC_parse++;
5176                 if ( paren == '<')         /* (?P<...>) named capture */
5177                     goto named_capture;
5178                 else if (paren == '>') {   /* (?P>name) named recursion */
5179                     goto named_recursion;
5180                 }
5181                 else if (paren == '=') {   /* (?P=...)  named backref */
5182                     /* this pretty much dupes the code for \k<NAME> in regatom(), if
5183                        you change this make sure you change that */
5184                     char* name_start = RExC_parse;
5185                     U32 num = 0;
5186                     SV *sv_dat = reg_scan_name(pRExC_state,
5187                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5188                     if (RExC_parse == name_start || *RExC_parse != ')')
5189                         vFAIL2("Sequence %.3s... not terminated",parse_start);
5190
5191                     if (!SIZE_ONLY) {
5192                         num = add_data( pRExC_state, 1, "S" );
5193                         RExC_rxi->data->data[num]=(void*)sv_dat;
5194                         SvREFCNT_inc_simple_void(sv_dat);
5195                     }
5196                     RExC_sawback = 1;
5197                     ret = reganode(pRExC_state,
5198                            (U8)(FOLD ? (LOC ? NREFFL : NREFF) : NREF),
5199                            num);
5200                     *flagp |= HASWIDTH;
5201
5202                     Set_Node_Offset(ret, parse_start+1);
5203                     Set_Node_Cur_Length(ret); /* MJD */
5204
5205                     nextchar(pRExC_state);
5206                     return ret;
5207                 }
5208                 RExC_parse++;
5209                 vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5210                 /*NOTREACHED*/
5211             case '<':           /* (?<...) */
5212                 if (*RExC_parse == '!')
5213                     paren = ',';
5214                 else if (*RExC_parse != '=') 
5215               named_capture:
5216                 {               /* (?<...>) */
5217                     char *name_start;
5218                     SV *svname;
5219                     paren= '>';
5220             case '\'':          /* (?'...') */
5221                     name_start= RExC_parse;
5222                     svname = reg_scan_name(pRExC_state,
5223                         SIZE_ONLY ?  /* reverse test from the others */
5224                         REG_RSN_RETURN_NAME : 
5225                         REG_RSN_RETURN_NULL);
5226                     if (RExC_parse == name_start) {
5227                         RExC_parse++;
5228                         vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5229                         /*NOTREACHED*/
5230                     }
5231                     if (*RExC_parse != paren)
5232                         vFAIL2("Sequence (?%c... not terminated",
5233                             paren=='>' ? '<' : paren);
5234                     if (SIZE_ONLY) {
5235                         HE *he_str;
5236                         SV *sv_dat = NULL;
5237                         if (!svname) /* shouldnt happen */
5238                             Perl_croak(aTHX_
5239                                 "panic: reg_scan_name returned NULL");
5240                         if (!RExC_paren_names) {
5241                             RExC_paren_names= newHV();
5242                             sv_2mortal((SV*)RExC_paren_names);
5243 #ifdef DEBUGGING
5244                             RExC_paren_name_list= newAV();
5245                             sv_2mortal((SV*)RExC_paren_name_list);
5246 #endif
5247                         }
5248                         he_str = hv_fetch_ent( RExC_paren_names, svname, 1, 0 );
5249                         if ( he_str )
5250                             sv_dat = HeVAL(he_str);
5251                         if ( ! sv_dat ) {
5252                             /* croak baby croak */
5253                             Perl_croak(aTHX_
5254                                 "panic: paren_name hash element allocation failed");
5255                         } else if ( SvPOK(sv_dat) ) {
5256                             /* (?|...) can mean we have dupes so scan to check
5257                                its already been stored. Maybe a flag indicating
5258                                we are inside such a construct would be useful,
5259                                but the arrays are likely to be quite small, so
5260                                for now we punt -- dmq */
5261                             IV count = SvIV(sv_dat);
5262                             I32 *pv = (I32*)SvPVX(sv_dat);
5263                             IV i;
5264                             for ( i = 0 ; i < count ; i++ ) {
5265                                 if ( pv[i] == RExC_npar ) {
5266                                     count = 0;
5267                                     break;
5268                                 }
5269                             }
5270                             if ( count ) {
5271                                 pv = (I32*)SvGROW(sv_dat, SvCUR(sv_dat) + sizeof(I32)+1);
5272                                 SvCUR_set(sv_dat, SvCUR(sv_dat) + sizeof(I32));
5273                                 pv[count] = RExC_npar;
5274                                 SvIVX(sv_dat)++;
5275                             }
5276                         } else {
5277                             (void)SvUPGRADE(sv_dat,SVt_PVNV);
5278                             sv_setpvn(sv_dat, (char *)&(RExC_npar), sizeof(I32));
5279                             SvIOK_on(sv_dat);
5280                             SvIVX(sv_dat)= 1;
5281                         }
5282 #ifdef DEBUGGING
5283                         if (!av_store(RExC_paren_name_list, RExC_npar, SvREFCNT_inc(svname)))
5284                             SvREFCNT_dec(svname);
5285 #endif
5286
5287                         /*sv_dump(sv_dat);*/
5288                     }
5289                     nextchar(pRExC_state);
5290                     paren = 1;
5291                     goto capturing_parens;
5292                 }
5293                 RExC_seen |= REG_SEEN_LOOKBEHIND;
5294                 RExC_parse++;
5295             case '=':           /* (?=...) */
5296             case '!':           /* (?!...) */
5297                 RExC_seen_zerolen++;
5298                 if (*RExC_parse == ')') {
5299                     ret=reg_node(pRExC_state, OPFAIL);
5300                     nextchar(pRExC_state);
5301                     return ret;
5302                 }
5303                 break;
5304             case '|':           /* (?|...) */
5305                 /* branch reset, behave like a (?:...) except that
5306                    buffers in alternations share the same numbers */
5307                 paren = ':'; 
5308                 after_freeze = freeze_paren = RExC_npar;
5309                 break;
5310             case ':':           /* (?:...) */
5311             case '>':           /* (?>...) */
5312                 break;
5313             case '$':           /* (?$...) */
5314             case '@':           /* (?@...) */
5315                 vFAIL2("Sequence (?%c...) not implemented", (int)paren);
5316                 break;
5317             case '#':           /* (?#...) */
5318                 while (*RExC_parse && *RExC_parse != ')')
5319                     RExC_parse++;
5320                 if (*RExC_parse != ')')
5321                     FAIL("Sequence (?#... not terminated");
5322                 nextchar(pRExC_state);
5323                 *flagp = TRYAGAIN;
5324                 return NULL;
5325             case '0' :           /* (?0) */
5326             case 'R' :           /* (?R) */
5327                 if (*RExC_parse != ')')
5328                     FAIL("Sequence (?R) not terminated");
5329                 ret = reg_node(pRExC_state, GOSTART);
5330                 *flagp |= POSTPONED;
5331                 nextchar(pRExC_state);
5332                 return ret;
5333                 /*notreached*/
5334             { /* named and numeric backreferences */
5335                 I32 num;
5336             case '&':            /* (?&NAME) */
5337                 parse_start = RExC_parse - 1;
5338               named_recursion:
5339                 {
5340                     SV *sv_dat = reg_scan_name(pRExC_state,
5341                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5342                      num = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
5343                 }
5344                 goto gen_recurse_regop;
5345                 /* NOT REACHED */
5346             case '+':
5347                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
5348                     RExC_parse++;
5349                     vFAIL("Illegal pattern");
5350                 }
5351                 goto parse_recursion;
5352                 /* NOT REACHED*/
5353             case '-': /* (?-1) */
5354                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
5355                     RExC_parse--; /* rewind to let it be handled later */
5356                     goto parse_flags;
5357                 } 
5358                 /*FALLTHROUGH */
5359             case '1': case '2': case '3': case '4': /* (?1) */
5360             case '5': case '6': case '7': case '8': case '9':
5361                 RExC_parse--;
5362               parse_recursion:
5363                 num = atoi(RExC_parse);
5364                 parse_start = RExC_parse - 1; /* MJD */
5365                 if (*RExC_parse == '-')
5366                     RExC_parse++;
5367                 while (isDIGIT(*RExC_parse))
5368                         RExC_parse++;
5369                 if (*RExC_parse!=')') 
5370                     vFAIL("Expecting close bracket");
5371                         
5372               gen_recurse_regop:
5373                 if ( paren == '-' ) {
5374                     /*
5375                     Diagram of capture buffer numbering.
5376                     Top line is the normal capture buffer numbers
5377                     Botton line is the negative indexing as from
5378                     the X (the (?-2))
5379
5380                     +   1 2    3 4 5 X          6 7
5381                        /(a(x)y)(a(b(c(?-2)d)e)f)(g(h))/
5382                     -   5 4    3 2 1 X          x x
5383
5384                     */
5385                     num = RExC_npar + num;
5386                     if (num < 1)  {
5387                         RExC_parse++;
5388                         vFAIL("Reference to nonexistent group");
5389                     }
5390                 } else if ( paren == '+' ) {
5391                     num = RExC_npar + num - 1;
5392                 }
5393
5394                 ret = reganode(pRExC_state, GOSUB, num);
5395                 if (!SIZE_ONLY) {
5396                     if (num > (I32)RExC_rx->nparens) {
5397                         RExC_parse++;
5398                         vFAIL("Reference to nonexistent group");
5399                     }
5400                     ARG2L_SET( ret, RExC_recurse_count++);
5401                     RExC_emit++;
5402                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5403                         "Recurse #%"UVuf" to %"IVdf"\n", (UV)ARG(ret), (IV)ARG2L(ret)));
5404                 } else {
5405                     RExC_size++;
5406                 }
5407                 RExC_seen |= REG_SEEN_RECURSE;
5408                 Set_Node_Length(ret, 1 + regarglen[OP(ret)]); /* MJD */
5409                 Set_Node_Offset(ret, parse_start); /* MJD */
5410
5411                 *flagp |= POSTPONED;
5412                 nextchar(pRExC_state);
5413                 return ret;
5414             } /* named and numeric backreferences */
5415             /* NOT REACHED */
5416
5417             case '?':           /* (??...) */
5418                 is_logical = 1;
5419                 if (*RExC_parse != '{') {
5420                     RExC_parse++;
5421                     vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5422                     /*NOTREACHED*/
5423                 }
5424                 *flagp |= POSTPONED;
5425                 paren = *RExC_parse++;
5426                 /* FALL THROUGH */
5427             case '{':           /* (?{...}) */
5428             {
5429                 I32 count = 1;
5430                 U32 n = 0;
5431                 char c;
5432                 char *s = RExC_parse;
5433
5434                 RExC_seen_zerolen++;
5435                 RExC_seen |= REG_SEEN_EVAL;
5436                 while (count && (c = *RExC_parse)) {
5437                     if (c == '\\') {
5438                         if (RExC_parse[1])
5439                             RExC_parse++;
5440                     }
5441                     else if (c == '{')
5442                         count++;
5443                     else if (c == '}')
5444                         count--;
5445                     RExC_parse++;
5446                 }
5447                 if (*RExC_parse != ')') {
5448                     RExC_parse = s;             
5449                     vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
5450                 }
5451                 if (!SIZE_ONLY) {
5452                     PAD *pad;
5453                     OP_4tree *sop, *rop;
5454                     SV * const sv = newSVpvn(s, RExC_parse - 1 - s);
5455
5456                     ENTER;
5457                     Perl_save_re_context(aTHX);
5458                     rop = sv_compile_2op(sv, &sop, "re", &pad);
5459                     sop->op_private |= OPpREFCOUNTED;
5460                     /* re_dup will OpREFCNT_inc */
5461                     OpREFCNT_set(sop, 1);
5462                     LEAVE;
5463
5464                     n = add_data(pRExC_state, 3, "nop");
5465                     RExC_rxi->data->data[n] = (void*)rop;
5466                     RExC_rxi->data->data[n+1] = (void*)sop;
5467                     RExC_rxi->data->data[n+2] = (void*)pad;
5468                     SvREFCNT_dec(sv);
5469                 }
5470                 else {                                          /* First pass */
5471                     if (PL_reginterp_cnt < ++RExC_seen_evals
5472                         && IN_PERL_RUNTIME)
5473                         /* No compiled RE interpolated, has runtime
5474                            components ===> unsafe.  */
5475                         FAIL("Eval-group not allowed at runtime, use re 'eval'");
5476                     if (PL_tainting && PL_tainted)
5477                         FAIL("Eval-group in insecure regular expression");
5478 #if PERL_VERSION > 8
5479                     if (IN_PERL_COMPILETIME)
5480                         PL_cv_has_eval = 1;
5481 #endif
5482                 }
5483
5484                 nextchar(pRExC_state);
5485                 if (is_logical) {
5486                     ret = reg_node(pRExC_state, LOGICAL);
5487                     if (!SIZE_ONLY)
5488                         ret->flags = 2;
5489                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, EVAL, n));
5490                     /* deal with the length of this later - MJD */
5491                     return ret;
5492                 }
5493                 ret = reganode(pRExC_state, EVAL, n);
5494                 Set_Node_Length(ret, RExC_parse - parse_start + 1);
5495                 Set_Node_Offset(ret, parse_start);
5496                 return ret;
5497             }
5498             case '(':           /* (?(?{...})...) and (?(?=...)...) */
5499             {
5500                 int is_define= 0;
5501                 if (RExC_parse[0] == '?') {        /* (?(?...)) */
5502                     if (RExC_parse[1] == '=' || RExC_parse[1] == '!'
5503                         || RExC_parse[1] == '<'
5504                         || RExC_parse[1] == '{') { /* Lookahead or eval. */
5505                         I32 flag;
5506                         
5507                         ret = reg_node(pRExC_state, LOGICAL);
5508                         if (!SIZE_ONLY)
5509                             ret->flags = 1;
5510                         REGTAIL(pRExC_state, ret, reg(pRExC_state, 1, &flag,depth+1));
5511                         goto insert_if;
5512                     }
5513                 }
5514                 else if ( RExC_parse[0] == '<'     /* (?(<NAME>)...) */
5515                          || RExC_parse[0] == '\'' ) /* (?('NAME')...) */
5516                 {
5517                     char ch = RExC_parse[0] == '<' ? '>' : '\'';
5518                     char *name_start= RExC_parse++;
5519                     U32 num = 0;
5520                     SV *sv_dat=reg_scan_name(pRExC_state,
5521                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5522                     if (RExC_parse == name_start || *RExC_parse != ch)
5523                         vFAIL2("Sequence (?(%c... not terminated",
5524                             (ch == '>' ? '<' : ch));
5525                     RExC_parse++;
5526                     if (!SIZE_ONLY) {
5527                         num = add_data( pRExC_state, 1, "S" );
5528                         RExC_rxi->data->data[num]=(void*)sv_dat;
5529                         SvREFCNT_inc_simple_void(sv_dat);
5530                     }
5531                     ret = reganode(pRExC_state,NGROUPP,num);
5532                     goto insert_if_check_paren;
5533                 }
5534                 else if (RExC_parse[0] == 'D' &&
5535                          RExC_parse[1] == 'E' &&
5536                          RExC_parse[2] == 'F' &&
5537                          RExC_parse[3] == 'I' &&
5538                          RExC_parse[4] == 'N' &&
5539                          RExC_parse[5] == 'E')
5540                 {
5541                     ret = reganode(pRExC_state,DEFINEP,0);
5542                     RExC_parse +=6 ;
5543                     is_define = 1;
5544                     goto insert_if_check_paren;
5545                 }
5546                 else if (RExC_parse[0] == 'R') {
5547                     RExC_parse++;
5548                     parno = 0;
5549                     if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
5550                         parno = atoi(RExC_parse++);
5551                         while (isDIGIT(*RExC_parse))
5552                             RExC_parse++;
5553                     } else if (RExC_parse[0] == '&') {
5554                         SV *sv_dat;
5555                         RExC_parse++;
5556                         sv_dat = reg_scan_name(pRExC_state,
5557                             SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5558                         parno = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
5559                     }
5560                     ret = reganode(pRExC_state,INSUBP,parno); 
5561                     goto insert_if_check_paren;
5562                 }
5563                 else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
5564                     /* (?(1)...) */
5565                     char c;
5566                     parno = atoi(RExC_parse++);
5567
5568                     while (isDIGIT(*RExC_parse))
5569                         RExC_parse++;
5570                     ret = reganode(pRExC_state, GROUPP, parno);
5571
5572                  insert_if_check_paren:
5573                     if ((c = *nextchar(pRExC_state)) != ')')
5574                         vFAIL("Switch condition not recognized");
5575                   insert_if:
5576                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, IFTHEN, 0));
5577                     br = regbranch(pRExC_state, &flags, 1,depth+1);
5578                     if (br == NULL)
5579                         br = reganode(pRExC_state, LONGJMP, 0);
5580                     else
5581                         REGTAIL(pRExC_state, br, reganode(pRExC_state, LONGJMP, 0));
5582                     c = *nextchar(pRExC_state);
5583                     if (flags&HASWIDTH)
5584                         *flagp |= HASWIDTH;
5585                     if (c == '|') {
5586                         if (is_define) 
5587                             vFAIL("(?(DEFINE)....) does not allow branches");
5588                         lastbr = reganode(pRExC_state, IFTHEN, 0); /* Fake one for optimizer. */
5589                         regbranch(pRExC_state, &flags, 1,depth+1);
5590                         REGTAIL(pRExC_state, ret, lastbr);
5591                         if (flags&HASWIDTH)
5592                             *flagp |= HASWIDTH;
5593                         c = *nextchar(pRExC_state);
5594                     }
5595                     else
5596                         lastbr = NULL;
5597                     if (c != ')')
5598                         vFAIL("Switch (?(condition)... contains too many branches");
5599                     ender = reg_node(pRExC_state, TAIL);
5600                     REGTAIL(pRExC_state, br, ender);
5601                     if (lastbr) {
5602                         REGTAIL(pRExC_state, lastbr, ender);
5603                         REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
5604                     }
5605                     else
5606                         REGTAIL(pRExC_state, ret, ender);
5607                     RExC_size++; /* XXX WHY do we need this?!!
5608                                     For large programs it seems to be required
5609                                     but I can't figure out why. -- dmq*/
5610                     return ret;
5611                 }
5612                 else {
5613                     vFAIL2("Unknown switch condition (?(%.2s", RExC_parse);
5614                 }
5615             }
5616             case 0:
5617                 RExC_parse--; /* for vFAIL to print correctly */
5618                 vFAIL("Sequence (? incomplete");
5619                 break;
5620             default:
5621                 --RExC_parse;
5622                 parse_flags:      /* (?i) */  
5623             {
5624                 U32 posflags = 0, negflags = 0;
5625                 U32 *flagsp = &posflags;
5626
5627                 while (*RExC_parse) {
5628                     /* && strchr("iogcmsx", *RExC_parse) */
5629                     /* (?g), (?gc) and (?o) are useless here
5630                        and must be globally applied -- japhy */
5631                     switch (*RExC_parse) {
5632                     CASE_STD_PMMOD_FLAGS_PARSE_SET(flagsp);
5633                     case 'o':
5634                     case 'g':
5635                         if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
5636                             const I32 wflagbit = *RExC_parse == 'o' ? WASTED_O : WASTED_G;
5637                             if (! (wastedflags & wflagbit) ) {
5638                                 wastedflags |= wflagbit;
5639                                 vWARN5(
5640                                     RExC_parse + 1,
5641                                     "Useless (%s%c) - %suse /%c modifier",
5642                                     flagsp == &negflags ? "?-" : "?",
5643                                     *RExC_parse,
5644                                     flagsp == &negflags ? "don't " : "",
5645                                     *RExC_parse
5646                                 );
5647                             }
5648                         }
5649                         break;
5650                         
5651                     case 'c':
5652                         if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
5653                             if (! (wastedflags & WASTED_C) ) {
5654                                 wastedflags |= WASTED_GC;
5655                                 vWARN3(
5656                                     RExC_parse + 1,
5657                                     "Useless (%sc) - %suse /gc modifier",
5658                                     flagsp == &negflags ? "?-" : "?",
5659                                     flagsp == &negflags ? "don't " : ""
5660                                 );
5661                             }
5662                         }
5663                         break;
5664                     case 'k':
5665                         if (flagsp == &negflags) {
5666                             if (SIZE_ONLY && ckWARN(WARN_REGEXP))
5667                                 vWARN(RExC_parse + 1,"Useless use of (?-k)");
5668                         } else {
5669                             *flagsp |= RXf_PMf_KEEPCOPY;
5670                         }
5671                         break;
5672                     case '-':
5673                         if (flagsp == &negflags) {
5674                             RExC_parse++;
5675                             vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5676                             /*NOTREACHED*/
5677                         }
5678                         flagsp = &negflags;
5679                         wastedflags = 0;  /* reset so (?g-c) warns twice */
5680                         break;
5681                     case ':':
5682                         paren = ':';
5683                         /*FALLTHROUGH*/
5684                     case ')':
5685                         RExC_flags |= posflags;
5686                         RExC_flags &= ~negflags;
5687                         nextchar(pRExC_state);
5688                         if (paren != ':') {
5689                             *flagp = TRYAGAIN;
5690                             return NULL;
5691                         } else {
5692                             ret = NULL;
5693                             goto parse_rest;
5694                         }
5695                         /*NOTREACHED*/
5696                     default:
5697                         RExC_parse++;
5698                         vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5699                         /*NOTREACHED*/
5700                     }                           
5701                     ++RExC_parse;
5702                 }
5703             }} /* one for the default block, one for the switch */
5704         }
5705         else {                  /* (...) */
5706           capturing_parens:
5707             parno = RExC_npar;
5708             RExC_npar++;
5709             
5710             ret = reganode(pRExC_state, OPEN, parno);
5711             if (!SIZE_ONLY ){
5712                 if (!RExC_nestroot) 
5713                     RExC_nestroot = parno;
5714                 if (RExC_seen & REG_SEEN_RECURSE
5715                     && !RExC_open_parens[parno-1])
5716                 {
5717                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5718                         "Setting open paren #%"IVdf" to %d\n", 
5719                         (IV)parno, REG_NODE_NUM(ret)));
5720                     RExC_open_parens[parno-1]= ret;
5721                 }
5722             }
5723             Set_Node_Length(ret, 1); /* MJD */
5724             Set_Node_Offset(ret, RExC_parse); /* MJD */
5725             is_open = 1;
5726         }
5727     }
5728     else                        /* ! paren */
5729         ret = NULL;
5730    
5731    parse_rest:
5732     /* Pick up the branches, linking them together. */
5733     parse_start = RExC_parse;   /* MJD */
5734     br = regbranch(pRExC_state, &flags, 1,depth+1);
5735     /*     branch_len = (paren != 0); */
5736
5737     if (br == NULL)
5738         return(NULL);
5739     if (*RExC_parse == '|') {
5740         if (!SIZE_ONLY && RExC_extralen) {
5741             reginsert(pRExC_state, BRANCHJ, br, depth+1);
5742         }
5743         else {                  /* MJD */
5744             reginsert(pRExC_state, BRANCH, br, depth+1);
5745             Set_Node_Length(br, paren != 0);
5746             Set_Node_Offset_To_R(br-RExC_emit_start, parse_start-RExC_start);
5747         }
5748         have_branch = 1;
5749         if (SIZE_ONLY)
5750             RExC_extralen += 1;         /* For BRANCHJ-BRANCH. */
5751     }
5752     else if (paren == ':') {
5753         *flagp |= flags&SIMPLE;
5754     }
5755     if (is_open) {                              /* Starts with OPEN. */
5756         REGTAIL(pRExC_state, ret, br);          /* OPEN -> first. */
5757     }
5758     else if (paren != '?')              /* Not Conditional */
5759         ret = br;
5760     *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
5761     lastbr = br;
5762     while (*RExC_parse == '|') {
5763         if (!SIZE_ONLY && RExC_extralen) {
5764             ender = reganode(pRExC_state, LONGJMP,0);
5765             REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
5766         }
5767         if (SIZE_ONLY)
5768             RExC_extralen += 2;         /* Account for LONGJMP. */
5769         nextchar(pRExC_state);
5770         if (freeze_paren) {
5771             if (RExC_npar > after_freeze)
5772                 after_freeze = RExC_npar;
5773             RExC_npar = freeze_paren;       
5774         }
5775         br = regbranch(pRExC_state, &flags, 0, depth+1);
5776
5777         if (br == NULL)
5778             return(NULL);
5779         REGTAIL(pRExC_state, lastbr, br);               /* BRANCH -> BRANCH. */
5780         lastbr = br;
5781         *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
5782     }
5783
5784     if (have_branch || paren != ':') {
5785         /* Make a closing node, and hook it on the end. */
5786         switch (paren) {
5787         case ':':
5788             ender = reg_node(pRExC_state, TAIL);
5789             break;
5790         case 1:
5791             ender = reganode(pRExC_state, CLOSE, parno);
5792             if (!SIZE_ONLY && RExC_seen & REG_SEEN_RECURSE) {
5793                 DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5794                         "Setting close paren #%"IVdf" to %d\n", 
5795                         (IV)parno, REG_NODE_NUM(ender)));
5796                 RExC_close_parens[parno-1]= ender;
5797                 if (RExC_nestroot == parno) 
5798                     RExC_nestroot = 0;
5799             }       
5800             Set_Node_Offset(ender,RExC_parse+1); /* MJD */
5801             Set_Node_Length(ender,1); /* MJD */
5802             break;
5803         case '<':
5804         case ',':
5805         case '=':
5806         case '!':
5807             *flagp &= ~HASWIDTH;
5808             /* FALL THROUGH */
5809         case '>':
5810             ender = reg_node(pRExC_state, SUCCEED);
5811             break;
5812         case 0:
5813             ender = reg_node(pRExC_state, END);
5814             if (!SIZE_ONLY) {
5815                 assert(!RExC_opend); /* there can only be one! */
5816                 RExC_opend = ender;
5817             }
5818             break;
5819         }
5820         REGTAIL(pRExC_state, lastbr, ender);
5821
5822         if (have_branch && !SIZE_ONLY) {
5823             if (depth==1)
5824                 RExC_seen |= REG_TOP_LEVEL_BRANCHES;
5825
5826             /* Hook the tails of the branches to the closing node. */
5827             for (br = ret; br; br = regnext(br)) {
5828                 const U8 op = PL_regkind[OP(br)];
5829                 if (op == BRANCH) {
5830                     REGTAIL_STUDY(pRExC_state, NEXTOPER(br), ender);
5831                 }
5832                 else if (op == BRANCHJ) {
5833                     REGTAIL_STUDY(pRExC_state, NEXTOPER(NEXTOPER(br)), ender);
5834                 }
5835             }
5836         }
5837     }
5838
5839     {
5840         const char *p;
5841         static const char parens[] = "=!<,>";
5842
5843         if (paren && (p = strchr(parens, paren))) {
5844             U8 node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
5845             int flag = (p - parens) > 1;
5846
5847             if (paren == '>')
5848                 node = SUSPEND, flag = 0;
5849             reginsert(pRExC_state, node,ret, depth+1);
5850             Set_Node_Cur_Length(ret);
5851             Set_Node_Offset(ret, parse_start + 1);
5852             ret->flags = flag;
5853             REGTAIL_STUDY(pRExC_state, ret, reg_node(pRExC_state, TAIL));
5854         }
5855     }
5856
5857     /* Check for proper termination. */
5858     if (paren) {
5859         RExC_flags = oregflags;
5860         if (RExC_parse >= RExC_end || *nextchar(pRExC_state) != ')') {
5861             RExC_parse = oregcomp_parse;
5862             vFAIL("Unmatched (");
5863         }
5864     }
5865     else if (!paren && RExC_parse < RExC_end) {
5866         if (*RExC_parse == ')') {
5867             RExC_parse++;
5868             vFAIL("Unmatched )");
5869         }
5870         else
5871             FAIL("Junk on end of regexp");      /* "Can't happen". */
5872         /* NOTREACHED */
5873     }
5874     if (after_freeze)
5875         RExC_npar = after_freeze;
5876     return(ret);
5877 }
5878
5879 /*
5880  - regbranch - one alternative of an | operator
5881  *
5882  * Implements the concatenation operator.
5883  */
5884 STATIC regnode *
5885 S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
5886 {
5887     dVAR;
5888     register regnode *ret;
5889     register regnode *chain = NULL;
5890     register regnode *latest;
5891     I32 flags = 0, c = 0;
5892     GET_RE_DEBUG_FLAGS_DECL;
5893     DEBUG_PARSE("brnc");
5894
5895     if (first)
5896         ret = NULL;
5897     else {
5898         if (!SIZE_ONLY && RExC_extralen)
5899             ret = reganode(pRExC_state, BRANCHJ,0);
5900         else {
5901             ret = reg_node(pRExC_state, BRANCH);
5902             Set_Node_Length(ret, 1);
5903         }
5904     }
5905         
5906     if (!first && SIZE_ONLY)
5907         RExC_extralen += 1;                     /* BRANCHJ */
5908
5909     *flagp = WORST;                     /* Tentatively. */
5910
5911     RExC_parse--;
5912     nextchar(pRExC_state);
5913     while (RExC_parse < RExC_end && *RExC_parse != '|' && *RExC_parse != ')') {
5914         flags &= ~TRYAGAIN;
5915         latest = regpiece(pRExC_state, &flags,depth+1);
5916         if (latest == NULL) {
5917             if (flags & TRYAGAIN)
5918                 continue;
5919             return(NULL);
5920         }
5921         else if (ret == NULL)
5922             ret = latest;
5923         *flagp |= flags&(HASWIDTH|POSTPONED);
5924         if (chain == NULL)      /* First piece. */
5925             *flagp |= flags&SPSTART;
5926         else {
5927             RExC_naughty++;
5928             REGTAIL(pRExC_state, chain, latest);
5929         }
5930         chain = latest;
5931         c++;
5932     }
5933     if (chain == NULL) {        /* Loop ran zero times. */
5934         chain = reg_node(pRExC_state, NOTHING);
5935         if (ret == NULL)
5936             ret = chain;
5937     }
5938     if (c == 1) {
5939         *flagp |= flags&SIMPLE;
5940     }
5941
5942     return ret;
5943 }
5944
5945 /*
5946  - regpiece - something followed by possible [*+?]
5947  *
5948  * Note that the branching code sequences used for ? and the general cases
5949  * of * and + are somewhat optimized:  they use the same NOTHING node as
5950  * both the endmarker for their branch list and the body of the last branch.
5951  * It might seem that this node could be dispensed with entirely, but the
5952  * endmarker role is not redundant.
5953  */
5954 STATIC regnode *
5955 S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
5956 {
5957     dVAR;
5958     register regnode *ret;
5959     register char op;
5960     register char *next;
5961     I32 flags;
5962     const char * const origparse = RExC_parse;
5963     I32 min;
5964     I32 max = REG_INFTY;
5965     char *parse_start;
5966     const char *maxpos = NULL;
5967     GET_RE_DEBUG_FLAGS_DECL;
5968     DEBUG_PARSE("piec");
5969
5970     ret = regatom(pRExC_state, &flags,depth+1);
5971     if (ret == NULL) {
5972         if (flags & TRYAGAIN)
5973             *flagp |= TRYAGAIN;
5974         return(NULL);
5975     }
5976
5977     op = *RExC_parse;
5978
5979     if (op == '{' && regcurly(RExC_parse)) {
5980         maxpos = NULL;
5981         parse_start = RExC_parse; /* MJD */
5982         next = RExC_parse + 1;
5983         while (isDIGIT(*next) || *next == ',') {
5984             if (*next == ',') {
5985                 if (maxpos)
5986                     break;
5987                 else
5988                     maxpos = next;
5989             }
5990             next++;
5991         }
5992         if (*next == '}') {             /* got one */
5993             if (!maxpos)
5994                 maxpos = next;
5995             RExC_parse++;
5996             min = atoi(RExC_parse);
5997             if (*maxpos == ',')
5998                 maxpos++;
5999             else
6000                 maxpos = RExC_parse;
6001             max = atoi(maxpos);
6002             if (!max && *maxpos != '0')
6003                 max = REG_INFTY;                /* meaning "infinity" */
6004             else if (max >= REG_INFTY)
6005                 vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
6006             RExC_parse = next;
6007             nextchar(pRExC_state);
6008
6009         do_curly:
6010             if ((flags&SIMPLE)) {
6011                 RExC_naughty += 2 + RExC_naughty / 2;
6012                 reginsert(pRExC_state, CURLY, ret, depth+1);
6013                 Set_Node_Offset(ret, parse_start+1); /* MJD */
6014                 Set_Node_Cur_Length(ret);
6015             }
6016             else {
6017                 regnode * const w = reg_node(pRExC_state, WHILEM);
6018
6019                 w->flags = 0;
6020                 REGTAIL(pRExC_state, ret, w);
6021                 if (!SIZE_ONLY && RExC_extralen) {
6022                     reginsert(pRExC_state, LONGJMP,ret, depth+1);
6023                     reginsert(pRExC_state, NOTHING,ret, depth+1);
6024                     NEXT_OFF(ret) = 3;  /* Go over LONGJMP. */
6025                 }
6026                 reginsert(pRExC_state, CURLYX,ret, depth+1);
6027                                 /* MJD hk */
6028                 Set_Node_Offset(ret, parse_start+1);
6029                 Set_Node_Length(ret,
6030                                 op == '{' ? (RExC_parse - parse_start) : 1);
6031
6032                 if (!SIZE_ONLY && RExC_extralen)
6033                     NEXT_OFF(ret) = 3;  /* Go over NOTHING to LONGJMP. */
6034                 REGTAIL(pRExC_state, ret, reg_node(pRExC_state, NOTHING));
6035                 if (SIZE_ONLY)
6036                     RExC_whilem_seen++, RExC_extralen += 3;
6037                 RExC_naughty += 4 + RExC_naughty;       /* compound interest */
6038             }
6039             ret->flags = 0;
6040
6041             if (min > 0)
6042                 *flagp = WORST;
6043             if (max > 0)
6044                 *flagp |= HASWIDTH;
6045             if (max && max < min)
6046                 vFAIL("Can't do {n,m} with n > m");
6047             if (!SIZE_ONLY) {
6048                 ARG1_SET(ret, (U16)min);
6049                 ARG2_SET(ret, (U16)max);
6050             }
6051
6052             goto nest_check;
6053         }
6054     }
6055
6056     if (!ISMULT1(op)) {
6057         *flagp = flags;
6058         return(ret);
6059     }
6060
6061 #if 0                           /* Now runtime fix should be reliable. */
6062
6063     /* if this is reinstated, don't forget to put this back into perldiag:
6064
6065             =item Regexp *+ operand could be empty at {#} in regex m/%s/
6066
6067            (F) The part of the regexp subject to either the * or + quantifier
6068            could match an empty string. The {#} shows in the regular
6069            expression about where the problem was discovered.
6070
6071     */
6072
6073     if (!(flags&HASWIDTH) && op != '?')
6074       vFAIL("Regexp *+ operand could be empty");
6075 #endif
6076
6077     parse_start = RExC_parse;
6078     nextchar(pRExC_state);
6079
6080     *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
6081
6082     if (op == '*' && (flags&SIMPLE)) {
6083         reginsert(pRExC_state, STAR, ret, depth+1);
6084         ret->flags = 0;
6085         RExC_naughty += 4;
6086     }
6087     else if (op == '*') {
6088         min = 0;
6089         goto do_curly;
6090     }
6091     else if (op == '+' && (flags&SIMPLE)) {
6092         reginsert(pRExC_state, PLUS, ret, depth+1);
6093         ret->flags = 0;
6094         RExC_naughty += 3;
6095     }
6096     else if (op == '+') {
6097         min = 1;
6098         goto do_curly;
6099     }
6100     else if (op == '?') {
6101         min = 0; max = 1;
6102         goto do_curly;
6103     }
6104   nest_check:
6105     if (!SIZE_ONLY && !(flags&(HASWIDTH|POSTPONED)) && max > REG_INFTY/3 && ckWARN(WARN_REGEXP)) {
6106         vWARN3(RExC_parse,
6107                "%.*s matches null string many times",
6108                (int)(RExC_parse >= origparse ? RExC_parse - origparse : 0),
6109                origparse);
6110     }
6111
6112     if (RExC_parse < RExC_end && *RExC_parse == '?') {
6113         nextchar(pRExC_state);
6114         reginsert(pRExC_state, MINMOD, ret, depth+1);
6115         REGTAIL(pRExC_state, ret, ret + NODE_STEP_REGNODE);
6116     }
6117 #ifndef REG_ALLOW_MINMOD_SUSPEND
6118     else
6119 #endif
6120     if (RExC_parse < RExC_end && *RExC_parse == '+') {
6121         regnode *ender;
6122         nextchar(pRExC_state);
6123         ender = reg_node(pRExC_state, SUCCEED);
6124         REGTAIL(pRExC_state, ret, ender);
6125         reginsert(pRExC_state, SUSPEND, ret, depth+1);
6126         ret->flags = 0;
6127         ender = reg_node(pRExC_state, TAIL);
6128         REGTAIL(pRExC_state, ret, ender);
6129         /*ret= ender;*/
6130     }
6131
6132     if (RExC_parse < RExC_end && ISMULT2(RExC_parse)) {
6133         RExC_parse++;
6134         vFAIL("Nested quantifiers");
6135     }
6136
6137     return(ret);
6138 }
6139
6140
6141 /* reg_namedseq(pRExC_state,UVp)
6142    
6143    This is expected to be called by a parser routine that has 
6144    recognized'\N' and needs to handle the rest. RExC_parse is 
6145    expected to point at the first char following the N at the time
6146    of the call.
6147    
6148    If valuep is non-null then it is assumed that we are parsing inside 
6149    of a charclass definition and the first codepoint in the resolved
6150    string is returned via *valuep and the routine will return NULL. 
6151    In this mode if a multichar string is returned from the charnames 
6152    handler a warning will be issued, and only the first char in the 
6153    sequence will be examined. If the string returned is zero length
6154    then the value of *valuep is undefined and NON-NULL will 
6155    be returned to indicate failure. (This will NOT be a valid pointer 
6156    to a regnode.)
6157    
6158    If value is null then it is assumed that we are parsing normal text
6159    and inserts a new EXACT node into the program containing the resolved
6160    string and returns a pointer to the new node. If the string is 
6161    zerolength a NOTHING node is emitted.
6162    
6163    On success RExC_parse is set to the char following the endbrace.
6164    Parsing failures will generate a fatal errorvia vFAIL(...)
6165    
6166    NOTE: We cache all results from the charnames handler locally in 
6167    the RExC_charnames hash (created on first use) to prevent a charnames 
6168    handler from playing silly-buggers and returning a short string and 
6169    then a long string for a given pattern. Since the regexp program 
6170    size is calculated during an initial parse this would result
6171    in a buffer overrun so we cache to prevent the charname result from
6172    changing during the course of the parse.
6173    
6174  */
6175 STATIC regnode *
6176 S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep) 
6177 {
6178     char * name;        /* start of the content of the name */
6179     char * endbrace;    /* endbrace following the name */
6180     SV *sv_str = NULL;  
6181     SV *sv_name = NULL;
6182     STRLEN len; /* this has various purposes throughout the code */
6183     bool cached = 0; /* if this is true then we shouldn't refcount dev sv_str */
6184     regnode *ret = NULL;
6185     
6186     if (*RExC_parse != '{') {
6187         vFAIL("Missing braces on \\N{}");
6188     }
6189     name = RExC_parse+1;
6190     endbrace = strchr(RExC_parse, '}');
6191     if ( ! endbrace ) {
6192         RExC_parse++;
6193         vFAIL("Missing right brace on \\N{}");
6194     } 
6195     RExC_parse = endbrace + 1;  
6196     
6197     
6198     /* RExC_parse points at the beginning brace, 
6199        endbrace points at the last */
6200     if ( name[0]=='U' && name[1]=='+' ) {
6201         /* its a "unicode hex" notation {U+89AB} */
6202         I32 fl = PERL_SCAN_ALLOW_UNDERSCORES
6203             | PERL_SCAN_DISALLOW_PREFIX
6204             | (SIZE_ONLY ? PERL_SCAN_SILENT_ILLDIGIT : 0);
6205         UV cp;
6206         len = (STRLEN)(endbrace - name - 2);
6207         cp = grok_hex(name + 2, &len, &fl, NULL);
6208         if ( len != (STRLEN)(endbrace - name - 2) ) {
6209             cp = 0xFFFD;
6210         }    
6211         if (cp > 0xff)
6212             RExC_utf8 = 1;
6213         if ( valuep ) {
6214             *valuep = cp;
6215             return NULL;
6216         }
6217         sv_str= Perl_newSVpvf_nocontext("%c",(int)cp);
6218     } else {
6219         /* fetch the charnames handler for this scope */
6220         HV * const table = GvHV(PL_hintgv);
6221         SV **cvp= table ? 
6222             hv_fetchs(table, "charnames", FALSE) :
6223             NULL;
6224         SV *cv= cvp ? *cvp : NULL;
6225         HE *he_str;
6226         int count;
6227         /* create an SV with the name as argument */
6228         sv_name = newSVpvn(name, endbrace - name);
6229         
6230         if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6231             vFAIL2("Constant(\\N{%s}) unknown: "
6232                   "(possibly a missing \"use charnames ...\")",
6233                   SvPVX(sv_name));
6234         }
6235         if (!cvp || !SvOK(*cvp)) { /* when $^H{charnames} = undef; */
6236             vFAIL2("Constant(\\N{%s}): "
6237                   "$^H{charnames} is not defined",SvPVX(sv_name));
6238         }
6239         
6240         
6241         
6242         if (!RExC_charnames) {
6243             /* make sure our cache is allocated */
6244             RExC_charnames = newHV();
6245             sv_2mortal((SV*)RExC_charnames);
6246         } 
6247             /* see if we have looked this one up before */
6248         he_str = hv_fetch_ent( RExC_charnames, sv_name, 0, 0 );
6249         if ( he_str ) {
6250             sv_str = HeVAL(he_str);
6251             cached = 1;
6252         } else {
6253             dSP ;
6254
6255             ENTER ;
6256             SAVETMPS ;
6257             PUSHMARK(SP) ;
6258             
6259             XPUSHs(sv_name);
6260             
6261             PUTBACK ;
6262             
6263             count= call_sv(cv, G_SCALAR);
6264             
6265             if (count == 1) { /* XXXX is this right? dmq */
6266                 sv_str = POPs;
6267                 SvREFCNT_inc_simple_void(sv_str);
6268             } 
6269             
6270             SPAGAIN ;
6271             PUTBACK ;
6272             FREETMPS ;
6273             LEAVE ;
6274             
6275             if ( !sv_str || !SvOK(sv_str) ) {
6276                 vFAIL2("Constant(\\N{%s}): Call to &{$^H{charnames}} "
6277                       "did not return a defined value",SvPVX(sv_name));
6278             }
6279             if (hv_store_ent( RExC_charnames, sv_name, sv_str, 0))
6280                 cached = 1;
6281         }
6282     }
6283     if (valuep) {
6284         char *p = SvPV(sv_str, len);
6285         if (len) {
6286             STRLEN numlen = 1;
6287             if ( SvUTF8(sv_str) ) {
6288                 *valuep = utf8_to_uvchr((U8*)p, &numlen);
6289                 if (*valuep > 0x7F)
6290                     RExC_utf8 = 1; 
6291                 /* XXXX
6292                   We have to turn on utf8 for high bit chars otherwise
6293                   we get failures with
6294                   
6295                    "ss" =~ /[\N{LATIN SMALL LETTER SHARP S}]/i
6296                    "SS" =~ /[\N{LATIN SMALL LETTER SHARP S}]/i
6297                 
6298                   This is different from what \x{} would do with the same
6299                   codepoint, where the condition is > 0xFF.
6300                   - dmq
6301                 */
6302                 
6303                 
6304             } else {
6305                 *valuep = (UV)*p;
6306                 /* warn if we havent used the whole string? */
6307             }
6308             if (numlen<len && SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6309                 vWARN2(RExC_parse,
6310                     "Ignoring excess chars from \\N{%s} in character class",
6311                     SvPVX(sv_name)
6312                 );
6313             }        
6314         } else if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6315             vWARN2(RExC_parse,
6316                     "Ignoring zero length \\N{%s} in character class",
6317                     SvPVX(sv_name)
6318                 );
6319         }
6320         if (sv_name)    
6321             SvREFCNT_dec(sv_name);    
6322         if (!cached)
6323             SvREFCNT_dec(sv_str);    
6324         return len ? NULL : (regnode *)&len;
6325     } else if(SvCUR(sv_str)) {     
6326         
6327         char *s; 
6328         char *p, *pend;        
6329         STRLEN charlen = 1;
6330 #ifdef DEBUGGING
6331         char * parse_start = name-3; /* needed for the offsets */
6332 #endif
6333         GET_RE_DEBUG_FLAGS_DECL;     /* needed for the offsets */
6334         
6335         ret = reg_node(pRExC_state,
6336             (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
6337         s= STRING(ret);
6338         
6339         if ( RExC_utf8 && !SvUTF8(sv_str) ) {
6340             sv_utf8_upgrade(sv_str);
6341         } else if ( !RExC_utf8 && SvUTF8(sv_str) ) {
6342             RExC_utf8= 1;
6343         }
6344         
6345         p = SvPV(sv_str, len);
6346         pend = p + len;
6347         /* len is the length written, charlen is the size the char read */
6348         for ( len = 0; p < pend; p += charlen ) {
6349             if (UTF) {
6350                 UV uvc = utf8_to_uvchr((U8*)p, &charlen);
6351                 if (FOLD) {
6352                     STRLEN foldlen,numlen;
6353                     U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
6354                     uvc = toFOLD_uni(uvc, tmpbuf, &foldlen);
6355                     /* Emit all the Unicode characters. */
6356                     
6357                     for (foldbuf = tmpbuf;
6358                         foldlen;
6359                         foldlen -= numlen) 
6360                     {
6361                         uvc = utf8_to_uvchr(foldbuf, &numlen);
6362                         if (numlen > 0) {
6363                             const STRLEN unilen = reguni(pRExC_state, uvc, s);
6364                             s       += unilen;
6365                             len     += unilen;
6366                             /* In EBCDIC the numlen
6367                             * and unilen can differ. */
6368                             foldbuf += numlen;
6369                             if (numlen >= foldlen)
6370                                 break;
6371                         }
6372                         else
6373                             break; /* "Can't happen." */
6374                     }                          
6375                 } else {
6376                     const STRLEN unilen = reguni(pRExC_state, uvc, s);
6377                     if (unilen > 0) {
6378                        s   += unilen;
6379                        len += unilen;
6380                     }
6381                 }
6382             } else {
6383                 len++;
6384                 REGC(*p, s++);
6385             }
6386         }
6387         if (SIZE_ONLY) {
6388             RExC_size += STR_SZ(len);
6389         } else {
6390             STR_LEN(ret) = len;
6391             RExC_emit += STR_SZ(len);
6392         }
6393         Set_Node_Cur_Length(ret); /* MJD */
6394         RExC_parse--; 
6395         nextchar(pRExC_state);
6396     } else {
6397         ret = reg_node(pRExC_state,NOTHING);
6398     }
6399     if (!cached) {
6400         SvREFCNT_dec(sv_str);
6401     }
6402     if (sv_name) {
6403         SvREFCNT_dec(sv_name); 
6404     }
6405     return ret;
6406
6407 }
6408
6409
6410 /*
6411  * reg_recode
6412  *
6413  * It returns the code point in utf8 for the value in *encp.
6414  *    value: a code value in the source encoding
6415  *    encp:  a pointer to an Encode object
6416  *
6417  * If the result from Encode is not a single character,
6418  * it returns U+FFFD (Replacement character) and sets *encp to NULL.
6419  */
6420 STATIC UV
6421 S_reg_recode(pTHX_ const char value, SV **encp)
6422 {
6423     STRLEN numlen = 1;
6424     SV * const sv = sv_2mortal(newSVpvn(&value, numlen));
6425     const char * const s = encp && *encp ? sv_recode_to_utf8(sv, *encp)
6426                                          : SvPVX(sv);
6427     const STRLEN newlen = SvCUR(sv);
6428     UV uv = UNICODE_REPLACEMENT;
6429
6430     if (newlen)
6431         uv = SvUTF8(sv)
6432              ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
6433              : *(U8*)s;
6434
6435     if (!newlen || numlen != newlen) {
6436         uv = UNICODE_REPLACEMENT;
6437         if (encp)
6438             *encp = NULL;
6439     }
6440     return uv;
6441 }
6442
6443
6444 /*
6445  - regatom - the lowest level
6446
6447    Try to identify anything special at the start of the pattern. If there
6448    is, then handle it as required. This may involve generating a single regop,
6449    such as for an assertion; or it may involve recursing, such as to
6450    handle a () structure.
6451
6452    If the string doesn't start with something special then we gobble up
6453    as much literal text as we can.
6454
6455    Once we have been able to handle whatever type of thing started the
6456    sequence, we return.
6457
6458    Note: we have to be careful with escapes, as they can be both literal
6459    and special, and in the case of \10 and friends can either, depending
6460    on context. Specifically there are two seperate switches for handling
6461    escape sequences, with the one for handling literal escapes requiring
6462    a dummy entry for all of the special escapes that are actually handled
6463    by the other.
6464 */
6465
6466 STATIC regnode *
6467 S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
6468 {
6469     dVAR;
6470     register regnode *ret = NULL;
6471     I32 flags;
6472     char *parse_start = RExC_parse;
6473     GET_RE_DEBUG_FLAGS_DECL;
6474     DEBUG_PARSE("atom");
6475     *flagp = WORST;             /* Tentatively. */
6476
6477
6478 tryagain:
6479     switch (*RExC_parse) {
6480     case '^':
6481         RExC_seen_zerolen++;
6482         nextchar(pRExC_state);
6483         if (RExC_flags & RXf_PMf_MULTILINE)
6484             ret = reg_node(pRExC_state, MBOL);
6485         else if (RExC_flags & RXf_PMf_SINGLELINE)
6486             ret = reg_node(pRExC_state, SBOL);
6487         else
6488             ret = reg_node(pRExC_state, BOL);
6489         Set_Node_Length(ret, 1); /* MJD */
6490         break;
6491     case '$':
6492         nextchar(pRExC_state);
6493         if (*RExC_parse)
6494             RExC_seen_zerolen++;
6495         if (RExC_flags & RXf_PMf_MULTILINE)
6496             ret = reg_node(pRExC_state, MEOL);
6497         else if (RExC_flags & RXf_PMf_SINGLELINE)
6498             ret = reg_node(pRExC_state, SEOL);
6499         else
6500             ret = reg_node(pRExC_state, EOL);
6501         Set_Node_Length(ret, 1); /* MJD */
6502         break;
6503     case '.':
6504         nextchar(pRExC_state);
6505         if (RExC_flags & RXf_PMf_SINGLELINE)
6506             ret = reg_node(pRExC_state, SANY);
6507         else
6508             ret = reg_node(pRExC_state, REG_ANY);
6509         *flagp |= HASWIDTH|SIMPLE;
6510         RExC_naughty++;
6511         Set_Node_Length(ret, 1); /* MJD */
6512         break;
6513     case '[':
6514     {
6515         char * const oregcomp_parse = ++RExC_parse;
6516         ret = regclass(pRExC_state,depth+1);
6517         if (*RExC_parse != ']') {
6518             RExC_parse = oregcomp_parse;
6519             vFAIL("Unmatched [");
6520         }
6521         nextchar(pRExC_state);
6522         *flagp |= HASWIDTH|SIMPLE;
6523         Set_Node_Length(ret, RExC_parse - oregcomp_parse + 1); /* MJD */
6524         break;
6525     }
6526     case '(':
6527         nextchar(pRExC_state);
6528         ret = reg(pRExC_state, 1, &flags,depth+1);
6529         if (ret == NULL) {
6530                 if (flags & TRYAGAIN) {
6531                     if (RExC_parse == RExC_end) {
6532                          /* Make parent create an empty node if needed. */
6533                         *flagp |= TRYAGAIN;
6534                         return(NULL);
6535                     }
6536                     goto tryagain;
6537                 }
6538                 return(NULL);
6539         }
6540         *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE|POSTPONED);
6541         break;
6542     case '|':
6543     case ')':
6544         if (flags & TRYAGAIN) {
6545             *flagp |= TRYAGAIN;
6546             return NULL;
6547         }
6548         vFAIL("Internal urp");
6549                                 /* Supposed to be caught earlier. */
6550         break;
6551     case '{':
6552         if (!regcurly(RExC_parse)) {
6553             RExC_parse++;
6554             goto defchar;
6555         }
6556         /* FALL THROUGH */
6557     case '?':
6558     case '+':
6559     case '*':
6560         RExC_parse++;
6561         vFAIL("Quantifier follows nothing");
6562         break;
6563     case '\\':
6564         /* Special Escapes
6565
6566            This switch handles escape sequences that resolve to some kind
6567            of special regop and not to literal text. Escape sequnces that
6568            resolve to literal text are handled below in the switch marked
6569            "Literal Escapes".
6570
6571            Every entry in this switch *must* have a corresponding entry
6572            in the literal escape switch. However, the opposite is not
6573            required, as the default for this switch is to jump to the
6574            literal text handling code.
6575         */
6576         switch (*++RExC_parse) {
6577         /* Special Escapes */
6578         case 'A':
6579             RExC_seen_zerolen++;
6580             ret = reg_node(pRExC_state, SBOL);
6581             *flagp |= SIMPLE;
6582             goto finish_meta_pat;
6583         case 'G':
6584             ret = reg_node(pRExC_state, GPOS);
6585             RExC_seen |= REG_SEEN_GPOS;
6586             *flagp |= SIMPLE;
6587             goto finish_meta_pat;
6588         case 'K':
6589             RExC_seen_zerolen++;
6590             ret = reg_node(pRExC_state, KEEPS);
6591             *flagp |= SIMPLE;
6592             goto finish_meta_pat;
6593         case 'Z':
6594             ret = reg_node(pRExC_state, SEOL);
6595             *flagp |= SIMPLE;
6596             RExC_seen_zerolen++;                /* Do not optimize RE away */
6597             goto finish_meta_pat;
6598         case 'z':
6599             ret = reg_node(pRExC_state, EOS);
6600             *flagp |= SIMPLE;
6601             RExC_seen_zerolen++;                /* Do not optimize RE away */
6602             goto finish_meta_pat;
6603         case 'C':
6604             ret = reg_node(pRExC_state, CANY);
6605             RExC_seen |= REG_SEEN_CANY;
6606             *flagp |= HASWIDTH|SIMPLE;
6607             goto finish_meta_pat;
6608         case 'X':
6609             ret = reg_node(pRExC_state, CLUMP);
6610             *flagp |= HASWIDTH;
6611             goto finish_meta_pat;
6612         case 'w':
6613             ret = reg_node(pRExC_state, (U8)(LOC ? ALNUML     : ALNUM));
6614             *flagp |= HASWIDTH|SIMPLE;
6615             goto finish_meta_pat;
6616         case 'W':
6617             ret = reg_node(pRExC_state, (U8)(LOC ? NALNUML    : NALNUM));
6618             *flagp |= HASWIDTH|SIMPLE;
6619             goto finish_meta_pat;
6620         case 'b':
6621             RExC_seen_zerolen++;
6622             RExC_seen |= REG_SEEN_LOOKBEHIND;
6623             ret = reg_node(pRExC_state, (U8)(LOC ? BOUNDL     : BOUND));
6624             *flagp |= SIMPLE;
6625             goto finish_meta_pat;
6626         case 'B':
6627             RExC_seen_zerolen++;
6628             RExC_seen |= REG_SEEN_LOOKBEHIND;
6629             ret = reg_node(pRExC_state, (U8)(LOC ? NBOUNDL    : NBOUND));
6630             *flagp |= SIMPLE;
6631             goto finish_meta_pat;
6632         case 's':
6633             ret = reg_node(pRExC_state, (U8)(LOC ? SPACEL     : SPACE));
6634             *flagp |= HASWIDTH|SIMPLE;
6635             goto finish_meta_pat;
6636         case 'S':
6637             ret = reg_node(pRExC_state, (U8)(LOC ? NSPACEL    : NSPACE));
6638             *flagp |= HASWIDTH|SIMPLE;
6639             goto finish_meta_pat;
6640         case 'd':
6641             ret = reg_node(pRExC_state, DIGIT);
6642             *flagp |= HASWIDTH|SIMPLE;
6643             goto finish_meta_pat;
6644         case 'D':
6645             ret = reg_node(pRExC_state, NDIGIT);
6646             *flagp |= HASWIDTH|SIMPLE;
6647             goto finish_meta_pat;
6648         case 'R':
6649             ret = reg_node(pRExC_state, LNBREAK);
6650             *flagp |= HASWIDTH|SIMPLE;
6651             goto finish_meta_pat;
6652         case 'h':
6653             ret = reg_node(pRExC_state, HORIZWS);
6654             *flagp |= HASWIDTH|SIMPLE;
6655             goto finish_meta_pat;
6656         case 'H':
6657             ret = reg_node(pRExC_state, NHORIZWS);
6658             *flagp |= HASWIDTH|SIMPLE;
6659             goto finish_meta_pat;
6660         case 'v':
6661             ret = reg_node(pRExC_state, VERTWS);
6662             *flagp |= HASWIDTH|SIMPLE;
6663             goto finish_meta_pat;
6664         case 'V':
6665             ret = reg_node(pRExC_state, NVERTWS);
6666             *flagp |= HASWIDTH|SIMPLE;
6667          finish_meta_pat:           
6668             nextchar(pRExC_state);
6669             Set_Node_Length(ret, 2); /* MJD */
6670             break;          
6671         case 'p':
6672         case 'P':
6673             {   
6674                 char* const oldregxend = RExC_end;
6675 #ifdef DEBUGGING
6676                 char* parse_start = RExC_parse - 2;
6677 #endif
6678
6679                 if (RExC_parse[1] == '{') {
6680                   /* a lovely hack--pretend we saw [\pX] instead */
6681                     RExC_end = strchr(RExC_parse, '}');
6682                     if (!RExC_end) {
6683                         const U8 c = (U8)*RExC_parse;
6684                         RExC_parse += 2;
6685                         RExC_end = oldregxend;
6686                         vFAIL2("Missing right brace on \\%c{}", c);
6687                     }
6688                     RExC_end++;
6689                 }
6690                 else {
6691                     RExC_end = RExC_parse + 2;
6692                     if (RExC_end > oldregxend)
6693                         RExC_end = oldregxend;
6694                 }
6695                 RExC_parse--;
6696
6697                 ret = regclass(pRExC_state,depth+1);
6698
6699                 RExC_end = oldregxend;
6700                 RExC_parse--;
6701
6702                 Set_Node_Offset(ret, parse_start + 2);
6703                 Set_Node_Cur_Length(ret);
6704                 nextchar(pRExC_state);
6705                 *flagp |= HASWIDTH|SIMPLE;
6706             }
6707             break;
6708         case 'N': 
6709             /* Handle \N{NAME} here and not below because it can be 
6710             multicharacter. join_exact() will join them up later on. 
6711             Also this makes sure that things like /\N{BLAH}+/ and 
6712             \N{BLAH} being multi char Just Happen. dmq*/
6713             ++RExC_parse;
6714             ret= reg_namedseq(pRExC_state, NULL); 
6715             break;
6716         case 'k':    /* Handle \k<NAME> and \k'NAME' */
6717         parse_named_seq:
6718         {   
6719             char ch= RExC_parse[1];         
6720             if (ch != '<' && ch != '\'' && ch != '{') {
6721                 RExC_parse++;
6722                 vFAIL2("Sequence %.2s... not terminated",parse_start);
6723             } else {
6724                 /* this pretty much dupes the code for (?P=...) in reg(), if
6725                    you change this make sure you change that */
6726                 char* name_start = (RExC_parse += 2);
6727                 U32 num = 0;
6728                 SV *sv_dat = reg_scan_name(pRExC_state,
6729                     SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
6730                 ch= (ch == '<') ? '>' : (ch == '{') ? '}' : '\'';
6731                 if (RExC_parse == name_start || *RExC_parse != ch)
6732                     vFAIL2("Sequence %.3s... not terminated",parse_start);
6733
6734                 if (!SIZE_ONLY) {
6735                     num = add_data( pRExC_state, 1, "S" );
6736                     RExC_rxi->data->data[num]=(void*)sv_dat;
6737                     SvREFCNT_inc_simple_void(sv_dat);
6738                 }
6739
6740                 RExC_sawback = 1;
6741                 ret = reganode(pRExC_state,
6742                            (U8)(FOLD ? (LOC ? NREFFL : NREFF) : NREF),
6743                            num);
6744                 *flagp |= HASWIDTH;
6745
6746                 /* override incorrect value set in reganode MJD */
6747                 Set_Node_Offset(ret, parse_start+1);
6748                 Set_Node_Cur_Length(ret); /* MJD */
6749                 nextchar(pRExC_state);
6750
6751             }
6752             break;
6753         }
6754         case 'g': 
6755         case '1': case '2': case '3': case '4':
6756         case '5': case '6': case '7': case '8': case '9':
6757             {
6758                 I32 num;
6759                 bool isg = *RExC_parse == 'g';
6760                 bool isrel = 0; 
6761                 bool hasbrace = 0;
6762                 if (isg) {
6763                     RExC_parse++;
6764                     if (*RExC_parse == '{') {
6765                         RExC_parse++;
6766                         hasbrace = 1;
6767                     }
6768                     if (*RExC_parse == '-') {
6769                         RExC_parse++;
6770                         isrel = 1;
6771                     }
6772                     if (hasbrace && !isDIGIT(*RExC_parse)) {
6773                         if (isrel) RExC_parse--;
6774                         RExC_parse -= 2;                            
6775                         goto parse_named_seq;
6776                 }   }
6777                 num = atoi(RExC_parse);
6778                 if (isrel) {
6779                     num = RExC_npar - num;
6780                     if (num < 1)
6781                         vFAIL("Reference to nonexistent or unclosed group");
6782                 }
6783                 if (!isg && num > 9 && num >= RExC_npar)
6784                     goto defchar;
6785                 else {
6786                     char * const parse_start = RExC_parse - 1; /* MJD */
6787                     while (isDIGIT(*RExC_parse))
6788                         RExC_parse++;
6789                     if (parse_start == RExC_parse - 1) 
6790                         vFAIL("Unterminated \\g... pattern");
6791                     if (hasbrace) {
6792                         if (*RExC_parse != '}') 
6793                             vFAIL("Unterminated \\g{...} pattern");
6794                         RExC_parse++;
6795                     }    
6796                     if (!SIZE_ONLY) {
6797                         if (num > (I32)RExC_rx->nparens)
6798                             vFAIL("Reference to nonexistent group");
6799                     }
6800                     RExC_sawback = 1;
6801                     ret = reganode(pRExC_state,
6802                                    (U8)(FOLD ? (LOC ? REFFL : REFF) : REF),
6803                                    num);
6804                     *flagp |= HASWIDTH;
6805
6806                     /* override incorrect value set in reganode MJD */
6807                     Set_Node_Offset(ret, parse_start+1);
6808                     Set_Node_Cur_Length(ret); /* MJD */
6809                     RExC_parse--;
6810                     nextchar(pRExC_state);
6811                 }
6812             }
6813             break;
6814         case '\0':
6815             if (RExC_parse >= RExC_end)
6816                 FAIL("Trailing \\");
6817             /* FALL THROUGH */
6818         default:
6819             /* Do not generate "unrecognized" warnings here, we fall
6820                back into the quick-grab loop below */
6821             parse_start--;
6822             goto defchar;
6823         }
6824         break;
6825
6826     case '#':
6827         if (RExC_flags & RXf_PMf_EXTENDED) {
6828             if ( reg_skipcomment( pRExC_state ) )
6829                 goto tryagain;
6830         }
6831         /* FALL THROUGH */
6832
6833     default: {
6834             register STRLEN len;
6835             register UV ender;
6836             register char *p;
6837             char *s;
6838             STRLEN foldlen;
6839             U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
6840
6841             parse_start = RExC_parse - 1;
6842
6843             RExC_parse++;
6844
6845         defchar:
6846             ender = 0;
6847             ret = reg_node(pRExC_state,
6848                            (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
6849             s = STRING(ret);
6850             for (len = 0, p = RExC_parse - 1;
6851               len < 127 && p < RExC_end;
6852               len++)
6853             {
6854                 char * const oldp = p;
6855
6856                 if (RExC_flags & RXf_PMf_EXTENDED)
6857                     p = regwhite( pRExC_state, p );
6858                 switch (*p) {
6859                 case '^':
6860                 case '$':
6861                 case '.':
6862                 case '[':
6863                 case '(':
6864                 case ')':
6865                 case '|':
6866                     goto loopdone;
6867                 case '\\':
6868                     /* Literal Escapes Switch
6869
6870                        This switch is meant to handle escape sequences that
6871                        resolve to a literal character.
6872
6873                        Every escape sequence that represents something
6874                        else, like an assertion or a char class, is handled
6875                        in the switch marked 'Special Escapes' above in this
6876                        routine, but also has an entry here as anything that
6877                        isn't explicitly mentioned here will be treated as
6878                        an unescaped equivalent literal.
6879                     */
6880
6881                     switch (*++p) {
6882                     /* These are all the special escapes. */
6883                     case 'A':             /* Start assertion */
6884                     case 'b': case 'B':   /* Word-boundary assertion*/
6885                     case 'C':             /* Single char !DANGEROUS! */
6886                     case 'd': case 'D':   /* digit class */
6887                     case 'g': case 'G':   /* generic-backref, pos assertion */
6888                     case 'h': case 'H':   /* HORIZWS */
6889                     case 'k': case 'K':   /* named backref, keep marker */
6890                     case 'N':             /* named char sequence */
6891                     case 'p': case 'P':   /* unicode property */
6892                               case 'R':   /* LNBREAK */
6893                     case 's': case 'S':   /* space class */
6894                     case 'v': case 'V':   /* VERTWS */
6895                     case 'w': case 'W':   /* word class */
6896                     case 'X':             /* eXtended Unicode "combining character sequence" */
6897                     case 'z': case 'Z':   /* End of line/string assertion */
6898                         --p;
6899                         goto loopdone;
6900
6901                     /* Anything after here is an escape that resolves to a
6902                        literal. (Except digits, which may or may not)
6903                      */
6904                     case 'n':
6905                         ender = '\n';
6906                         p++;
6907                         break;
6908                     case 'r':
6909                         ender = '\r';
6910                         p++;
6911                         break;
6912                     case 't':
6913                         ender = '\t';
6914                         p++;
6915                         break;
6916                     case 'f':
6917                         ender = '\f';
6918                         p++;
6919                         break;
6920                     case 'e':
6921                           ender = ASCII_TO_NATIVE('\033');
6922                         p++;
6923                         break;
6924                     case 'a':
6925                           ender = ASCII_TO_NATIVE('\007');
6926                         p++;
6927                         break;
6928                     case 'x':
6929                         if (*++p == '{') {
6930                             char* const e = strchr(p, '}');
6931         
6932                             if (!e) {
6933                                 RExC_parse = p + 1;
6934                                 vFAIL("Missing right brace on \\x{}");
6935                             }
6936                             else {
6937                                 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
6938                                     | PERL_SCAN_DISALLOW_PREFIX;
6939                                 STRLEN numlen = e - p - 1;
6940                                 ender = grok_hex(p + 1, &numlen, &flags, NULL);
6941                                 if (ender > 0xff)
6942                                     RExC_utf8 = 1;
6943                                 p = e + 1;
6944                             }
6945                         }
6946                         else {
6947                             I32 flags = PERL_SCAN_DISALLOW_PREFIX;
6948                             STRLEN numlen = 2;
6949                             ender = grok_hex(p, &numlen, &flags, NULL);
6950                             p += numlen;
6951                         }
6952                         if (PL_encoding && ender < 0x100)
6953                             goto recode_encoding;
6954                         break;
6955                     case 'c':
6956                         p++;
6957                         ender = UCHARAT(p++);
6958                         ender = toCTRL(ender);
6959                         break;
6960                     case '0': case '1': case '2': case '3':case '4':
6961                     case '5': case '6': case '7': case '8':case '9':
6962                         if (*p == '0' ||
6963                           (isDIGIT(p[1]) && atoi(p) >= RExC_npar) ) {
6964                             I32 flags = 0;
6965                             STRLEN numlen = 3;
6966                             ender = grok_oct(p, &numlen, &flags, NULL);
6967                             p += numlen;
6968                         }
6969                         else {
6970                             --p;
6971                             goto loopdone;
6972                         }
6973                         if (PL_encoding && ender < 0x100)
6974                             goto recode_encoding;
6975                         break;
6976                     recode_encoding:
6977                         {
6978                             SV* enc = PL_encoding;
6979                             ender = reg_recode((const char)(U8)ender, &enc);
6980                             if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
6981                                 vWARN(p, "Invalid escape in the specified encoding");
6982                             RExC_utf8 = 1;
6983                         }
6984                         break;
6985                     case '\0':
6986                         if (p >= RExC_end)
6987                             FAIL("Trailing \\");
6988                         /* FALL THROUGH */
6989                     default:
6990                         if (!SIZE_ONLY&& isALPHA(*p) && ckWARN(WARN_REGEXP))
6991                             vWARN2(p + 1, "Unrecognized escape \\%c passed through", UCHARAT(p));
6992                         goto normal_default;
6993                     }
6994                     break;
6995                 default:
6996                   normal_default:
6997                     if (UTF8_IS_START(*p) && UTF) {
6998                         STRLEN numlen;
6999                         ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
7000                                                &numlen, UTF8_ALLOW_DEFAULT);
7001                         p += numlen;
7002                     }
7003                     else
7004                         ender = *p++;
7005                     break;
7006                 }
7007                 if ( RExC_flags & RXf_PMf_EXTENDED)
7008                     p = regwhite( pRExC_state, p );
7009                 if (UTF && FOLD) {
7010                     /* Prime the casefolded buffer. */
7011                     ender = toFOLD_uni(ender, tmpbuf, &foldlen);
7012                 }
7013                 if (p < RExC_end && ISMULT2(p)) { /* Back off on ?+*. */
7014                     if (len)
7015                         p = oldp;
7016                     else if (UTF) {
7017                          if (FOLD) {
7018                               /* Emit all the Unicode characters. */
7019                               STRLEN numlen;
7020                               for (foldbuf = tmpbuf;
7021                                    foldlen;
7022                                    foldlen -= numlen) {
7023                                    ender = utf8_to_uvchr(foldbuf, &numlen);
7024                                    if (numlen > 0) {
7025                                         const STRLEN unilen = reguni(pRExC_state, ender, s);
7026                                         s       += unilen;
7027                                         len     += unilen;
7028                                         /* In EBCDIC the numlen
7029                                          * and unilen can differ. */
7030                                         foldbuf += numlen;
7031                                         if (numlen >= foldlen)
7032                                              break;
7033                                    }
7034                                    else
7035                                         break; /* "Can't happen." */
7036                               }
7037                          }
7038                          else {
7039                               const STRLEN unilen = reguni(pRExC_state, ender, s);
7040                               if (unilen > 0) {
7041                                    s   += unilen;
7042                                    len += unilen;
7043                               }
7044                          }
7045                     }
7046                     else {
7047                         len++;
7048                         REGC((char)ender, s++);
7049                     }
7050                     break;
7051                 }
7052                 if (UTF) {
7053                      if (FOLD) {
7054                           /* Emit all the Unicode characters. */
7055                           STRLEN numlen;
7056                           for (foldbuf = tmpbuf;
7057                                foldlen;
7058                                foldlen -= numlen) {
7059                                ender = utf8_to_uvchr(foldbuf, &numlen);
7060                                if (numlen > 0) {
7061                                     const STRLEN unilen = reguni(pRExC_state, ender, s);
7062                                     len     += unilen;
7063                                     s       += unilen;
7064                                     /* In EBCDIC the numlen
7065                                      * and unilen can differ. */
7066                                     foldbuf += numlen;
7067                                     if (numlen >= foldlen)
7068                                          break;
7069                                }
7070                                else
7071                                     break;
7072                           }
7073                      }
7074                      else {
7075                           const STRLEN unilen = reguni(pRExC_state, ender, s);
7076                           if (unilen > 0) {
7077                                s   += unilen;
7078                                len += unilen;
7079                           }
7080                      }
7081                      len--;
7082                 }
7083                 else
7084                     REGC((char)ender, s++);
7085             }
7086         loopdone:
7087             RExC_parse = p - 1;
7088             Set_Node_Cur_Length(ret); /* MJD */
7089             nextchar(pRExC_state);
7090             {
7091                 /* len is STRLEN which is unsigned, need to copy to signed */
7092                 IV iv = len;
7093                 if (iv < 0)
7094                     vFAIL("Internal disaster");
7095             }
7096             if (len > 0)
7097                 *flagp |= HASWIDTH;
7098             if (len == 1 && UNI_IS_INVARIANT(ender))
7099                 *flagp |= SIMPLE;
7100                 
7101             if (SIZE_ONLY)
7102                 RExC_size += STR_SZ(len);
7103             else {
7104                 STR_LEN(ret) = len;
7105                 RExC_emit += STR_SZ(len);
7106             }
7107         }
7108         break;
7109     }
7110
7111     return(ret);
7112 }
7113
7114 STATIC char *
7115 S_regwhite( RExC_state_t *pRExC_state, char *p )
7116 {
7117     const char *e = RExC_end;
7118     while (p < e) {
7119         if (isSPACE(*p))
7120             ++p;
7121         else if (*p == '#') {
7122             bool ended = 0;
7123             do {
7124                 if (*p++ == '\n') {
7125                     ended = 1;
7126                     break;
7127                 }
7128             } while (p < e);
7129             if (!ended)
7130                 RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
7131         }
7132         else
7133             break;
7134     }
7135     return p;
7136 }
7137
7138 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
7139    Character classes ([:foo:]) can also be negated ([:^foo:]).
7140    Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
7141    Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
7142    but trigger failures because they are currently unimplemented. */
7143
7144 #define POSIXCC_DONE(c)   ((c) == ':')
7145 #define POSIXCC_NOTYET(c) ((c) == '=' || (c) == '.')
7146 #define POSIXCC(c) (POSIXCC_DONE(c) || POSIXCC_NOTYET(c))
7147
7148 STATIC I32
7149 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value)
7150 {
7151     dVAR;
7152     I32 namedclass = OOB_NAMEDCLASS;
7153
7154     if (value == '[' && RExC_parse + 1 < RExC_end &&
7155         /* I smell either [: or [= or [. -- POSIX has been here, right? */
7156         POSIXCC(UCHARAT(RExC_parse))) {
7157         const char c = UCHARAT(RExC_parse);
7158         char* const s = RExC_parse++;
7159         
7160         while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != c)
7161             RExC_parse++;
7162         if (RExC_parse == RExC_end)
7163             /* Grandfather lone [:, [=, [. */
7164             RExC_parse = s;
7165         else {
7166             const char* const t = RExC_parse++; /* skip over the c */
7167             assert(*t == c);
7168
7169             if (UCHARAT(RExC_parse) == ']') {
7170                 const char *posixcc = s + 1;
7171                 RExC_parse++; /* skip over the ending ] */
7172
7173                 if (*s == ':') {
7174                     const I32 complement = *posixcc == '^' ? *posixcc++ : 0;
7175                     const I32 skip = t - posixcc;
7176
7177                     /* Initially switch on the length of the name.  */
7178                     switch (skip) {
7179                     case 4:
7180                         if (memEQ(posixcc, "word", 4)) /* this is not POSIX, this is the Perl \w */
7181                             namedclass = complement ? ANYOF_NALNUM : ANYOF_ALNUM;
7182                         break;
7183                     case 5:
7184                         /* Names all of length 5.  */
7185                         /* alnum alpha ascii blank cntrl digit graph lower
7186                            print punct space upper  */
7187                         /* Offset 4 gives the best switch position.  */
7188                         switch (posixcc[4]) {
7189                         case 'a':
7190                             if (memEQ(posixcc, "alph", 4)) /* alpha */
7191                                 namedclass = complement ? ANYOF_NALPHA : ANYOF_ALPHA;
7192                             break;
7193                         case 'e':
7194                             if (memEQ(posixcc, "spac", 4)) /* space */
7195                                 namedclass = complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
7196                             break;
7197                         case 'h':
7198                             if (memEQ(posixcc, "grap", 4)) /* graph */
7199                                 namedclass = complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
7200                             break;
7201                         case 'i':
7202                             if (memEQ(posixcc, "asci", 4)) /* ascii */
7203                                 namedclass = complement ? ANYOF_NASCII : ANYOF_ASCII;
7204                             break;
7205                         case 'k':
7206                             if (memEQ(posixcc, "blan", 4)) /* blank */
7207                                 namedclass = complement ? ANYOF_NBLANK : ANYOF_BLANK;
7208                             break;
7209                         case 'l':
7210                             if (memEQ(posixcc, "cntr", 4)) /* cntrl */
7211                                 namedclass = complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
7212                             break;
7213                         case 'm':
7214                             if (memEQ(posixcc, "alnu", 4)) /* alnum */
7215                                 namedclass = complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
7216                             break;
7217                         case 'r':
7218                             if (memEQ(posixcc, "lowe", 4)) /* lower */
7219                                 namedclass = complement ? ANYOF_NLOWER : ANYOF_LOWER;
7220                             else if (memEQ(posixcc, "uppe", 4)) /* upper */
7221                                 namedclass = complement ? ANYOF_NUPPER : ANYOF_UPPER;
7222                             break;
7223                         case 't':
7224                             if (memEQ(posixcc, "digi", 4)) /* digit */
7225                                 namedclass = complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
7226                             else if (memEQ(posixcc, "prin", 4)) /* print */
7227                                 namedclass = complement ? ANYOF_NPRINT : ANYOF_PRINT;
7228                             else if (memEQ(posixcc, "punc", 4)) /* punct */
7229                                 namedclass = complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
7230                             break;
7231                         }
7232                         break;
7233                     case 6:
7234                         if (memEQ(posixcc, "xdigit", 6))
7235                             namedclass = complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
7236                         break;
7237                     }
7238
7239                     if (namedclass == OOB_NAMEDCLASS)
7240                         Simple_vFAIL3("POSIX class [:%.*s:] unknown",
7241                                       t - s - 1, s + 1);
7242                     assert (posixcc[skip] == ':');
7243                     assert (posixcc[skip+1] == ']');
7244                 } else if (!SIZE_ONLY) {
7245                     /* [[=foo=]] and [[.foo.]] are still future. */
7246
7247                     /* adjust RExC_parse so the warning shows after
7248                        the class closes */
7249                     while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse) != ']')
7250                         RExC_parse++;
7251                     Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
7252                 }
7253             } else {
7254                 /* Maternal grandfather:
7255                  * "[:" ending in ":" but not in ":]" */
7256                 RExC_parse = s;
7257             }
7258         }
7259     }
7260
7261     return namedclass;
7262 }
7263
7264 STATIC void
7265 S_checkposixcc(pTHX_ RExC_state_t *pRExC_state)
7266 {
7267     dVAR;
7268     if (POSIXCC(UCHARAT(RExC_parse))) {
7269         const char *s = RExC_parse;
7270         const char  c = *s++;
7271
7272         while (isALNUM(*s))
7273             s++;
7274         if (*s && c == *s && s[1] == ']') {
7275             if (ckWARN(WARN_REGEXP))
7276                 vWARN3(s+2,
7277                         "POSIX syntax [%c %c] belongs inside character classes",
7278                         c, c);
7279
7280             /* [[=foo=]] and [[.foo.]] are still future. */
7281             if (POSIXCC_NOTYET(c)) {
7282                 /* adjust RExC_parse so the error shows after
7283                    the class closes */
7284                 while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse++) != ']')
7285                     NOOP;
7286                 Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
7287             }
7288         }
7289     }
7290 }
7291
7292
7293 #define _C_C_T_(NAME,TEST,WORD)                         \
7294 ANYOF_##NAME:                                           \
7295     if (LOC)                                            \
7296         ANYOF_CLASS_SET(ret, ANYOF_##NAME);             \
7297     else {                                              \
7298         for (value = 0; value < 256; value++)           \
7299             if (TEST)                                   \
7300                 ANYOF_BITMAP_SET(ret, value);           \
7301     }                                                   \
7302     yesno = '+';                                        \
7303     what = WORD;                                        \
7304     break;                                              \
7305 case ANYOF_N##NAME:                                     \
7306     if (LOC)                                            \
7307         ANYOF_CLASS_SET(ret, ANYOF_N##NAME);            \
7308     else {                                              \
7309         for (value = 0; value < 256; value++)           \
7310             if (!TEST)                                  \
7311                 ANYOF_BITMAP_SET(ret, value);           \
7312     }                                                   \
7313     yesno = '!';                                        \
7314     what = WORD;                                        \
7315     break
7316
7317 #define _C_C_T_NOLOC_(NAME,TEST,WORD)                   \
7318 ANYOF_##NAME:                                           \
7319         for (value = 0; value < 256; value++)           \
7320             if (TEST)                                   \
7321                 ANYOF_BITMAP_SET(ret, value);           \
7322     yesno = '+';                                        \
7323     what = WORD;                                        \
7324     break;                                              \
7325 case ANYOF_N##NAME:                                     \
7326         for (value = 0; value < 256; value++)           \
7327             if (!TEST)                                  \
7328                 ANYOF_BITMAP_SET(ret, value);           \
7329     yesno = '!';                                        \
7330     what = WORD;                                        \
7331     break
7332
7333 /*
7334    parse a class specification and produce either an ANYOF node that
7335    matches the pattern or if the pattern matches a single char only and
7336    that char is < 256 and we are case insensitive then we produce an 
7337    EXACT node instead.
7338 */
7339
7340 STATIC regnode *
7341 S_regclass(pTHX_ RExC_state_t *pRExC_state, U32 depth)
7342 {
7343     dVAR;
7344     register UV nextvalue;
7345     register IV prevvalue = OOB_UNICODE;
7346     register IV range = 0;
7347     UV value = 0; /* XXX:dmq: needs to be referenceable (unfortunately) */
7348     register regnode *ret;
7349     STRLEN numlen;
7350     IV namedclass;
7351     char *rangebegin = NULL;
7352     bool need_class = 0;
7353     SV *listsv = NULL;
7354     UV n;
7355     bool optimize_invert   = TRUE;
7356     AV* unicode_alternate  = NULL;
7357 #ifdef EBCDIC
7358     UV literal_endpoint = 0;
7359 #endif
7360     UV stored = 0;  /* number of chars stored in the class */
7361
7362     regnode * const orig_emit = RExC_emit; /* Save the original RExC_emit in
7363         case we need to change the emitted regop to an EXACT. */
7364     const char * orig_parse = RExC_parse;
7365     GET_RE_DEBUG_FLAGS_DECL;
7366 #ifndef DEBUGGING
7367     PERL_UNUSED_ARG(depth);
7368 #endif
7369
7370     DEBUG_PARSE("clas");
7371
7372     /* Assume we are going to generate an ANYOF node. */
7373     ret = reganode(pRExC_state, ANYOF, 0);
7374
7375     if (!SIZE_ONLY)
7376         ANYOF_FLAGS(ret) = 0;
7377
7378     if (UCHARAT(RExC_parse) == '^') {   /* Complement of range. */
7379         RExC_naughty++;
7380         RExC_parse++;
7381         if (!SIZE_ONLY)
7382             ANYOF_FLAGS(ret) |= ANYOF_INVERT;
7383     }
7384
7385     if (SIZE_ONLY) {
7386         RExC_size += ANYOF_SKIP;
7387         listsv = &PL_sv_undef; /* For code scanners: listsv always non-NULL. */
7388     }
7389     else {
7390         RExC_emit += ANYOF_SKIP;
7391         if (FOLD)
7392             ANYOF_FLAGS(ret) |= ANYOF_FOLD;
7393         if (LOC)
7394             ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
7395         ANYOF_BITMAP_ZERO(ret);
7396         listsv = newSVpvs("# comment\n");
7397     }
7398
7399     nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
7400
7401     if (!SIZE_ONLY && POSIXCC(nextvalue))
7402         checkposixcc(pRExC_state);
7403
7404     /* allow 1st char to be ] (allowing it to be - is dealt with later) */
7405     if (UCHARAT(RExC_parse) == ']')
7406         goto charclassloop;
7407
7408 parseit:
7409     while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
7410
7411     charclassloop:
7412
7413         namedclass = OOB_NAMEDCLASS; /* initialize as illegal */
7414
7415         if (!range)
7416             rangebegin = RExC_parse;
7417         if (UTF) {
7418             value = utf8n_to_uvchr((U8*)RExC_parse,
7419                                    RExC_end - RExC_parse,
7420                                    &numlen, UTF8_ALLOW_DEFAULT);
7421             RExC_parse += numlen;
7422         }
7423         else
7424             value = UCHARAT(RExC_parse++);
7425
7426         nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
7427         if (value == '[' && POSIXCC(nextvalue))
7428             namedclass = regpposixcc(pRExC_state, value);
7429         else if (value == '\\') {
7430             if (UTF) {
7431                 value = utf8n_to_uvchr((U8*)RExC_parse,
7432                                    RExC_end - RExC_parse,
7433                                    &numlen, UTF8_ALLOW_DEFAULT);
7434                 RExC_parse += numlen;
7435             }
7436             else
7437                 value = UCHARAT(RExC_parse++);
7438             /* Some compilers cannot handle switching on 64-bit integer
7439              * values, therefore value cannot be an UV.  Yes, this will
7440              * be a problem later if we want switch on Unicode.
7441              * A similar issue a little bit later when switching on
7442              * namedclass. --jhi */
7443             switch ((I32)value) {
7444             case 'w':   namedclass = ANYOF_ALNUM;       break;
7445             case 'W':   namedclass = ANYOF_NALNUM;      break;
7446             case 's':   namedclass = ANYOF_SPACE;       break;
7447             case 'S':   namedclass = ANYOF_NSPACE;      break;
7448             case 'd':   namedclass = ANYOF_DIGIT;       break;
7449             case 'D':   namedclass = ANYOF_NDIGIT;      break;
7450             case 'v':   namedclass = ANYOF_VERTWS;      break;
7451             case 'V':   namedclass = ANYOF_NVERTWS;     break;
7452             case 'h':   namedclass = ANYOF_HORIZWS;     break;
7453             case 'H':   namedclass = ANYOF_NHORIZWS;    break;
7454             case 'N':  /* Handle \N{NAME} in class */
7455                 {
7456                     /* We only pay attention to the first char of 
7457                     multichar strings being returned. I kinda wonder
7458                     if this makes sense as it does change the behaviour
7459                     from earlier versions, OTOH that behaviour was broken
7460                     as well. */
7461                     UV v; /* value is register so we cant & it /grrr */
7462                     if (reg_namedseq(pRExC_state, &v)) {
7463                         goto parseit;
7464                     }
7465                     value= v; 
7466                 }
7467                 break;
7468             case 'p':
7469             case 'P':
7470                 {
7471                 char *e;
7472                 if (RExC_parse >= RExC_end)
7473                     vFAIL2("Empty \\%c{}", (U8)value);
7474                 if (*RExC_parse == '{') {
7475                     const U8 c = (U8)value;
7476                     e = strchr(RExC_parse++, '}');
7477                     if (!e)
7478                         vFAIL2("Missing right brace on \\%c{}", c);
7479                     while (isSPACE(UCHARAT(RExC_parse)))
7480                         RExC_parse++;
7481                     if (e == RExC_parse)
7482                         vFAIL2("Empty \\%c{}", c);
7483                     n = e - RExC_parse;
7484                     while (isSPACE(UCHARAT(RExC_parse + n - 1)))
7485                         n--;
7486                 }
7487                 else {
7488                     e = RExC_parse;
7489                     n = 1;
7490                 }
7491                 if (!SIZE_ONLY) {
7492                     if (UCHARAT(RExC_parse) == '^') {
7493                          RExC_parse++;
7494                          n--;
7495                          value = value == 'p' ? 'P' : 'p'; /* toggle */
7496                          while (isSPACE(UCHARAT(RExC_parse))) {
7497                               RExC_parse++;
7498                               n--;
7499                          }
7500                     }
7501                     Perl_sv_catpvf(aTHX_ listsv, "%cutf8::%.*s\n",
7502                         (value=='p' ? '+' : '!'), (int)n, RExC_parse);
7503                 }
7504                 RExC_parse = e + 1;
7505                 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7506                 namedclass = ANYOF_MAX;  /* no official name, but it's named */
7507                 }
7508                 break;
7509             case 'n':   value = '\n';                   break;
7510             case 'r':   value = '\r';                   break;
7511             case 't':   value = '\t';                   break;
7512             case 'f':   value = '\f';                   break;
7513             case 'b':   value = '\b';                   break;
7514             case 'e':   value = ASCII_TO_NATIVE('\033');break;
7515             case 'a':   value = ASCII_TO_NATIVE('\007');break;
7516             case 'x':
7517                 if (*RExC_parse == '{') {
7518                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
7519                         | PERL_SCAN_DISALLOW_PREFIX;
7520                     char * const e = strchr(RExC_parse++, '}');
7521                     if (!e)
7522                         vFAIL("Missing right brace on \\x{}");
7523
7524                     numlen = e - RExC_parse;
7525                     value = grok_hex(RExC_parse, &numlen, &flags, NULL);
7526                     RExC_parse = e + 1;
7527                 }
7528                 else {
7529                     I32 flags = PERL_SCAN_DISALLOW_PREFIX;
7530                     numlen = 2;
7531                     value = grok_hex(RExC_parse, &numlen, &flags, NULL);
7532                     RExC_parse += numlen;
7533                 }
7534                 if (PL_encoding && value < 0x100)
7535                     goto recode_encoding;
7536                 break;
7537             case 'c':
7538                 value = UCHARAT(RExC_parse++);
7539                 value = toCTRL(value);
7540                 break;
7541             case '0': case '1': case '2': case '3': case '4':
7542             case '5': case '6': case '7': case '8': case '9':
7543                 {
7544                     I32 flags = 0;
7545                     numlen = 3;
7546                     value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
7547                     RExC_parse += numlen;
7548                     if (PL_encoding && value < 0x100)
7549                         goto recode_encoding;
7550                     break;
7551                 }
7552             recode_encoding:
7553                 {
7554                     SV* enc = PL_encoding;
7555                     value = reg_recode((const char)(U8)value, &enc);
7556                     if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
7557                         vWARN(RExC_parse,
7558                               "Invalid escape in the specified encoding");
7559                     break;
7560                 }
7561             default:
7562                 if (!SIZE_ONLY && isALPHA(value) && ckWARN(WARN_REGEXP))
7563                     vWARN2(RExC_parse,
7564                            "Unrecognized escape \\%c in character class passed through",
7565                            (int)value);
7566                 break;
7567             }
7568         } /* end of \blah */
7569 #ifdef EBCDIC
7570         else
7571             literal_endpoint++;
7572 #endif
7573
7574         if (namedclass > OOB_NAMEDCLASS) { /* this is a named class \blah */
7575
7576             if (!SIZE_ONLY && !need_class)
7577                 ANYOF_CLASS_ZERO(ret);
7578
7579             need_class = 1;
7580
7581             /* a bad range like a-\d, a-[:digit:] ? */
7582             if (range) {
7583                 if (!SIZE_ONLY) {
7584                     if (ckWARN(WARN_REGEXP)) {
7585                         const int w =
7586                             RExC_parse >= rangebegin ?
7587                             RExC_parse - rangebegin : 0;
7588                         vWARN4(RExC_parse,
7589                                "False [] range \"%*.*s\"",
7590                                w, w, rangebegin);
7591                     }
7592                     if (prevvalue < 256) {
7593                         ANYOF_BITMAP_SET(ret, prevvalue);
7594                         ANYOF_BITMAP_SET(ret, '-');
7595                     }
7596                     else {
7597                         ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7598                         Perl_sv_catpvf(aTHX_ listsv,
7599                                        "%04"UVxf"\n%04"UVxf"\n", (UV)prevvalue, (UV) '-');
7600                     }
7601                 }
7602
7603                 range = 0; /* this was not a true range */
7604             }
7605
7606
7607     
7608             if (!SIZE_ONLY) {
7609                 const char *what = NULL;
7610                 char yesno = 0;
7611
7612                 if (namedclass > OOB_NAMEDCLASS)
7613                     optimize_invert = FALSE;
7614                 /* Possible truncation here but in some 64-bit environments
7615                  * the compiler gets heartburn about switch on 64-bit values.
7616                  * A similar issue a little earlier when switching on value.
7617                  * --jhi */
7618                 switch ((I32)namedclass) {
7619                 case _C_C_T_(ALNUM, isALNUM(value), "Word");
7620                 case _C_C_T_(ALNUMC, isALNUMC(value), "Alnum");
7621                 case _C_C_T_(ALPHA, isALPHA(value), "Alpha");
7622                 case _C_C_T_(BLANK, isBLANK(value), "Blank");
7623                 case _C_C_T_(CNTRL, isCNTRL(value), "Cntrl");
7624                 case _C_C_T_(GRAPH, isGRAPH(value), "Graph");
7625                 case _C_C_T_(LOWER, isLOWER(value), "Lower");
7626                 case _C_C_T_(PRINT, isPRINT(value), "Print");
7627                 case _C_C_T_(PSXSPC, isPSXSPC(value), "Space");
7628                 case _C_C_T_(PUNCT, isPUNCT(value), "Punct");
7629                 case _C_C_T_(SPACE, isSPACE(value), "SpacePerl");
7630                 case _C_C_T_(UPPER, isUPPER(value), "Upper");
7631                 case _C_C_T_(XDIGIT, isXDIGIT(value), "XDigit");
7632                 case _C_C_T_NOLOC_(VERTWS, is_VERTWS_latin1(&value), "VertSpace");
7633                 case _C_C_T_NOLOC_(HORIZWS, is_HORIZWS_latin1(&value), "HorizSpace");
7634                 case ANYOF_ASCII:
7635                     if (LOC)
7636                         ANYOF_CLASS_SET(ret, ANYOF_ASCII);
7637                     else {
7638 #ifndef EBCDIC
7639                         for (value = 0; value < 128; value++)
7640                             ANYOF_BITMAP_SET(ret, value);
7641 #else  /* EBCDIC */
7642                         for (value = 0; value < 256; value++) {
7643                             if (isASCII(value))
7644                                 ANYOF_BITMAP_SET(ret, value);
7645                         }
7646 #endif /* EBCDIC */
7647                     }
7648                     yesno = '+';
7649                     what = "ASCII";
7650                     break;
7651                 case ANYOF_NASCII:
7652                     if (LOC)
7653                         ANYOF_CLASS_SET(ret, ANYOF_NASCII);
7654                     else {
7655 #ifndef EBCDIC
7656                         for (value = 128; value < 256; value++)
7657                             ANYOF_BITMAP_SET(ret, value);
7658 #else  /* EBCDIC */
7659                         for (value = 0; value < 256; value++) {
7660                             if (!isASCII(value))
7661                                 ANYOF_BITMAP_SET(ret, value);
7662                         }
7663 #endif /* EBCDIC */
7664                     }
7665                     yesno = '!';
7666                     what = "ASCII";
7667                     break;              
7668                 case ANYOF_DIGIT:
7669                     if (LOC)
7670                         ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
7671                     else {
7672                         /* consecutive digits assumed */
7673                         for (value = '0'; value <= '9'; value++)
7674                             ANYOF_BITMAP_SET(ret, value);
7675                     }
7676                     yesno = '+';
7677                     what = "Digit";
7678                     break;
7679                 case ANYOF_NDIGIT:
7680                     if (LOC)
7681                         ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
7682                     else {
7683                         /* consecutive digits assumed */
7684                         for (value = 0; value < '0'; value++)
7685                             ANYOF_BITMAP_SET(ret, value);
7686                         for (value = '9' + 1; value < 256; value++)
7687                             ANYOF_BITMAP_SET(ret, value);
7688                     }
7689                     yesno = '!';
7690                     what = "Digit";
7691                     break;              
7692                 case ANYOF_MAX:
7693                     /* this is to handle \p and \P */
7694                     break;
7695                 default:
7696                     vFAIL("Invalid [::] class");
7697                     break;
7698                 }
7699                 if (what) {
7700                     /* Strings such as "+utf8::isWord\n" */
7701                     Perl_sv_catpvf(aTHX_ listsv, "%cutf8::Is%s\n", yesno, what);
7702                 }
7703                 if (LOC)
7704                     ANYOF_FLAGS(ret) |= ANYOF_CLASS;
7705                 continue;
7706             }
7707         } /* end of namedclass \blah */
7708
7709         if (range) {
7710             if (prevvalue > (IV)value) /* b-a */ {
7711                 const int w = RExC_parse - rangebegin;
7712                 Simple_vFAIL4("Invalid [] range \"%*.*s\"", w, w, rangebegin);
7713                 range = 0; /* not a valid range */
7714             }
7715         }
7716         else {
7717             prevvalue = value; /* save the beginning of the range */
7718             if (*RExC_parse == '-' && RExC_parse+1 < RExC_end &&
7719                 RExC_parse[1] != ']') {
7720                 RExC_parse++;
7721
7722                 /* a bad range like \w-, [:word:]- ? */
7723                 if (namedclass > OOB_NAMEDCLASS) {
7724                     if (ckWARN(WARN_REGEXP)) {
7725                         const int w =
7726                             RExC_parse >= rangebegin ?
7727                             RExC_parse - rangebegin : 0;
7728                         vWARN4(RExC_parse,
7729                                "False [] range \"%*.*s\"",
7730                                w, w, rangebegin);
7731                     }
7732                     if (!SIZE_ONLY)
7733                         ANYOF_BITMAP_SET(ret, '-');
7734                 } else
7735                     range = 1;  /* yeah, it's a range! */
7736                 continue;       /* but do it the next time */
7737             }
7738         }
7739
7740         /* now is the next time */
7741         /*stored += (value - prevvalue + 1);*/
7742         if (!SIZE_ONLY) {
7743             if (prevvalue < 256) {
7744                 const IV ceilvalue = value < 256 ? value : 255;
7745                 IV i;
7746 #ifdef EBCDIC
7747                 /* In EBCDIC [\x89-\x91] should include
7748                  * the \x8e but [i-j] should not. */
7749                 if (literal_endpoint == 2 &&
7750                     ((isLOWER(prevvalue) && isLOWER(ceilvalue)) ||
7751                      (isUPPER(prevvalue) && isUPPER(ceilvalue))))
7752                 {
7753                     if (isLOWER(prevvalue)) {
7754                         for (i = prevvalue; i <= ceilvalue; i++)
7755                             if (isLOWER(i))
7756                                 ANYOF_BITMAP_SET(ret, i);
7757                     } else {
7758                         for (i = prevvalue; i <= ceilvalue; i++)
7759                             if (isUPPER(i))
7760                                 ANYOF_BITMAP_SET(ret, i);
7761                     }
7762                 }
7763                 else
7764 #endif
7765                       for (i = prevvalue; i <= ceilvalue; i++) {
7766                         if (!ANYOF_BITMAP_TEST(ret,i)) {
7767                             stored++;  
7768                             ANYOF_BITMAP_SET(ret, i);
7769                         }
7770                       }
7771           }
7772           if (value > 255 || UTF) {
7773                 const UV prevnatvalue  = NATIVE_TO_UNI(prevvalue);
7774                 const UV natvalue      = NATIVE_TO_UNI(value);
7775                 stored+=2; /* can't optimize this class */
7776                 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7777                 if (prevnatvalue < natvalue) { /* what about > ? */
7778                     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
7779                                    prevnatvalue, natvalue);
7780                 }
7781                 else if (prevnatvalue == natvalue) {
7782                     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", natvalue);
7783                     if (FOLD) {
7784                          U8 foldbuf[UTF8_MAXBYTES_CASE+1];
7785                          STRLEN foldlen;
7786                          const UV f = to_uni_fold(natvalue, foldbuf, &foldlen);
7787
7788 #ifdef EBCDIC /* RD t/uni/fold ff and 6b */
7789                          if (RExC_precomp[0] == ':' &&
7790                              RExC_precomp[1] == '[' &&
7791                              (f == 0xDF || f == 0x92)) {
7792                              f = NATIVE_TO_UNI(f);
7793                         }
7794 #endif
7795                          /* If folding and foldable and a single
7796                           * character, insert also the folded version
7797                           * to the charclass. */
7798                          if (f != value) {
7799 #ifdef EBCDIC /* RD tunifold ligatures s,t fb05, fb06 */
7800                              if ((RExC_precomp[0] == ':' &&
7801                                   RExC_precomp[1] == '[' &&
7802                                   (f == 0xA2 &&
7803                                    (value == 0xFB05 || value == 0xFB06))) ?
7804                                  foldlen == ((STRLEN)UNISKIP(f) - 1) :
7805                                  foldlen == (STRLEN)UNISKIP(f) )
7806 #else
7807                               if (foldlen == (STRLEN)UNISKIP(f))
7808 #endif
7809                                   Perl_sv_catpvf(aTHX_ listsv,
7810                                                  "%04"UVxf"\n", f);
7811                               else {
7812                                   /* Any multicharacter foldings
7813                                    * require the following transform:
7814                                    * [ABCDEF] -> (?:[ABCabcDEFd]|pq|rst)
7815                                    * where E folds into "pq" and F folds
7816                                    * into "rst", all other characters
7817                                    * fold to single characters.  We save
7818                                    * away these multicharacter foldings,
7819                                    * to be later saved as part of the
7820                                    * additional "s" data. */
7821                                   SV *sv;
7822
7823                                   if (!unicode_alternate)
7824                                       unicode_alternate = newAV();
7825                                   sv = newSVpvn((char*)foldbuf, foldlen);
7826                                   SvUTF8_on(sv);
7827                                   av_push(unicode_alternate, sv);
7828                               }
7829                          }
7830
7831                          /* If folding and the value is one of the Greek
7832                           * sigmas insert a few more sigmas to make the
7833                           * folding rules of the sigmas to work right.
7834                           * Note that not all the possible combinations
7835                           * are handled here: some of them are handled
7836                           * by the standard folding rules, and some of
7837                           * them (literal or EXACTF cases) are handled
7838                           * during runtime in regexec.c:S_find_byclass(). */
7839                          if (value == UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA) {
7840                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
7841                                              (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA);
7842                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
7843                                              (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
7844                          }
7845                          else if (value == UNICODE_GREEK_CAPITAL_LETTER_SIGMA)
7846                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
7847                                              (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
7848                     }
7849                 }
7850             }
7851 #ifdef EBCDIC
7852             literal_endpoint = 0;
7853 #endif
7854         }
7855
7856         range = 0; /* this range (if it was one) is done now */
7857     }
7858
7859     if (need_class) {
7860         ANYOF_FLAGS(ret) |= ANYOF_LARGE;
7861         if (SIZE_ONLY)
7862             RExC_size += ANYOF_CLASS_ADD_SKIP;
7863         else
7864             RExC_emit += ANYOF_CLASS_ADD_SKIP;
7865     }
7866
7867
7868     if (SIZE_ONLY)
7869         return ret;
7870     /****** !SIZE_ONLY AFTER HERE *********/
7871
7872     if( stored == 1 && (value < 128 || (value < 256 && !UTF))
7873         && !( ANYOF_FLAGS(ret) & ( ANYOF_FLAGS_ALL ^ ANYOF_FOLD ) )
7874     ) {
7875         /* optimize single char class to an EXACT node
7876            but *only* when its not a UTF/high char  */
7877         const char * cur_parse= RExC_parse;
7878         RExC_emit = (regnode *)orig_emit;
7879         RExC_parse = (char *)orig_parse;
7880         ret = reg_node(pRExC_state,
7881                        (U8)((ANYOF_FLAGS(ret) & ANYOF_FOLD) ? EXACTF : EXACT));
7882         RExC_parse = (char *)cur_parse;
7883         *STRING(ret)= (char)value;
7884         STR_LEN(ret)= 1;
7885         RExC_emit += STR_SZ(1);
7886         return ret;
7887     }
7888     /* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
7889     if ( /* If the only flag is folding (plus possibly inversion). */
7890         ((ANYOF_FLAGS(ret) & (ANYOF_FLAGS_ALL ^ ANYOF_INVERT)) == ANYOF_FOLD)
7891        ) {
7892         for (value = 0; value < 256; ++value) {
7893             if (ANYOF_BITMAP_TEST(ret, value)) {
7894                 UV fold = PL_fold[value];
7895
7896                 if (fold != value)
7897                     ANYOF_BITMAP_SET(ret, fold);
7898             }
7899         }
7900         ANYOF_FLAGS(ret) &= ~ANYOF_FOLD;
7901     }
7902
7903     /* optimize inverted simple patterns (e.g. [^a-z]) */
7904     if (optimize_invert &&
7905         /* If the only flag is inversion. */
7906         (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT) {
7907         for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
7908             ANYOF_BITMAP(ret)[value] ^= ANYOF_FLAGS_ALL;
7909         ANYOF_FLAGS(ret) = ANYOF_UNICODE_ALL;
7910     }
7911     {
7912         AV * const av = newAV();
7913         SV *rv;
7914         /* The 0th element stores the character class description
7915          * in its textual form: used later (regexec.c:Perl_regclass_swash())
7916          * to initialize the appropriate swash (which gets stored in
7917          * the 1st element), and also useful for dumping the regnode.
7918          * The 2nd element stores the multicharacter foldings,
7919          * used later (regexec.c:S_reginclass()). */
7920         av_store(av, 0, listsv);
7921         av_store(av, 1, NULL);
7922         av_store(av, 2, (SV*)unicode_alternate);
7923         rv = newRV_noinc((SV*)av);
7924         n = add_data(pRExC_state, 1, "s");
7925         RExC_rxi->data->data[n] = (void*)rv;
7926         ARG_SET(ret, n);
7927     }
7928     return ret;
7929 }
7930 #undef _C_C_T_
7931
7932
7933 /* reg_skipcomment()
7934
7935    Absorbs an /x style # comments from the input stream.
7936    Returns true if there is more text remaining in the stream.
7937    Will set the REG_SEEN_RUN_ON_COMMENT flag if the comment
7938    terminates the pattern without including a newline.
7939
7940    Note its the callers responsibility to ensure that we are
7941    actually in /x mode
7942
7943 */
7944
7945 STATIC bool
7946 S_reg_skipcomment(pTHX_ RExC_state_t *pRExC_state)
7947 {
7948     bool ended = 0;
7949     while (RExC_parse < RExC_end)
7950         if (*RExC_parse++ == '\n') {
7951             ended = 1;
7952             break;
7953         }
7954     if (!ended) {
7955         /* we ran off the end of the pattern without ending
7956            the comment, so we have to add an \n when wrapping */
7957         RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
7958         return 0;
7959     } else
7960         return 1;
7961 }
7962
7963 /* nextchar()
7964
7965    Advance that parse position, and optionall absorbs
7966    "whitespace" from the inputstream.
7967
7968    Without /x "whitespace" means (?#...) style comments only,
7969    with /x this means (?#...) and # comments and whitespace proper.
7970
7971    Returns the RExC_parse point from BEFORE the scan occurs.
7972
7973    This is the /x friendly way of saying RExC_parse++.
7974 */
7975
7976 STATIC char*
7977 S_nextchar(pTHX_ RExC_state_t *pRExC_state)
7978 {
7979     char* const retval = RExC_parse++;
7980
7981     for (;;) {
7982         if (*RExC_parse == '(' && RExC_parse[1] == '?' &&
7983                 RExC_parse[2] == '#') {
7984             while (*RExC_parse != ')') {
7985                 if (RExC_parse == RExC_end)
7986                     FAIL("Sequence (?#... not terminated");
7987                 RExC_parse++;
7988             }
7989             RExC_parse++;
7990             continue;
7991         }
7992         if (RExC_flags & RXf_PMf_EXTENDED) {
7993             if (isSPACE(*RExC_parse)) {
7994                 RExC_parse++;
7995                 continue;
7996             }
7997             else if (*RExC_parse == '#') {
7998                 if ( reg_skipcomment( pRExC_state ) )
7999                     continue;
8000             }
8001         }
8002         return retval;
8003     }
8004 }
8005
8006 /*
8007 - reg_node - emit a node
8008 */
8009 STATIC regnode *                        /* Location. */
8010 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
8011 {
8012     dVAR;
8013     register regnode *ptr;
8014     regnode * const ret = RExC_emit;
8015     GET_RE_DEBUG_FLAGS_DECL;
8016
8017     if (SIZE_ONLY) {
8018         SIZE_ALIGN(RExC_size);
8019         RExC_size += 1;
8020         return(ret);
8021     }
8022     if (RExC_emit >= RExC_emit_bound)
8023         Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d", op);
8024
8025     NODE_ALIGN_FILL(ret);
8026     ptr = ret;
8027     FILL_ADVANCE_NODE(ptr, op);
8028 #ifdef RE_TRACK_PATTERN_OFFSETS
8029     if (RExC_offsets) {         /* MJD */
8030         MJD_OFFSET_DEBUG(("%s:%d: (op %s) %s %"UVuf" (len %"UVuf") (max %"UVuf").\n", 
8031               "reg_node", __LINE__, 
8032               PL_reg_name[op],
8033               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] 
8034                 ? "Overwriting end of array!\n" : "OK",
8035               (UV)(RExC_emit - RExC_emit_start),
8036               (UV)(RExC_parse - RExC_start),
8037               (UV)RExC_offsets[0])); 
8038         Set_Node_Offset(RExC_emit, RExC_parse + (op == END));
8039     }
8040 #endif
8041     RExC_emit = ptr;
8042     return(ret);
8043 }
8044
8045 /*
8046 - reganode - emit a node with an argument
8047 */
8048 STATIC regnode *                        /* Location. */
8049 S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
8050 {
8051     dVAR;
8052     register regnode *ptr;
8053     regnode * const ret = RExC_emit;
8054     GET_RE_DEBUG_FLAGS_DECL;
8055
8056     if (SIZE_ONLY) {
8057         SIZE_ALIGN(RExC_size);
8058         RExC_size += 2;
8059         /* 
8060            We can't do this:
8061            
8062            assert(2==regarglen[op]+1); 
8063         
8064            Anything larger than this has to allocate the extra amount.
8065            If we changed this to be:
8066            
8067            RExC_size += (1 + regarglen[op]);
8068            
8069            then it wouldn't matter. Its not clear what side effect
8070            might come from that so its not done so far.
8071            -- dmq
8072         */
8073         return(ret);
8074     }
8075     if (RExC_emit >= RExC_emit_bound)
8076         Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %d", op);
8077
8078     NODE_ALIGN_FILL(ret);
8079     ptr = ret;
8080     FILL_ADVANCE_NODE_ARG(ptr, op, arg);
8081 #ifdef RE_TRACK_PATTERN_OFFSETS
8082     if (RExC_offsets) {         /* MJD */
8083         MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n", 
8084               "reganode",
8085               __LINE__,
8086               PL_reg_name[op],
8087               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] ? 
8088               "Overwriting end of array!\n" : "OK",
8089               (UV)(RExC_emit - RExC_emit_start),
8090               (UV)(RExC_parse - RExC_start),
8091               (UV)RExC_offsets[0])); 
8092         Set_Cur_Node_Offset;
8093     }
8094 #endif            
8095     RExC_emit = ptr;
8096     return(ret);
8097 }
8098
8099 /*
8100 - reguni - emit (if appropriate) a Unicode character
8101 */
8102 STATIC STRLEN
8103 S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char* s)
8104 {
8105     dVAR;
8106     return SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
8107 }
8108
8109 /*
8110 - reginsert - insert an operator in front of already-emitted operand
8111 *
8112 * Means relocating the operand.
8113 */
8114 STATIC void
8115 S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
8116 {
8117     dVAR;
8118     register regnode *src;
8119     register regnode *dst;
8120     register regnode *place;
8121     const int offset = regarglen[(U8)op];
8122     const int size = NODE_STEP_REGNODE + offset;
8123     GET_RE_DEBUG_FLAGS_DECL;
8124     PERL_UNUSED_ARG(depth);
8125 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
8126     DEBUG_PARSE_FMT("inst"," - %s",PL_reg_name[op]);
8127     if (SIZE_ONLY) {
8128         RExC_size += size;
8129         return;
8130     }
8131
8132     src = RExC_emit;
8133     RExC_emit += size;
8134     dst = RExC_emit;
8135     if (RExC_open_parens) {
8136         int paren;
8137         /*DEBUG_PARSE_FMT("inst"," - %"IVdf, (IV)RExC_npar);*/
8138         for ( paren=0 ; paren < RExC_npar ; paren++ ) {
8139             if ( RExC_open_parens[paren] >= opnd ) {
8140                 /*DEBUG_PARSE_FMT("open"," - %d",size);*/
8141                 RExC_open_parens[paren] += size;
8142             } else {
8143                 /*DEBUG_PARSE_FMT("open"," - %s","ok");*/
8144             }
8145             if ( RExC_close_parens[paren] >= opnd ) {
8146                 /*DEBUG_PARSE_FMT("close"," - %d",size);*/
8147                 RExC_close_parens[paren] += size;
8148             } else {
8149                 /*DEBUG_PARSE_FMT("close"," - %s","ok");*/
8150             }
8151         }
8152     }
8153
8154     while (src > opnd) {
8155         StructCopy(--src, --dst, regnode);
8156 #ifdef RE_TRACK_PATTERN_OFFSETS
8157         if (RExC_offsets) {     /* MJD 20010112 */
8158             MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s copy %"UVuf" -> %"UVuf" (max %"UVuf").\n",
8159                   "reg_insert",
8160                   __LINE__,
8161                   PL_reg_name[op],
8162                   (UV)(dst - RExC_emit_start) > RExC_offsets[0] 
8163                     ? "Overwriting end of array!\n" : "OK",
8164                   (UV)(src - RExC_emit_start),
8165                   (UV)(dst - RExC_emit_start),
8166                   (UV)RExC_offsets[0])); 
8167             Set_Node_Offset_To_R(dst-RExC_emit_start, Node_Offset(src));
8168             Set_Node_Length_To_R(dst-RExC_emit_start, Node_Length(src));
8169         }
8170 #endif
8171     }
8172     
8173
8174     place = opnd;               /* Op node, where operand used to be. */
8175 #ifdef RE_TRACK_PATTERN_OFFSETS
8176     if (RExC_offsets) {         /* MJD */
8177         MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n", 
8178               "reginsert",
8179               __LINE__,
8180               PL_reg_name[op],
8181               (UV)(place - RExC_emit_start) > RExC_offsets[0] 
8182               ? "Overwriting end of array!\n" : "OK",
8183               (UV)(place - RExC_emit_start),
8184               (UV)(RExC_parse - RExC_start),
8185               (UV)RExC_offsets[0]));
8186         Set_Node_Offset(place, RExC_parse);
8187         Set_Node_Length(place, 1);
8188     }
8189 #endif    
8190     src = NEXTOPER(place);
8191     FILL_ADVANCE_NODE(place, op);
8192     Zero(src, offset, regnode);
8193 }
8194
8195 /*
8196 - regtail - set the next-pointer at the end of a node chain of p to val.
8197 - SEE ALSO: regtail_study
8198 */
8199 /* TODO: All three parms should be const */
8200 STATIC void
8201 S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
8202 {
8203     dVAR;
8204     register regnode *scan;
8205     GET_RE_DEBUG_FLAGS_DECL;
8206 #ifndef DEBUGGING
8207     PERL_UNUSED_ARG(depth);
8208 #endif
8209
8210     if (SIZE_ONLY)
8211         return;
8212
8213     /* Find last node. */
8214     scan = p;
8215     for (;;) {
8216         regnode * const temp = regnext(scan);
8217         DEBUG_PARSE_r({
8218             SV * const mysv=sv_newmortal();
8219             DEBUG_PARSE_MSG((scan==p ? "tail" : ""));
8220             regprop(RExC_rx, mysv, scan);
8221             PerlIO_printf(Perl_debug_log, "~ %s (%d) %s %s\n",
8222                 SvPV_nolen_const(mysv), REG_NODE_NUM(scan),
8223                     (temp == NULL ? "->" : ""),
8224                     (temp == NULL ? PL_reg_name[OP(val)] : "")
8225             );
8226         });
8227         if (temp == NULL)
8228             break;
8229         scan = temp;
8230     }
8231
8232     if (reg_off_by_arg[OP(scan)]) {
8233         ARG_SET(scan, val - scan);
8234     }
8235     else {
8236         NEXT_OFF(scan) = val - scan;
8237     }
8238 }
8239
8240 #ifdef DEBUGGING
8241 /*
8242 - regtail_study - set the next-pointer at the end of a node chain of p to val.
8243 - Look for optimizable sequences at the same time.
8244 - currently only looks for EXACT chains.
8245
8246 This is expermental code. The idea is to use this routine to perform 
8247 in place optimizations on branches and groups as they are constructed,
8248 with the long term intention of removing optimization from study_chunk so
8249 that it is purely analytical.
8250
8251 Currently only used when in DEBUG mode. The macro REGTAIL_STUDY() is used
8252 to control which is which.
8253
8254 */
8255 /* TODO: All four parms should be const */
8256
8257 STATIC U8
8258 S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
8259 {
8260     dVAR;
8261     register regnode *scan;
8262     U8 exact = PSEUDO;
8263 #ifdef EXPERIMENTAL_INPLACESCAN
8264     I32 min = 0;
8265 #endif
8266
8267     GET_RE_DEBUG_FLAGS_DECL;
8268
8269
8270     if (SIZE_ONLY)
8271         return exact;
8272
8273     /* Find last node. */
8274
8275     scan = p;
8276     for (;;) {
8277         regnode * const temp = regnext(scan);
8278 #ifdef EXPERIMENTAL_INPLACESCAN
8279         if (PL_regkind[OP(scan)] == EXACT)
8280             if (join_exact(pRExC_state,scan,&min,1,val,depth+1))
8281                 return EXACT;
8282 #endif
8283         if ( exact ) {
8284             switch (OP(scan)) {
8285                 case EXACT:
8286                 case EXACTF:
8287                 case EXACTFL:
8288                         if( exact == PSEUDO )
8289                             exact= OP(scan);
8290                         else if ( exact != OP(scan) )
8291                             exact= 0;
8292                 case NOTHING:
8293                     break;
8294                 default:
8295                     exact= 0;
8296             }
8297         }
8298         DEBUG_PARSE_r({
8299             SV * const mysv=sv_newmortal();
8300             DEBUG_PARSE_MSG((scan==p ? "tsdy" : ""));
8301             regprop(RExC_rx, mysv, scan);
8302             PerlIO_printf(Perl_debug_log, "~ %s (%d) -> %s\n",
8303                 SvPV_nolen_const(mysv),
8304                 REG_NODE_NUM(scan),
8305                 PL_reg_name[exact]);
8306         });
8307         if (temp == NULL)
8308             break;
8309         scan = temp;
8310     }
8311     DEBUG_PARSE_r({
8312         SV * const mysv_val=sv_newmortal();
8313         DEBUG_PARSE_MSG("");
8314         regprop(RExC_rx, mysv_val, val);
8315         PerlIO_printf(Perl_debug_log, "~ attach to %s (%"IVdf") offset to %"IVdf"\n",
8316                       SvPV_nolen_const(mysv_val),
8317                       (IV)REG_NODE_NUM(val),
8318                       (IV)(val - scan)
8319         );
8320     });
8321     if (reg_off_by_arg[OP(scan)]) {
8322         ARG_SET(scan, val - scan);
8323     }
8324     else {
8325         NEXT_OFF(scan) = val - scan;
8326     }
8327
8328     return exact;
8329 }
8330 #endif
8331
8332 /*
8333  - regcurly - a little FSA that accepts {\d+,?\d*}
8334  */
8335 STATIC I32
8336 S_regcurly(register const char *s)
8337 {
8338     if (*s++ != '{')
8339         return FALSE;
8340     if (!isDIGIT(*s))
8341         return FALSE;
8342     while (isDIGIT(*s))
8343         s++;
8344     if (*s == ',')
8345         s++;
8346     while (isDIGIT(*s))
8347         s++;
8348     if (*s != '}')
8349         return FALSE;
8350     return TRUE;
8351 }
8352
8353
8354 /*
8355  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
8356  */
8357 void
8358 Perl_regdump(pTHX_ const regexp *r)
8359 {
8360 #ifdef DEBUGGING
8361     dVAR;
8362     SV * const sv = sv_newmortal();
8363     SV *dsv= sv_newmortal();
8364     RXi_GET_DECL(r,ri);
8365
8366     (void)dumpuntil(r, ri->program, ri->program + 1, NULL, NULL, sv, 0, 0);
8367
8368     /* Header fields of interest. */
8369     if (r->anchored_substr) {
8370         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->anchored_substr), 
8371             RE_SV_DUMPLEN(r->anchored_substr), 30);
8372         PerlIO_printf(Perl_debug_log,
8373                       "anchored %s%s at %"IVdf" ",
8374                       s, RE_SV_TAIL(r->anchored_substr),
8375                       (IV)r->anchored_offset);
8376     } else if (r->anchored_utf8) {
8377         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->anchored_utf8), 
8378             RE_SV_DUMPLEN(r->anchored_utf8), 30);
8379         PerlIO_printf(Perl_debug_log,
8380                       "anchored utf8 %s%s at %"IVdf" ",
8381                       s, RE_SV_TAIL(r->anchored_utf8),
8382                       (IV)r->anchored_offset);
8383     }                 
8384     if (r->float_substr) {
8385         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->float_substr), 
8386             RE_SV_DUMPLEN(r->float_substr), 30);
8387         PerlIO_printf(Perl_debug_log,
8388                       "floating %s%s at %"IVdf"..%"UVuf" ",
8389                       s, RE_SV_TAIL(r->float_substr),
8390                       (IV)r->float_min_offset, (UV)r->float_max_offset);
8391     } else if (r->float_utf8) {
8392         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->float_utf8), 
8393             RE_SV_DUMPLEN(r->float_utf8), 30);
8394         PerlIO_printf(Perl_debug_log,
8395                       "floating utf8 %s%s at %"IVdf"..%"UVuf" ",
8396                       s, RE_SV_TAIL(r->float_utf8),
8397                       (IV)r->float_min_offset, (UV)r->float_max_offset);
8398     }
8399     if (r->check_substr || r->check_utf8)
8400         PerlIO_printf(Perl_debug_log,
8401                       (const char *)
8402                       (r->check_substr == r->float_substr
8403                        && r->check_utf8 == r->float_utf8
8404                        ? "(checking floating" : "(checking anchored"));
8405     if (r->extflags & RXf_NOSCAN)
8406         PerlIO_printf(Perl_debug_log, " noscan");
8407     if (r->extflags & RXf_CHECK_ALL)
8408         PerlIO_printf(Perl_debug_log, " isall");
8409     if (r->check_substr || r->check_utf8)
8410         PerlIO_printf(Perl_debug_log, ") ");
8411
8412     if (ri->regstclass) {
8413         regprop(r, sv, ri->regstclass);
8414         PerlIO_printf(Perl_debug_log, "stclass %s ", SvPVX_const(sv));
8415     }
8416     if (r->extflags & RXf_ANCH) {
8417         PerlIO_printf(Perl_debug_log, "anchored");
8418         if (r->extflags & RXf_ANCH_BOL)
8419             PerlIO_printf(Perl_debug_log, "(BOL)");
8420         if (r->extflags & RXf_ANCH_MBOL)
8421             PerlIO_printf(Perl_debug_log, "(MBOL)");
8422         if (r->extflags & RXf_ANCH_SBOL)
8423             PerlIO_printf(Perl_debug_log, "(SBOL)");
8424         if (r->extflags & RXf_ANCH_GPOS)
8425             PerlIO_printf(Perl_debug_log, "(GPOS)");
8426         PerlIO_putc(Perl_debug_log, ' ');
8427     }
8428     if (r->extflags & RXf_GPOS_SEEN)
8429         PerlIO_printf(Perl_debug_log, "GPOS:%"UVuf" ", (UV)r->gofs);
8430     if (r->intflags & PREGf_SKIP)
8431         PerlIO_printf(Perl_debug_log, "plus ");
8432     if (r->intflags & PREGf_IMPLICIT)
8433         PerlIO_printf(Perl_debug_log, "implicit ");
8434     PerlIO_printf(Perl_debug_log, "minlen %"IVdf" ", (IV)r->minlen);
8435     if (r->extflags & RXf_EVAL_SEEN)
8436         PerlIO_printf(Perl_debug_log, "with eval ");
8437     PerlIO_printf(Perl_debug_log, "\n");
8438 #else
8439     PERL_UNUSED_CONTEXT;
8440     PERL_UNUSED_ARG(r);
8441 #endif  /* DEBUGGING */
8442 }
8443
8444 /*
8445 - regprop - printable representation of opcode
8446 */
8447 void
8448 Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o)
8449 {
8450 #ifdef DEBUGGING
8451     dVAR;
8452     register int k;
8453     RXi_GET_DECL(prog,progi);
8454     GET_RE_DEBUG_FLAGS_DECL;
8455     
8456
8457     sv_setpvn(sv, "", 0);
8458
8459     if (OP(o) > REGNODE_MAX)            /* regnode.type is unsigned */
8460         /* It would be nice to FAIL() here, but this may be called from
8461            regexec.c, and it would be hard to supply pRExC_state. */
8462         Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", (int)OP(o), (int)REGNODE_MAX);
8463     sv_catpv(sv, PL_reg_name[OP(o)]); /* Take off const! */
8464
8465     k = PL_regkind[OP(o)];
8466
8467     if (k == EXACT) {
8468         SV * const dsv = sv_2mortal(newSVpvs(""));
8469         /* Using is_utf8_string() (via PERL_PV_UNI_DETECT) 
8470          * is a crude hack but it may be the best for now since 
8471          * we have no flag "this EXACTish node was UTF-8" 
8472          * --jhi */
8473         const char * const s = 
8474             pv_pretty(dsv, STRING(o), STR_LEN(o), 60, 
8475                 PL_colors[0], PL_colors[1],
8476                 PERL_PV_ESCAPE_UNI_DETECT |
8477                 PERL_PV_PRETTY_ELIPSES    |
8478                 PERL_PV_PRETTY_LTGT    
8479             ); 
8480         Perl_sv_catpvf(aTHX_ sv, " %s", s );
8481     } else if (k == TRIE) {
8482         /* print the details of the trie in dumpuntil instead, as
8483          * progi->data isn't available here */
8484         const char op = OP(o);
8485         const U32 n = ARG(o);
8486         const reg_ac_data * const ac = IS_TRIE_AC(op) ?
8487                (reg_ac_data *)progi->data->data[n] :
8488                NULL;
8489         const reg_trie_data * const trie
8490             = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
8491         
8492         Perl_sv_catpvf(aTHX_ sv, "-%s",PL_reg_name[o->flags]);
8493         DEBUG_TRIE_COMPILE_r(
8494             Perl_sv_catpvf(aTHX_ sv,
8495                 "<S:%"UVuf"/%"IVdf" W:%"UVuf" L:%"UVuf"/%"UVuf" C:%"UVuf"/%"UVuf">",
8496                 (UV)trie->startstate,
8497                 (IV)trie->statecount-1, /* -1 because of the unused 0 element */
8498                 (UV)trie->wordcount,
8499                 (UV)trie->minlen,
8500                 (UV)trie->maxlen,
8501                 (UV)TRIE_CHARCOUNT(trie),
8502                 (UV)trie->uniquecharcount
8503             )
8504         );
8505         if ( IS_ANYOF_TRIE(op) || trie->bitmap ) {
8506             int i;
8507             int rangestart = -1;
8508             U8* bitmap = IS_ANYOF_TRIE(op) ? (U8*)ANYOF_BITMAP(o) : (U8*)TRIE_BITMAP(trie);
8509             Perl_sv_catpvf(aTHX_ sv, "[");
8510             for (i = 0; i <= 256; i++) {
8511                 if (i < 256 && BITMAP_TEST(bitmap,i)) {
8512                     if (rangestart == -1)
8513                         rangestart = i;
8514                 } else if (rangestart != -1) {
8515                     if (i <= rangestart + 3)
8516                         for (; rangestart < i; rangestart++)
8517                             put_byte(sv, rangestart);
8518                     else {
8519                         put_byte(sv, rangestart);
8520                         sv_catpvs(sv, "-");
8521                         put_byte(sv, i - 1);
8522                     }
8523                     rangestart = -1;
8524                 }
8525             }
8526             Perl_sv_catpvf(aTHX_ sv, "]");
8527         } 
8528          
8529     } else if (k == CURLY) {
8530         if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
8531             Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
8532         Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
8533     }
8534     else if (k == WHILEM && o->flags)                   /* Ordinal/of */
8535         Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
8536     else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP || OP(o)==ACCEPT) {
8537         Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o));    /* Parenth number */
8538         if ( prog->paren_names ) {
8539             if ( k != REF || OP(o) < NREF) {        
8540                 AV *list= (AV *)progi->data->data[progi->name_list_idx];
8541                 SV **name= av_fetch(list, ARG(o), 0 );
8542                 if (name)
8543                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
8544             }       
8545             else {
8546                 AV *list= (AV *)progi->data->data[ progi->name_list_idx ];
8547                 SV *sv_dat=(SV*)progi->data->data[ ARG( o ) ];
8548                 I32 *nums=(I32*)SvPVX(sv_dat);
8549                 SV **name= av_fetch(list, nums[0], 0 );
8550                 I32 n;
8551                 if (name) {
8552                     for ( n=0; n<SvIVX(sv_dat); n++ ) {
8553                         Perl_sv_catpvf(aTHX_ sv, "%s%"IVdf,
8554                                     (n ? "," : ""), (IV)nums[n]);
8555                     }
8556                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
8557                 }
8558             }
8559         }            
8560     } else if (k == GOSUB) 
8561         Perl_sv_catpvf(aTHX_ sv, "%d[%+d]", (int)ARG(o),(int)ARG2L(o)); /* Paren and offset */
8562     else if (k == VERB) {
8563         if (!o->flags) 
8564             Perl_sv_catpvf(aTHX_ sv, ":%"SVf, 
8565                 SVfARG((SV*)progi->data->data[ ARG( o ) ]));
8566     } else if (k == LOGICAL)
8567         Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);     /* 2: embedded, otherwise 1 */
8568     else if (k == ANYOF) {
8569         int i, rangestart = -1;
8570         const U8 flags = ANYOF_FLAGS(o);
8571
8572         /* Should be synchronized with * ANYOF_ #xdefines in regcomp.h */
8573         static const char * const anyofs[] = {
8574             "\\w",
8575             "\\W",
8576             "\\s",
8577             "\\S",
8578             "\\d",
8579             "\\D",
8580             "[:alnum:]",
8581             "[:^alnum:]",
8582             "[:alpha:]",
8583             "[:^alpha:]",
8584             "[:ascii:]",
8585             "[:^ascii:]",
8586             "[:ctrl:]",
8587             "[:^ctrl:]",
8588             "[:graph:]",
8589             "[:^graph:]",
8590             "[:lower:]",
8591             "[:^lower:]",
8592             "[:print:]",
8593             "[:^print:]",
8594             "[:punct:]",
8595             "[:^punct:]",
8596             "[:upper:]",
8597             "[:^upper:]",
8598             "[:xdigit:]",
8599             "[:^xdigit:]",
8600             "[:space:]",
8601             "[:^space:]",
8602             "[:blank:]",
8603             "[:^blank:]"
8604         };
8605
8606         if (flags & ANYOF_LOCALE)
8607             sv_catpvs(sv, "{loc}");
8608         if (flags & ANYOF_FOLD)
8609             sv_catpvs(sv, "{i}");
8610         Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
8611         if (flags & ANYOF_INVERT)
8612             sv_catpvs(sv, "^");
8613         for (i = 0; i <= 256; i++) {
8614             if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
8615                 if (rangestart == -1)
8616                     rangestart = i;
8617             } else if (rangestart != -1) {
8618                 if (i <= rangestart + 3)
8619                     for (; rangestart < i; rangestart++)
8620                         put_byte(sv, rangestart);
8621                 else {
8622                     put_byte(sv, rangestart);
8623                     sv_catpvs(sv, "-");
8624                     put_byte(sv, i - 1);
8625                 }
8626                 rangestart = -1;
8627             }
8628         }
8629
8630         if (o->flags & ANYOF_CLASS)
8631             for (i = 0; i < (int)(sizeof(anyofs)/sizeof(char*)); i++)
8632                 if (ANYOF_CLASS_TEST(o,i))
8633                     sv_catpv(sv, anyofs[i]);
8634
8635         if (flags & ANYOF_UNICODE)
8636             sv_catpvs(sv, "{unicode}");
8637         else if (flags & ANYOF_UNICODE_ALL)
8638             sv_catpvs(sv, "{unicode_all}");
8639
8640         {
8641             SV *lv;
8642             SV * const sw = regclass_swash(prog, o, FALSE, &lv, 0);
8643         
8644             if (lv) {
8645                 if (sw) {
8646                     U8 s[UTF8_MAXBYTES_CASE+1];
8647                 
8648                     for (i = 0; i <= 256; i++) { /* just the first 256 */
8649                         uvchr_to_utf8(s, i);
8650                         
8651                         if (i < 256 && swash_fetch(sw, s, TRUE)) {
8652                             if (rangestart == -1)
8653                                 rangestart = i;
8654                         } else if (rangestart != -1) {
8655                             if (i <= rangestart + 3)
8656                                 for (; rangestart < i; rangestart++) {
8657                                     const U8 * const e = uvchr_to_utf8(s,rangestart);
8658                                     U8 *p;
8659                                     for(p = s; p < e; p++)
8660                                         put_byte(sv, *p);
8661                                 }
8662                             else {
8663                                 const U8 *e = uvchr_to_utf8(s,rangestart);
8664                                 U8 *p;
8665                                 for (p = s; p < e; p++)
8666                                     put_byte(sv, *p);
8667                                 sv_catpvs(sv, "-");
8668                                 e = uvchr_to_utf8(s, i-1);
8669                                 for (p = s; p < e; p++)
8670                                     put_byte(sv, *p);
8671                                 }
8672                                 rangestart = -1;
8673                             }
8674                         }
8675                         
8676                     sv_catpvs(sv, "..."); /* et cetera */
8677                 }
8678
8679                 {
8680                     char *s = savesvpv(lv);
8681                     char * const origs = s;
8682                 
8683                     while (*s && *s != '\n')
8684                         s++;
8685                 
8686                     if (*s == '\n') {
8687                         const char * const t = ++s;
8688                         
8689                         while (*s) {
8690                             if (*s == '\n')
8691                                 *s = ' ';
8692                             s++;
8693                         }
8694                         if (s[-1] == ' ')
8695                             s[-1] = 0;
8696                         
8697                         sv_catpv(sv, t);
8698                     }
8699                 
8700                     Safefree(origs);
8701                 }
8702             }
8703         }
8704
8705         Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
8706     }
8707     else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
8708         Perl_sv_catpvf(aTHX_ sv, "[%d]", -(o->flags));
8709 #else
8710     PERL_UNUSED_CONTEXT;
8711     PERL_UNUSED_ARG(sv);
8712     PERL_UNUSED_ARG(o);
8713     PERL_UNUSED_ARG(prog);
8714 #endif  /* DEBUGGING */
8715 }
8716
8717 SV *
8718 Perl_re_intuit_string(pTHX_ regexp *prog)
8719 {                               /* Assume that RE_INTUIT is set */
8720     dVAR;
8721     GET_RE_DEBUG_FLAGS_DECL;
8722     PERL_UNUSED_CONTEXT;
8723
8724     DEBUG_COMPILE_r(
8725         {
8726             const char * const s = SvPV_nolen_const(prog->check_substr
8727                       ? prog->check_substr : prog->check_utf8);
8728
8729             if (!PL_colorset) reginitcolors();
8730             PerlIO_printf(Perl_debug_log,
8731                       "%sUsing REx %ssubstr:%s \"%s%.60s%s%s\"\n",
8732                       PL_colors[4],
8733                       prog->check_substr ? "" : "utf8 ",
8734                       PL_colors[5],PL_colors[0],
8735                       s,
8736                       PL_colors[1],
8737                       (strlen(s) > 60 ? "..." : ""));
8738         } );
8739
8740     return prog->check_substr ? prog->check_substr : prog->check_utf8;
8741 }
8742
8743 /* 
8744    pregfree() 
8745    
8746    handles refcounting and freeing the perl core regexp structure. When 
8747    it is necessary to actually free the structure the first thing it 
8748    does is call the 'free' method of the regexp_engine associated to to 
8749    the regexp, allowing the handling of the void *pprivate; member 
8750    first. (This routine is not overridable by extensions, which is why 
8751    the extensions free is called first.)
8752    
8753    See regdupe and regdupe_internal if you change anything here. 
8754 */
8755 #ifndef PERL_IN_XSUB_RE
8756 void
8757 Perl_pregfree(pTHX_ struct regexp *r)
8758 {
8759     dVAR;
8760     GET_RE_DEBUG_FLAGS_DECL;
8761
8762     if (!r || (--r->refcnt > 0))
8763         return;
8764     if (r->mother_re) {
8765         ReREFCNT_dec(r->mother_re);
8766     } else {
8767         CALLREGFREE_PVT(r); /* free the private data */
8768         if (r->paren_names)
8769             SvREFCNT_dec(r->paren_names);
8770         Safefree(r->wrapped);
8771     }        
8772     if (r->substrs) {
8773         if (r->anchored_substr)
8774             SvREFCNT_dec(r->anchored_substr);
8775         if (r->anchored_utf8)
8776             SvREFCNT_dec(r->anchored_utf8);
8777         if (r->float_substr)
8778             SvREFCNT_dec(r->float_substr);
8779         if (r->float_utf8)
8780             SvREFCNT_dec(r->float_utf8);
8781         Safefree(r->substrs);
8782     }
8783     RX_MATCH_COPY_FREE(r);
8784 #ifdef PERL_OLD_COPY_ON_WRITE
8785     if (r->saved_copy)
8786         SvREFCNT_dec(r->saved_copy);
8787 #endif
8788     Safefree(r->swap);
8789     Safefree(r->offs);
8790     Safefree(r);
8791 }
8792
8793 /*  reg_temp_copy()
8794     
8795     This is a hacky workaround to the structural issue of match results
8796     being stored in the regexp structure which is in turn stored in
8797     PL_curpm/PL_reg_curpm. The problem is that due to qr// the pattern
8798     could be PL_curpm in multiple contexts, and could require multiple
8799     result sets being associated with the pattern simultaneously, such
8800     as when doing a recursive match with (??{$qr})
8801     
8802     The solution is to make a lightweight copy of the regexp structure 
8803     when a qr// is returned from the code executed by (??{$qr}) this
8804     lightweight copy doesnt actually own any of its data except for
8805     the starp/end and the actual regexp structure itself. 
8806     
8807 */    
8808     
8809     
8810 regexp *
8811 Perl_reg_temp_copy (pTHX_ struct regexp *r) {
8812     regexp *ret;
8813     register const I32 npar = r->nparens+1;
8814     (void)ReREFCNT_inc(r);
8815     Newx(ret, 1, regexp);
8816     StructCopy(r, ret, regexp);
8817     Newx(ret->offs, npar, regexp_paren_pair);
8818     Copy(r->offs, ret->offs, npar, regexp_paren_pair);
8819     ret->refcnt = 1;
8820     if (r->substrs) {
8821         Newx(ret->substrs, 1, struct reg_substr_data);
8822         StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
8823
8824         SvREFCNT_inc_void(ret->anchored_substr);
8825         SvREFCNT_inc_void(ret->anchored_utf8);
8826         SvREFCNT_inc_void(ret->float_substr);
8827         SvREFCNT_inc_void(ret->float_utf8);
8828
8829         /* check_substr and check_utf8, if non-NULL, point to either their
8830            anchored or float namesakes, and don't hold a second reference.  */
8831     }
8832     RX_MATCH_COPIED_off(ret);
8833 #ifdef PERL_OLD_COPY_ON_WRITE
8834     /* this is broken. */
8835     assert(0); 
8836     if (ret->saved_copy)
8837         ret->saved_copy=NULL;
8838 #endif
8839     ret->mother_re = r; 
8840     ret->swap = NULL;
8841     
8842     return ret;
8843 }
8844 #endif
8845
8846 /* regfree_internal() 
8847
8848    Free the private data in a regexp. This is overloadable by 
8849    extensions. Perl takes care of the regexp structure in pregfree(), 
8850    this covers the *pprivate pointer which technically perldoesnt 
8851    know about, however of course we have to handle the 
8852    regexp_internal structure when no extension is in use. 
8853    
8854    Note this is called before freeing anything in the regexp 
8855    structure. 
8856  */
8857  
8858 void
8859 Perl_regfree_internal(pTHX_ struct regexp *r)
8860 {
8861     dVAR;
8862     RXi_GET_DECL(r,ri);
8863     GET_RE_DEBUG_FLAGS_DECL;
8864     
8865     DEBUG_COMPILE_r({
8866         if (!PL_colorset)
8867             reginitcolors();
8868         {
8869             SV *dsv= sv_newmortal();
8870             RE_PV_QUOTED_DECL(s, (r->extflags & RXf_UTF8),
8871                 dsv, r->precomp, r->prelen, 60);
8872             PerlIO_printf(Perl_debug_log,"%sFreeing REx:%s %s\n", 
8873                 PL_colors[4],PL_colors[5],s);
8874         }
8875     });
8876 #ifdef RE_TRACK_PATTERN_OFFSETS
8877     if (ri->u.offsets)
8878         Safefree(ri->u.offsets);             /* 20010421 MJD */
8879 #endif
8880     if (ri->data) {
8881         int n = ri->data->count;
8882         PAD* new_comppad = NULL;
8883         PAD* old_comppad;
8884         PADOFFSET refcnt;
8885
8886         while (--n >= 0) {
8887           /* If you add a ->what type here, update the comment in regcomp.h */
8888             switch (ri->data->what[n]) {
8889             case 's':
8890             case 'S':
8891             case 'u':
8892                 SvREFCNT_dec((SV*)ri->data->data[n]);
8893                 break;
8894             case 'f':
8895                 Safefree(ri->data->data[n]);
8896                 break;
8897             case 'p':
8898                 new_comppad = (AV*)ri->data->data[n];
8899                 break;
8900             case 'o':
8901                 if (new_comppad == NULL)
8902                     Perl_croak(aTHX_ "panic: pregfree comppad");
8903                 PAD_SAVE_LOCAL(old_comppad,
8904                     /* Watch out for global destruction's random ordering. */
8905                     (SvTYPE(new_comppad) == SVt_PVAV) ? new_comppad : NULL
8906                 );
8907                 OP_REFCNT_LOCK;
8908                 refcnt = OpREFCNT_dec((OP_4tree*)ri->data->data[n]);
8909                 OP_REFCNT_UNLOCK;
8910                 if (!refcnt)
8911                     op_free((OP_4tree*)ri->data->data[n]);
8912
8913                 PAD_RESTORE_LOCAL(old_comppad);
8914                 SvREFCNT_dec((SV*)new_comppad);
8915                 new_comppad = NULL;
8916                 break;
8917             case 'n':
8918                 break;
8919             case 'T':           
8920                 { /* Aho Corasick add-on structure for a trie node.
8921                      Used in stclass optimization only */
8922                     U32 refcount;
8923                     reg_ac_data *aho=(reg_ac_data*)ri->data->data[n];
8924                     OP_REFCNT_LOCK;
8925                     refcount = --aho->refcount;
8926                     OP_REFCNT_UNLOCK;
8927                     if ( !refcount ) {
8928                         PerlMemShared_free(aho->states);
8929                         PerlMemShared_free(aho->fail);
8930                          /* do this last!!!! */
8931                         PerlMemShared_free(ri->data->data[n]);
8932                         PerlMemShared_free(ri->regstclass);
8933                     }
8934                 }
8935                 break;
8936             case 't':
8937                 {
8938                     /* trie structure. */
8939                     U32 refcount;
8940                     reg_trie_data *trie=(reg_trie_data*)ri->data->data[n];
8941                     OP_REFCNT_LOCK;
8942                     refcount = --trie->refcount;
8943                     OP_REFCNT_UNLOCK;
8944                     if ( !refcount ) {
8945                         PerlMemShared_free(trie->charmap);
8946                         PerlMemShared_free(trie->states);
8947                         PerlMemShared_free(trie->trans);
8948                         if (trie->bitmap)
8949                             PerlMemShared_free(trie->bitmap);
8950                         if (trie->wordlen)
8951                             PerlMemShared_free(trie->wordlen);
8952                         if (trie->jump)
8953                             PerlMemShared_free(trie->jump);
8954                         if (trie->nextword)
8955                             PerlMemShared_free(trie->nextword);
8956                         /* do this last!!!! */
8957                         PerlMemShared_free(ri->data->data[n]);
8958                     }
8959                 }
8960                 break;
8961             default:
8962                 Perl_croak(aTHX_ "panic: regfree data code '%c'", ri->data->what[n]);
8963             }
8964         }
8965         Safefree(ri->data->what);
8966         Safefree(ri->data);
8967     }
8968
8969     Safefree(ri);
8970 }
8971
8972 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8973 #define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8974 #define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8975 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
8976
8977 /* 
8978    re_dup - duplicate a regexp. 
8979    
8980    This routine is expected to clone a given regexp structure. It is not
8981    compiler under USE_ITHREADS.
8982
8983    After all of the core data stored in struct regexp is duplicated
8984    the regexp_engine.dupe method is used to copy any private data
8985    stored in the *pprivate pointer. This allows extensions to handle
8986    any duplication it needs to do.
8987
8988    See pregfree() and regfree_internal() if you change anything here. 
8989 */
8990 #if defined(USE_ITHREADS)
8991 #ifndef PERL_IN_XSUB_RE
8992 regexp *
8993 Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param)
8994 {
8995     dVAR;
8996     regexp *ret;
8997     I32 npar;
8998
8999     if (!r)
9000         return (REGEXP *)NULL;
9001
9002     if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
9003         return ret;
9004
9005     
9006     npar = r->nparens+1;
9007     Newx(ret, 1, regexp);
9008     StructCopy(r, ret, regexp);
9009     Newx(ret->offs, npar, regexp_paren_pair);
9010     Copy(r->offs, ret->offs, npar, regexp_paren_pair);
9011     if(ret->swap) {
9012         /* no need to copy these */
9013         Newx(ret->swap, npar, regexp_paren_pair);
9014     }
9015
9016     if (ret->substrs) {
9017         /* Do it this way to avoid reading from *r after the StructCopy().
9018            That way, if any of the sv_dup_inc()s dislodge *r from the L1
9019            cache, it doesn't matter.  */
9020         const bool anchored = r->check_substr == r->anchored_substr;
9021         Newx(ret->substrs, 1, struct reg_substr_data);
9022         StructCopy(r->substrs, ret->substrs, struct reg_substr_data);
9023
9024         ret->anchored_substr = sv_dup_inc(ret->anchored_substr, param);
9025         ret->anchored_utf8 = sv_dup_inc(ret->anchored_utf8, param);
9026         ret->float_substr = sv_dup_inc(ret->float_substr, param);
9027         ret->float_utf8 = sv_dup_inc(ret->float_utf8, param);
9028
9029         /* check_substr and check_utf8, if non-NULL, point to either their
9030            anchored or float namesakes, and don't hold a second reference.  */
9031
9032         if (ret->check_substr) {
9033             if (anchored) {
9034                 assert(r->check_utf8 == r->anchored_utf8);
9035                 ret->check_substr = ret->anchored_substr;
9036                 ret->check_utf8 = ret->anchored_utf8;
9037             } else {
9038                 assert(r->check_substr == r->float_substr);
9039                 assert(r->check_utf8 == r->float_utf8);
9040                 ret->check_substr = ret->float_substr;
9041                 ret->check_utf8 = ret->float_utf8;
9042             }
9043         }
9044     }
9045
9046     ret->wrapped        = SAVEPVN(ret->wrapped, ret->wraplen+1);
9047     ret->precomp        = ret->wrapped + (ret->precomp - ret->wrapped);
9048     ret->paren_names    = hv_dup_inc(ret->paren_names, param);
9049
9050     if (ret->pprivate)
9051         RXi_SET(ret,CALLREGDUPE_PVT(ret,param));
9052
9053     if (RX_MATCH_COPIED(ret))
9054         ret->subbeg  = SAVEPVN(ret->subbeg, ret->sublen);
9055     else
9056         ret->subbeg = NULL;
9057 #ifdef PERL_OLD_COPY_ON_WRITE
9058     ret->saved_copy = NULL;
9059 #endif
9060
9061     ret->mother_re      = NULL;
9062     ret->gofs = 0;
9063     ret->seen_evals = 0;
9064     
9065     ptr_table_store(PL_ptr_table, r, ret);
9066     return ret;
9067 }
9068 #endif /* PERL_IN_XSUB_RE */
9069
9070 /*
9071    regdupe_internal()
9072    
9073    This is the internal complement to regdupe() which is used to copy
9074    the structure pointed to by the *pprivate pointer in the regexp.
9075    This is the core version of the extension overridable cloning hook.
9076    The regexp structure being duplicated will be copied by perl prior
9077    to this and will be provided as the regexp *r argument, however 
9078    with the /old/ structures pprivate pointer value. Thus this routine
9079    may override any copying normally done by perl.
9080    
9081    It returns a pointer to the new regexp_internal structure.
9082 */
9083
9084 void *
9085 Perl_regdupe_internal(pTHX_ const regexp *r, CLONE_PARAMS *param)
9086 {
9087     dVAR;
9088     regexp_internal *reti;
9089     int len, npar;
9090     RXi_GET_DECL(r,ri);
9091     
9092     npar = r->nparens+1;
9093     len = ProgLen(ri);
9094     
9095     Newxc(reti, sizeof(regexp_internal) + (len+1)*sizeof(regnode), char, regexp_internal);
9096     Copy(ri->program, reti->program, len+1, regnode);
9097     
9098
9099     reti->regstclass = NULL;
9100
9101     if (ri->data) {
9102         struct reg_data *d;
9103         const int count = ri->data->count;
9104         int i;
9105
9106         Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
9107                 char, struct reg_data);
9108         Newx(d->what, count, U8);
9109
9110         d->count = count;
9111         for (i = 0; i < count; i++) {
9112             d->what[i] = ri->data->what[i];
9113             switch (d->what[i]) {
9114                 /* legal options are one of: sSfpontTu
9115                    see also regcomp.h and pregfree() */
9116             case 's':
9117             case 'S':
9118             case 'p': /* actually an AV, but the dup function is identical.  */
9119             case 'u': /* actually an HV, but the dup function is identical.  */
9120                 d->data[i] = sv_dup_inc((SV *)ri->data->data[i], param);
9121                 break;
9122             case 'f':
9123                 /* This is cheating. */
9124                 Newx(d->data[i], 1, struct regnode_charclass_class);
9125                 StructCopy(ri->data->data[i], d->data[i],
9126                             struct regnode_charclass_class);
9127                 reti->regstclass = (regnode*)d->data[i];
9128                 break;
9129             case 'o':
9130                 /* Compiled op trees are readonly and in shared memory,
9131                    and can thus be shared without duplication. */
9132                 OP_REFCNT_LOCK;
9133                 d->data[i] = (void*)OpREFCNT_inc((OP*)ri->data->data[i]);
9134                 OP_REFCNT_UNLOCK;
9135                 break;
9136             case 'T':
9137                 /* Trie stclasses are readonly and can thus be shared
9138                  * without duplication. We free the stclass in pregfree
9139                  * when the corresponding reg_ac_data struct is freed.
9140                  */
9141                 reti->regstclass= ri->regstclass;
9142                 /* Fall through */
9143             case 't':
9144                 OP_REFCNT_LOCK;
9145                 ((reg_trie_data*)ri->data->data[i])->refcount++;
9146                 OP_REFCNT_UNLOCK;
9147                 /* Fall through */
9148             case 'n':
9149                 d->data[i] = ri->data->data[i];
9150                 break;
9151             default:
9152                 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", ri->data->what[i]);
9153             }
9154         }
9155
9156         reti->data = d;
9157     }
9158     else
9159         reti->data = NULL;
9160
9161     reti->name_list_idx = ri->name_list_idx;
9162
9163 #ifdef RE_TRACK_PATTERN_OFFSETS
9164     if (ri->u.offsets) {
9165         Newx(reti->u.offsets, 2*len+1, U32);
9166         Copy(ri->u.offsets, reti->u.offsets, 2*len+1, U32);
9167     }
9168 #else
9169     SetProgLen(reti,len);
9170 #endif
9171
9172     return (void*)reti;
9173 }
9174
9175 #endif    /* USE_ITHREADS */
9176
9177 /* 
9178    reg_stringify() 
9179    
9180    converts a regexp embedded in a MAGIC struct to its stringified form, 
9181    caching the converted form in the struct and returns the cached 
9182    string. 
9183
9184    If lp is nonnull then it is used to return the length of the 
9185    resulting string
9186    
9187    If flags is nonnull and the returned string contains UTF8 then 
9188    (*flags & 1) will be true.
9189    
9190    If haseval is nonnull then it is used to return whether the pattern 
9191    contains evals.
9192    
9193    Normally called via macro: 
9194    
9195         CALLREG_STRINGIFY(mg,&len,&utf8);
9196         
9197    And internally with
9198    
9199         CALLREG_AS_STR(mg,&lp,&flags,&haseval)        
9200     
9201    See sv_2pv_flags() in sv.c for an example of internal usage.
9202     
9203  */
9204 #ifndef PERL_IN_XSUB_RE
9205
9206 char *
9207 Perl_reg_stringify(pTHX_ MAGIC *mg, STRLEN *lp, U32 *flags, I32 *haseval ) {
9208     dVAR;
9209     const regexp * const re = (regexp *)mg->mg_obj;
9210     if (haseval) 
9211         *haseval = re->seen_evals;
9212     if (flags)    
9213         *flags = ((re->extflags & RXf_UTF8) ? 1 : 0);
9214     if (lp)
9215         *lp = re->wraplen;
9216     return re->wrapped;
9217 }
9218
9219 /*
9220  - regnext - dig the "next" pointer out of a node
9221  */
9222 regnode *
9223 Perl_regnext(pTHX_ register regnode *p)
9224 {
9225     dVAR;
9226     register I32 offset;
9227
9228     if (!p)
9229         return(NULL);
9230
9231     offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
9232     if (offset == 0)
9233         return(NULL);
9234
9235     return(p+offset);
9236 }
9237 #endif
9238
9239 STATIC void     
9240 S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
9241 {
9242     va_list args;
9243     STRLEN l1 = strlen(pat1);
9244     STRLEN l2 = strlen(pat2);
9245     char buf[512];
9246     SV *msv;
9247     const char *message;
9248
9249     if (l1 > 510)
9250         l1 = 510;
9251     if (l1 + l2 > 510)
9252         l2 = 510 - l1;
9253     Copy(pat1, buf, l1 , char);
9254     Copy(pat2, buf + l1, l2 , char);
9255     buf[l1 + l2] = '\n';
9256     buf[l1 + l2 + 1] = '\0';
9257 #ifdef I_STDARG
9258     /* ANSI variant takes additional second argument */
9259     va_start(args, pat2);
9260 #else
9261     va_start(args);
9262 #endif
9263     msv = vmess(buf, &args);
9264     va_end(args);
9265     message = SvPV_const(msv,l1);
9266     if (l1 > 512)
9267         l1 = 512;
9268     Copy(message, buf, l1 , char);
9269     buf[l1-1] = '\0';                   /* Overwrite \n */
9270     Perl_croak(aTHX_ "%s", buf);
9271 }
9272
9273 /* XXX Here's a total kludge.  But we need to re-enter for swash routines. */
9274
9275 #ifndef PERL_IN_XSUB_RE
9276 void
9277 Perl_save_re_context(pTHX)
9278 {
9279     dVAR;
9280
9281     struct re_save_state *state;
9282
9283     SAVEVPTR(PL_curcop);
9284     SSGROW(SAVESTACK_ALLOC_FOR_RE_SAVE_STATE + 1);
9285
9286     state = (struct re_save_state *)(PL_savestack + PL_savestack_ix);
9287     PL_savestack_ix += SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
9288     SSPUSHINT(SAVEt_RE_STATE);
9289
9290     Copy(&PL_reg_state, state, 1, struct re_save_state);
9291
9292     PL_reg_start_tmp = 0;
9293     PL_reg_start_tmpl = 0;
9294     PL_reg_oldsaved = NULL;
9295     PL_reg_oldsavedlen = 0;
9296     PL_reg_maxiter = 0;
9297     PL_reg_leftiter = 0;
9298     PL_reg_poscache = NULL;
9299     PL_reg_poscache_size = 0;
9300 #ifdef PERL_OLD_COPY_ON_WRITE
9301     PL_nrs = NULL;
9302 #endif
9303
9304     /* Save $1..$n (#18107: UTF-8 s/(\w+)/uc($1)/e); AMS 20021106. */
9305     if (PL_curpm) {
9306         const REGEXP * const rx = PM_GETRE(PL_curpm);
9307         if (rx) {
9308             U32 i;
9309             for (i = 1; i <= rx->nparens; i++) {
9310                 char digits[TYPE_CHARS(long)];
9311                 const STRLEN len = my_snprintf(digits, sizeof(digits), "%lu", (long)i);
9312                 GV *const *const gvp
9313                     = (GV**)hv_fetch(PL_defstash, digits, len, 0);
9314
9315                 if (gvp) {
9316                     GV * const gv = *gvp;
9317                     if (SvTYPE(gv) == SVt_PVGV && GvSV(gv))
9318                         save_scalar(gv);
9319                 }
9320             }
9321         }
9322     }
9323 }
9324 #endif
9325
9326 static void
9327 clear_re(pTHX_ void *r)
9328 {
9329     dVAR;
9330     ReREFCNT_dec((regexp *)r);
9331 }
9332
9333 #ifdef DEBUGGING
9334
9335 STATIC void
9336 S_put_byte(pTHX_ SV *sv, int c)
9337 {
9338     if (isCNTRL(c) || c == 255 || !isPRINT(c))
9339         Perl_sv_catpvf(aTHX_ sv, "\\%o", c);
9340     else if (c == '-' || c == ']' || c == '\\' || c == '^')
9341         Perl_sv_catpvf(aTHX_ sv, "\\%c", c);
9342     else
9343         Perl_sv_catpvf(aTHX_ sv, "%c", c);
9344 }
9345
9346
9347 #define CLEAR_OPTSTART \
9348     if (optstart) STMT_START { \
9349             DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log, " (%"IVdf" nodes)\n", (IV)(node - optstart))); \
9350             optstart=NULL; \
9351     } STMT_END
9352
9353 #define DUMPUNTIL(b,e) CLEAR_OPTSTART; node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1);
9354
9355 STATIC const regnode *
9356 S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node,
9357             const regnode *last, const regnode *plast, 
9358             SV* sv, I32 indent, U32 depth)
9359 {
9360     dVAR;
9361     register U8 op = PSEUDO;    /* Arbitrary non-END op. */
9362     register const regnode *next;
9363     const regnode *optstart= NULL;
9364     
9365     RXi_GET_DECL(r,ri);
9366     GET_RE_DEBUG_FLAGS_DECL;
9367     
9368 #ifdef DEBUG_DUMPUNTIL
9369     PerlIO_printf(Perl_debug_log, "--- %d : %d - %d - %d\n",indent,node-start,
9370         last ? last-start : 0,plast ? plast-start : 0);
9371 #endif
9372             
9373     if (plast && plast < last) 
9374         last= plast;
9375
9376     while (PL_regkind[op] != END && (!last || node < last)) {
9377         /* While that wasn't END last time... */
9378         NODE_ALIGN(node);
9379         op = OP(node);
9380         if (op == CLOSE || op == WHILEM)
9381             indent--;
9382         next = regnext((regnode *)node);
9383
9384         /* Where, what. */
9385         if (OP(node) == OPTIMIZED) {
9386             if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE))
9387                 optstart = node;
9388             else
9389                 goto after_print;
9390         } else
9391             CLEAR_OPTSTART;
9392         
9393         regprop(r, sv, node);
9394         PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
9395                       (int)(2*indent + 1), "", SvPVX_const(sv));
9396         
9397         if (OP(node) != OPTIMIZED) {                  
9398             if (next == NULL)           /* Next ptr. */
9399                 PerlIO_printf(Perl_debug_log, " (0)");
9400             else if (PL_regkind[(U8)op] == BRANCH && PL_regkind[OP(next)] != BRANCH )
9401                 PerlIO_printf(Perl_debug_log, " (FAIL)");
9402             else 
9403                 PerlIO_printf(Perl_debug_log, " (%"IVdf")", (IV)(next - start));
9404             (void)PerlIO_putc(Perl_debug_log, '\n'); 
9405         }
9406         
9407       after_print:
9408         if (PL_regkind[(U8)op] == BRANCHJ) {
9409             assert(next);
9410             {
9411                 register const regnode *nnode = (OP(next) == LONGJMP
9412                                              ? regnext((regnode *)next)
9413                                              : next);
9414                 if (last && nnode > last)
9415                     nnode = last;
9416                 DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode);
9417             }
9418         }
9419         else if (PL_regkind[(U8)op] == BRANCH) {
9420             assert(next);
9421             DUMPUNTIL(NEXTOPER(node), next);
9422         }
9423         else if ( PL_regkind[(U8)op]  == TRIE ) {
9424             const regnode *this_trie = node;
9425             const char op = OP(node);
9426             const U32 n = ARG(node);
9427             const reg_ac_data * const ac = op>=AHOCORASICK ?
9428                (reg_ac_data *)ri->data->data[n] :
9429                NULL;
9430             const reg_trie_data * const trie =
9431                 (reg_trie_data*)ri->data->data[op<AHOCORASICK ? n : ac->trie];
9432 #ifdef DEBUGGING
9433             AV *const trie_words = (AV *) ri->data->data[n + TRIE_WORDS_OFFSET];
9434 #endif
9435             const regnode *nextbranch= NULL;
9436             I32 word_idx;
9437             sv_setpvn(sv, "", 0);
9438             for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) {
9439                 SV ** const elem_ptr = av_fetch(trie_words,word_idx,0);
9440                 
9441                 PerlIO_printf(Perl_debug_log, "%*s%s ",
9442                    (int)(2*(indent+3)), "",
9443                     elem_ptr ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr), SvCUR(*elem_ptr), 60,
9444                             PL_colors[0], PL_colors[1],
9445                             (SvUTF8(*elem_ptr) ? PERL_PV_ESCAPE_UNI : 0) |
9446                             PERL_PV_PRETTY_ELIPSES    |
9447                             PERL_PV_PRETTY_LTGT
9448                             )
9449                             : "???"
9450                 );
9451                 if (trie->jump) {
9452                     U16 dist= trie->jump[word_idx+1];
9453                     PerlIO_printf(Perl_debug_log, "(%"UVuf")\n",
9454                                   (UV)((dist ? this_trie + dist : next) - start));
9455                     if (dist) {
9456                         if (!nextbranch)
9457                             nextbranch= this_trie + trie->jump[0];    
9458                         DUMPUNTIL(this_trie + dist, nextbranch);
9459                     }
9460                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
9461                         nextbranch= regnext((regnode *)nextbranch);
9462                 } else {
9463                     PerlIO_printf(Perl_debug_log, "\n");
9464                 }
9465             }
9466             if (last && next > last)
9467                 node= last;
9468             else
9469                 node= next;
9470         }
9471         else if ( op == CURLY ) {   /* "next" might be very big: optimizer */
9472             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS,
9473                     NEXTOPER(node) + EXTRA_STEP_2ARGS + 1);
9474         }
9475         else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
9476             assert(next);
9477             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next);
9478         }
9479         else if ( op == PLUS || op == STAR) {
9480             DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1);
9481         }
9482         else if (op == ANYOF) {
9483             /* arglen 1 + class block */
9484             node += 1 + ((ANYOF_FLAGS(node) & ANYOF_LARGE)
9485                     ? ANYOF_CLASS_SKIP : ANYOF_SKIP);
9486             node = NEXTOPER(node);
9487         }
9488         else if (PL_regkind[(U8)op] == EXACT) {
9489             /* Literal string, where present. */
9490             node += NODE_SZ_STR(node) - 1;
9491             node = NEXTOPER(node);
9492         }
9493         else {
9494             node = NEXTOPER(node);
9495             node += regarglen[(U8)op];
9496         }
9497         if (op == CURLYX || op == OPEN)
9498             indent++;
9499     }
9500     CLEAR_OPTSTART;
9501 #ifdef DEBUG_DUMPUNTIL    
9502     PerlIO_printf(Perl_debug_log, "--- %d\n", (int)indent);
9503 #endif
9504     return node;
9505 }
9506
9507 #endif  /* DEBUGGING */
9508
9509 /*
9510  * Local variables:
9511  * c-indentation-style: bsd
9512  * c-basic-offset: 4
9513  * indent-tabs-mode: t
9514  * End:
9515  *
9516  * ex: set ts=8 sts=4 sw=4 noet:
9517  */