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