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