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