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