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