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