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