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