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