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