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