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