6ea593ea8d2781f4fe6243fec5e3346cfcc99914
[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->lastparen) >= nums[i] &&
4714                     rx->endp[nums[i]] != -1)
4715                 {
4716                     ret = CALLREG_NUMBUF(rx,nums[i],NULL);
4717                     if (!retarray)
4718                         return ret;
4719                 } else {
4720                     ret = newSVsv(&PL_sv_undef);
4721                 }
4722                 if (retarray) {
4723                     SvREFCNT_inc(ret);
4724                     av_push(retarray, ret);
4725                 }
4726             }
4727             if (retarray)
4728                 return (SV*)retarray;
4729         }
4730     }
4731     return NULL;
4732 }
4733
4734 SV*
4735 Perl_reg_numbered_buff_get(pTHX_ const REGEXP * const rx, I32 paren, SV* usesv)
4736 {
4737     char *s = NULL;
4738     I32 i = 0;
4739     I32 s1, t1;
4740     SV *sv = usesv ? usesv : newSVpvs("");
4741         
4742     if (!rx->subbeg) {
4743         sv_setsv(sv,&PL_sv_undef);
4744         return sv;
4745     } 
4746     else               
4747     if (paren == -2 && rx->startp[0] != -1) {
4748         /* $` */
4749         i = rx->startp[0];
4750         s = rx->subbeg;
4751     }
4752     else 
4753     if (paren == -1 && rx->endp[0] != -1) {
4754         /* $' */
4755         s = rx->subbeg + rx->endp[0];
4756         i = rx->sublen - rx->endp[0];
4757     } 
4758     else
4759     if ( 0 <= paren && paren <= (I32)rx->nparens &&
4760         (s1 = rx->startp[paren]) != -1 &&
4761         (t1 = rx->endp[paren]) != -1)
4762     {
4763         /* $& $1 ... */
4764         i = t1 - s1;
4765         s = rx->subbeg + s1;
4766     } else {
4767         sv_setsv(sv,&PL_sv_undef);
4768         return sv;
4769     }          
4770     assert(rx->sublen >= (s - rx->subbeg) + i );
4771     if (i >= 0) {
4772         const int oldtainted = PL_tainted;
4773         TAINT_NOT;
4774         sv_setpvn(sv, s, i);
4775         PL_tainted = oldtainted;
4776         if ( (rx->extflags & RXf_CANY_SEEN)
4777             ? (RX_MATCH_UTF8(rx)
4778                         && (!i || is_utf8_string((U8*)s, i)))
4779             : (RX_MATCH_UTF8(rx)) )
4780         {
4781             SvUTF8_on(sv);
4782         }
4783         else
4784             SvUTF8_off(sv);
4785         if (PL_tainting) {
4786             if (RX_MATCH_TAINTED(rx)) {
4787                 if (SvTYPE(sv) >= SVt_PVMG) {
4788                     MAGIC* const mg = SvMAGIC(sv);
4789                     MAGIC* mgt;
4790                     PL_tainted = 1;
4791                     SvMAGIC_set(sv, mg->mg_moremagic);
4792                     SvTAINT(sv);
4793                     if ((mgt = SvMAGIC(sv))) {
4794                         mg->mg_moremagic = mgt;
4795                         SvMAGIC_set(sv, mg);
4796                     }
4797                 } else {
4798                     PL_tainted = 1;
4799                     SvTAINT(sv);
4800                 }
4801             } else 
4802                 SvTAINTED_off(sv);
4803         }
4804     } else {
4805         sv_setsv(sv,&PL_sv_undef);
4806     }
4807     return sv;
4808 }
4809
4810
4811 /* Scans the name of a named buffer from the pattern.
4812  * If flags is REG_RSN_RETURN_NULL returns null.
4813  * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name
4814  * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding
4815  * to the parsed name as looked up in the RExC_paren_names hash.
4816  * If there is an error throws a vFAIL().. type exception.
4817  */
4818
4819 #define REG_RSN_RETURN_NULL    0
4820 #define REG_RSN_RETURN_NAME    1
4821 #define REG_RSN_RETURN_DATA    2
4822
4823 STATIC SV*
4824 S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags) {
4825     char *name_start = RExC_parse;
4826
4827     if (isIDFIRST_lazy_if(RExC_parse, UTF)) {
4828          /* skip IDFIRST by using do...while */
4829         if (UTF)
4830             do {
4831                 RExC_parse += UTF8SKIP(RExC_parse);
4832             } while (isALNUM_utf8((U8*)RExC_parse));
4833         else
4834             do {
4835                 RExC_parse++;
4836             } while (isALNUM(*RExC_parse));
4837     }
4838
4839     if ( flags ) {
4840         SV* sv_name = sv_2mortal(Perl_newSVpvn(aTHX_ name_start,
4841             (int)(RExC_parse - name_start)));
4842         if (UTF)
4843             SvUTF8_on(sv_name);
4844         if ( flags == REG_RSN_RETURN_NAME)
4845             return sv_name;
4846         else if (flags==REG_RSN_RETURN_DATA) {
4847             HE *he_str = NULL;
4848             SV *sv_dat = NULL;
4849             if ( ! sv_name )      /* should not happen*/
4850                 Perl_croak(aTHX_ "panic: no svname in reg_scan_name");
4851             if (RExC_paren_names)
4852                 he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 );
4853             if ( he_str )
4854                 sv_dat = HeVAL(he_str);
4855             if ( ! sv_dat )
4856                 vFAIL("Reference to nonexistent named group");
4857             return sv_dat;
4858         }
4859         else {
4860             Perl_croak(aTHX_ "panic: bad flag in reg_scan_name");
4861         }
4862         /* NOT REACHED */
4863     }
4864     return NULL;
4865 }
4866
4867 #define DEBUG_PARSE_MSG(funcname)     DEBUG_PARSE_r({           \
4868     int rem=(int)(RExC_end - RExC_parse);                       \
4869     int cut;                                                    \
4870     int num;                                                    \
4871     int iscut=0;                                                \
4872     if (rem>10) {                                               \
4873         rem=10;                                                 \
4874         iscut=1;                                                \
4875     }                                                           \
4876     cut=10-rem;                                                 \
4877     if (RExC_lastparse!=RExC_parse)                             \
4878         PerlIO_printf(Perl_debug_log," >%.*s%-*s",              \
4879             rem, RExC_parse,                                    \
4880             cut + 4,                                            \
4881             iscut ? "..." : "<"                                 \
4882         );                                                      \
4883     else                                                        \
4884         PerlIO_printf(Perl_debug_log,"%16s","");                \
4885                                                                 \
4886     if (SIZE_ONLY)                                              \
4887        num=RExC_size;                                           \
4888     else                                                        \
4889        num=REG_NODE_NUM(RExC_emit);                             \
4890     if (RExC_lastnum!=num)                                      \
4891        PerlIO_printf(Perl_debug_log,"|%4d",num);                \
4892     else                                                        \
4893        PerlIO_printf(Perl_debug_log,"|%4s","");                 \
4894     PerlIO_printf(Perl_debug_log,"|%*s%-4s",                    \
4895         (int)((depth*2)), "",                                   \
4896         (funcname)                                              \
4897     );                                                          \
4898     RExC_lastnum=num;                                           \
4899     RExC_lastparse=RExC_parse;                                  \
4900 })
4901
4902
4903
4904 #define DEBUG_PARSE(funcname)     DEBUG_PARSE_r({           \
4905     DEBUG_PARSE_MSG((funcname));                            \
4906     PerlIO_printf(Perl_debug_log,"%4s","\n");               \
4907 })
4908 #define DEBUG_PARSE_FMT(funcname,fmt,args)     DEBUG_PARSE_r({           \
4909     DEBUG_PARSE_MSG((funcname));                            \
4910     PerlIO_printf(Perl_debug_log,fmt "\n",args);               \
4911 })
4912 /*
4913  - reg - regular expression, i.e. main body or parenthesized thing
4914  *
4915  * Caller must absorb opening parenthesis.
4916  *
4917  * Combining parenthesis handling with the base level of regular expression
4918  * is a trifle forced, but the need to tie the tails of the branches to what
4919  * follows makes it hard to avoid.
4920  */
4921 #define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1)
4922 #ifdef DEBUGGING
4923 #define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1)
4924 #else
4925 #define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1)
4926 #endif
4927
4928 /* this idea is borrowed from STR_WITH_LEN in handy.h */
4929 #define CHECK_WORD(s,v,l)  \
4930     (((sizeof(s)-1)==(l)) && (strnEQ(start_verb, (s ""), (sizeof(s)-1))))
4931
4932 STATIC regnode *
4933 S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
4934     /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
4935 {
4936     dVAR;
4937     register regnode *ret;              /* Will be the head of the group. */
4938     register regnode *br;
4939     register regnode *lastbr;
4940     register regnode *ender = NULL;
4941     register I32 parno = 0;
4942     I32 flags;
4943     const I32 oregflags = RExC_flags;
4944     bool have_branch = 0;
4945     bool is_open = 0;
4946     I32 freeze_paren = 0;
4947     I32 after_freeze = 0;
4948
4949     /* for (?g), (?gc), and (?o) warnings; warning
4950        about (?c) will warn about (?g) -- japhy    */
4951
4952 #define WASTED_O  0x01
4953 #define WASTED_G  0x02
4954 #define WASTED_C  0x04
4955 #define WASTED_GC (0x02|0x04)
4956     I32 wastedflags = 0x00;
4957
4958     char * parse_start = RExC_parse; /* MJD */
4959     char * const oregcomp_parse = RExC_parse;
4960
4961     GET_RE_DEBUG_FLAGS_DECL;
4962     DEBUG_PARSE("reg ");
4963
4964
4965     *flagp = 0;                         /* Tentatively. */
4966
4967
4968     /* Make an OPEN node, if parenthesized. */
4969     if (paren) {
4970         if ( *RExC_parse == '*') { /* (*VERB:ARG) */
4971             char *start_verb = RExC_parse;
4972             STRLEN verb_len = 0;
4973             char *start_arg = NULL;
4974             unsigned char op = 0;
4975             int argok = 1;
4976             int internal_argval = 0; /* internal_argval is only useful if !argok */
4977             while ( *RExC_parse && *RExC_parse != ')' ) {
4978                 if ( *RExC_parse == ':' ) {
4979                     start_arg = RExC_parse + 1;
4980                     break;
4981                 }
4982                 RExC_parse++;
4983             }
4984             ++start_verb;
4985             verb_len = RExC_parse - start_verb;
4986             if ( start_arg ) {
4987                 RExC_parse++;
4988                 while ( *RExC_parse && *RExC_parse != ')' ) 
4989                     RExC_parse++;
4990                 if ( *RExC_parse != ')' ) 
4991                     vFAIL("Unterminated verb pattern argument");
4992                 if ( RExC_parse == start_arg )
4993                     start_arg = NULL;
4994             } else {
4995                 if ( *RExC_parse != ')' )
4996                     vFAIL("Unterminated verb pattern");
4997             }
4998             
4999             switch ( *start_verb ) {
5000             case 'A':  /* (*ACCEPT) */
5001                 if ( CHECK_WORD("ACCEPT",start_verb,verb_len) ) {
5002                     op = ACCEPT;
5003                     internal_argval = RExC_nestroot;
5004                 }
5005                 break;
5006             case 'C':  /* (*COMMIT) */
5007                 if ( CHECK_WORD("COMMIT",start_verb,verb_len) )
5008                     op = COMMIT;
5009                 break;
5010             case 'F':  /* (*FAIL) */
5011                 if ( verb_len==1 || CHECK_WORD("FAIL",start_verb,verb_len) ) {
5012                     op = OPFAIL;
5013                     argok = 0;
5014                 }
5015                 break;
5016             case ':':  /* (*:NAME) */
5017             case 'M':  /* (*MARK:NAME) */
5018                 if ( verb_len==0 || CHECK_WORD("MARK",start_verb,verb_len) ) {
5019                     op = MARKPOINT;
5020                     argok = -1;
5021                 }
5022                 break;
5023             case 'P':  /* (*PRUNE) */
5024                 if ( CHECK_WORD("PRUNE",start_verb,verb_len) )
5025                     op = PRUNE;
5026                 break;
5027             case 'S':   /* (*SKIP) */  
5028                 if ( CHECK_WORD("SKIP",start_verb,verb_len) ) 
5029                     op = SKIP;
5030                 break;
5031             case 'T':  /* (*THEN) */
5032                 /* [19:06] <TimToady> :: is then */
5033                 if ( CHECK_WORD("THEN",start_verb,verb_len) ) {
5034                     op = CUTGROUP;
5035                     RExC_seen |= REG_SEEN_CUTGROUP;
5036                 }
5037                 break;
5038             }
5039             if ( ! op ) {
5040                 RExC_parse++;
5041                 vFAIL3("Unknown verb pattern '%.*s'",
5042                     verb_len, start_verb);
5043             }
5044             if ( argok ) {
5045                 if ( start_arg && internal_argval ) {
5046                     vFAIL3("Verb pattern '%.*s' may not have an argument",
5047                         verb_len, start_verb); 
5048                 } else if ( argok < 0 && !start_arg ) {
5049                     vFAIL3("Verb pattern '%.*s' has a mandatory argument",
5050                         verb_len, start_verb);    
5051                 } else {
5052                     ret = reganode(pRExC_state, op, internal_argval);
5053                     if ( ! internal_argval && ! SIZE_ONLY ) {
5054                         if (start_arg) {
5055                             SV *sv = newSVpvn( start_arg, RExC_parse - start_arg);
5056                             ARG(ret) = add_data( pRExC_state, 1, "S" );
5057                             RExC_rxi->data->data[ARG(ret)]=(void*)sv;
5058                             ret->flags = 0;
5059                         } else {
5060                             ret->flags = 1; 
5061                         }
5062                     }               
5063                 }
5064                 if (!internal_argval)
5065                     RExC_seen |= REG_SEEN_VERBARG;
5066             } else if ( start_arg ) {
5067                 vFAIL3("Verb pattern '%.*s' may not have an argument",
5068                         verb_len, start_verb);    
5069             } else {
5070                 ret = reg_node(pRExC_state, op);
5071             }
5072             nextchar(pRExC_state);
5073             return ret;
5074         } else 
5075         if (*RExC_parse == '?') { /* (?...) */
5076             bool is_logical = 0;
5077             const char * const seqstart = RExC_parse;
5078
5079             RExC_parse++;
5080             paren = *RExC_parse++;
5081             ret = NULL;                 /* For look-ahead/behind. */
5082             switch (paren) {
5083
5084             case 'P':   /* (?P...) variants for those used to PCRE/Python */
5085                 paren = *RExC_parse++;
5086                 if ( paren == '<')         /* (?P<...>) named capture */
5087                     goto named_capture;
5088                 else if (paren == '>') {   /* (?P>name) named recursion */
5089                     goto named_recursion;
5090                 }
5091                 else if (paren == '=') {   /* (?P=...)  named backref */
5092                     /* this pretty much dupes the code for \k<NAME> in regatom(), if
5093                        you change this make sure you change that */
5094                     char* name_start = RExC_parse;
5095                     U32 num = 0;
5096                     SV *sv_dat = reg_scan_name(pRExC_state,
5097                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5098                     if (RExC_parse == name_start || *RExC_parse != ')')
5099                         vFAIL2("Sequence %.3s... not terminated",parse_start);
5100
5101                     if (!SIZE_ONLY) {
5102                         num = add_data( pRExC_state, 1, "S" );
5103                         RExC_rxi->data->data[num]=(void*)sv_dat;
5104                         SvREFCNT_inc(sv_dat);
5105                     }
5106                     RExC_sawback = 1;
5107                     ret = reganode(pRExC_state,
5108                            (U8)(FOLD ? (LOC ? NREFFL : NREFF) : NREF),
5109                            num);
5110                     *flagp |= HASWIDTH;
5111
5112                     Set_Node_Offset(ret, parse_start+1);
5113                     Set_Node_Cur_Length(ret); /* MJD */
5114
5115                     nextchar(pRExC_state);
5116                     return ret;
5117                 }
5118                 RExC_parse++;
5119                 vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5120                 /*NOTREACHED*/
5121             case '<':           /* (?<...) */
5122                 if (*RExC_parse == '!')
5123                     paren = ',';
5124                 else if (*RExC_parse != '=') 
5125               named_capture:
5126                 {               /* (?<...>) */
5127                     char *name_start;
5128                     SV *svname;
5129                     paren= '>';
5130             case '\'':          /* (?'...') */
5131                     name_start= RExC_parse;
5132                     svname = reg_scan_name(pRExC_state,
5133                         SIZE_ONLY ?  /* reverse test from the others */
5134                         REG_RSN_RETURN_NAME : 
5135                         REG_RSN_RETURN_NULL);
5136                     if (RExC_parse == name_start) {
5137                         RExC_parse++;
5138                         vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5139                         /*NOTREACHED*/
5140                     }
5141                     if (*RExC_parse != paren)
5142                         vFAIL2("Sequence (?%c... not terminated",
5143                             paren=='>' ? '<' : paren);
5144                     if (SIZE_ONLY) {
5145                         HE *he_str;
5146                         SV *sv_dat = NULL;
5147                         if (!svname) /* shouldnt happen */
5148                             Perl_croak(aTHX_
5149                                 "panic: reg_scan_name returned NULL");
5150                         if (!RExC_paren_names) {
5151                             RExC_paren_names= newHV();
5152                             sv_2mortal((SV*)RExC_paren_names);
5153 #ifdef DEBUGGING
5154                             RExC_paren_name_list= newAV();
5155                             sv_2mortal((SV*)RExC_paren_name_list);
5156 #endif
5157                         }
5158                         he_str = hv_fetch_ent( RExC_paren_names, svname, 1, 0 );
5159                         if ( he_str )
5160                             sv_dat = HeVAL(he_str);
5161                         if ( ! sv_dat ) {
5162                             /* croak baby croak */
5163                             Perl_croak(aTHX_
5164                                 "panic: paren_name hash element allocation failed");
5165                         } else if ( SvPOK(sv_dat) ) {
5166                             /* (?|...) can mean we have dupes so scan to check
5167                                its already been stored. Maybe a flag indicating
5168                                we are inside such a construct would be useful,
5169                                but the arrays are likely to be quite small, so
5170                                for now we punt -- dmq */
5171                             IV count = SvIV(sv_dat);
5172                             I32 *pv = (I32*)SvPVX(sv_dat);
5173                             IV i;
5174                             for ( i = 0 ; i < count ; i++ ) {
5175                                 if ( pv[i] == RExC_npar ) {
5176                                     count = 0;
5177                                     break;
5178                                 }
5179                             }
5180                             if ( count ) {
5181                                 pv = (I32*)SvGROW(sv_dat, SvCUR(sv_dat) + sizeof(I32)+1);
5182                                 SvCUR_set(sv_dat, SvCUR(sv_dat) + sizeof(I32));
5183                                 pv[count] = RExC_npar;
5184                                 SvIVX(sv_dat)++;
5185                             }
5186                         } else {
5187                             (void)SvUPGRADE(sv_dat,SVt_PVNV);
5188                             sv_setpvn(sv_dat, (char *)&(RExC_npar), sizeof(I32));
5189                             SvIOK_on(sv_dat);
5190                             SvIVX(sv_dat)= 1;
5191                         }
5192 #ifdef DEBUGGING
5193                         if (!av_store(RExC_paren_name_list, RExC_npar, SvREFCNT_inc(svname)))
5194                             SvREFCNT_dec(svname);
5195 #endif
5196
5197                         /*sv_dump(sv_dat);*/
5198                     }
5199                     nextchar(pRExC_state);
5200                     paren = 1;
5201                     goto capturing_parens;
5202                 }
5203                 RExC_seen |= REG_SEEN_LOOKBEHIND;
5204                 RExC_parse++;
5205             case '=':           /* (?=...) */
5206             case '!':           /* (?!...) */
5207                 RExC_seen_zerolen++;
5208                 if (*RExC_parse == ')') {
5209                     ret=reg_node(pRExC_state, OPFAIL);
5210                     nextchar(pRExC_state);
5211                     return ret;
5212                 }
5213                 break;
5214             case '|':           /* (?|...) */
5215                 /* branch reset, behave like a (?:...) except that
5216                    buffers in alternations share the same numbers */
5217                 paren = ':'; 
5218                 after_freeze = freeze_paren = RExC_npar;
5219                 break;
5220             case ':':           /* (?:...) */
5221             case '>':           /* (?>...) */
5222                 break;
5223             case '$':           /* (?$...) */
5224             case '@':           /* (?@...) */
5225                 vFAIL2("Sequence (?%c...) not implemented", (int)paren);
5226                 break;
5227             case '#':           /* (?#...) */
5228                 while (*RExC_parse && *RExC_parse != ')')
5229                     RExC_parse++;
5230                 if (*RExC_parse != ')')
5231                     FAIL("Sequence (?#... not terminated");
5232                 nextchar(pRExC_state);
5233                 *flagp = TRYAGAIN;
5234                 return NULL;
5235             case '0' :           /* (?0) */
5236             case 'R' :           /* (?R) */
5237                 if (*RExC_parse != ')')
5238                     FAIL("Sequence (?R) not terminated");
5239                 ret = reg_node(pRExC_state, GOSTART);
5240                 *flagp |= POSTPONED;
5241                 nextchar(pRExC_state);
5242                 return ret;
5243                 /*notreached*/
5244             { /* named and numeric backreferences */
5245                 I32 num;
5246             case '&':            /* (?&NAME) */
5247                 parse_start = RExC_parse - 1;
5248               named_recursion:
5249                 {
5250                     SV *sv_dat = reg_scan_name(pRExC_state,
5251                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5252                      num = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
5253                 }
5254                 goto gen_recurse_regop;
5255                 /* NOT REACHED */
5256             case '+':
5257                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
5258                     RExC_parse++;
5259                     vFAIL("Illegal pattern");
5260                 }
5261                 goto parse_recursion;
5262                 /* NOT REACHED*/
5263             case '-': /* (?-1) */
5264                 if (!(RExC_parse[0] >= '1' && RExC_parse[0] <= '9')) {
5265                     RExC_parse--; /* rewind to let it be handled later */
5266                     goto parse_flags;
5267                 } 
5268                 /*FALLTHROUGH */
5269             case '1': case '2': case '3': case '4': /* (?1) */
5270             case '5': case '6': case '7': case '8': case '9':
5271                 RExC_parse--;
5272               parse_recursion:
5273                 num = atoi(RExC_parse);
5274                 parse_start = RExC_parse - 1; /* MJD */
5275                 if (*RExC_parse == '-')
5276                     RExC_parse++;
5277                 while (isDIGIT(*RExC_parse))
5278                         RExC_parse++;
5279                 if (*RExC_parse!=')') 
5280                     vFAIL("Expecting close bracket");
5281                         
5282               gen_recurse_regop:
5283                 if ( paren == '-' ) {
5284                     /*
5285                     Diagram of capture buffer numbering.
5286                     Top line is the normal capture buffer numbers
5287                     Botton line is the negative indexing as from
5288                     the X (the (?-2))
5289
5290                     +   1 2    3 4 5 X          6 7
5291                        /(a(x)y)(a(b(c(?-2)d)e)f)(g(h))/
5292                     -   5 4    3 2 1 X          x x
5293
5294                     */
5295                     num = RExC_npar + num;
5296                     if (num < 1)  {
5297                         RExC_parse++;
5298                         vFAIL("Reference to nonexistent group");
5299                     }
5300                 } else if ( paren == '+' ) {
5301                     num = RExC_npar + num - 1;
5302                 }
5303
5304                 ret = reganode(pRExC_state, GOSUB, num);
5305                 if (!SIZE_ONLY) {
5306                     if (num > (I32)RExC_rx->nparens) {
5307                         RExC_parse++;
5308                         vFAIL("Reference to nonexistent group");
5309                     }
5310                     ARG2L_SET( ret, RExC_recurse_count++);
5311                     RExC_emit++;
5312                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5313                         "Recurse #%"UVuf" to %"IVdf"\n", (UV)ARG(ret), (IV)ARG2L(ret)));
5314                 } else {
5315                     RExC_size++;
5316                 }
5317                 RExC_seen |= REG_SEEN_RECURSE;
5318                 Set_Node_Length(ret, 1 + regarglen[OP(ret)]); /* MJD */
5319                 Set_Node_Offset(ret, parse_start); /* MJD */
5320
5321                 *flagp |= POSTPONED;
5322                 nextchar(pRExC_state);
5323                 return ret;
5324             } /* named and numeric backreferences */
5325             /* NOT REACHED */
5326
5327             case 'p':           /* (?p...) */
5328                 if (SIZE_ONLY && ckWARN2(WARN_DEPRECATED, WARN_REGEXP))
5329                     vWARNdep(RExC_parse, "(?p{}) is deprecated - use (??{})");
5330                 /* FALL THROUGH*/
5331             case '?':           /* (??...) */
5332                 is_logical = 1;
5333                 if (*RExC_parse != '{') {
5334                     RExC_parse++;
5335                     vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5336                     /*NOTREACHED*/
5337                 }
5338                 *flagp |= POSTPONED;
5339                 paren = *RExC_parse++;
5340                 /* FALL THROUGH */
5341             case '{':           /* (?{...}) */
5342             {
5343                 I32 count = 1;
5344                 U32 n = 0;
5345                 char c;
5346                 char *s = RExC_parse;
5347
5348                 RExC_seen_zerolen++;
5349                 RExC_seen |= REG_SEEN_EVAL;
5350                 while (count && (c = *RExC_parse)) {
5351                     if (c == '\\') {
5352                         if (RExC_parse[1])
5353                             RExC_parse++;
5354                     }
5355                     else if (c == '{')
5356                         count++;
5357                     else if (c == '}')
5358                         count--;
5359                     RExC_parse++;
5360                 }
5361                 if (*RExC_parse != ')') {
5362                     RExC_parse = s;             
5363                     vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
5364                 }
5365                 if (!SIZE_ONLY) {
5366                     PAD *pad;
5367                     OP_4tree *sop, *rop;
5368                     SV * const sv = newSVpvn(s, RExC_parse - 1 - s);
5369
5370                     ENTER;
5371                     Perl_save_re_context(aTHX);
5372                     rop = sv_compile_2op(sv, &sop, "re", &pad);
5373                     sop->op_private |= OPpREFCOUNTED;
5374                     /* re_dup will OpREFCNT_inc */
5375                     OpREFCNT_set(sop, 1);
5376                     LEAVE;
5377
5378                     n = add_data(pRExC_state, 3, "nop");
5379                     RExC_rxi->data->data[n] = (void*)rop;
5380                     RExC_rxi->data->data[n+1] = (void*)sop;
5381                     RExC_rxi->data->data[n+2] = (void*)pad;
5382                     SvREFCNT_dec(sv);
5383                 }
5384                 else {                                          /* First pass */
5385                     if (PL_reginterp_cnt < ++RExC_seen_evals
5386                         && IN_PERL_RUNTIME)
5387                         /* No compiled RE interpolated, has runtime
5388                            components ===> unsafe.  */
5389                         FAIL("Eval-group not allowed at runtime, use re 'eval'");
5390                     if (PL_tainting && PL_tainted)
5391                         FAIL("Eval-group in insecure regular expression");
5392 #if PERL_VERSION > 8
5393                     if (IN_PERL_COMPILETIME)
5394                         PL_cv_has_eval = 1;
5395 #endif
5396                 }
5397
5398                 nextchar(pRExC_state);
5399                 if (is_logical) {
5400                     ret = reg_node(pRExC_state, LOGICAL);
5401                     if (!SIZE_ONLY)
5402                         ret->flags = 2;
5403                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, EVAL, n));
5404                     /* deal with the length of this later - MJD */
5405                     return ret;
5406                 }
5407                 ret = reganode(pRExC_state, EVAL, n);
5408                 Set_Node_Length(ret, RExC_parse - parse_start + 1);
5409                 Set_Node_Offset(ret, parse_start);
5410                 return ret;
5411             }
5412             case '(':           /* (?(?{...})...) and (?(?=...)...) */
5413             {
5414                 int is_define= 0;
5415                 if (RExC_parse[0] == '?') {        /* (?(?...)) */
5416                     if (RExC_parse[1] == '=' || RExC_parse[1] == '!'
5417                         || RExC_parse[1] == '<'
5418                         || RExC_parse[1] == '{') { /* Lookahead or eval. */
5419                         I32 flag;
5420                         
5421                         ret = reg_node(pRExC_state, LOGICAL);
5422                         if (!SIZE_ONLY)
5423                             ret->flags = 1;
5424                         REGTAIL(pRExC_state, ret, reg(pRExC_state, 1, &flag,depth+1));
5425                         goto insert_if;
5426                     }
5427                 }
5428                 else if ( RExC_parse[0] == '<'     /* (?(<NAME>)...) */
5429                          || RExC_parse[0] == '\'' ) /* (?('NAME')...) */
5430                 {
5431                     char ch = RExC_parse[0] == '<' ? '>' : '\'';
5432                     char *name_start= RExC_parse++;
5433                     U32 num = 0;
5434                     SV *sv_dat=reg_scan_name(pRExC_state,
5435                         SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5436                     if (RExC_parse == name_start || *RExC_parse != ch)
5437                         vFAIL2("Sequence (?(%c... not terminated",
5438                             (ch == '>' ? '<' : ch));
5439                     RExC_parse++;
5440                     if (!SIZE_ONLY) {
5441                         num = add_data( pRExC_state, 1, "S" );
5442                         RExC_rxi->data->data[num]=(void*)sv_dat;
5443                         SvREFCNT_inc(sv_dat);
5444                     }
5445                     ret = reganode(pRExC_state,NGROUPP,num);
5446                     goto insert_if_check_paren;
5447                 }
5448                 else if (RExC_parse[0] == 'D' &&
5449                          RExC_parse[1] == 'E' &&
5450                          RExC_parse[2] == 'F' &&
5451                          RExC_parse[3] == 'I' &&
5452                          RExC_parse[4] == 'N' &&
5453                          RExC_parse[5] == 'E')
5454                 {
5455                     ret = reganode(pRExC_state,DEFINEP,0);
5456                     RExC_parse +=6 ;
5457                     is_define = 1;
5458                     goto insert_if_check_paren;
5459                 }
5460                 else if (RExC_parse[0] == 'R') {
5461                     RExC_parse++;
5462                     parno = 0;
5463                     if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
5464                         parno = atoi(RExC_parse++);
5465                         while (isDIGIT(*RExC_parse))
5466                             RExC_parse++;
5467                     } else if (RExC_parse[0] == '&') {
5468                         SV *sv_dat;
5469                         RExC_parse++;
5470                         sv_dat = reg_scan_name(pRExC_state,
5471                             SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
5472                         parno = sv_dat ? *((I32 *)SvPVX(sv_dat)) : 0;
5473                     }
5474                     ret = reganode(pRExC_state,INSUBP,parno); 
5475                     goto insert_if_check_paren;
5476                 }
5477                 else if (RExC_parse[0] >= '1' && RExC_parse[0] <= '9' ) {
5478                     /* (?(1)...) */
5479                     char c;
5480                     parno = atoi(RExC_parse++);
5481
5482                     while (isDIGIT(*RExC_parse))
5483                         RExC_parse++;
5484                     ret = reganode(pRExC_state, GROUPP, parno);
5485
5486                  insert_if_check_paren:
5487                     if ((c = *nextchar(pRExC_state)) != ')')
5488                         vFAIL("Switch condition not recognized");
5489                   insert_if:
5490                     REGTAIL(pRExC_state, ret, reganode(pRExC_state, IFTHEN, 0));
5491                     br = regbranch(pRExC_state, &flags, 1,depth+1);
5492                     if (br == NULL)
5493                         br = reganode(pRExC_state, LONGJMP, 0);
5494                     else
5495                         REGTAIL(pRExC_state, br, reganode(pRExC_state, LONGJMP, 0));
5496                     c = *nextchar(pRExC_state);
5497                     if (flags&HASWIDTH)
5498                         *flagp |= HASWIDTH;
5499                     if (c == '|') {
5500                         if (is_define) 
5501                             vFAIL("(?(DEFINE)....) does not allow branches");
5502                         lastbr = reganode(pRExC_state, IFTHEN, 0); /* Fake one for optimizer. */
5503                         regbranch(pRExC_state, &flags, 1,depth+1);
5504                         REGTAIL(pRExC_state, ret, lastbr);
5505                         if (flags&HASWIDTH)
5506                             *flagp |= HASWIDTH;
5507                         c = *nextchar(pRExC_state);
5508                     }
5509                     else
5510                         lastbr = NULL;
5511                     if (c != ')')
5512                         vFAIL("Switch (?(condition)... contains too many branches");
5513                     ender = reg_node(pRExC_state, TAIL);
5514                     REGTAIL(pRExC_state, br, ender);
5515                     if (lastbr) {
5516                         REGTAIL(pRExC_state, lastbr, ender);
5517                         REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender);
5518                     }
5519                     else
5520                         REGTAIL(pRExC_state, ret, ender);
5521                     return ret;
5522                 }
5523                 else {
5524                     vFAIL2("Unknown switch condition (?(%.2s", RExC_parse);
5525                 }
5526             }
5527             case 0:
5528                 RExC_parse--; /* for vFAIL to print correctly */
5529                 vFAIL("Sequence (? incomplete");
5530                 break;
5531             default:
5532                 --RExC_parse;
5533                 parse_flags:      /* (?i) */  
5534             {
5535                 U32 posflags = 0, negflags = 0;
5536                 U32 *flagsp = &posflags;
5537
5538                 while (*RExC_parse) {
5539                     /* && strchr("iogcmsx", *RExC_parse) */
5540                     /* (?g), (?gc) and (?o) are useless here
5541                        and must be globally applied -- japhy */
5542                     switch (*RExC_parse) {
5543                     CASE_STD_PMMOD_FLAGS_PARSE_SET(flagsp);
5544                     case 'o':
5545                     case 'g':
5546                         if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
5547                             const I32 wflagbit = *RExC_parse == 'o' ? WASTED_O : WASTED_G;
5548                             if (! (wastedflags & wflagbit) ) {
5549                                 wastedflags |= wflagbit;
5550                                 vWARN5(
5551                                     RExC_parse + 1,
5552                                     "Useless (%s%c) - %suse /%c modifier",
5553                                     flagsp == &negflags ? "?-" : "?",
5554                                     *RExC_parse,
5555                                     flagsp == &negflags ? "don't " : "",
5556                                     *RExC_parse
5557                                 );
5558                             }
5559                         }
5560                         break;
5561                         
5562                     case 'c':
5563                         if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
5564                             if (! (wastedflags & WASTED_C) ) {
5565                                 wastedflags |= WASTED_GC;
5566                                 vWARN3(
5567                                     RExC_parse + 1,
5568                                     "Useless (%sc) - %suse /gc modifier",
5569                                     flagsp == &negflags ? "?-" : "?",
5570                                     flagsp == &negflags ? "don't " : ""
5571                                 );
5572                             }
5573                         }
5574                         break;
5575                     case 'k':
5576                         if (flagsp == &negflags) {
5577                             if (SIZE_ONLY && ckWARN(WARN_REGEXP))
5578                                 vWARN(RExC_parse + 1,"Useless use of (?-k)");
5579                         } else {
5580                             *flagsp |= RXf_PMf_KEEPCOPY;
5581                         }
5582                         break;
5583                     case '-':
5584                         if (flagsp == &negflags) {
5585                             RExC_parse++;
5586                             vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5587                             /*NOTREACHED*/
5588                         }
5589                         flagsp = &negflags;
5590                         wastedflags = 0;  /* reset so (?g-c) warns twice */
5591                         break;
5592                     case ':':
5593                         paren = ':';
5594                         /*FALLTHROUGH*/
5595                     case ')':
5596                         RExC_flags |= posflags;
5597                         RExC_flags &= ~negflags;
5598                         nextchar(pRExC_state);
5599                         if (paren != ':') {
5600                             *flagp = TRYAGAIN;
5601                             return NULL;
5602                         } else {
5603                             ret = NULL;
5604                             goto parse_rest;
5605                         }
5606                         /*NOTREACHED*/
5607                     default:
5608                         RExC_parse++;
5609                         vFAIL3("Sequence (%.*s...) not recognized", RExC_parse-seqstart, seqstart);
5610                         /*NOTREACHED*/
5611                     }                           
5612                     ++RExC_parse;
5613                 }
5614             }} /* one for the default block, one for the switch */
5615         }
5616         else {                  /* (...) */
5617           capturing_parens:
5618             parno = RExC_npar;
5619             RExC_npar++;
5620             
5621             ret = reganode(pRExC_state, OPEN, parno);
5622             if (!SIZE_ONLY ){
5623                 if (!RExC_nestroot) 
5624                     RExC_nestroot = parno;
5625                 if (RExC_seen & REG_SEEN_RECURSE
5626                     && !RExC_open_parens[parno-1])
5627                 {
5628                     DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5629                         "Setting open paren #%"IVdf" to %d\n", 
5630                         (IV)parno, REG_NODE_NUM(ret)));
5631                     RExC_open_parens[parno-1]= ret;
5632                 }
5633             }
5634             Set_Node_Length(ret, 1); /* MJD */
5635             Set_Node_Offset(ret, RExC_parse); /* MJD */
5636             is_open = 1;
5637         }
5638     }
5639     else                        /* ! paren */
5640         ret = NULL;
5641    
5642    parse_rest:
5643     /* Pick up the branches, linking them together. */
5644     parse_start = RExC_parse;   /* MJD */
5645     br = regbranch(pRExC_state, &flags, 1,depth+1);
5646     /*     branch_len = (paren != 0); */
5647
5648     if (br == NULL)
5649         return(NULL);
5650     if (*RExC_parse == '|') {
5651         if (!SIZE_ONLY && RExC_extralen) {
5652             reginsert(pRExC_state, BRANCHJ, br, depth+1);
5653         }
5654         else {                  /* MJD */
5655             reginsert(pRExC_state, BRANCH, br, depth+1);
5656             Set_Node_Length(br, paren != 0);
5657             Set_Node_Offset_To_R(br-RExC_emit_start, parse_start-RExC_start);
5658         }
5659         have_branch = 1;
5660         if (SIZE_ONLY)
5661             RExC_extralen += 1;         /* For BRANCHJ-BRANCH. */
5662     }
5663     else if (paren == ':') {
5664         *flagp |= flags&SIMPLE;
5665     }
5666     if (is_open) {                              /* Starts with OPEN. */
5667         REGTAIL(pRExC_state, ret, br);          /* OPEN -> first. */
5668     }
5669     else if (paren != '?')              /* Not Conditional */
5670         ret = br;
5671     *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
5672     lastbr = br;
5673     while (*RExC_parse == '|') {
5674         if (!SIZE_ONLY && RExC_extralen) {
5675             ender = reganode(pRExC_state, LONGJMP,0);
5676             REGTAIL(pRExC_state, NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
5677         }
5678         if (SIZE_ONLY)
5679             RExC_extralen += 2;         /* Account for LONGJMP. */
5680         nextchar(pRExC_state);
5681         if (freeze_paren) {
5682             if (RExC_npar > after_freeze)
5683                 after_freeze = RExC_npar;
5684             RExC_npar = freeze_paren;       
5685         }
5686         br = regbranch(pRExC_state, &flags, 0, depth+1);
5687
5688         if (br == NULL)
5689             return(NULL);
5690         REGTAIL(pRExC_state, lastbr, br);               /* BRANCH -> BRANCH. */
5691         lastbr = br;
5692         *flagp |= flags & (SPSTART | HASWIDTH | POSTPONED);
5693     }
5694
5695     if (have_branch || paren != ':') {
5696         /* Make a closing node, and hook it on the end. */
5697         switch (paren) {
5698         case ':':
5699             ender = reg_node(pRExC_state, TAIL);
5700             break;
5701         case 1:
5702             ender = reganode(pRExC_state, CLOSE, parno);
5703             if (!SIZE_ONLY && RExC_seen & REG_SEEN_RECURSE) {
5704                 DEBUG_OPTIMISE_MORE_r(PerlIO_printf(Perl_debug_log,
5705                         "Setting close paren #%"IVdf" to %d\n", 
5706                         (IV)parno, REG_NODE_NUM(ender)));
5707                 RExC_close_parens[parno-1]= ender;
5708                 if (RExC_nestroot == parno) 
5709                     RExC_nestroot = 0;
5710             }       
5711             Set_Node_Offset(ender,RExC_parse+1); /* MJD */
5712             Set_Node_Length(ender,1); /* MJD */
5713             break;
5714         case '<':
5715         case ',':
5716         case '=':
5717         case '!':
5718             *flagp &= ~HASWIDTH;
5719             /* FALL THROUGH */
5720         case '>':
5721             ender = reg_node(pRExC_state, SUCCEED);
5722             break;
5723         case 0:
5724             ender = reg_node(pRExC_state, END);
5725             if (!SIZE_ONLY) {
5726                 assert(!RExC_opend); /* there can only be one! */
5727                 RExC_opend = ender;
5728             }
5729             break;
5730         }
5731         REGTAIL(pRExC_state, lastbr, ender);
5732
5733         if (have_branch && !SIZE_ONLY) {
5734             if (depth==1)
5735                 RExC_seen |= REG_TOP_LEVEL_BRANCHES;
5736
5737             /* Hook the tails of the branches to the closing node. */
5738             for (br = ret; br; br = regnext(br)) {
5739                 const U8 op = PL_regkind[OP(br)];
5740                 if (op == BRANCH) {
5741                     REGTAIL_STUDY(pRExC_state, NEXTOPER(br), ender);
5742                 }
5743                 else if (op == BRANCHJ) {
5744                     REGTAIL_STUDY(pRExC_state, NEXTOPER(NEXTOPER(br)), ender);
5745                 }
5746             }
5747         }
5748     }
5749
5750     {
5751         const char *p;
5752         static const char parens[] = "=!<,>";
5753
5754         if (paren && (p = strchr(parens, paren))) {
5755             U8 node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
5756             int flag = (p - parens) > 1;
5757
5758             if (paren == '>')
5759                 node = SUSPEND, flag = 0;
5760             reginsert(pRExC_state, node,ret, depth+1);
5761             Set_Node_Cur_Length(ret);
5762             Set_Node_Offset(ret, parse_start + 1);
5763             ret->flags = flag;
5764             REGTAIL_STUDY(pRExC_state, ret, reg_node(pRExC_state, TAIL));
5765         }
5766     }
5767
5768     /* Check for proper termination. */
5769     if (paren) {
5770         RExC_flags = oregflags;
5771         if (RExC_parse >= RExC_end || *nextchar(pRExC_state) != ')') {
5772             RExC_parse = oregcomp_parse;
5773             vFAIL("Unmatched (");
5774         }
5775     }
5776     else if (!paren && RExC_parse < RExC_end) {
5777         if (*RExC_parse == ')') {
5778             RExC_parse++;
5779             vFAIL("Unmatched )");
5780         }
5781         else
5782             FAIL("Junk on end of regexp");      /* "Can't happen". */
5783         /* NOTREACHED */
5784     }
5785     if (after_freeze)
5786         RExC_npar = after_freeze;
5787     return(ret);
5788 }
5789
5790 /*
5791  - regbranch - one alternative of an | operator
5792  *
5793  * Implements the concatenation operator.
5794  */
5795 STATIC regnode *
5796 S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
5797 {
5798     dVAR;
5799     register regnode *ret;
5800     register regnode *chain = NULL;
5801     register regnode *latest;
5802     I32 flags = 0, c = 0;
5803     GET_RE_DEBUG_FLAGS_DECL;
5804     DEBUG_PARSE("brnc");
5805     if (first)
5806         ret = NULL;
5807     else {
5808         if (!SIZE_ONLY && RExC_extralen)
5809             ret = reganode(pRExC_state, BRANCHJ,0);
5810         else {
5811             ret = reg_node(pRExC_state, BRANCH);
5812             Set_Node_Length(ret, 1);
5813         }
5814     }
5815         
5816     if (!first && SIZE_ONLY)
5817         RExC_extralen += 1;                     /* BRANCHJ */
5818
5819     *flagp = WORST;                     /* Tentatively. */
5820
5821     RExC_parse--;
5822     nextchar(pRExC_state);
5823     while (RExC_parse < RExC_end && *RExC_parse != '|' && *RExC_parse != ')') {
5824         flags &= ~TRYAGAIN;
5825         latest = regpiece(pRExC_state, &flags,depth+1);
5826         if (latest == NULL) {
5827             if (flags & TRYAGAIN)
5828                 continue;
5829             return(NULL);
5830         }
5831         else if (ret == NULL)
5832             ret = latest;
5833         *flagp |= flags&(HASWIDTH|POSTPONED);
5834         if (chain == NULL)      /* First piece. */
5835             *flagp |= flags&SPSTART;
5836         else {
5837             RExC_naughty++;
5838             REGTAIL(pRExC_state, chain, latest);
5839         }
5840         chain = latest;
5841         c++;
5842     }
5843     if (chain == NULL) {        /* Loop ran zero times. */
5844         chain = reg_node(pRExC_state, NOTHING);
5845         if (ret == NULL)
5846             ret = chain;
5847     }
5848     if (c == 1) {
5849         *flagp |= flags&SIMPLE;
5850     }
5851
5852     return ret;
5853 }
5854
5855 /*
5856  - regpiece - something followed by possible [*+?]
5857  *
5858  * Note that the branching code sequences used for ? and the general cases
5859  * of * and + are somewhat optimized:  they use the same NOTHING node as
5860  * both the endmarker for their branch list and the body of the last branch.
5861  * It might seem that this node could be dispensed with entirely, but the
5862  * endmarker role is not redundant.
5863  */
5864 STATIC regnode *
5865 S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
5866 {
5867     dVAR;
5868     register regnode *ret;
5869     register char op;
5870     register char *next;
5871     I32 flags;
5872     const char * const origparse = RExC_parse;
5873     I32 min;
5874     I32 max = REG_INFTY;
5875     char *parse_start;
5876     const char *maxpos = NULL;
5877     GET_RE_DEBUG_FLAGS_DECL;
5878     DEBUG_PARSE("piec");
5879
5880     ret = regatom(pRExC_state, &flags,depth+1);
5881     if (ret == NULL) {
5882         if (flags & TRYAGAIN)
5883             *flagp |= TRYAGAIN;
5884         return(NULL);
5885     }
5886
5887     op = *RExC_parse;
5888
5889     if (op == '{' && regcurly(RExC_parse)) {
5890         maxpos = NULL;
5891         parse_start = RExC_parse; /* MJD */
5892         next = RExC_parse + 1;
5893         while (isDIGIT(*next) || *next == ',') {
5894             if (*next == ',') {
5895                 if (maxpos)
5896                     break;
5897                 else
5898                     maxpos = next;
5899             }
5900             next++;
5901         }
5902         if (*next == '}') {             /* got one */
5903             if (!maxpos)
5904                 maxpos = next;
5905             RExC_parse++;
5906             min = atoi(RExC_parse);
5907             if (*maxpos == ',')
5908                 maxpos++;
5909             else
5910                 maxpos = RExC_parse;
5911             max = atoi(maxpos);
5912             if (!max && *maxpos != '0')
5913                 max = REG_INFTY;                /* meaning "infinity" */
5914             else if (max >= REG_INFTY)
5915                 vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
5916             RExC_parse = next;
5917             nextchar(pRExC_state);
5918
5919         do_curly:
5920             if ((flags&SIMPLE)) {
5921                 RExC_naughty += 2 + RExC_naughty / 2;
5922                 reginsert(pRExC_state, CURLY, ret, depth+1);
5923                 Set_Node_Offset(ret, parse_start+1); /* MJD */
5924                 Set_Node_Cur_Length(ret);
5925             }
5926             else {
5927                 regnode * const w = reg_node(pRExC_state, WHILEM);
5928
5929                 w->flags = 0;
5930                 REGTAIL(pRExC_state, ret, w);
5931                 if (!SIZE_ONLY && RExC_extralen) {
5932                     reginsert(pRExC_state, LONGJMP,ret, depth+1);
5933                     reginsert(pRExC_state, NOTHING,ret, depth+1);
5934                     NEXT_OFF(ret) = 3;  /* Go over LONGJMP. */
5935                 }
5936                 reginsert(pRExC_state, CURLYX,ret, depth+1);
5937                                 /* MJD hk */
5938                 Set_Node_Offset(ret, parse_start+1);
5939                 Set_Node_Length(ret,
5940                                 op == '{' ? (RExC_parse - parse_start) : 1);
5941
5942                 if (!SIZE_ONLY && RExC_extralen)
5943                     NEXT_OFF(ret) = 3;  /* Go over NOTHING to LONGJMP. */
5944                 REGTAIL(pRExC_state, ret, reg_node(pRExC_state, NOTHING));
5945                 if (SIZE_ONLY)
5946                     RExC_whilem_seen++, RExC_extralen += 3;
5947                 RExC_naughty += 4 + RExC_naughty;       /* compound interest */
5948             }
5949             ret->flags = 0;
5950
5951             if (min > 0)
5952                 *flagp = WORST;
5953             if (max > 0)
5954                 *flagp |= HASWIDTH;
5955             if (max && max < min)
5956                 vFAIL("Can't do {n,m} with n > m");
5957             if (!SIZE_ONLY) {
5958                 ARG1_SET(ret, (U16)min);
5959                 ARG2_SET(ret, (U16)max);
5960             }
5961
5962             goto nest_check;
5963         }
5964     }
5965
5966     if (!ISMULT1(op)) {
5967         *flagp = flags;
5968         return(ret);
5969     }
5970
5971 #if 0                           /* Now runtime fix should be reliable. */
5972
5973     /* if this is reinstated, don't forget to put this back into perldiag:
5974
5975             =item Regexp *+ operand could be empty at {#} in regex m/%s/
5976
5977            (F) The part of the regexp subject to either the * or + quantifier
5978            could match an empty string. The {#} shows in the regular
5979            expression about where the problem was discovered.
5980
5981     */
5982
5983     if (!(flags&HASWIDTH) && op != '?')
5984       vFAIL("Regexp *+ operand could be empty");
5985 #endif
5986
5987     parse_start = RExC_parse;
5988     nextchar(pRExC_state);
5989
5990     *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
5991
5992     if (op == '*' && (flags&SIMPLE)) {
5993         reginsert(pRExC_state, STAR, ret, depth+1);
5994         ret->flags = 0;
5995         RExC_naughty += 4;
5996     }
5997     else if (op == '*') {
5998         min = 0;
5999         goto do_curly;
6000     }
6001     else if (op == '+' && (flags&SIMPLE)) {
6002         reginsert(pRExC_state, PLUS, ret, depth+1);
6003         ret->flags = 0;
6004         RExC_naughty += 3;
6005     }
6006     else if (op == '+') {
6007         min = 1;
6008         goto do_curly;
6009     }
6010     else if (op == '?') {
6011         min = 0; max = 1;
6012         goto do_curly;
6013     }
6014   nest_check:
6015     if (!SIZE_ONLY && !(flags&(HASWIDTH|POSTPONED)) && max > REG_INFTY/3 && ckWARN(WARN_REGEXP)) {
6016         vWARN3(RExC_parse,
6017                "%.*s matches null string many times",
6018                (int)(RExC_parse >= origparse ? RExC_parse - origparse : 0),
6019                origparse);
6020     }
6021
6022     if (RExC_parse < RExC_end && *RExC_parse == '?') {
6023         nextchar(pRExC_state);
6024         reginsert(pRExC_state, MINMOD, ret, depth+1);
6025         REGTAIL(pRExC_state, ret, ret + NODE_STEP_REGNODE);
6026     }
6027 #ifndef REG_ALLOW_MINMOD_SUSPEND
6028     else
6029 #endif
6030     if (RExC_parse < RExC_end && *RExC_parse == '+') {
6031         regnode *ender;
6032         nextchar(pRExC_state);
6033         ender = reg_node(pRExC_state, SUCCEED);
6034         REGTAIL(pRExC_state, ret, ender);
6035         reginsert(pRExC_state, SUSPEND, ret, depth+1);
6036         ret->flags = 0;
6037         ender = reg_node(pRExC_state, TAIL);
6038         REGTAIL(pRExC_state, ret, ender);
6039         /*ret= ender;*/
6040     }
6041
6042     if (RExC_parse < RExC_end && ISMULT2(RExC_parse)) {
6043         RExC_parse++;
6044         vFAIL("Nested quantifiers");
6045     }
6046
6047     return(ret);
6048 }
6049
6050
6051 /* reg_namedseq(pRExC_state,UVp)
6052    
6053    This is expected to be called by a parser routine that has 
6054    recognized'\N' and needs to handle the rest. RExC_parse is 
6055    expected to point at the first char following the N at the time
6056    of the call.
6057    
6058    If valuep is non-null then it is assumed that we are parsing inside 
6059    of a charclass definition and the first codepoint in the resolved
6060    string is returned via *valuep and the routine will return NULL. 
6061    In this mode if a multichar string is returned from the charnames 
6062    handler a warning will be issued, and only the first char in the 
6063    sequence will be examined. If the string returned is zero length
6064    then the value of *valuep is undefined and NON-NULL will 
6065    be returned to indicate failure. (This will NOT be a valid pointer 
6066    to a regnode.)
6067    
6068    If value is null then it is assumed that we are parsing normal text
6069    and inserts a new EXACT node into the program containing the resolved
6070    string and returns a pointer to the new node. If the string is 
6071    zerolength a NOTHING node is emitted.
6072    
6073    On success RExC_parse is set to the char following the endbrace.
6074    Parsing failures will generate a fatal errorvia vFAIL(...)
6075    
6076    NOTE: We cache all results from the charnames handler locally in 
6077    the RExC_charnames hash (created on first use) to prevent a charnames 
6078    handler from playing silly-buggers and returning a short string and 
6079    then a long string for a given pattern. Since the regexp program 
6080    size is calculated during an initial parse this would result
6081    in a buffer overrun so we cache to prevent the charname result from
6082    changing during the course of the parse.
6083    
6084  */
6085 STATIC regnode *
6086 S_reg_namedseq(pTHX_ RExC_state_t *pRExC_state, UV *valuep) 
6087 {
6088     char * name;        /* start of the content of the name */
6089     char * endbrace;    /* endbrace following the name */
6090     SV *sv_str = NULL;  
6091     SV *sv_name = NULL;
6092     STRLEN len; /* this has various purposes throughout the code */
6093     bool cached = 0; /* if this is true then we shouldn't refcount dev sv_str */
6094     regnode *ret = NULL;
6095     
6096     if (*RExC_parse != '{') {
6097         vFAIL("Missing braces on \\N{}");
6098     }
6099     name = RExC_parse+1;
6100     endbrace = strchr(RExC_parse, '}');
6101     if ( ! endbrace ) {
6102         RExC_parse++;
6103         vFAIL("Missing right brace on \\N{}");
6104     } 
6105     RExC_parse = endbrace + 1;  
6106     
6107     
6108     /* RExC_parse points at the beginning brace, 
6109        endbrace points at the last */
6110     if ( name[0]=='U' && name[1]=='+' ) {
6111         /* its a "unicode hex" notation {U+89AB} */
6112         I32 fl = PERL_SCAN_ALLOW_UNDERSCORES
6113             | PERL_SCAN_DISALLOW_PREFIX
6114             | (SIZE_ONLY ? PERL_SCAN_SILENT_ILLDIGIT : 0);
6115         UV cp;
6116         len = (STRLEN)(endbrace - name - 2);
6117         cp = grok_hex(name + 2, &len, &fl, NULL);
6118         if ( len != (STRLEN)(endbrace - name - 2) ) {
6119             cp = 0xFFFD;
6120         }    
6121         if (cp > 0xff)
6122             RExC_utf8 = 1;
6123         if ( valuep ) {
6124             *valuep = cp;
6125             return NULL;
6126         }
6127         sv_str= Perl_newSVpvf_nocontext("%c",(int)cp);
6128     } else {
6129         /* fetch the charnames handler for this scope */
6130         HV * const table = GvHV(PL_hintgv);
6131         SV **cvp= table ? 
6132             hv_fetchs(table, "charnames", FALSE) :
6133             NULL;
6134         SV *cv= cvp ? *cvp : NULL;
6135         HE *he_str;
6136         int count;
6137         /* create an SV with the name as argument */
6138         sv_name = newSVpvn(name, endbrace - name);
6139         
6140         if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
6141             vFAIL2("Constant(\\N{%s}) unknown: "
6142                   "(possibly a missing \"use charnames ...\")",
6143                   SvPVX(sv_name));
6144         }
6145         if (!cvp || !SvOK(*cvp)) { /* when $^H{charnames} = undef; */
6146             vFAIL2("Constant(\\N{%s}): "
6147                   "$^H{charnames} is not defined",SvPVX(sv_name));
6148         }
6149         
6150         
6151         
6152         if (!RExC_charnames) {
6153             /* make sure our cache is allocated */
6154             RExC_charnames = newHV();
6155             sv_2mortal((SV*)RExC_charnames);
6156         } 
6157             /* see if we have looked this one up before */
6158         he_str = hv_fetch_ent( RExC_charnames, sv_name, 0, 0 );
6159         if ( he_str ) {
6160             sv_str = HeVAL(he_str);
6161             cached = 1;
6162         } else {
6163             dSP ;
6164
6165             ENTER ;
6166             SAVETMPS ;
6167             PUSHMARK(SP) ;
6168             
6169             XPUSHs(sv_name);
6170             
6171             PUTBACK ;
6172             
6173             count= call_sv(cv, G_SCALAR);
6174             
6175             if (count == 1) { /* XXXX is this right? dmq */
6176                 sv_str = POPs;
6177                 SvREFCNT_inc_simple_void(sv_str);
6178             } 
6179             
6180             SPAGAIN ;
6181             PUTBACK ;
6182             FREETMPS ;
6183             LEAVE ;
6184             
6185             if ( !sv_str || !SvOK(sv_str) ) {
6186                 vFAIL2("Constant(\\N{%s}): Call to &{$^H{charnames}} "
6187                       "did not return a defined value",SvPVX(sv_name));
6188             }
6189             if (hv_store_ent( RExC_charnames, sv_name, sv_str, 0))
6190                 cached = 1;
6191         }
6192     }
6193     if (valuep) {
6194         char *p = SvPV(sv_str, len);
6195         if (len) {
6196             STRLEN numlen = 1;
6197             if ( SvUTF8(sv_str) ) {
6198                 *valuep = utf8_to_uvchr((U8*)p, &numlen);
6199                 if (*valuep > 0x7F)
6200                     RExC_utf8 = 1; 
6201                 /* XXXX
6202                   We have to turn on utf8 for high bit chars otherwise
6203                   we get failures with
6204                   
6205                    "ss" =~ /[\N{LATIN SMALL LETTER SHARP S}]/i
6206                    "SS" =~ /[\N{LATIN SMALL LETTER SHARP S}]/i
6207                 
6208                   This is different from what \x{} would do with the same
6209                   codepoint, where the condition is > 0xFF.
6210                   - dmq
6211                 */
6212                 
6213                 
6214             } else {
6215                 *valuep = (UV)*p;
6216                 /* warn if we havent used the whole string? */
6217             }
6218             if (numlen<len && SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6219                 vWARN2(RExC_parse,
6220                     "Ignoring excess chars from \\N{%s} in character class",
6221                     SvPVX(sv_name)
6222                 );
6223             }        
6224         } else if (SIZE_ONLY && ckWARN(WARN_REGEXP)) {
6225             vWARN2(RExC_parse,
6226                     "Ignoring zero length \\N{%s} in character class",
6227                     SvPVX(sv_name)
6228                 );
6229         }
6230         if (sv_name)    
6231             SvREFCNT_dec(sv_name);    
6232         if (!cached)
6233             SvREFCNT_dec(sv_str);    
6234         return len ? NULL : (regnode *)&len;
6235     } else if(SvCUR(sv_str)) {     
6236         
6237         char *s; 
6238         char *p, *pend;        
6239         STRLEN charlen = 1;
6240 #ifdef DEBUGGING
6241         char * parse_start = name-3; /* needed for the offsets */
6242 #endif
6243         GET_RE_DEBUG_FLAGS_DECL;     /* needed for the offsets */
6244         
6245         ret = reg_node(pRExC_state,
6246             (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
6247         s= STRING(ret);
6248         
6249         if ( RExC_utf8 && !SvUTF8(sv_str) ) {
6250             sv_utf8_upgrade(sv_str);
6251         } else if ( !RExC_utf8 && SvUTF8(sv_str) ) {
6252             RExC_utf8= 1;
6253         }
6254         
6255         p = SvPV(sv_str, len);
6256         pend = p + len;
6257         /* len is the length written, charlen is the size the char read */
6258         for ( len = 0; p < pend; p += charlen ) {
6259             if (UTF) {
6260                 UV uvc = utf8_to_uvchr((U8*)p, &charlen);
6261                 if (FOLD) {
6262                     STRLEN foldlen,numlen;
6263                     U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
6264                     uvc = toFOLD_uni(uvc, tmpbuf, &foldlen);
6265                     /* Emit all the Unicode characters. */
6266                     
6267                     for (foldbuf = tmpbuf;
6268                         foldlen;
6269                         foldlen -= numlen) 
6270                     {
6271                         uvc = utf8_to_uvchr(foldbuf, &numlen);
6272                         if (numlen > 0) {
6273                             const STRLEN unilen = reguni(pRExC_state, uvc, s);
6274                             s       += unilen;
6275                             len     += unilen;
6276                             /* In EBCDIC the numlen
6277                             * and unilen can differ. */
6278                             foldbuf += numlen;
6279                             if (numlen >= foldlen)
6280                                 break;
6281                         }
6282                         else
6283                             break; /* "Can't happen." */
6284                     }                          
6285                 } else {
6286                     const STRLEN unilen = reguni(pRExC_state, uvc, s);
6287                     if (unilen > 0) {
6288                        s   += unilen;
6289                        len += unilen;
6290                     }
6291                 }
6292             } else {
6293                 len++;
6294                 REGC(*p, s++);
6295             }
6296         }
6297         if (SIZE_ONLY) {
6298             RExC_size += STR_SZ(len);
6299         } else {
6300             STR_LEN(ret) = len;
6301             RExC_emit += STR_SZ(len);
6302         }
6303         Set_Node_Cur_Length(ret); /* MJD */
6304         RExC_parse--; 
6305         nextchar(pRExC_state);
6306     } else {
6307         ret = reg_node(pRExC_state,NOTHING);
6308     }
6309     if (!cached) {
6310         SvREFCNT_dec(sv_str);
6311     }
6312     if (sv_name) {
6313         SvREFCNT_dec(sv_name); 
6314     }
6315     return ret;
6316
6317 }
6318
6319
6320 /*
6321  * reg_recode
6322  *
6323  * It returns the code point in utf8 for the value in *encp.
6324  *    value: a code value in the source encoding
6325  *    encp:  a pointer to an Encode object
6326  *
6327  * If the result from Encode is not a single character,
6328  * it returns U+FFFD (Replacement character) and sets *encp to NULL.
6329  */
6330 STATIC UV
6331 S_reg_recode(pTHX_ const char value, SV **encp)
6332 {
6333     STRLEN numlen = 1;
6334     SV * const sv = sv_2mortal(newSVpvn(&value, numlen));
6335     const char * const s = encp && *encp ? sv_recode_to_utf8(sv, *encp)
6336                                          : SvPVX(sv);
6337     const STRLEN newlen = SvCUR(sv);
6338     UV uv = UNICODE_REPLACEMENT;
6339
6340     if (newlen)
6341         uv = SvUTF8(sv)
6342              ? utf8n_to_uvchr((U8*)s, newlen, &numlen, UTF8_ALLOW_DEFAULT)
6343              : *(U8*)s;
6344
6345     if (!newlen || numlen != newlen) {
6346         uv = UNICODE_REPLACEMENT;
6347         if (encp)
6348             *encp = NULL;
6349     }
6350     return uv;
6351 }
6352
6353
6354 /*
6355  - regatom - the lowest level
6356
6357    Try to identify anything special at the start of the pattern. If there
6358    is, then handle it as required. This may involve generating a single regop,
6359    such as for an assertion; or it may involve recursing, such as to
6360    handle a () structure.
6361
6362    If the string doesn't start with something special then we gobble up
6363    as much literal text as we can.
6364
6365    Once we have been able to handle whatever type of thing started the
6366    sequence, we return.
6367
6368    Note: we have to be careful with escapes, as they can be both literal
6369    and special, and in the case of \10 and friends can either, depending
6370    on context. Specifically there are two seperate switches for handling
6371    escape sequences, with the one for handling literal escapes requiring
6372    a dummy entry for all of the special escapes that are actually handled
6373    by the other.
6374 */
6375
6376 STATIC regnode *
6377 S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
6378 {
6379     dVAR;
6380     register regnode *ret = NULL;
6381     I32 flags;
6382     char *parse_start = RExC_parse;
6383     GET_RE_DEBUG_FLAGS_DECL;
6384     DEBUG_PARSE("atom");
6385     *flagp = WORST;             /* Tentatively. */
6386
6387
6388 tryagain:
6389     switch (*RExC_parse) {
6390     case '^':
6391         RExC_seen_zerolen++;
6392         nextchar(pRExC_state);
6393         if (RExC_flags & RXf_PMf_MULTILINE)
6394             ret = reg_node(pRExC_state, MBOL);
6395         else if (RExC_flags & RXf_PMf_SINGLELINE)
6396             ret = reg_node(pRExC_state, SBOL);
6397         else
6398             ret = reg_node(pRExC_state, BOL);
6399         Set_Node_Length(ret, 1); /* MJD */
6400         break;
6401     case '$':
6402         nextchar(pRExC_state);
6403         if (*RExC_parse)
6404             RExC_seen_zerolen++;
6405         if (RExC_flags & RXf_PMf_MULTILINE)
6406             ret = reg_node(pRExC_state, MEOL);
6407         else if (RExC_flags & RXf_PMf_SINGLELINE)
6408             ret = reg_node(pRExC_state, SEOL);
6409         else
6410             ret = reg_node(pRExC_state, EOL);
6411         Set_Node_Length(ret, 1); /* MJD */
6412         break;
6413     case '.':
6414         nextchar(pRExC_state);
6415         if (RExC_flags & RXf_PMf_SINGLELINE)
6416             ret = reg_node(pRExC_state, SANY);
6417         else
6418             ret = reg_node(pRExC_state, REG_ANY);
6419         *flagp |= HASWIDTH|SIMPLE;
6420         RExC_naughty++;
6421         Set_Node_Length(ret, 1); /* MJD */
6422         break;
6423     case '[':
6424     {
6425         char * const oregcomp_parse = ++RExC_parse;
6426         ret = regclass(pRExC_state,depth+1);
6427         if (*RExC_parse != ']') {
6428             RExC_parse = oregcomp_parse;
6429             vFAIL("Unmatched [");
6430         }
6431         nextchar(pRExC_state);
6432         *flagp |= HASWIDTH|SIMPLE;
6433         Set_Node_Length(ret, RExC_parse - oregcomp_parse + 1); /* MJD */
6434         break;
6435     }
6436     case '(':
6437         nextchar(pRExC_state);
6438         ret = reg(pRExC_state, 1, &flags,depth+1);
6439         if (ret == NULL) {
6440                 if (flags & TRYAGAIN) {
6441                     if (RExC_parse == RExC_end) {
6442                          /* Make parent create an empty node if needed. */
6443                         *flagp |= TRYAGAIN;
6444                         return(NULL);
6445                     }
6446                     goto tryagain;
6447                 }
6448                 return(NULL);
6449         }
6450         *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE|POSTPONED);
6451         break;
6452     case '|':
6453     case ')':
6454         if (flags & TRYAGAIN) {
6455             *flagp |= TRYAGAIN;
6456             return NULL;
6457         }
6458         vFAIL("Internal urp");
6459                                 /* Supposed to be caught earlier. */
6460         break;
6461     case '{':
6462         if (!regcurly(RExC_parse)) {
6463             RExC_parse++;
6464             goto defchar;
6465         }
6466         /* FALL THROUGH */
6467     case '?':
6468     case '+':
6469     case '*':
6470         RExC_parse++;
6471         vFAIL("Quantifier follows nothing");
6472         break;
6473     case '\\':
6474         /* Special Escapes
6475
6476            This switch handles escape sequences that resolve to some kind
6477            of special regop and not to literal text. Escape sequnces that
6478            resolve to literal text are handled below in the switch marked
6479            "Literal Escapes".
6480
6481            Every entry in this switch *must* have a corresponding entry
6482            in the literal escape switch. However, the opposite is not
6483            required, as the default for this switch is to jump to the
6484            literal text handling code.
6485         */
6486         switch (*++RExC_parse) {
6487         /* Special Escapes */
6488         case 'A':
6489             RExC_seen_zerolen++;
6490             ret = reg_node(pRExC_state, SBOL);
6491             *flagp |= SIMPLE;
6492             goto finish_meta_pat;
6493         case 'G':
6494             ret = reg_node(pRExC_state, GPOS);
6495             RExC_seen |= REG_SEEN_GPOS;
6496             *flagp |= SIMPLE;
6497             goto finish_meta_pat;
6498         case 'K':
6499             RExC_seen_zerolen++;
6500             ret = reg_node(pRExC_state, KEEPS);
6501             *flagp |= SIMPLE;
6502             goto finish_meta_pat;
6503         case 'Z':
6504             ret = reg_node(pRExC_state, SEOL);
6505             *flagp |= SIMPLE;
6506             RExC_seen_zerolen++;                /* Do not optimize RE away */
6507             goto finish_meta_pat;
6508         case 'z':
6509             ret = reg_node(pRExC_state, EOS);
6510             *flagp |= SIMPLE;
6511             RExC_seen_zerolen++;                /* Do not optimize RE away */
6512             goto finish_meta_pat;
6513         case 'C':
6514             ret = reg_node(pRExC_state, CANY);
6515             RExC_seen |= REG_SEEN_CANY;
6516             *flagp |= HASWIDTH|SIMPLE;
6517             goto finish_meta_pat;
6518         case 'X':
6519             ret = reg_node(pRExC_state, CLUMP);
6520             *flagp |= HASWIDTH;
6521             goto finish_meta_pat;
6522         case 'w':
6523             ret = reg_node(pRExC_state, (U8)(LOC ? ALNUML     : ALNUM));
6524             *flagp |= HASWIDTH|SIMPLE;
6525             goto finish_meta_pat;
6526         case 'W':
6527             ret = reg_node(pRExC_state, (U8)(LOC ? NALNUML    : NALNUM));
6528             *flagp |= HASWIDTH|SIMPLE;
6529             goto finish_meta_pat;
6530         case 'b':
6531             RExC_seen_zerolen++;
6532             RExC_seen |= REG_SEEN_LOOKBEHIND;
6533             ret = reg_node(pRExC_state, (U8)(LOC ? BOUNDL     : BOUND));
6534             *flagp |= SIMPLE;
6535             goto finish_meta_pat;
6536         case 'B':
6537             RExC_seen_zerolen++;
6538             RExC_seen |= REG_SEEN_LOOKBEHIND;
6539             ret = reg_node(pRExC_state, (U8)(LOC ? NBOUNDL    : NBOUND));
6540             *flagp |= SIMPLE;
6541             goto finish_meta_pat;
6542         case 's':
6543             ret = reg_node(pRExC_state, (U8)(LOC ? SPACEL     : SPACE));
6544             *flagp |= HASWIDTH|SIMPLE;
6545             goto finish_meta_pat;
6546         case 'S':
6547             ret = reg_node(pRExC_state, (U8)(LOC ? NSPACEL    : NSPACE));
6548             *flagp |= HASWIDTH|SIMPLE;
6549             goto finish_meta_pat;
6550         case 'd':
6551             ret = reg_node(pRExC_state, DIGIT);
6552             *flagp |= HASWIDTH|SIMPLE;
6553             goto finish_meta_pat;
6554         case 'D':
6555             ret = reg_node(pRExC_state, NDIGIT);
6556             *flagp |= HASWIDTH|SIMPLE;
6557             goto finish_meta_pat;
6558         case 'v':
6559             ret = reganode(pRExC_state, PRUNE, 0);
6560             ret->flags = 1;
6561             *flagp |= SIMPLE;
6562             goto finish_meta_pat;
6563         case 'V':
6564             ret = reganode(pRExC_state, SKIP, 0);
6565             ret->flags = 1;
6566             *flagp |= SIMPLE;
6567          finish_meta_pat:           
6568             nextchar(pRExC_state);
6569             Set_Node_Length(ret, 2); /* MJD */
6570             break;          
6571         case 'p':
6572         case 'P':
6573             {   
6574                 char* const oldregxend = RExC_end;
6575 #ifdef DEBUGGING
6576                 char* parse_start = RExC_parse - 2;
6577 #endif
6578
6579                 if (RExC_parse[1] == '{') {
6580                   /* a lovely hack--pretend we saw [\pX] instead */
6581                     RExC_end = strchr(RExC_parse, '}');
6582                     if (!RExC_end) {
6583                         const U8 c = (U8)*RExC_parse;
6584                         RExC_parse += 2;
6585                         RExC_end = oldregxend;
6586                         vFAIL2("Missing right brace on \\%c{}", c);
6587                     }
6588                     RExC_end++;
6589                 }
6590                 else {
6591                     RExC_end = RExC_parse + 2;
6592                     if (RExC_end > oldregxend)
6593                         RExC_end = oldregxend;
6594                 }
6595                 RExC_parse--;
6596
6597                 ret = regclass(pRExC_state,depth+1);
6598
6599                 RExC_end = oldregxend;
6600                 RExC_parse--;
6601
6602                 Set_Node_Offset(ret, parse_start + 2);
6603                 Set_Node_Cur_Length(ret);
6604                 nextchar(pRExC_state);
6605                 *flagp |= HASWIDTH|SIMPLE;
6606             }
6607             break;
6608         case 'N': 
6609             /* Handle \N{NAME} here and not below because it can be 
6610             multicharacter. join_exact() will join them up later on. 
6611             Also this makes sure that things like /\N{BLAH}+/ and 
6612             \N{BLAH} being multi char Just Happen. dmq*/
6613             ++RExC_parse;
6614             ret= reg_namedseq(pRExC_state, NULL); 
6615             break;
6616         case 'k':    /* Handle \k<NAME> and \k'NAME' */
6617         parse_named_seq:
6618         {   
6619             char ch= RExC_parse[1];         
6620             if (ch != '<' && ch != '\'' && ch != '{') {
6621                 RExC_parse++;
6622                 vFAIL2("Sequence %.2s... not terminated",parse_start);
6623             } else {
6624                 /* this pretty much dupes the code for (?P=...) in reg(), if
6625                    you change this make sure you change that */
6626                 char* name_start = (RExC_parse += 2);
6627                 U32 num = 0;
6628                 SV *sv_dat = reg_scan_name(pRExC_state,
6629                     SIZE_ONLY ? REG_RSN_RETURN_NULL : REG_RSN_RETURN_DATA);
6630                 ch= (ch == '<') ? '>' : (ch == '{') ? '}' : '\'';
6631                 if (RExC_parse == name_start || *RExC_parse != ch)
6632                     vFAIL2("Sequence %.3s... not terminated",parse_start);
6633
6634                 if (!SIZE_ONLY) {
6635                     num = add_data( pRExC_state, 1, "S" );
6636                     RExC_rxi->data->data[num]=(void*)sv_dat;
6637                     SvREFCNT_inc(sv_dat);
6638                 }
6639
6640                 RExC_sawback = 1;
6641                 ret = reganode(pRExC_state,
6642                            (U8)(FOLD ? (LOC ? NREFFL : NREFF) : NREF),
6643                            num);
6644                 *flagp |= HASWIDTH;
6645
6646                 /* override incorrect value set in reganode MJD */
6647                 Set_Node_Offset(ret, parse_start+1);
6648                 Set_Node_Cur_Length(ret); /* MJD */
6649                 nextchar(pRExC_state);
6650
6651             }
6652             break;
6653         }
6654         case 'g': 
6655         case '1': case '2': case '3': case '4':
6656         case '5': case '6': case '7': case '8': case '9':
6657             {
6658                 I32 num;
6659                 bool isg = *RExC_parse == 'g';
6660                 bool isrel = 0; 
6661                 bool hasbrace = 0;
6662                 if (isg) {
6663                     RExC_parse++;
6664                     if (*RExC_parse == '{') {
6665                         RExC_parse++;
6666                         hasbrace = 1;
6667                     }
6668                     if (*RExC_parse == '-') {
6669                         RExC_parse++;
6670                         isrel = 1;
6671                     }
6672                     if (hasbrace && !isDIGIT(*RExC_parse)) {
6673                         if (isrel) RExC_parse--;
6674                         RExC_parse -= 2;                            
6675                         goto parse_named_seq;
6676                 }   }
6677                 num = atoi(RExC_parse);
6678                 if (isrel) {
6679                     num = RExC_npar - num;
6680                     if (num < 1)
6681                         vFAIL("Reference to nonexistent or unclosed group");
6682                 }
6683                 if (!isg && num > 9 && num >= RExC_npar)
6684                     goto defchar;
6685                 else {
6686                     char * const parse_start = RExC_parse - 1; /* MJD */
6687                     while (isDIGIT(*RExC_parse))
6688                         RExC_parse++;
6689                     if (parse_start == RExC_parse - 1) 
6690                         vFAIL("Unterminated \\g... pattern");
6691                     if (hasbrace) {
6692                         if (*RExC_parse != '}') 
6693                             vFAIL("Unterminated \\g{...} pattern");
6694                         RExC_parse++;
6695                     }    
6696                     if (!SIZE_ONLY) {
6697                         if (num > (I32)RExC_rx->nparens)
6698                             vFAIL("Reference to nonexistent group");
6699                     }
6700                     RExC_sawback = 1;
6701                     ret = reganode(pRExC_state,
6702                                    (U8)(FOLD ? (LOC ? REFFL : REFF) : REF),
6703                                    num);
6704                     *flagp |= HASWIDTH;
6705
6706                     /* override incorrect value set in reganode MJD */
6707                     Set_Node_Offset(ret, parse_start+1);
6708                     Set_Node_Cur_Length(ret); /* MJD */
6709                     RExC_parse--;
6710                     nextchar(pRExC_state);
6711                 }
6712             }
6713             break;
6714         case '\0':
6715             if (RExC_parse >= RExC_end)
6716                 FAIL("Trailing \\");
6717             /* FALL THROUGH */
6718         default:
6719             /* Do not generate "unrecognized" warnings here, we fall
6720                back into the quick-grab loop below */
6721             parse_start--;
6722             goto defchar;
6723         }
6724         break;
6725
6726     case '#':
6727         if (RExC_flags & RXf_PMf_EXTENDED) {
6728             if ( reg_skipcomment( pRExC_state ) )
6729                 goto tryagain;
6730         }
6731         /* FALL THROUGH */
6732
6733     default: {
6734             register STRLEN len;
6735             register UV ender;
6736             register char *p;
6737             char *s;
6738             STRLEN foldlen;
6739             U8 tmpbuf[UTF8_MAXBYTES_CASE+1], *foldbuf;
6740
6741             parse_start = RExC_parse - 1;
6742
6743             RExC_parse++;
6744
6745         defchar:
6746             ender = 0;
6747             ret = reg_node(pRExC_state,
6748                            (U8)(FOLD ? (LOC ? EXACTFL : EXACTF) : EXACT));
6749             s = STRING(ret);
6750             for (len = 0, p = RExC_parse - 1;
6751               len < 127 && p < RExC_end;
6752               len++)
6753             {
6754                 char * const oldp = p;
6755
6756                 if (RExC_flags & RXf_PMf_EXTENDED)
6757                     p = regwhite( pRExC_state, p );
6758                 switch (*p) {
6759                 case '^':
6760                 case '$':
6761                 case '.':
6762                 case '[':
6763                 case '(':
6764                 case ')':
6765                 case '|':
6766                     goto loopdone;
6767                 case '\\':
6768                     /* Literal Escapes Switch
6769
6770                        This switch is meant to handle escape sequences that
6771                        resolve to a literal character.
6772
6773                        Every escape sequence that represents something
6774                        else, like an assertion or a char class, is handled
6775                        in the switch marked 'Special Escapes' above in this
6776                        routine, but also has an entry here as anything that
6777                        isn't explicitly mentioned here will be treated as
6778                        an unescaped equivalent literal.
6779                     */
6780
6781                     switch (*++p) {
6782                     /* These are all the special escapes. */
6783                     case 'A':             /* Start assertion */
6784                     case 'b': case 'B':   /* Word-boundary assertion*/
6785                     case 'C':             /* Single char !DANGEROUS! */
6786                     case 'd': case 'D':   /* digit class */
6787                     case 'g': case 'G':   /* generic-backref, pos assertion */
6788                     case 'k': case 'K':   /* named backref, keep marker */
6789                     case 'N':             /* named char sequence */
6790                     case 'p': case 'P':   /* unicode property */
6791                     case 's': case 'S':   /* space class */
6792                     case 'v': case 'V':   /* (*PRUNE) and (*SKIP) */
6793                     case 'w': case 'W':   /* word class */
6794                     case 'X':             /* eXtended Unicode "combining character sequence" */
6795                     case 'z': case 'Z':   /* End of line/string assertion */
6796                         --p;
6797                         goto loopdone;
6798
6799                     /* Anything after here is an escape that resolves to a
6800                        literal. (Except digits, which may or may not)
6801                      */
6802                     case 'n':
6803                         ender = '\n';
6804                         p++;
6805                         break;
6806                     case 'r':
6807                         ender = '\r';
6808                         p++;
6809                         break;
6810                     case 't':
6811                         ender = '\t';
6812                         p++;
6813                         break;
6814                     case 'f':
6815                         ender = '\f';
6816                         p++;
6817                         break;
6818                     case 'e':
6819                           ender = ASCII_TO_NATIVE('\033');
6820                         p++;
6821                         break;
6822                     case 'a':
6823                           ender = ASCII_TO_NATIVE('\007');
6824                         p++;
6825                         break;
6826                     case 'x':
6827                         if (*++p == '{') {
6828                             char* const e = strchr(p, '}');
6829         
6830                             if (!e) {
6831                                 RExC_parse = p + 1;
6832                                 vFAIL("Missing right brace on \\x{}");
6833                             }
6834                             else {
6835                                 I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
6836                                     | PERL_SCAN_DISALLOW_PREFIX;
6837                                 STRLEN numlen = e - p - 1;
6838                                 ender = grok_hex(p + 1, &numlen, &flags, NULL);
6839                                 if (ender > 0xff)
6840                                     RExC_utf8 = 1;
6841                                 p = e + 1;
6842                             }
6843                         }
6844                         else {
6845                             I32 flags = PERL_SCAN_DISALLOW_PREFIX;
6846                             STRLEN numlen = 2;
6847                             ender = grok_hex(p, &numlen, &flags, NULL);
6848                             p += numlen;
6849                         }
6850                         if (PL_encoding && ender < 0x100)
6851                             goto recode_encoding;
6852                         break;
6853                     case 'c':
6854                         p++;
6855                         ender = UCHARAT(p++);
6856                         ender = toCTRL(ender);
6857                         break;
6858                     case '0': case '1': case '2': case '3':case '4':
6859                     case '5': case '6': case '7': case '8':case '9':
6860                         if (*p == '0' ||
6861                           (isDIGIT(p[1]) && atoi(p) >= RExC_npar) ) {
6862                             I32 flags = 0;
6863                             STRLEN numlen = 3;
6864                             ender = grok_oct(p, &numlen, &flags, NULL);
6865                             p += numlen;
6866                         }
6867                         else {
6868                             --p;
6869                             goto loopdone;
6870                         }
6871                         if (PL_encoding && ender < 0x100)
6872                             goto recode_encoding;
6873                         break;
6874                     recode_encoding:
6875                         {
6876                             SV* enc = PL_encoding;
6877                             ender = reg_recode((const char)(U8)ender, &enc);
6878                             if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
6879                                 vWARN(p, "Invalid escape in the specified encoding");
6880                             RExC_utf8 = 1;
6881                         }
6882                         break;
6883                     case '\0':
6884                         if (p >= RExC_end)
6885                             FAIL("Trailing \\");
6886                         /* FALL THROUGH */
6887                     default:
6888                         if (!SIZE_ONLY&& isALPHA(*p) && ckWARN(WARN_REGEXP))
6889                             vWARN2(p + 1, "Unrecognized escape \\%c passed through", UCHARAT(p));
6890                         goto normal_default;
6891                     }
6892                     break;
6893                 default:
6894                   normal_default:
6895                     if (UTF8_IS_START(*p) && UTF) {
6896                         STRLEN numlen;
6897                         ender = utf8n_to_uvchr((U8*)p, RExC_end - p,
6898                                                &numlen, UTF8_ALLOW_DEFAULT);
6899                         p += numlen;
6900                     }
6901                     else
6902                         ender = *p++;
6903                     break;
6904                 }
6905                 if ( RExC_flags & RXf_PMf_EXTENDED)
6906                     p = regwhite( pRExC_state, p );
6907                 if (UTF && FOLD) {
6908                     /* Prime the casefolded buffer. */
6909                     ender = toFOLD_uni(ender, tmpbuf, &foldlen);
6910                 }
6911                 if (p < RExC_end && ISMULT2(p)) { /* Back off on ?+*. */
6912                     if (len)
6913                         p = oldp;
6914                     else if (UTF) {
6915                          if (FOLD) {
6916                               /* Emit all the Unicode characters. */
6917                               STRLEN numlen;
6918                               for (foldbuf = tmpbuf;
6919                                    foldlen;
6920                                    foldlen -= numlen) {
6921                                    ender = utf8_to_uvchr(foldbuf, &numlen);
6922                                    if (numlen > 0) {
6923                                         const STRLEN unilen = reguni(pRExC_state, ender, s);
6924                                         s       += unilen;
6925                                         len     += unilen;
6926                                         /* In EBCDIC the numlen
6927                                          * and unilen can differ. */
6928                                         foldbuf += numlen;
6929                                         if (numlen >= foldlen)
6930                                              break;
6931                                    }
6932                                    else
6933                                         break; /* "Can't happen." */
6934                               }
6935                          }
6936                          else {
6937                               const STRLEN unilen = reguni(pRExC_state, ender, s);
6938                               if (unilen > 0) {
6939                                    s   += unilen;
6940                                    len += unilen;
6941                               }
6942                          }
6943                     }
6944                     else {
6945                         len++;
6946                         REGC((char)ender, s++);
6947                     }
6948                     break;
6949                 }
6950                 if (UTF) {
6951                      if (FOLD) {
6952                           /* Emit all the Unicode characters. */
6953                           STRLEN numlen;
6954                           for (foldbuf = tmpbuf;
6955                                foldlen;
6956                                foldlen -= numlen) {
6957                                ender = utf8_to_uvchr(foldbuf, &numlen);
6958                                if (numlen > 0) {
6959                                     const STRLEN unilen = reguni(pRExC_state, ender, s);
6960                                     len     += unilen;
6961                                     s       += unilen;
6962                                     /* In EBCDIC the numlen
6963                                      * and unilen can differ. */
6964                                     foldbuf += numlen;
6965                                     if (numlen >= foldlen)
6966                                          break;
6967                                }
6968                                else
6969                                     break;
6970                           }
6971                      }
6972                      else {
6973                           const STRLEN unilen = reguni(pRExC_state, ender, s);
6974                           if (unilen > 0) {
6975                                s   += unilen;
6976                                len += unilen;
6977                           }
6978                      }
6979                      len--;
6980                 }
6981                 else
6982                     REGC((char)ender, s++);
6983             }
6984         loopdone:
6985             RExC_parse = p - 1;
6986             Set_Node_Cur_Length(ret); /* MJD */
6987             nextchar(pRExC_state);
6988             {
6989                 /* len is STRLEN which is unsigned, need to copy to signed */
6990                 IV iv = len;
6991                 if (iv < 0)
6992                     vFAIL("Internal disaster");
6993             }
6994             if (len > 0)
6995                 *flagp |= HASWIDTH;
6996             if (len == 1 && UNI_IS_INVARIANT(ender))
6997                 *flagp |= SIMPLE;
6998                 
6999             if (SIZE_ONLY)
7000                 RExC_size += STR_SZ(len);
7001             else {
7002                 STR_LEN(ret) = len;
7003                 RExC_emit += STR_SZ(len);
7004             }
7005         }
7006         break;
7007     }
7008
7009     return(ret);
7010 }
7011
7012 STATIC char *
7013 S_regwhite( RExC_state_t *pRExC_state, char *p )
7014 {
7015     const char *e = RExC_end;
7016     while (p < e) {
7017         if (isSPACE(*p))
7018             ++p;
7019         else if (*p == '#') {
7020             bool ended = 0;
7021             do {
7022                 if (*p++ == '\n') {
7023                     ended = 1;
7024                     break;
7025                 }
7026             } while (p < e);
7027             if (!ended)
7028                 RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
7029         }
7030         else
7031             break;
7032     }
7033     return p;
7034 }
7035
7036 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
7037    Character classes ([:foo:]) can also be negated ([:^foo:]).
7038    Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
7039    Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
7040    but trigger failures because they are currently unimplemented. */
7041
7042 #define POSIXCC_DONE(c)   ((c) == ':')
7043 #define POSIXCC_NOTYET(c) ((c) == '=' || (c) == '.')
7044 #define POSIXCC(c) (POSIXCC_DONE(c) || POSIXCC_NOTYET(c))
7045
7046 STATIC I32
7047 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value)
7048 {
7049     dVAR;
7050     I32 namedclass = OOB_NAMEDCLASS;
7051
7052     if (value == '[' && RExC_parse + 1 < RExC_end &&
7053         /* I smell either [: or [= or [. -- POSIX has been here, right? */
7054         POSIXCC(UCHARAT(RExC_parse))) {
7055         const char c = UCHARAT(RExC_parse);
7056         char* const s = RExC_parse++;
7057         
7058         while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != c)
7059             RExC_parse++;
7060         if (RExC_parse == RExC_end)
7061             /* Grandfather lone [:, [=, [. */
7062             RExC_parse = s;
7063         else {
7064             const char* const t = RExC_parse++; /* skip over the c */
7065             assert(*t == c);
7066
7067             if (UCHARAT(RExC_parse) == ']') {
7068                 const char *posixcc = s + 1;
7069                 RExC_parse++; /* skip over the ending ] */
7070
7071                 if (*s == ':') {
7072                     const I32 complement = *posixcc == '^' ? *posixcc++ : 0;
7073                     const I32 skip = t - posixcc;
7074
7075                     /* Initially switch on the length of the name.  */
7076                     switch (skip) {
7077                     case 4:
7078                         if (memEQ(posixcc, "word", 4)) /* this is not POSIX, this is the Perl \w */
7079                             namedclass = complement ? ANYOF_NALNUM : ANYOF_ALNUM;
7080                         break;
7081                     case 5:
7082                         /* Names all of length 5.  */
7083                         /* alnum alpha ascii blank cntrl digit graph lower
7084                            print punct space upper  */
7085                         /* Offset 4 gives the best switch position.  */
7086                         switch (posixcc[4]) {
7087                         case 'a':
7088                             if (memEQ(posixcc, "alph", 4)) /* alpha */
7089                                 namedclass = complement ? ANYOF_NALPHA : ANYOF_ALPHA;
7090                             break;
7091                         case 'e':
7092                             if (memEQ(posixcc, "spac", 4)) /* space */
7093                                 namedclass = complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
7094                             break;
7095                         case 'h':
7096                             if (memEQ(posixcc, "grap", 4)) /* graph */
7097                                 namedclass = complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
7098                             break;
7099                         case 'i':
7100                             if (memEQ(posixcc, "asci", 4)) /* ascii */
7101                                 namedclass = complement ? ANYOF_NASCII : ANYOF_ASCII;
7102                             break;
7103                         case 'k':
7104                             if (memEQ(posixcc, "blan", 4)) /* blank */
7105                                 namedclass = complement ? ANYOF_NBLANK : ANYOF_BLANK;
7106                             break;
7107                         case 'l':
7108                             if (memEQ(posixcc, "cntr", 4)) /* cntrl */
7109                                 namedclass = complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
7110                             break;
7111                         case 'm':
7112                             if (memEQ(posixcc, "alnu", 4)) /* alnum */
7113                                 namedclass = complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
7114                             break;
7115                         case 'r':
7116                             if (memEQ(posixcc, "lowe", 4)) /* lower */
7117                                 namedclass = complement ? ANYOF_NLOWER : ANYOF_LOWER;
7118                             else if (memEQ(posixcc, "uppe", 4)) /* upper */
7119                                 namedclass = complement ? ANYOF_NUPPER : ANYOF_UPPER;
7120                             break;
7121                         case 't':
7122                             if (memEQ(posixcc, "digi", 4)) /* digit */
7123                                 namedclass = complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
7124                             else if (memEQ(posixcc, "prin", 4)) /* print */
7125                                 namedclass = complement ? ANYOF_NPRINT : ANYOF_PRINT;
7126                             else if (memEQ(posixcc, "punc", 4)) /* punct */
7127                                 namedclass = complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
7128                             break;
7129                         }
7130                         break;
7131                     case 6:
7132                         if (memEQ(posixcc, "xdigit", 6))
7133                             namedclass = complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
7134                         break;
7135                     }
7136
7137                     if (namedclass == OOB_NAMEDCLASS)
7138                         Simple_vFAIL3("POSIX class [:%.*s:] unknown",
7139                                       t - s - 1, s + 1);
7140                     assert (posixcc[skip] == ':');
7141                     assert (posixcc[skip+1] == ']');
7142                 } else if (!SIZE_ONLY) {
7143                     /* [[=foo=]] and [[.foo.]] are still future. */
7144
7145                     /* adjust RExC_parse so the warning shows after
7146                        the class closes */
7147                     while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse) != ']')
7148                         RExC_parse++;
7149                     Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
7150                 }
7151             } else {
7152                 /* Maternal grandfather:
7153                  * "[:" ending in ":" but not in ":]" */
7154                 RExC_parse = s;
7155             }
7156         }
7157     }
7158
7159     return namedclass;
7160 }
7161
7162 STATIC void
7163 S_checkposixcc(pTHX_ RExC_state_t *pRExC_state)
7164 {
7165     dVAR;
7166     if (POSIXCC(UCHARAT(RExC_parse))) {
7167         const char *s = RExC_parse;
7168         const char  c = *s++;
7169
7170         while (isALNUM(*s))
7171             s++;
7172         if (*s && c == *s && s[1] == ']') {
7173             if (ckWARN(WARN_REGEXP))
7174                 vWARN3(s+2,
7175                         "POSIX syntax [%c %c] belongs inside character classes",
7176                         c, c);
7177
7178             /* [[=foo=]] and [[.foo.]] are still future. */
7179             if (POSIXCC_NOTYET(c)) {
7180                 /* adjust RExC_parse so the error shows after
7181                    the class closes */
7182                 while (UCHARAT(RExC_parse) && UCHARAT(RExC_parse++) != ']')
7183                     NOOP;
7184                 Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
7185             }
7186         }
7187     }
7188 }
7189
7190
7191 #define _C_C_T_(NAME,TEST,WORD)                         \
7192 ANYOF_##NAME:                                           \
7193     if (LOC)                                            \
7194         ANYOF_CLASS_SET(ret, ANYOF_##NAME);             \
7195     else {                                              \
7196         for (value = 0; value < 256; value++)           \
7197             if (TEST)                                   \
7198                 ANYOF_BITMAP_SET(ret, value);           \
7199     }                                                   \
7200     yesno = '+';                                        \
7201     what = WORD;                                        \
7202     break;                                              \
7203 case ANYOF_N##NAME:                                     \
7204     if (LOC)                                            \
7205         ANYOF_CLASS_SET(ret, ANYOF_N##NAME);            \
7206     else {                                              \
7207         for (value = 0; value < 256; value++)           \
7208             if (!TEST)                                  \
7209                 ANYOF_BITMAP_SET(ret, value);           \
7210     }                                                   \
7211     yesno = '!';                                        \
7212     what = WORD;                                        \
7213     break
7214
7215
7216 /*
7217    parse a class specification and produce either an ANYOF node that
7218    matches the pattern or if the pattern matches a single char only and
7219    that char is < 256 and we are case insensitive then we produce an 
7220    EXACT node instead.
7221 */
7222
7223 STATIC regnode *
7224 S_regclass(pTHX_ RExC_state_t *pRExC_state, U32 depth)
7225 {
7226     dVAR;
7227     register UV value = 0;
7228     register UV nextvalue;
7229     register IV prevvalue = OOB_UNICODE;
7230     register IV range = 0;
7231     register regnode *ret;
7232     STRLEN numlen;
7233     IV namedclass;
7234     char *rangebegin = NULL;
7235     bool need_class = 0;
7236     SV *listsv = NULL;
7237     UV n;
7238     bool optimize_invert   = TRUE;
7239     AV* unicode_alternate  = NULL;
7240 #ifdef EBCDIC
7241     UV literal_endpoint = 0;
7242 #endif
7243     UV stored = 0;  /* number of chars stored in the class */
7244
7245     regnode * const orig_emit = RExC_emit; /* Save the original RExC_emit in
7246         case we need to change the emitted regop to an EXACT. */
7247     const char * orig_parse = RExC_parse;
7248     GET_RE_DEBUG_FLAGS_DECL;
7249 #ifndef DEBUGGING
7250     PERL_UNUSED_ARG(depth);
7251 #endif
7252
7253     DEBUG_PARSE("clas");
7254
7255     /* Assume we are going to generate an ANYOF node. */
7256     ret = reganode(pRExC_state, ANYOF, 0);
7257
7258     if (!SIZE_ONLY)
7259         ANYOF_FLAGS(ret) = 0;
7260
7261     if (UCHARAT(RExC_parse) == '^') {   /* Complement of range. */
7262         RExC_naughty++;
7263         RExC_parse++;
7264         if (!SIZE_ONLY)
7265             ANYOF_FLAGS(ret) |= ANYOF_INVERT;
7266     }
7267
7268     if (SIZE_ONLY) {
7269         RExC_size += ANYOF_SKIP;
7270         listsv = &PL_sv_undef; /* For code scanners: listsv always non-NULL. */
7271     }
7272     else {
7273         RExC_emit += ANYOF_SKIP;
7274         if (FOLD)
7275             ANYOF_FLAGS(ret) |= ANYOF_FOLD;
7276         if (LOC)
7277             ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
7278         ANYOF_BITMAP_ZERO(ret);
7279         listsv = newSVpvs("# comment\n");
7280     }
7281
7282     nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
7283
7284     if (!SIZE_ONLY && POSIXCC(nextvalue))
7285         checkposixcc(pRExC_state);
7286
7287     /* allow 1st char to be ] (allowing it to be - is dealt with later) */
7288     if (UCHARAT(RExC_parse) == ']')
7289         goto charclassloop;
7290
7291 parseit:
7292     while (RExC_parse < RExC_end && UCHARAT(RExC_parse) != ']') {
7293
7294     charclassloop:
7295
7296         namedclass = OOB_NAMEDCLASS; /* initialize as illegal */
7297
7298         if (!range)
7299             rangebegin = RExC_parse;
7300         if (UTF) {
7301             value = utf8n_to_uvchr((U8*)RExC_parse,
7302                                    RExC_end - RExC_parse,
7303                                    &numlen, UTF8_ALLOW_DEFAULT);
7304             RExC_parse += numlen;
7305         }
7306         else
7307             value = UCHARAT(RExC_parse++);
7308
7309         nextvalue = RExC_parse < RExC_end ? UCHARAT(RExC_parse) : 0;
7310         if (value == '[' && POSIXCC(nextvalue))
7311             namedclass = regpposixcc(pRExC_state, value);
7312         else if (value == '\\') {
7313             if (UTF) {
7314                 value = utf8n_to_uvchr((U8*)RExC_parse,
7315                                    RExC_end - RExC_parse,
7316                                    &numlen, UTF8_ALLOW_DEFAULT);
7317                 RExC_parse += numlen;
7318             }
7319             else
7320                 value = UCHARAT(RExC_parse++);
7321             /* Some compilers cannot handle switching on 64-bit integer
7322              * values, therefore value cannot be an UV.  Yes, this will
7323              * be a problem later if we want switch on Unicode.
7324              * A similar issue a little bit later when switching on
7325              * namedclass. --jhi */
7326             switch ((I32)value) {
7327             case 'w':   namedclass = ANYOF_ALNUM;       break;
7328             case 'W':   namedclass = ANYOF_NALNUM;      break;
7329             case 's':   namedclass = ANYOF_SPACE;       break;
7330             case 'S':   namedclass = ANYOF_NSPACE;      break;
7331             case 'd':   namedclass = ANYOF_DIGIT;       break;
7332             case 'D':   namedclass = ANYOF_NDIGIT;      break;
7333             case 'N':  /* Handle \N{NAME} in class */
7334                 {
7335                     /* We only pay attention to the first char of 
7336                     multichar strings being returned. I kinda wonder
7337                     if this makes sense as it does change the behaviour
7338                     from earlier versions, OTOH that behaviour was broken
7339                     as well. */
7340                     UV v; /* value is register so we cant & it /grrr */
7341                     if (reg_namedseq(pRExC_state, &v)) {
7342                         goto parseit;
7343                     }
7344                     value= v; 
7345                 }
7346                 break;
7347             case 'p':
7348             case 'P':
7349                 {
7350                 char *e;
7351                 if (RExC_parse >= RExC_end)
7352                     vFAIL2("Empty \\%c{}", (U8)value);
7353                 if (*RExC_parse == '{') {
7354                     const U8 c = (U8)value;
7355                     e = strchr(RExC_parse++, '}');
7356                     if (!e)
7357                         vFAIL2("Missing right brace on \\%c{}", c);
7358                     while (isSPACE(UCHARAT(RExC_parse)))
7359                         RExC_parse++;
7360                     if (e == RExC_parse)
7361                         vFAIL2("Empty \\%c{}", c);
7362                     n = e - RExC_parse;
7363                     while (isSPACE(UCHARAT(RExC_parse + n - 1)))
7364                         n--;
7365                 }
7366                 else {
7367                     e = RExC_parse;
7368                     n = 1;
7369                 }
7370                 if (!SIZE_ONLY) {
7371                     if (UCHARAT(RExC_parse) == '^') {
7372                          RExC_parse++;
7373                          n--;
7374                          value = value == 'p' ? 'P' : 'p'; /* toggle */
7375                          while (isSPACE(UCHARAT(RExC_parse))) {
7376                               RExC_parse++;
7377                               n--;
7378                          }
7379                     }
7380                     Perl_sv_catpvf(aTHX_ listsv, "%cutf8::%.*s\n",
7381                         (value=='p' ? '+' : '!'), (int)n, RExC_parse);
7382                 }
7383                 RExC_parse = e + 1;
7384                 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7385                 namedclass = ANYOF_MAX;  /* no official name, but it's named */
7386                 }
7387                 break;
7388             case 'n':   value = '\n';                   break;
7389             case 'r':   value = '\r';                   break;
7390             case 't':   value = '\t';                   break;
7391             case 'f':   value = '\f';                   break;
7392             case 'b':   value = '\b';                   break;
7393             case 'e':   value = ASCII_TO_NATIVE('\033');break;
7394             case 'a':   value = ASCII_TO_NATIVE('\007');break;
7395             case 'x':
7396                 if (*RExC_parse == '{') {
7397                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES
7398                         | PERL_SCAN_DISALLOW_PREFIX;
7399                     char * const e = strchr(RExC_parse++, '}');
7400                     if (!e)
7401                         vFAIL("Missing right brace on \\x{}");
7402
7403                     numlen = e - RExC_parse;
7404                     value = grok_hex(RExC_parse, &numlen, &flags, NULL);
7405                     RExC_parse = e + 1;
7406                 }
7407                 else {
7408                     I32 flags = PERL_SCAN_DISALLOW_PREFIX;
7409                     numlen = 2;
7410                     value = grok_hex(RExC_parse, &numlen, &flags, NULL);
7411                     RExC_parse += numlen;
7412                 }
7413                 if (PL_encoding && value < 0x100)
7414                     goto recode_encoding;
7415                 break;
7416             case 'c':
7417                 value = UCHARAT(RExC_parse++);
7418                 value = toCTRL(value);
7419                 break;
7420             case '0': case '1': case '2': case '3': case '4':
7421             case '5': case '6': case '7': case '8': case '9':
7422                 {
7423                     I32 flags = 0;
7424                     numlen = 3;
7425                     value = grok_oct(--RExC_parse, &numlen, &flags, NULL);
7426                     RExC_parse += numlen;
7427                     if (PL_encoding && value < 0x100)
7428                         goto recode_encoding;
7429                     break;
7430                 }
7431             recode_encoding:
7432                 {
7433                     SV* enc = PL_encoding;
7434                     value = reg_recode((const char)(U8)value, &enc);
7435                     if (!enc && SIZE_ONLY && ckWARN(WARN_REGEXP))
7436                         vWARN(RExC_parse,
7437                               "Invalid escape in the specified encoding");
7438                     break;
7439                 }
7440             default:
7441                 if (!SIZE_ONLY && isALPHA(value) && ckWARN(WARN_REGEXP))
7442                     vWARN2(RExC_parse,
7443                            "Unrecognized escape \\%c in character class passed through",
7444                            (int)value);
7445                 break;
7446             }
7447         } /* end of \blah */
7448 #ifdef EBCDIC
7449         else
7450             literal_endpoint++;
7451 #endif
7452
7453         if (namedclass > OOB_NAMEDCLASS) { /* this is a named class \blah */
7454
7455             if (!SIZE_ONLY && !need_class)
7456                 ANYOF_CLASS_ZERO(ret);
7457
7458             need_class = 1;
7459
7460             /* a bad range like a-\d, a-[:digit:] ? */
7461             if (range) {
7462                 if (!SIZE_ONLY) {
7463                     if (ckWARN(WARN_REGEXP)) {
7464                         const int w =
7465                             RExC_parse >= rangebegin ?
7466                             RExC_parse - rangebegin : 0;
7467                         vWARN4(RExC_parse,
7468                                "False [] range \"%*.*s\"",
7469                                w, w, rangebegin);
7470                     }
7471                     if (prevvalue < 256) {
7472                         ANYOF_BITMAP_SET(ret, prevvalue);
7473                         ANYOF_BITMAP_SET(ret, '-');
7474                     }
7475                     else {
7476                         ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7477                         Perl_sv_catpvf(aTHX_ listsv,
7478                                        "%04"UVxf"\n%04"UVxf"\n", (UV)prevvalue, (UV) '-');
7479                     }
7480                 }
7481
7482                 range = 0; /* this was not a true range */
7483             }
7484
7485
7486     
7487             if (!SIZE_ONLY) {
7488                 const char *what = NULL;
7489                 char yesno = 0;
7490
7491                 if (namedclass > OOB_NAMEDCLASS)
7492                     optimize_invert = FALSE;
7493                 /* Possible truncation here but in some 64-bit environments
7494                  * the compiler gets heartburn about switch on 64-bit values.
7495                  * A similar issue a little earlier when switching on value.
7496                  * --jhi */
7497                 switch ((I32)namedclass) {
7498                 case _C_C_T_(ALNUM, isALNUM(value), "Word");
7499                 case _C_C_T_(ALNUMC, isALNUMC(value), "Alnum");
7500                 case _C_C_T_(ALPHA, isALPHA(value), "Alpha");
7501                 case _C_C_T_(BLANK, isBLANK(value), "Blank");
7502                 case _C_C_T_(CNTRL, isCNTRL(value), "Cntrl");
7503                 case _C_C_T_(GRAPH, isGRAPH(value), "Graph");
7504                 case _C_C_T_(LOWER, isLOWER(value), "Lower");
7505                 case _C_C_T_(PRINT, isPRINT(value), "Print");
7506                 case _C_C_T_(PSXSPC, isPSXSPC(value), "Space");
7507                 case _C_C_T_(PUNCT, isPUNCT(value), "Punct");
7508                 case _C_C_T_(SPACE, isSPACE(value), "SpacePerl");
7509                 case _C_C_T_(UPPER, isUPPER(value), "Upper");
7510                 case _C_C_T_(XDIGIT, isXDIGIT(value), "XDigit");
7511                 case ANYOF_ASCII:
7512                     if (LOC)
7513                         ANYOF_CLASS_SET(ret, ANYOF_ASCII);
7514                     else {
7515 #ifndef EBCDIC
7516                         for (value = 0; value < 128; value++)
7517                             ANYOF_BITMAP_SET(ret, value);
7518 #else  /* EBCDIC */
7519                         for (value = 0; value < 256; value++) {
7520                             if (isASCII(value))
7521                                 ANYOF_BITMAP_SET(ret, value);
7522                         }
7523 #endif /* EBCDIC */
7524                     }
7525                     yesno = '+';
7526                     what = "ASCII";
7527                     break;
7528                 case ANYOF_NASCII:
7529                     if (LOC)
7530                         ANYOF_CLASS_SET(ret, ANYOF_NASCII);
7531                     else {
7532 #ifndef EBCDIC
7533                         for (value = 128; value < 256; value++)
7534                             ANYOF_BITMAP_SET(ret, value);
7535 #else  /* EBCDIC */
7536                         for (value = 0; value < 256; value++) {
7537                             if (!isASCII(value))
7538                                 ANYOF_BITMAP_SET(ret, value);
7539                         }
7540 #endif /* EBCDIC */
7541                     }
7542                     yesno = '!';
7543                     what = "ASCII";
7544                     break;              
7545                 case ANYOF_DIGIT:
7546                     if (LOC)
7547                         ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
7548                     else {
7549                         /* consecutive digits assumed */
7550                         for (value = '0'; value <= '9'; value++)
7551                             ANYOF_BITMAP_SET(ret, value);
7552                     }
7553                     yesno = '+';
7554                     what = "Digit";
7555                     break;
7556                 case ANYOF_NDIGIT:
7557                     if (LOC)
7558                         ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
7559                     else {
7560                         /* consecutive digits assumed */
7561                         for (value = 0; value < '0'; value++)
7562                             ANYOF_BITMAP_SET(ret, value);
7563                         for (value = '9' + 1; value < 256; value++)
7564                             ANYOF_BITMAP_SET(ret, value);
7565                     }
7566                     yesno = '!';
7567                     what = "Digit";
7568                     break;              
7569                 case ANYOF_MAX:
7570                     /* this is to handle \p and \P */
7571                     break;
7572                 default:
7573                     vFAIL("Invalid [::] class");
7574                     break;
7575                 }
7576                 if (what) {
7577                     /* Strings such as "+utf8::isWord\n" */
7578                     Perl_sv_catpvf(aTHX_ listsv, "%cutf8::Is%s\n", yesno, what);
7579                 }
7580                 if (LOC)
7581                     ANYOF_FLAGS(ret) |= ANYOF_CLASS;
7582                 continue;
7583             }
7584         } /* end of namedclass \blah */
7585
7586         if (range) {
7587             if (prevvalue > (IV)value) /* b-a */ {
7588                 const int w = RExC_parse - rangebegin;
7589                 Simple_vFAIL4("Invalid [] range \"%*.*s\"", w, w, rangebegin);
7590                 range = 0; /* not a valid range */
7591             }
7592         }
7593         else {
7594             prevvalue = value; /* save the beginning of the range */
7595             if (*RExC_parse == '-' && RExC_parse+1 < RExC_end &&
7596                 RExC_parse[1] != ']') {
7597                 RExC_parse++;
7598
7599                 /* a bad range like \w-, [:word:]- ? */
7600                 if (namedclass > OOB_NAMEDCLASS) {
7601                     if (ckWARN(WARN_REGEXP)) {
7602                         const int w =
7603                             RExC_parse >= rangebegin ?
7604                             RExC_parse - rangebegin : 0;
7605                         vWARN4(RExC_parse,
7606                                "False [] range \"%*.*s\"",
7607                                w, w, rangebegin);
7608                     }
7609                     if (!SIZE_ONLY)
7610                         ANYOF_BITMAP_SET(ret, '-');
7611                 } else
7612                     range = 1;  /* yeah, it's a range! */
7613                 continue;       /* but do it the next time */
7614             }
7615         }
7616
7617         /* now is the next time */
7618         /*stored += (value - prevvalue + 1);*/
7619         if (!SIZE_ONLY) {
7620             if (prevvalue < 256) {
7621                 const IV ceilvalue = value < 256 ? value : 255;
7622                 IV i;
7623 #ifdef EBCDIC
7624                 /* In EBCDIC [\x89-\x91] should include
7625                  * the \x8e but [i-j] should not. */
7626                 if (literal_endpoint == 2 &&
7627                     ((isLOWER(prevvalue) && isLOWER(ceilvalue)) ||
7628                      (isUPPER(prevvalue) && isUPPER(ceilvalue))))
7629                 {
7630                     if (isLOWER(prevvalue)) {
7631                         for (i = prevvalue; i <= ceilvalue; i++)
7632                             if (isLOWER(i))
7633                                 ANYOF_BITMAP_SET(ret, i);
7634                     } else {
7635                         for (i = prevvalue; i <= ceilvalue; i++)
7636                             if (isUPPER(i))
7637                                 ANYOF_BITMAP_SET(ret, i);
7638                     }
7639                 }
7640                 else
7641 #endif
7642                       for (i = prevvalue; i <= ceilvalue; i++) {
7643                         if (!ANYOF_BITMAP_TEST(ret,i)) {
7644                             stored++;  
7645                             ANYOF_BITMAP_SET(ret, i);
7646                         }
7647                       }
7648           }
7649           if (value > 255 || UTF) {
7650                 const UV prevnatvalue  = NATIVE_TO_UNI(prevvalue);
7651                 const UV natvalue      = NATIVE_TO_UNI(value);
7652                 stored+=2; /* can't optimize this class */
7653                 ANYOF_FLAGS(ret) |= ANYOF_UNICODE;
7654                 if (prevnatvalue < natvalue) { /* what about > ? */
7655                     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
7656                                    prevnatvalue, natvalue);
7657                 }
7658                 else if (prevnatvalue == natvalue) {
7659                     Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n", natvalue);
7660                     if (FOLD) {
7661                          U8 foldbuf[UTF8_MAXBYTES_CASE+1];
7662                          STRLEN foldlen;
7663                          const UV f = to_uni_fold(natvalue, foldbuf, &foldlen);
7664
7665 #ifdef EBCDIC /* RD t/uni/fold ff and 6b */
7666                          if (RExC_precomp[0] == ':' &&
7667                              RExC_precomp[1] == '[' &&
7668                              (f == 0xDF || f == 0x92)) {
7669                              f = NATIVE_TO_UNI(f);
7670                         }
7671 #endif
7672                          /* If folding and foldable and a single
7673                           * character, insert also the folded version
7674                           * to the charclass. */
7675                          if (f != value) {
7676 #ifdef EBCDIC /* RD tunifold ligatures s,t fb05, fb06 */
7677                              if ((RExC_precomp[0] == ':' &&
7678                                   RExC_precomp[1] == '[' &&
7679                                   (f == 0xA2 &&
7680                                    (value == 0xFB05 || value == 0xFB06))) ?
7681                                  foldlen == ((STRLEN)UNISKIP(f) - 1) :
7682                                  foldlen == (STRLEN)UNISKIP(f) )
7683 #else
7684                               if (foldlen == (STRLEN)UNISKIP(f))
7685 #endif
7686                                   Perl_sv_catpvf(aTHX_ listsv,
7687                                                  "%04"UVxf"\n", f);
7688                               else {
7689                                   /* Any multicharacter foldings
7690                                    * require the following transform:
7691                                    * [ABCDEF] -> (?:[ABCabcDEFd]|pq|rst)
7692                                    * where E folds into "pq" and F folds
7693                                    * into "rst", all other characters
7694                                    * fold to single characters.  We save
7695                                    * away these multicharacter foldings,
7696                                    * to be later saved as part of the
7697                                    * additional "s" data. */
7698                                   SV *sv;
7699
7700                                   if (!unicode_alternate)
7701                                       unicode_alternate = newAV();
7702                                   sv = newSVpvn((char*)foldbuf, foldlen);
7703                                   SvUTF8_on(sv);
7704                                   av_push(unicode_alternate, sv);
7705                               }
7706                          }
7707
7708                          /* If folding and the value is one of the Greek
7709                           * sigmas insert a few more sigmas to make the
7710                           * folding rules of the sigmas to work right.
7711                           * Note that not all the possible combinations
7712                           * are handled here: some of them are handled
7713                           * by the standard folding rules, and some of
7714                           * them (literal or EXACTF cases) are handled
7715                           * during runtime in regexec.c:S_find_byclass(). */
7716                          if (value == UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA) {
7717                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
7718                                              (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA);
7719                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
7720                                              (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
7721                          }
7722                          else if (value == UNICODE_GREEK_CAPITAL_LETTER_SIGMA)
7723                               Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\n",
7724                                              (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA);
7725                     }
7726                 }
7727             }
7728 #ifdef EBCDIC
7729             literal_endpoint = 0;
7730 #endif
7731         }
7732
7733         range = 0; /* this range (if it was one) is done now */
7734     }
7735
7736     if (need_class) {
7737         ANYOF_FLAGS(ret) |= ANYOF_LARGE;
7738         if (SIZE_ONLY)
7739             RExC_size += ANYOF_CLASS_ADD_SKIP;
7740         else
7741             RExC_emit += ANYOF_CLASS_ADD_SKIP;
7742     }
7743
7744
7745     if (SIZE_ONLY)
7746         return ret;
7747     /****** !SIZE_ONLY AFTER HERE *********/
7748
7749     if( stored == 1 && value < 256
7750         && !( ANYOF_FLAGS(ret) & ( ANYOF_FLAGS_ALL ^ ANYOF_FOLD ) )
7751     ) {
7752         /* optimize single char class to an EXACT node
7753            but *only* when its not a UTF/high char  */
7754         const char * cur_parse= RExC_parse;
7755         RExC_emit = (regnode *)orig_emit;
7756         RExC_parse = (char *)orig_parse;
7757         ret = reg_node(pRExC_state,
7758                        (U8)((ANYOF_FLAGS(ret) & ANYOF_FOLD) ? EXACTF : EXACT));
7759         RExC_parse = (char *)cur_parse;
7760         *STRING(ret)= (char)value;
7761         STR_LEN(ret)= 1;
7762         RExC_emit += STR_SZ(1);
7763         return ret;
7764     }
7765     /* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
7766     if ( /* If the only flag is folding (plus possibly inversion). */
7767         ((ANYOF_FLAGS(ret) & (ANYOF_FLAGS_ALL ^ ANYOF_INVERT)) == ANYOF_FOLD)
7768        ) {
7769         for (value = 0; value < 256; ++value) {
7770             if (ANYOF_BITMAP_TEST(ret, value)) {
7771                 UV fold = PL_fold[value];
7772
7773                 if (fold != value)
7774                     ANYOF_BITMAP_SET(ret, fold);
7775             }
7776         }
7777         ANYOF_FLAGS(ret) &= ~ANYOF_FOLD;
7778     }
7779
7780     /* optimize inverted simple patterns (e.g. [^a-z]) */
7781     if (optimize_invert &&
7782         /* If the only flag is inversion. */
7783         (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT) {
7784         for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
7785             ANYOF_BITMAP(ret)[value] ^= ANYOF_FLAGS_ALL;
7786         ANYOF_FLAGS(ret) = ANYOF_UNICODE_ALL;
7787     }
7788     {
7789         AV * const av = newAV();
7790         SV *rv;
7791         /* The 0th element stores the character class description
7792          * in its textual form: used later (regexec.c:Perl_regclass_swash())
7793          * to initialize the appropriate swash (which gets stored in
7794          * the 1st element), and also useful for dumping the regnode.
7795          * The 2nd element stores the multicharacter foldings,
7796          * used later (regexec.c:S_reginclass()). */
7797         av_store(av, 0, listsv);
7798         av_store(av, 1, NULL);
7799         av_store(av, 2, (SV*)unicode_alternate);
7800         rv = newRV_noinc((SV*)av);
7801         n = add_data(pRExC_state, 1, "s");
7802         RExC_rxi->data->data[n] = (void*)rv;
7803         ARG_SET(ret, n);
7804     }
7805     return ret;
7806 }
7807 #undef _C_C_T_
7808
7809
7810 /* reg_skipcomment()
7811
7812    Absorbs an /x style # comments from the input stream.
7813    Returns true if there is more text remaining in the stream.
7814    Will set the REG_SEEN_RUN_ON_COMMENT flag if the comment
7815    terminates the pattern without including a newline.
7816
7817    Note its the callers responsibility to ensure that we are
7818    actually in /x mode
7819
7820 */
7821
7822 STATIC bool
7823 S_reg_skipcomment(pTHX_ RExC_state_t *pRExC_state)
7824 {
7825     bool ended = 0;
7826     while (RExC_parse < RExC_end)
7827         if (*RExC_parse++ == '\n') {
7828             ended = 1;
7829             break;
7830         }
7831     if (!ended) {
7832         /* we ran off the end of the pattern without ending
7833            the comment, so we have to add an \n when wrapping */
7834         RExC_seen |= REG_SEEN_RUN_ON_COMMENT;
7835         return 0;
7836     } else
7837         return 1;
7838 }
7839
7840 /* nextchar()
7841
7842    Advance that parse position, and optionall absorbs
7843    "whitespace" from the inputstream.
7844
7845    Without /x "whitespace" means (?#...) style comments only,
7846    with /x this means (?#...) and # comments and whitespace proper.
7847
7848    Returns the RExC_parse point from BEFORE the scan occurs.
7849
7850    This is the /x friendly way of saying RExC_parse++.
7851 */
7852
7853 STATIC char*
7854 S_nextchar(pTHX_ RExC_state_t *pRExC_state)
7855 {
7856     char* const retval = RExC_parse++;
7857
7858     for (;;) {
7859         if (*RExC_parse == '(' && RExC_parse[1] == '?' &&
7860                 RExC_parse[2] == '#') {
7861             while (*RExC_parse != ')') {
7862                 if (RExC_parse == RExC_end)
7863                     FAIL("Sequence (?#... not terminated");
7864                 RExC_parse++;
7865             }
7866             RExC_parse++;
7867             continue;
7868         }
7869         if (RExC_flags & RXf_PMf_EXTENDED) {
7870             if (isSPACE(*RExC_parse)) {
7871                 RExC_parse++;
7872                 continue;
7873             }
7874             else if (*RExC_parse == '#') {
7875                 if ( reg_skipcomment( pRExC_state ) )
7876                     continue;
7877             }
7878         }
7879         return retval;
7880     }
7881 }
7882
7883 /*
7884 - reg_node - emit a node
7885 */
7886 STATIC regnode *                        /* Location. */
7887 S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op)
7888 {
7889     dVAR;
7890     register regnode *ptr;
7891     regnode * const ret = RExC_emit;
7892     GET_RE_DEBUG_FLAGS_DECL;
7893
7894     if (SIZE_ONLY) {
7895         SIZE_ALIGN(RExC_size);
7896         RExC_size += 1;
7897         return(ret);
7898     }
7899 #ifdef DEBUGGING
7900     if (OP(RExC_emit) == 255)
7901         Perl_croak(aTHX_ "panic: reg_node overrun trying to emit %s: %d ",
7902             reg_name[op], OP(RExC_emit));
7903 #endif  
7904     NODE_ALIGN_FILL(ret);
7905     ptr = ret;
7906     FILL_ADVANCE_NODE(ptr, op);
7907 #ifdef RE_TRACK_PATTERN_OFFSETS
7908     if (RExC_offsets) {         /* MJD */
7909         MJD_OFFSET_DEBUG(("%s:%d: (op %s) %s %"UVuf" (len %"UVuf") (max %"UVuf").\n", 
7910               "reg_node", __LINE__, 
7911               reg_name[op],
7912               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] 
7913                 ? "Overwriting end of array!\n" : "OK",
7914               (UV)(RExC_emit - RExC_emit_start),
7915               (UV)(RExC_parse - RExC_start),
7916               (UV)RExC_offsets[0])); 
7917         Set_Node_Offset(RExC_emit, RExC_parse + (op == END));
7918     }
7919 #endif
7920     RExC_emit = ptr;
7921     return(ret);
7922 }
7923
7924 /*
7925 - reganode - emit a node with an argument
7926 */
7927 STATIC regnode *                        /* Location. */
7928 S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg)
7929 {
7930     dVAR;
7931     register regnode *ptr;
7932     regnode * const ret = RExC_emit;
7933     GET_RE_DEBUG_FLAGS_DECL;
7934
7935     if (SIZE_ONLY) {
7936         SIZE_ALIGN(RExC_size);
7937         RExC_size += 2;
7938         /* 
7939            We can't do this:
7940            
7941            assert(2==regarglen[op]+1); 
7942         
7943            Anything larger than this has to allocate the extra amount.
7944            If we changed this to be:
7945            
7946            RExC_size += (1 + regarglen[op]);
7947            
7948            then it wouldn't matter. Its not clear what side effect
7949            might come from that so its not done so far.
7950            -- dmq
7951         */
7952         return(ret);
7953     }
7954 #ifdef DEBUGGING
7955     if (OP(RExC_emit) == 255)
7956         Perl_croak(aTHX_ "panic: reganode overwriting end of allocated program space");
7957 #endif 
7958     NODE_ALIGN_FILL(ret);
7959     ptr = ret;
7960     FILL_ADVANCE_NODE_ARG(ptr, op, arg);
7961 #ifdef RE_TRACK_PATTERN_OFFSETS
7962     if (RExC_offsets) {         /* MJD */
7963         MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n", 
7964               "reganode",
7965               __LINE__,
7966               reg_name[op],
7967               (UV)(RExC_emit - RExC_emit_start) > RExC_offsets[0] ? 
7968               "Overwriting end of array!\n" : "OK",
7969               (UV)(RExC_emit - RExC_emit_start),
7970               (UV)(RExC_parse - RExC_start),
7971               (UV)RExC_offsets[0])); 
7972         Set_Cur_Node_Offset;
7973     }
7974 #endif            
7975     RExC_emit = ptr;
7976     return(ret);
7977 }
7978
7979 /*
7980 - reguni - emit (if appropriate) a Unicode character
7981 */
7982 STATIC STRLEN
7983 S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char* s)
7984 {
7985     dVAR;
7986     return SIZE_ONLY ? UNISKIP(uv) : (uvchr_to_utf8((U8*)s, uv) - (U8*)s);
7987 }
7988
7989 /*
7990 - reginsert - insert an operator in front of already-emitted operand
7991 *
7992 * Means relocating the operand.
7993 */
7994 STATIC void
7995 S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
7996 {
7997     dVAR;
7998     register regnode *src;
7999     register regnode *dst;
8000     register regnode *place;
8001     const int offset = regarglen[(U8)op];
8002     const int size = NODE_STEP_REGNODE + offset;
8003     GET_RE_DEBUG_FLAGS_DECL;
8004 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
8005     DEBUG_PARSE_FMT("inst"," - %s",reg_name[op]);
8006     if (SIZE_ONLY) {
8007         RExC_size += size;
8008         return;
8009     }
8010
8011     src = RExC_emit;
8012     RExC_emit += size;
8013     dst = RExC_emit;
8014     if (RExC_open_parens) {
8015         int paren;
8016         DEBUG_PARSE_FMT("inst"," - %"IVdf, (IV)RExC_npar);
8017         for ( paren=0 ; paren < RExC_npar ; paren++ ) {
8018             if ( RExC_open_parens[paren] >= opnd ) {
8019                 DEBUG_PARSE_FMT("open"," - %d",size);
8020                 RExC_open_parens[paren] += size;
8021             } else {
8022                 DEBUG_PARSE_FMT("open"," - %s","ok");
8023             }
8024             if ( RExC_close_parens[paren] >= opnd ) {
8025                 DEBUG_PARSE_FMT("close"," - %d",size);
8026                 RExC_close_parens[paren] += size;
8027             } else {
8028                 DEBUG_PARSE_FMT("close"," - %s","ok");
8029             }
8030         }
8031     }
8032
8033     while (src > opnd) {
8034         StructCopy(--src, --dst, regnode);
8035 #ifdef RE_TRACK_PATTERN_OFFSETS
8036         if (RExC_offsets) {     /* MJD 20010112 */
8037             MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s copy %"UVuf" -> %"UVuf" (max %"UVuf").\n",
8038                   "reg_insert",
8039                   __LINE__,
8040                   reg_name[op],
8041                   (UV)(dst - RExC_emit_start) > RExC_offsets[0] 
8042                     ? "Overwriting end of array!\n" : "OK",
8043                   (UV)(src - RExC_emit_start),
8044                   (UV)(dst - RExC_emit_start),
8045                   (UV)RExC_offsets[0])); 
8046             Set_Node_Offset_To_R(dst-RExC_emit_start, Node_Offset(src));
8047             Set_Node_Length_To_R(dst-RExC_emit_start, Node_Length(src));
8048         }
8049 #endif
8050     }
8051     
8052
8053     place = opnd;               /* Op node, where operand used to be. */
8054 #ifdef RE_TRACK_PATTERN_OFFSETS
8055     if (RExC_offsets) {         /* MJD */
8056         MJD_OFFSET_DEBUG(("%s(%d): (op %s) %s %"UVuf" <- %"UVuf" (max %"UVuf").\n", 
8057               "reginsert",
8058               __LINE__,
8059               reg_name[op],
8060               (UV)(place - RExC_emit_start) > RExC_offsets[0] 
8061               ? "Overwriting end of array!\n" : "OK",
8062               (UV)(place - RExC_emit_start),
8063               (UV)(RExC_parse - RExC_start),
8064               (UV)RExC_offsets[0]));
8065         Set_Node_Offset(place, RExC_parse);
8066         Set_Node_Length(place, 1);
8067     }
8068 #endif    
8069     src = NEXTOPER(place);
8070     FILL_ADVANCE_NODE(place, op);
8071     Zero(src, offset, regnode);
8072 }
8073
8074 /*
8075 - regtail - set the next-pointer at the end of a node chain of p to val.
8076 - SEE ALSO: regtail_study
8077 */
8078 /* TODO: All three parms should be const */
8079 STATIC void
8080 S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
8081 {
8082     dVAR;
8083     register regnode *scan;
8084     GET_RE_DEBUG_FLAGS_DECL;
8085 #ifndef DEBUGGING
8086     PERL_UNUSED_ARG(depth);
8087 #endif
8088
8089     if (SIZE_ONLY)
8090         return;
8091
8092     /* Find last node. */
8093     scan = p;
8094     for (;;) {
8095         regnode * const temp = regnext(scan);
8096         DEBUG_PARSE_r({
8097             SV * const mysv=sv_newmortal();
8098             DEBUG_PARSE_MSG((scan==p ? "tail" : ""));
8099             regprop(RExC_rx, mysv, scan);
8100             PerlIO_printf(Perl_debug_log, "~ %s (%d) %s %s\n",
8101                 SvPV_nolen_const(mysv), REG_NODE_NUM(scan),
8102                     (temp == NULL ? "->" : ""),
8103                     (temp == NULL ? reg_name[OP(val)] : "")
8104             );
8105         });
8106         if (temp == NULL)
8107             break;
8108         scan = temp;
8109     }
8110
8111     if (reg_off_by_arg[OP(scan)]) {
8112         ARG_SET(scan, val - scan);
8113     }
8114     else {
8115         NEXT_OFF(scan) = val - scan;
8116     }
8117 }
8118
8119 #ifdef DEBUGGING
8120 /*
8121 - regtail_study - set the next-pointer at the end of a node chain of p to val.
8122 - Look for optimizable sequences at the same time.
8123 - currently only looks for EXACT chains.
8124
8125 This is expermental code. The idea is to use this routine to perform 
8126 in place optimizations on branches and groups as they are constructed,
8127 with the long term intention of removing optimization from study_chunk so
8128 that it is purely analytical.
8129
8130 Currently only used when in DEBUG mode. The macro REGTAIL_STUDY() is used
8131 to control which is which.
8132
8133 */
8134 /* TODO: All four parms should be const */
8135
8136 STATIC U8
8137 S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val,U32 depth)
8138 {
8139     dVAR;
8140     register regnode *scan;
8141     U8 exact = PSEUDO;
8142 #ifdef EXPERIMENTAL_INPLACESCAN
8143     I32 min = 0;
8144 #endif
8145
8146     GET_RE_DEBUG_FLAGS_DECL;
8147
8148
8149     if (SIZE_ONLY)
8150         return exact;
8151
8152     /* Find last node. */
8153
8154     scan = p;
8155     for (;;) {
8156         regnode * const temp = regnext(scan);
8157 #ifdef EXPERIMENTAL_INPLACESCAN
8158         if (PL_regkind[OP(scan)] == EXACT)
8159             if (join_exact(pRExC_state,scan,&min,1,val,depth+1))
8160                 return EXACT;
8161 #endif
8162         if ( exact ) {
8163             switch (OP(scan)) {
8164                 case EXACT:
8165                 case EXACTF:
8166                 case EXACTFL:
8167                         if( exact == PSEUDO )
8168                             exact= OP(scan);
8169                         else if ( exact != OP(scan) )
8170                             exact= 0;
8171                 case NOTHING:
8172                     break;
8173                 default:
8174                     exact= 0;
8175             }
8176         }
8177         DEBUG_PARSE_r({
8178             SV * const mysv=sv_newmortal();
8179             DEBUG_PARSE_MSG((scan==p ? "tsdy" : ""));
8180             regprop(RExC_rx, mysv, scan);
8181             PerlIO_printf(Perl_debug_log, "~ %s (%d) -> %s\n",
8182                 SvPV_nolen_const(mysv),
8183                 REG_NODE_NUM(scan),
8184                 reg_name[exact]);
8185         });
8186         if (temp == NULL)
8187             break;
8188         scan = temp;
8189     }
8190     DEBUG_PARSE_r({
8191         SV * const mysv_val=sv_newmortal();
8192         DEBUG_PARSE_MSG("");
8193         regprop(RExC_rx, mysv_val, val);
8194         PerlIO_printf(Perl_debug_log, "~ attach to %s (%"IVdf") offset to %"IVdf"\n",
8195                       SvPV_nolen_const(mysv_val),
8196                       (IV)REG_NODE_NUM(val),
8197                       (IV)(val - scan)
8198         );
8199     });
8200     if (reg_off_by_arg[OP(scan)]) {
8201         ARG_SET(scan, val - scan);
8202     }
8203     else {
8204         NEXT_OFF(scan) = val - scan;
8205     }
8206
8207     return exact;
8208 }
8209 #endif
8210
8211 /*
8212  - regcurly - a little FSA that accepts {\d+,?\d*}
8213  */
8214 STATIC I32
8215 S_regcurly(register const char *s)
8216 {
8217     if (*s++ != '{')
8218         return FALSE;
8219     if (!isDIGIT(*s))
8220         return FALSE;
8221     while (isDIGIT(*s))
8222         s++;
8223     if (*s == ',')
8224         s++;
8225     while (isDIGIT(*s))
8226         s++;
8227     if (*s != '}')
8228         return FALSE;
8229     return TRUE;
8230 }
8231
8232
8233 /*
8234  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
8235  */
8236 void
8237 Perl_regdump(pTHX_ const regexp *r)
8238 {
8239 #ifdef DEBUGGING
8240     dVAR;
8241     SV * const sv = sv_newmortal();
8242     SV *dsv= sv_newmortal();
8243     RXi_GET_DECL(r,ri);
8244
8245     (void)dumpuntil(r, ri->program, ri->program + 1, NULL, NULL, sv, 0, 0);
8246
8247     /* Header fields of interest. */
8248     if (r->anchored_substr) {
8249         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->anchored_substr), 
8250             RE_SV_DUMPLEN(r->anchored_substr), 30);
8251         PerlIO_printf(Perl_debug_log,
8252                       "anchored %s%s at %"IVdf" ",
8253                       s, RE_SV_TAIL(r->anchored_substr),
8254                       (IV)r->anchored_offset);
8255     } else if (r->anchored_utf8) {
8256         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->anchored_utf8), 
8257             RE_SV_DUMPLEN(r->anchored_utf8), 30);
8258         PerlIO_printf(Perl_debug_log,
8259                       "anchored utf8 %s%s at %"IVdf" ",
8260                       s, RE_SV_TAIL(r->anchored_utf8),
8261                       (IV)r->anchored_offset);
8262     }                 
8263     if (r->float_substr) {
8264         RE_PV_QUOTED_DECL(s, 0, dsv, SvPVX_const(r->float_substr), 
8265             RE_SV_DUMPLEN(r->float_substr), 30);
8266         PerlIO_printf(Perl_debug_log,
8267                       "floating %s%s at %"IVdf"..%"UVuf" ",
8268                       s, RE_SV_TAIL(r->float_substr),
8269                       (IV)r->float_min_offset, (UV)r->float_max_offset);
8270     } else if (r->float_utf8) {
8271         RE_PV_QUOTED_DECL(s, 1, dsv, SvPVX_const(r->float_utf8), 
8272             RE_SV_DUMPLEN(r->float_utf8), 30);
8273         PerlIO_printf(Perl_debug_log,
8274                       "floating utf8 %s%s at %"IVdf"..%"UVuf" ",
8275                       s, RE_SV_TAIL(r->float_utf8),
8276                       (IV)r->float_min_offset, (UV)r->float_max_offset);
8277     }
8278     if (r->check_substr || r->check_utf8)
8279         PerlIO_printf(Perl_debug_log,
8280                       (const char *)
8281                       (r->check_substr == r->float_substr
8282                        && r->check_utf8 == r->float_utf8
8283                        ? "(checking floating" : "(checking anchored"));
8284     if (r->extflags & RXf_NOSCAN)
8285         PerlIO_printf(Perl_debug_log, " noscan");
8286     if (r->extflags & RXf_CHECK_ALL)
8287         PerlIO_printf(Perl_debug_log, " isall");
8288     if (r->check_substr || r->check_utf8)
8289         PerlIO_printf(Perl_debug_log, ") ");
8290
8291     if (ri->regstclass) {
8292         regprop(r, sv, ri->regstclass);
8293         PerlIO_printf(Perl_debug_log, "stclass %s ", SvPVX_const(sv));
8294     }
8295     if (r->extflags & RXf_ANCH) {
8296         PerlIO_printf(Perl_debug_log, "anchored");
8297         if (r->extflags & RXf_ANCH_BOL)
8298             PerlIO_printf(Perl_debug_log, "(BOL)");
8299         if (r->extflags & RXf_ANCH_MBOL)
8300             PerlIO_printf(Perl_debug_log, "(MBOL)");
8301         if (r->extflags & RXf_ANCH_SBOL)
8302             PerlIO_printf(Perl_debug_log, "(SBOL)");
8303         if (r->extflags & RXf_ANCH_GPOS)
8304             PerlIO_printf(Perl_debug_log, "(GPOS)");
8305         PerlIO_putc(Perl_debug_log, ' ');
8306     }
8307     if (r->extflags & RXf_GPOS_SEEN)
8308         PerlIO_printf(Perl_debug_log, "GPOS:%"UVuf" ", (UV)r->gofs);
8309     if (r->intflags & PREGf_SKIP)
8310         PerlIO_printf(Perl_debug_log, "plus ");
8311     if (r->intflags & PREGf_IMPLICIT)
8312         PerlIO_printf(Perl_debug_log, "implicit ");
8313     PerlIO_printf(Perl_debug_log, "minlen %"IVdf" ", (IV)r->minlen);
8314     if (r->extflags & RXf_EVAL_SEEN)
8315         PerlIO_printf(Perl_debug_log, "with eval ");
8316     PerlIO_printf(Perl_debug_log, "\n");
8317 #else
8318     PERL_UNUSED_CONTEXT;
8319     PERL_UNUSED_ARG(r);
8320 #endif  /* DEBUGGING */
8321 }
8322
8323 /*
8324 - regprop - printable representation of opcode
8325 */
8326 void
8327 Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o)
8328 {
8329 #ifdef DEBUGGING
8330     dVAR;
8331     register int k;
8332     RXi_GET_DECL(prog,progi);
8333     GET_RE_DEBUG_FLAGS_DECL;
8334     
8335
8336     sv_setpvn(sv, "", 0);
8337
8338     if (OP(o) > REGNODE_MAX)            /* regnode.type is unsigned */
8339         /* It would be nice to FAIL() here, but this may be called from
8340            regexec.c, and it would be hard to supply pRExC_state. */
8341         Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", (int)OP(o), (int)REGNODE_MAX);
8342     sv_catpv(sv, reg_name[OP(o)]); /* Take off const! */
8343
8344     k = PL_regkind[OP(o)];
8345
8346     if (k == EXACT) {
8347         SV * const dsv = sv_2mortal(newSVpvs(""));
8348         /* Using is_utf8_string() (via PERL_PV_UNI_DETECT) 
8349          * is a crude hack but it may be the best for now since 
8350          * we have no flag "this EXACTish node was UTF-8" 
8351          * --jhi */
8352         const char * const s = 
8353             pv_pretty(dsv, STRING(o), STR_LEN(o), 60, 
8354                 PL_colors[0], PL_colors[1],
8355                 PERL_PV_ESCAPE_UNI_DETECT |
8356                 PERL_PV_PRETTY_ELIPSES    |
8357                 PERL_PV_PRETTY_LTGT    
8358             ); 
8359         Perl_sv_catpvf(aTHX_ sv, " %s", s );
8360     } else if (k == TRIE) {
8361         /* print the details of the trie in dumpuntil instead, as
8362          * progi->data isn't available here */
8363         const char op = OP(o);
8364         const U32 n = ARG(o);
8365         const reg_ac_data * const ac = IS_TRIE_AC(op) ?
8366                (reg_ac_data *)progi->data->data[n] :
8367                NULL;
8368         const reg_trie_data * const trie
8369             = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie];
8370         
8371         Perl_sv_catpvf(aTHX_ sv, "-%s",reg_name[o->flags]);
8372         DEBUG_TRIE_COMPILE_r(
8373             Perl_sv_catpvf(aTHX_ sv,
8374                 "<S:%"UVuf"/%"IVdf" W:%"UVuf" L:%"UVuf"/%"UVuf" C:%"UVuf"/%"UVuf">",
8375                 (UV)trie->startstate,
8376                 (IV)trie->statecount-1, /* -1 because of the unused 0 element */
8377                 (UV)trie->wordcount,
8378                 (UV)trie->minlen,
8379                 (UV)trie->maxlen,
8380                 (UV)TRIE_CHARCOUNT(trie),
8381                 (UV)trie->uniquecharcount
8382             )
8383         );
8384         if ( IS_ANYOF_TRIE(op) || trie->bitmap ) {
8385             int i;
8386             int rangestart = -1;
8387             U8* bitmap = IS_ANYOF_TRIE(op) ? (U8*)ANYOF_BITMAP(o) : (U8*)TRIE_BITMAP(trie);
8388             Perl_sv_catpvf(aTHX_ sv, "[");
8389             for (i = 0; i <= 256; i++) {
8390                 if (i < 256 && BITMAP_TEST(bitmap,i)) {
8391                     if (rangestart == -1)
8392                         rangestart = i;
8393                 } else if (rangestart != -1) {
8394                     if (i <= rangestart + 3)
8395                         for (; rangestart < i; rangestart++)
8396                             put_byte(sv, rangestart);
8397                     else {
8398                         put_byte(sv, rangestart);
8399                         sv_catpvs(sv, "-");
8400                         put_byte(sv, i - 1);
8401                     }
8402                     rangestart = -1;
8403                 }
8404             }
8405             Perl_sv_catpvf(aTHX_ sv, "]");
8406         } 
8407          
8408     } else if (k == CURLY) {
8409         if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
8410             Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
8411         Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
8412     }
8413     else if (k == WHILEM && o->flags)                   /* Ordinal/of */
8414         Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
8415     else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP || OP(o)==ACCEPT) {
8416         Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o));    /* Parenth number */
8417         if ( prog->paren_names ) {
8418             if ( k != REF || OP(o) < NREF) {        
8419                 AV *list= (AV *)progi->data->data[progi->name_list_idx];
8420                 SV **name= av_fetch(list, ARG(o), 0 );
8421                 if (name)
8422                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
8423             }       
8424             else {
8425                 AV *list= (AV *)progi->data->data[ progi->name_list_idx ];
8426                 SV *sv_dat=(SV*)progi->data->data[ ARG( o ) ];
8427                 I32 *nums=(I32*)SvPVX(sv_dat);
8428                 SV **name= av_fetch(list, nums[0], 0 );
8429                 I32 n;
8430                 if (name) {
8431                     for ( n=0; n<SvIVX(sv_dat); n++ ) {
8432                         Perl_sv_catpvf(aTHX_ sv, "%s%"IVdf,
8433                                     (n ? "," : ""), (IV)nums[n]);
8434                     }
8435                     Perl_sv_catpvf(aTHX_ sv, " '%"SVf"'", SVfARG(*name));
8436                 }
8437             }
8438         }            
8439     } else if (k == GOSUB) 
8440         Perl_sv_catpvf(aTHX_ sv, "%d[%+d]", (int)ARG(o),(int)ARG2L(o)); /* Paren and offset */
8441     else if (k == VERB) {
8442         if (!o->flags) 
8443             Perl_sv_catpvf(aTHX_ sv, ":%"SVf, 
8444                 SVfARG((SV*)progi->data->data[ ARG( o ) ]));
8445     } else if (k == LOGICAL)
8446         Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);     /* 2: embedded, otherwise 1 */
8447     else if (k == ANYOF) {
8448         int i, rangestart = -1;
8449         const U8 flags = ANYOF_FLAGS(o);
8450
8451         /* Should be synchronized with * ANYOF_ #xdefines in regcomp.h */
8452         static const char * const anyofs[] = {
8453             "\\w",
8454             "\\W",
8455             "\\s",
8456             "\\S",
8457             "\\d",
8458             "\\D",
8459             "[:alnum:]",
8460             "[:^alnum:]",
8461             "[:alpha:]",
8462             "[:^alpha:]",
8463             "[:ascii:]",
8464             "[:^ascii:]",
8465             "[:ctrl:]",
8466             "[:^ctrl:]",
8467             "[:graph:]",
8468             "[:^graph:]",
8469             "[:lower:]",
8470             "[:^lower:]",
8471             "[:print:]",
8472             "[:^print:]",
8473             "[:punct:]",
8474             "[:^punct:]",
8475             "[:upper:]",
8476             "[:^upper:]",
8477             "[:xdigit:]",
8478             "[:^xdigit:]",
8479             "[:space:]",
8480             "[:^space:]",
8481             "[:blank:]",
8482             "[:^blank:]"
8483         };
8484
8485         if (flags & ANYOF_LOCALE)
8486             sv_catpvs(sv, "{loc}");
8487         if (flags & ANYOF_FOLD)
8488             sv_catpvs(sv, "{i}");
8489         Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
8490         if (flags & ANYOF_INVERT)
8491             sv_catpvs(sv, "^");
8492         for (i = 0; i <= 256; i++) {
8493             if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
8494                 if (rangestart == -1)
8495                     rangestart = i;
8496             } else if (rangestart != -1) {
8497                 if (i <= rangestart + 3)
8498                     for (; rangestart < i; rangestart++)
8499                         put_byte(sv, rangestart);
8500                 else {
8501                     put_byte(sv, rangestart);
8502                     sv_catpvs(sv, "-");
8503                     put_byte(sv, i - 1);
8504                 }
8505                 rangestart = -1;
8506             }
8507         }
8508
8509         if (o->flags & ANYOF_CLASS)
8510             for (i = 0; i < (int)(sizeof(anyofs)/sizeof(char*)); i++)
8511                 if (ANYOF_CLASS_TEST(o,i))
8512                     sv_catpv(sv, anyofs[i]);
8513
8514         if (flags & ANYOF_UNICODE)
8515             sv_catpvs(sv, "{unicode}");
8516         else if (flags & ANYOF_UNICODE_ALL)
8517             sv_catpvs(sv, "{unicode_all}");
8518
8519         {
8520             SV *lv;
8521             SV * const sw = regclass_swash(prog, o, FALSE, &lv, 0);
8522         
8523             if (lv) {
8524                 if (sw) {
8525                     U8 s[UTF8_MAXBYTES_CASE+1];
8526                 
8527                     for (i = 0; i <= 256; i++) { /* just the first 256 */
8528                         uvchr_to_utf8(s, i);
8529                         
8530                         if (i < 256 && swash_fetch(sw, s, TRUE)) {
8531                             if (rangestart == -1)
8532                                 rangestart = i;
8533                         } else if (rangestart != -1) {
8534                             if (i <= rangestart + 3)
8535                                 for (; rangestart < i; rangestart++) {
8536                                     const U8 * const e = uvchr_to_utf8(s,rangestart);
8537                                     U8 *p;
8538                                     for(p = s; p < e; p++)
8539                                         put_byte(sv, *p);
8540                                 }
8541                             else {
8542                                 const U8 *e = uvchr_to_utf8(s,rangestart);
8543                                 U8 *p;
8544                                 for (p = s; p < e; p++)
8545                                     put_byte(sv, *p);
8546                                 sv_catpvs(sv, "-");
8547                                 e = uvchr_to_utf8(s, i-1);
8548                                 for (p = s; p < e; p++)
8549                                     put_byte(sv, *p);
8550                                 }
8551                                 rangestart = -1;
8552                             }
8553                         }
8554                         
8555                     sv_catpvs(sv, "..."); /* et cetera */
8556                 }
8557
8558                 {
8559                     char *s = savesvpv(lv);
8560                     char * const origs = s;
8561                 
8562                     while (*s && *s != '\n')
8563                         s++;
8564                 
8565                     if (*s == '\n') {
8566                         const char * const t = ++s;
8567                         
8568                         while (*s) {
8569                             if (*s == '\n')
8570                                 *s = ' ';
8571                             s++;
8572                         }
8573                         if (s[-1] == ' ')
8574                             s[-1] = 0;
8575                         
8576                         sv_catpv(sv, t);
8577                     }
8578                 
8579                     Safefree(origs);
8580                 }
8581             }
8582         }
8583
8584         Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
8585     }
8586     else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
8587         Perl_sv_catpvf(aTHX_ sv, "[%d]", -(o->flags));
8588 #else
8589     PERL_UNUSED_CONTEXT;
8590     PERL_UNUSED_ARG(sv);
8591     PERL_UNUSED_ARG(o);
8592     PERL_UNUSED_ARG(prog);
8593 #endif  /* DEBUGGING */
8594 }
8595
8596 SV *
8597 Perl_re_intuit_string(pTHX_ regexp *prog)
8598 {                               /* Assume that RE_INTUIT is set */
8599     dVAR;
8600     GET_RE_DEBUG_FLAGS_DECL;
8601     PERL_UNUSED_CONTEXT;
8602
8603     DEBUG_COMPILE_r(
8604         {
8605             const char * const s = SvPV_nolen_const(prog->check_substr
8606                       ? prog->check_substr : prog->check_utf8);
8607
8608             if (!PL_colorset) reginitcolors();
8609             PerlIO_printf(Perl_debug_log,
8610                       "%sUsing REx %ssubstr:%s \"%s%.60s%s%s\"\n",
8611                       PL_colors[4],
8612                       prog->check_substr ? "" : "utf8 ",
8613                       PL_colors[5],PL_colors[0],
8614                       s,
8615                       PL_colors[1],
8616                       (strlen(s) > 60 ? "..." : ""));
8617         } );
8618
8619     return prog->check_substr ? prog->check_substr : prog->check_utf8;
8620 }
8621
8622 /* 
8623    pregfree() 
8624    
8625    handles refcounting and freeing the perl core regexp structure. When 
8626    it is necessary to actually free the structure the first thing it 
8627    does is call the 'free' method of the regexp_engine associated to to 
8628    the regexp, allowing the handling of the void *pprivate; member 
8629    first. (This routine is not overridable by extensions, which is why 
8630    the extensions free is called first.)
8631    
8632    See regdupe and regdupe_internal if you change anything here. 
8633 */
8634 #ifndef PERL_IN_XSUB_RE
8635 void
8636 Perl_pregfree(pTHX_ struct regexp *r)
8637 {
8638     dVAR;
8639     GET_RE_DEBUG_FLAGS_DECL;
8640
8641     if (!r || (--r->refcnt > 0))
8642         return;
8643         
8644     CALLREGFREE_PVT(r); /* free the private data */
8645     RX_MATCH_COPY_FREE(r);
8646 #ifdef PERL_OLD_COPY_ON_WRITE
8647     if (r->saved_copy)
8648         SvREFCNT_dec(r->saved_copy);
8649 #endif
8650     if (r->substrs) {
8651         if (r->anchored_substr)
8652             SvREFCNT_dec(r->anchored_substr);
8653         if (r->anchored_utf8)
8654             SvREFCNT_dec(r->anchored_utf8);
8655         if (r->float_substr)
8656             SvREFCNT_dec(r->float_substr);
8657         if (r->float_utf8)
8658             SvREFCNT_dec(r->float_utf8);
8659         Safefree(r->substrs);
8660     }
8661     if (r->paren_names)
8662         SvREFCNT_dec(r->paren_names);
8663     Safefree(r->wrapped);
8664     Safefree(r->startp);
8665     Safefree(r->endp);
8666     Safefree(r);
8667 }
8668 #endif
8669
8670 /* regfree_internal() 
8671
8672    Free the private data in a regexp. This is overloadable by 
8673    extensions. Perl takes care of the regexp structure in pregfree(), 
8674    this covers the *pprivate pointer which technically perldoesnt 
8675    know about, however of course we have to handle the 
8676    regexp_internal structure when no extension is in use. 
8677    
8678    Note this is called before freeing anything in the regexp 
8679    structure. 
8680  */
8681  
8682 void
8683 Perl_regfree_internal(pTHX_ struct regexp *r)
8684 {
8685     dVAR;
8686     RXi_GET_DECL(r,ri);
8687     GET_RE_DEBUG_FLAGS_DECL;
8688     
8689     DEBUG_COMPILE_r({
8690         if (!PL_colorset)
8691             reginitcolors();
8692         {
8693             SV *dsv= sv_newmortal();
8694             RE_PV_QUOTED_DECL(s, (r->extflags & RXf_UTF8),
8695                 dsv, r->precomp, r->prelen, 60);
8696             PerlIO_printf(Perl_debug_log,"%sFreeing REx:%s %s\n", 
8697                 PL_colors[4],PL_colors[5],s);
8698         }
8699     });
8700 #ifdef RE_TRACK_PATTERN_OFFSETS
8701     if (ri->u.offsets)
8702         Safefree(ri->u.offsets);             /* 20010421 MJD */
8703 #endif
8704     if (ri->data) {
8705         int n = ri->data->count;
8706         PAD* new_comppad = NULL;
8707         PAD* old_comppad;
8708         PADOFFSET refcnt;
8709
8710         while (--n >= 0) {
8711           /* If you add a ->what type here, update the comment in regcomp.h */
8712             switch (ri->data->what[n]) {
8713             case 's':
8714             case 'S':
8715             case 'u':
8716                 SvREFCNT_dec((SV*)ri->data->data[n]);
8717                 break;
8718             case 'f':
8719                 Safefree(ri->data->data[n]);
8720                 break;
8721             case 'p':
8722                 new_comppad = (AV*)ri->data->data[n];
8723                 break;
8724             case 'o':
8725                 if (new_comppad == NULL)
8726                     Perl_croak(aTHX_ "panic: pregfree comppad");
8727                 PAD_SAVE_LOCAL(old_comppad,
8728                     /* Watch out for global destruction's random ordering. */
8729                     (SvTYPE(new_comppad) == SVt_PVAV) ? new_comppad : NULL
8730                 );
8731                 OP_REFCNT_LOCK;
8732                 refcnt = OpREFCNT_dec((OP_4tree*)ri->data->data[n]);
8733                 OP_REFCNT_UNLOCK;
8734                 if (!refcnt)
8735                     op_free((OP_4tree*)ri->data->data[n]);
8736
8737                 PAD_RESTORE_LOCAL(old_comppad);
8738                 SvREFCNT_dec((SV*)new_comppad);
8739                 new_comppad = NULL;
8740                 break;
8741             case 'n':
8742                 break;
8743             case 'T':           
8744                 { /* Aho Corasick add-on structure for a trie node.
8745                      Used in stclass optimization only */
8746                     U32 refcount;
8747                     reg_ac_data *aho=(reg_ac_data*)ri->data->data[n];
8748                     OP_REFCNT_LOCK;
8749                     refcount = --aho->refcount;
8750                     OP_REFCNT_UNLOCK;
8751                     if ( !refcount ) {
8752                         PerlMemShared_free(aho->states);
8753                         PerlMemShared_free(aho->fail);
8754                          /* do this last!!!! */
8755                         PerlMemShared_free(ri->data->data[n]);
8756                         PerlMemShared_free(ri->regstclass);
8757                     }
8758                 }
8759                 break;
8760             case 't':
8761                 {
8762                     /* trie structure. */
8763                     U32 refcount;
8764                     reg_trie_data *trie=(reg_trie_data*)ri->data->data[n];
8765                     OP_REFCNT_LOCK;
8766                     refcount = --trie->refcount;
8767                     OP_REFCNT_UNLOCK;
8768                     if ( !refcount ) {
8769                         PerlMemShared_free(trie->charmap);
8770                         PerlMemShared_free(trie->states);
8771                         PerlMemShared_free(trie->trans);
8772                         if (trie->bitmap)
8773                             PerlMemShared_free(trie->bitmap);
8774                         if (trie->wordlen)
8775                             PerlMemShared_free(trie->wordlen);
8776                         if (trie->jump)
8777                             PerlMemShared_free(trie->jump);
8778                         if (trie->nextword)
8779                             PerlMemShared_free(trie->nextword);
8780                         /* do this last!!!! */
8781                         PerlMemShared_free(ri->data->data[n]);
8782                     }
8783                 }
8784                 break;
8785             default:
8786                 Perl_croak(aTHX_ "panic: regfree data code '%c'", ri->data->what[n]);
8787             }
8788         }
8789         Safefree(ri->data->what);
8790         Safefree(ri->data);
8791     }
8792     if (ri->swap) {
8793         Safefree(ri->swap->startp);
8794         Safefree(ri->swap->endp);
8795         Safefree(ri->swap);
8796     }
8797     Safefree(ri);
8798 }
8799
8800 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8801 #define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8802 #define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8803 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
8804
8805 /* 
8806    regdupe - duplicate a regexp. 
8807    
8808    This routine is called by sv.c's re_dup and is expected to clone a 
8809    given regexp structure. It is a no-op when not under USE_ITHREADS. 
8810    (Originally this *was* re_dup() for change history see sv.c)
8811    
8812    After all of the core data stored in struct regexp is duplicated
8813    the regexp_engine.dupe method is used to copy any private data
8814    stored in the *pprivate pointer. This allows extensions to handle
8815    any duplication it needs to do.
8816
8817    See pregfree() and regfree_internal() if you change anything here. 
8818 */
8819 #if defined(USE_ITHREADS)
8820 #ifndef PERL_IN_XSUB_RE
8821 regexp *
8822 Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param)
8823 {
8824     dVAR;
8825     regexp *ret;
8826     int i, npar;
8827     struct reg_substr_datum *s;
8828
8829     if (!r)
8830         return (REGEXP *)NULL;
8831
8832     if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8833         return ret;
8834
8835     
8836     npar = r->nparens+1;
8837     Newxz(ret, 1, regexp);
8838     Newx(ret->startp, npar, I32);
8839     Copy(r->startp, ret->startp, npar, I32);
8840     Newx(ret->endp, npar, I32);
8841     Copy(r->endp, ret->endp, npar, I32);
8842
8843     if (r->substrs) {
8844         Newx(ret->substrs, 1, struct reg_substr_data);
8845         for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8846             s->min_offset = r->substrs->data[i].min_offset;
8847             s->max_offset = r->substrs->data[i].max_offset;
8848             s->end_shift  = r->substrs->data[i].end_shift;
8849             s->substr     = sv_dup_inc(r->substrs->data[i].substr, param);
8850             s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
8851         }
8852     } else 
8853         ret->substrs = NULL;    
8854
8855     ret->wrapped        = SAVEPVN(r->wrapped, r->wraplen);
8856     ret->precomp        = ret->wrapped + (r->precomp - r->wrapped);
8857     ret->prelen         = r->prelen;
8858     ret->wraplen        = r->wraplen;
8859
8860     ret->refcnt         = r->refcnt;
8861     ret->minlen         = r->minlen;
8862     ret->minlenret      = r->minlenret;
8863     ret->nparens        = r->nparens;
8864     ret->lastparen      = r->lastparen;
8865     ret->lastcloseparen = r->lastcloseparen;
8866     ret->intflags       = r->intflags;
8867     ret->extflags       = r->extflags;
8868
8869     ret->sublen         = r->sublen;
8870
8871     ret->engine         = r->engine;
8872     
8873     ret->paren_names    = hv_dup_inc(r->paren_names, param);
8874
8875     if (RX_MATCH_COPIED(ret))
8876         ret->subbeg  = SAVEPVN(r->subbeg, r->sublen);
8877     else
8878         ret->subbeg = NULL;
8879 #ifdef PERL_OLD_COPY_ON_WRITE
8880     ret->saved_copy = NULL;
8881 #endif
8882     
8883     ret->pprivate = r->pprivate;
8884     if (ret->pprivate) 
8885         RXi_SET(ret,CALLREGDUPE_PVT(ret,param));
8886     
8887     ptr_table_store(PL_ptr_table, r, ret);
8888     return ret;
8889 }
8890 #endif /* PERL_IN_XSUB_RE */
8891
8892 /*
8893    regdupe_internal()
8894    
8895    This is the internal complement to regdupe() which is used to copy
8896    the structure pointed to by the *pprivate pointer in the regexp.
8897    This is the core version of the extension overridable cloning hook.
8898    The regexp structure being duplicated will be copied by perl prior
8899    to this and will be provided as the regexp *r argument, however 
8900    with the /old/ structures pprivate pointer value. Thus this routine
8901    may override any copying normally done by perl.
8902    
8903    It returns a pointer to the new regexp_internal structure.
8904 */
8905
8906 void *
8907 Perl_regdupe_internal(pTHX_ const regexp *r, CLONE_PARAMS *param)
8908 {
8909     dVAR;
8910     regexp_internal *reti;
8911     int len, npar;
8912     RXi_GET_DECL(r,ri);
8913     
8914     npar = r->nparens+1;
8915     len = ProgLen(ri);
8916     
8917     Newxc(reti, sizeof(regexp_internal) + (len+1)*sizeof(regnode), char, regexp_internal);
8918     Copy(ri->program, reti->program, len+1, regnode);
8919     
8920     if(ri->swap) {
8921         Newx(reti->swap, 1, regexp_paren_ofs);
8922         /* no need to copy these */
8923         Newx(reti->swap->startp, npar, I32);
8924         Newx(reti->swap->endp, npar, I32);
8925     } else {
8926         reti->swap = NULL;
8927     }
8928
8929     reti->regstclass = NULL;
8930
8931     if (ri->data) {
8932         struct reg_data *d;
8933         const int count = ri->data->count;
8934         int i;
8935
8936         Newxc(d, sizeof(struct reg_data) + count*sizeof(void *),
8937                 char, struct reg_data);
8938         Newx(d->what, count, U8);
8939
8940         d->count = count;
8941         for (i = 0; i < count; i++) {
8942             d->what[i] = ri->data->what[i];
8943             switch (d->what[i]) {
8944                 /* legal options are one of: sSfpontTu
8945                    see also regcomp.h and pregfree() */
8946             case 's':
8947             case 'S':
8948             case 'p': /* actually an AV, but the dup function is identical.  */
8949             case 'u': /* actually an HV, but the dup function is identical.  */
8950                 d->data[i] = sv_dup_inc((SV *)ri->data->data[i], param);
8951                 break;
8952             case 'f':
8953                 /* This is cheating. */
8954                 Newx(d->data[i], 1, struct regnode_charclass_class);
8955                 StructCopy(ri->data->data[i], d->data[i],
8956                             struct regnode_charclass_class);
8957                 reti->regstclass = (regnode*)d->data[i];
8958                 break;
8959             case 'o':
8960                 /* Compiled op trees are readonly and in shared memory,
8961                    and can thus be shared without duplication. */
8962                 OP_REFCNT_LOCK;
8963                 d->data[i] = (void*)OpREFCNT_inc((OP*)ri->data->data[i]);
8964                 OP_REFCNT_UNLOCK;
8965                 break;
8966             case 'T':
8967                 /* Trie stclasses are readonly and can thus be shared
8968                  * without duplication. We free the stclass in pregfree
8969                  * when the corresponding reg_ac_data struct is freed.
8970                  */
8971                 reti->regstclass= ri->regstclass;
8972                 /* Fall through */
8973             case 't':
8974                 OP_REFCNT_LOCK;
8975                 ((reg_trie_data*)ri->data->data[i])->refcount++;
8976                 OP_REFCNT_UNLOCK;
8977                 /* Fall through */
8978             case 'n':
8979                 d->data[i] = ri->data->data[i];
8980                 break;
8981             default:
8982                 Perl_croak(aTHX_ "panic: re_dup unknown data code '%c'", ri->data->what[i]);
8983             }
8984         }
8985
8986         reti->data = d;
8987     }
8988     else
8989         reti->data = NULL;
8990
8991     reti->name_list_idx = ri->name_list_idx;
8992
8993 #ifdef RE_TRACK_PATTERN_OFFSETS
8994     if (ri->u.offsets) {
8995         Newx(reti->u.offsets, 2*len+1, U32);
8996         Copy(ri->u.offsets, reti->u.offsets, 2*len+1, U32);
8997     }
8998 #else
8999     SetProgLen(reti,len);
9000 #endif
9001
9002     return (void*)reti;
9003 }
9004
9005 #endif    /* USE_ITHREADS */
9006
9007 /* 
9008    reg_stringify() 
9009    
9010    converts a regexp embedded in a MAGIC struct to its stringified form, 
9011    caching the converted form in the struct and returns the cached 
9012    string. 
9013
9014    If lp is nonnull then it is used to return the length of the 
9015    resulting string
9016    
9017    If flags is nonnull and the returned string contains UTF8 then 
9018    (*flags & 1) will be true.
9019    
9020    If haseval is nonnull then it is used to return whether the pattern 
9021    contains evals.
9022    
9023    Normally called via macro: 
9024    
9025         CALLREG_STRINGIFY(mg,&len,&utf8);
9026         
9027    And internally with
9028    
9029         CALLREG_AS_STR(mg,&lp,&flags,&haseval)        
9030     
9031    See sv_2pv_flags() in sv.c for an example of internal usage.
9032     
9033  */
9034 #ifndef PERL_IN_XSUB_RE
9035
9036 char *
9037 Perl_reg_stringify(pTHX_ MAGIC *mg, STRLEN *lp, U32 *flags, I32 *haseval ) {
9038     dVAR;
9039     const regexp * const re = (regexp *)mg->mg_obj;
9040     if (haseval) 
9041         *haseval = re->seen_evals;
9042     if (flags)    
9043         *flags = ((re->extflags & RXf_UTF8) ? 1 : 0);
9044     if (lp)
9045         *lp = re->wraplen;
9046     return re->wrapped;
9047 }
9048
9049 /*
9050  - regnext - dig the "next" pointer out of a node
9051  */
9052 regnode *
9053 Perl_regnext(pTHX_ register regnode *p)
9054 {
9055     dVAR;
9056     register I32 offset;
9057
9058     if (!p)
9059         return(NULL);
9060
9061     offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
9062     if (offset == 0)
9063         return(NULL);
9064
9065     return(p+offset);
9066 }
9067 #endif
9068
9069 STATIC void     
9070 S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
9071 {
9072     va_list args;
9073     STRLEN l1 = strlen(pat1);
9074     STRLEN l2 = strlen(pat2);
9075     char buf[512];
9076     SV *msv;
9077     const char *message;
9078
9079     if (l1 > 510)
9080         l1 = 510;
9081     if (l1 + l2 > 510)
9082         l2 = 510 - l1;
9083     Copy(pat1, buf, l1 , char);
9084     Copy(pat2, buf + l1, l2 , char);
9085     buf[l1 + l2] = '\n';
9086     buf[l1 + l2 + 1] = '\0';
9087 #ifdef I_STDARG
9088     /* ANSI variant takes additional second argument */
9089     va_start(args, pat2);
9090 #else
9091     va_start(args);
9092 #endif
9093     msv = vmess(buf, &args);
9094     va_end(args);
9095     message = SvPV_const(msv,l1);
9096     if (l1 > 512)
9097         l1 = 512;
9098     Copy(message, buf, l1 , char);
9099     buf[l1-1] = '\0';                   /* Overwrite \n */
9100     Perl_croak(aTHX_ "%s", buf);
9101 }
9102
9103 /* XXX Here's a total kludge.  But we need to re-enter for swash routines. */
9104
9105 #ifndef PERL_IN_XSUB_RE
9106 void
9107 Perl_save_re_context(pTHX)
9108 {
9109     dVAR;
9110
9111     struct re_save_state *state;
9112
9113     SAVEVPTR(PL_curcop);
9114     SSGROW(SAVESTACK_ALLOC_FOR_RE_SAVE_STATE + 1);
9115
9116     state = (struct re_save_state *)(PL_savestack + PL_savestack_ix);
9117     PL_savestack_ix += SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
9118     SSPUSHINT(SAVEt_RE_STATE);
9119
9120     Copy(&PL_reg_state, state, 1, struct re_save_state);
9121
9122     PL_reg_start_tmp = 0;
9123     PL_reg_start_tmpl = 0;
9124     PL_reg_oldsaved = NULL;
9125     PL_reg_oldsavedlen = 0;
9126     PL_reg_maxiter = 0;
9127     PL_reg_leftiter = 0;
9128     PL_reg_poscache = NULL;
9129     PL_reg_poscache_size = 0;
9130 #ifdef PERL_OLD_COPY_ON_WRITE
9131     PL_nrs = NULL;
9132 #endif
9133
9134     /* Save $1..$n (#18107: UTF-8 s/(\w+)/uc($1)/e); AMS 20021106. */
9135     if (PL_curpm) {
9136         const REGEXP * const rx = PM_GETRE(PL_curpm);
9137         if (rx) {
9138             U32 i;
9139             for (i = 1; i <= rx->nparens; i++) {
9140                 char digits[TYPE_CHARS(long)];
9141                 const STRLEN len = my_snprintf(digits, sizeof(digits), "%lu", (long)i);
9142                 GV *const *const gvp
9143                     = (GV**)hv_fetch(PL_defstash, digits, len, 0);
9144
9145                 if (gvp) {
9146                     GV * const gv = *gvp;
9147                     if (SvTYPE(gv) == SVt_PVGV && GvSV(gv))
9148                         save_scalar(gv);
9149                 }
9150             }
9151         }
9152     }
9153 }
9154 #endif
9155
9156 static void
9157 clear_re(pTHX_ void *r)
9158 {
9159     dVAR;
9160     ReREFCNT_dec((regexp *)r);
9161 }
9162
9163 #ifdef DEBUGGING
9164
9165 STATIC void
9166 S_put_byte(pTHX_ SV *sv, int c)
9167 {
9168     if (isCNTRL(c) || c == 255 || !isPRINT(c))
9169         Perl_sv_catpvf(aTHX_ sv, "\\%o", c);
9170     else if (c == '-' || c == ']' || c == '\\' || c == '^')
9171         Perl_sv_catpvf(aTHX_ sv, "\\%c", c);
9172     else
9173         Perl_sv_catpvf(aTHX_ sv, "%c", c);
9174 }
9175
9176
9177 #define CLEAR_OPTSTART \
9178     if (optstart) STMT_START { \
9179             DEBUG_OPTIMISE_r(PerlIO_printf(Perl_debug_log, " (%"IVdf" nodes)\n", (IV)(node - optstart))); \
9180             optstart=NULL; \
9181     } STMT_END
9182
9183 #define DUMPUNTIL(b,e) CLEAR_OPTSTART; node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1);
9184
9185 STATIC const regnode *
9186 S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node,
9187             const regnode *last, const regnode *plast, 
9188             SV* sv, I32 indent, U32 depth)
9189 {
9190     dVAR;
9191     register U8 op = PSEUDO;    /* Arbitrary non-END op. */
9192     register const regnode *next;
9193     const regnode *optstart= NULL;
9194     
9195     RXi_GET_DECL(r,ri);
9196     GET_RE_DEBUG_FLAGS_DECL;
9197     
9198 #ifdef DEBUG_DUMPUNTIL
9199     PerlIO_printf(Perl_debug_log, "--- %d : %d - %d - %d\n",indent,node-start,
9200         last ? last-start : 0,plast ? plast-start : 0);
9201 #endif
9202             
9203     if (plast && plast < last) 
9204         last= plast;
9205
9206     while (PL_regkind[op] != END && (!last || node < last)) {
9207         /* While that wasn't END last time... */
9208         NODE_ALIGN(node);
9209         op = OP(node);
9210         if (op == CLOSE || op == WHILEM)
9211             indent--;
9212         next = regnext((regnode *)node);
9213
9214         /* Where, what. */
9215         if (OP(node) == OPTIMIZED) {
9216             if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE))
9217                 optstart = node;
9218             else
9219                 goto after_print;
9220         } else
9221             CLEAR_OPTSTART;
9222         
9223         regprop(r, sv, node);
9224         PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
9225                       (int)(2*indent + 1), "", SvPVX_const(sv));
9226         
9227         if (OP(node) != OPTIMIZED) {                  
9228             if (next == NULL)           /* Next ptr. */
9229                 PerlIO_printf(Perl_debug_log, " (0)");
9230             else if (PL_regkind[(U8)op] == BRANCH && PL_regkind[OP(next)] != BRANCH )
9231                 PerlIO_printf(Perl_debug_log, " (FAIL)");
9232             else 
9233                 PerlIO_printf(Perl_debug_log, " (%"IVdf")", (IV)(next - start));
9234             (void)PerlIO_putc(Perl_debug_log, '\n'); 
9235         }
9236         
9237       after_print:
9238         if (PL_regkind[(U8)op] == BRANCHJ) {
9239             assert(next);
9240             {
9241                 register const regnode *nnode = (OP(next) == LONGJMP
9242                                              ? regnext((regnode *)next)
9243                                              : next);
9244                 if (last && nnode > last)
9245                     nnode = last;
9246                 DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode);
9247             }
9248         }
9249         else if (PL_regkind[(U8)op] == BRANCH) {
9250             assert(next);
9251             DUMPUNTIL(NEXTOPER(node), next);
9252         }
9253         else if ( PL_regkind[(U8)op]  == TRIE ) {
9254             const regnode *this_trie = node;
9255             const char op = OP(node);
9256             const U32 n = ARG(node);
9257             const reg_ac_data * const ac = op>=AHOCORASICK ?
9258                (reg_ac_data *)ri->data->data[n] :
9259                NULL;
9260             const reg_trie_data * const trie =
9261                 (reg_trie_data*)ri->data->data[op<AHOCORASICK ? n : ac->trie];
9262 #ifdef DEBUGGING
9263             AV *const trie_words = (AV *) ri->data->data[n + TRIE_WORDS_OFFSET];
9264 #endif
9265             const regnode *nextbranch= NULL;
9266             I32 word_idx;
9267             sv_setpvn(sv, "", 0);
9268             for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) {
9269                 SV ** const elem_ptr = av_fetch(trie_words,word_idx,0);
9270                 
9271                 PerlIO_printf(Perl_debug_log, "%*s%s ",
9272                    (int)(2*(indent+3)), "",
9273                     elem_ptr ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr), SvCUR(*elem_ptr), 60,
9274                             PL_colors[0], PL_colors[1],
9275                             (SvUTF8(*elem_ptr) ? PERL_PV_ESCAPE_UNI : 0) |
9276                             PERL_PV_PRETTY_ELIPSES    |
9277                             PERL_PV_PRETTY_LTGT
9278                             )
9279                             : "???"
9280                 );
9281                 if (trie->jump) {
9282                     U16 dist= trie->jump[word_idx+1];
9283                     PerlIO_printf(Perl_debug_log, "(%"UVuf")\n",
9284                                   (UV)((dist ? this_trie + dist : next) - start));
9285                     if (dist) {
9286                         if (!nextbranch)
9287                             nextbranch= this_trie + trie->jump[0];    
9288                         DUMPUNTIL(this_trie + dist, nextbranch);
9289                     }
9290                     if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH)
9291                         nextbranch= regnext((regnode *)nextbranch);
9292                 } else {
9293                     PerlIO_printf(Perl_debug_log, "\n");
9294                 }
9295             }
9296             if (last && next > last)
9297                 node= last;
9298             else
9299                 node= next;
9300         }
9301         else if ( op == CURLY ) {   /* "next" might be very big: optimizer */
9302             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS,
9303                     NEXTOPER(node) + EXTRA_STEP_2ARGS + 1);
9304         }
9305         else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
9306             assert(next);
9307             DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next);
9308         }
9309         else if ( op == PLUS || op == STAR) {
9310             DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1);
9311         }
9312         else if (op == ANYOF) {
9313             /* arglen 1 + class block */
9314             node += 1 + ((ANYOF_FLAGS(node) & ANYOF_LARGE)
9315                     ? ANYOF_CLASS_SKIP : ANYOF_SKIP);
9316             node = NEXTOPER(node);
9317         }
9318         else if (PL_regkind[(U8)op] == EXACT) {
9319             /* Literal string, where present. */
9320             node += NODE_SZ_STR(node) - 1;
9321             node = NEXTOPER(node);
9322         }
9323         else {
9324             node = NEXTOPER(node);
9325             node += regarglen[(U8)op];
9326         }
9327         if (op == CURLYX || op == OPEN)
9328             indent++;
9329     }
9330     CLEAR_OPTSTART;
9331 #ifdef DEBUG_DUMPUNTIL    
9332     PerlIO_printf(Perl_debug_log, "--- %d\n", (int)indent);
9333 #endif
9334     return node;
9335 }
9336
9337 #endif  /* DEBUGGING */
9338
9339 /*
9340  * Local variables:
9341  * c-indentation-style: bsd
9342  * c-basic-offset: 4
9343  * indent-tabs-mode: t
9344  * End:
9345  *
9346  * ex: set ts=8 sts=4 sw=4 noet:
9347  */