This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
restore match data on backtracing
[perl5.git] / regcomp.c
1 /*    regcomp.c
2  */
3
4 /*
5  * "A fair jaw-cracker dwarf-language must be."  --Samwise Gamgee
6  */
7
8 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
9  * confused with the original package (see point 3 below).  Thanks, Henry!
10  */
11
12 /* Additional note: this code is very heavily munged from Henry's version
13  * in places.  In some spots I've traded clarity for efficiency, so don't
14  * blame Henry for some of the lack of readability.
15  */
16
17 /* The names of the functions have been changed from regcomp and
18  * regexec to  pregcomp and pregexec in order to avoid conflicts
19  * with the POSIX routines of the same names.
20 */
21
22 #ifdef PERL_EXT_RE_BUILD
23 /* need to replace pregcomp et al, so enable that */
24 #  ifndef PERL_IN_XSUB_RE
25 #    define PERL_IN_XSUB_RE
26 #  endif
27 /* need access to debugger hooks */
28 #  if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
29 #    define DEBUGGING
30 #  endif
31 #endif
32
33 #ifdef PERL_IN_XSUB_RE
34 /* We *really* need to overwrite these symbols: */
35 #  define Perl_pregcomp my_regcomp
36 #  define Perl_regdump my_regdump
37 #  define Perl_regprop my_regprop
38 #  define Perl_pregfree my_regfree
39 #  define Perl_re_intuit_string my_re_intuit_string
40 /* *These* symbols are masked to allow static link. */
41 #  define Perl_regnext my_regnext
42 #  define Perl_save_re_context my_save_re_context
43 #  define Perl_reginitcolors my_reginitcolors 
44
45 #  define PERL_NO_GET_CONTEXT
46 #endif 
47
48 /*SUPPRESS 112*/
49 /*
50  * pregcomp and pregexec -- regsub and regerror are not used in perl
51  *
52  *      Copyright (c) 1986 by University of Toronto.
53  *      Written by Henry Spencer.  Not derived from licensed software.
54  *
55  *      Permission is granted to anyone to use this software for any
56  *      purpose on any computer system, and to redistribute it freely,
57  *      subject to the following restrictions:
58  *
59  *      1. The author is not responsible for the consequences of use of
60  *              this software, no matter how awful, even if they arise
61  *              from defects in it.
62  *
63  *      2. The origin of this software must not be misrepresented, either
64  *              by explicit claim or by omission.
65  *
66  *      3. Altered versions must be plainly marked as such, and must not
67  *              be misrepresented as being the original software.
68  *
69  *
70  ****    Alterations to Henry's code are...
71  ****
72  ****    Copyright (c) 1991-2000, Larry Wall
73  ****
74  ****    You may distribute under the terms of either the GNU General Public
75  ****    License or the Artistic License, as specified in the README file.
76
77  *
78  * Beware that some of this code is subtly aware of the way operator
79  * precedence is structured in regular expressions.  Serious changes in
80  * regular-expression syntax might require a total rethink.
81  */
82 #include "EXTERN.h"
83 #define PERL_IN_REGCOMP_C
84 #include "perl.h"
85
86 #ifdef PERL_IN_XSUB_RE
87 #  if defined(PERL_CAPI) || defined(PERL_OBJECT)
88 #    include "XSUB.h"
89 #  endif
90 #else
91 #  include "INTERN.h"
92 #endif
93
94 #define REG_COMP_C
95 #include "regcomp.h"
96
97 #ifdef op
98 #undef op
99 #endif /* op */
100
101 #ifdef MSDOS
102 # if defined(BUGGY_MSC6)
103  /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
104  # pragma optimize("a",off)
105  /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
106  # pragma optimize("w",on )
107 # endif /* BUGGY_MSC6 */
108 #endif /* MSDOS */
109
110 #ifndef STATIC
111 #define STATIC  static
112 #endif
113
114 #define ISMULT1(c)      ((c) == '*' || (c) == '+' || (c) == '?')
115 #define ISMULT2(s)      ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
116         ((*s) == '{' && regcurly(s)))
117 #ifdef atarist
118 #define PERL_META       "^$.[()|?+*\\"
119 #else
120 #define META    "^$.[()|?+*\\"
121 #endif
122
123 #ifdef SPSTART
124 #undef SPSTART          /* dratted cpp namespace... */
125 #endif
126 /*
127  * Flags to be passed up and down.
128  */
129 #define WORST           0       /* Worst case. */
130 #define HASWIDTH        0x1     /* Known to match non-null strings. */
131 #define SIMPLE          0x2     /* Simple enough to be STAR/PLUS operand. */
132 #define SPSTART         0x4     /* Starts with * or +. */
133 #define TRYAGAIN        0x8     /* Weeded out a declaration. */
134
135 /* Length of a variant. */
136
137 typedef struct scan_data_t {
138     I32 len_min;
139     I32 len_delta;
140     I32 pos_min;
141     I32 pos_delta;
142     SV *last_found;
143     I32 last_end;                       /* min value, <0 unless valid. */
144     I32 last_start_min;
145     I32 last_start_max;
146     SV **longest;                       /* Either &l_fixed, or &l_float. */
147     SV *longest_fixed;
148     I32 offset_fixed;
149     SV *longest_float;
150     I32 offset_float_min;
151     I32 offset_float_max;
152     I32 flags;
153     I32 whilem_c;
154     I32 *last_closep;
155     struct regnode_charclass_class *start_class;
156 } scan_data_t;
157
158 /*
159  * Forward declarations for pregcomp()'s friends.
160  */
161
162 static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
163                                       0, 0, 0, 0, 0, 0};
164
165 #define SF_BEFORE_EOL           (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
166 #define SF_BEFORE_SEOL          0x1
167 #define SF_BEFORE_MEOL          0x2
168 #define SF_FIX_BEFORE_EOL       (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
169 #define SF_FL_BEFORE_EOL        (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
170
171 #ifdef NO_UNARY_PLUS
172 #  define SF_FIX_SHIFT_EOL      (0+2)
173 #  define SF_FL_SHIFT_EOL               (0+4)
174 #else
175 #  define SF_FIX_SHIFT_EOL      (+2)
176 #  define SF_FL_SHIFT_EOL               (+4)
177 #endif
178
179 #define SF_FIX_BEFORE_SEOL      (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
180 #define SF_FIX_BEFORE_MEOL      (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
181
182 #define SF_FL_BEFORE_SEOL       (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
183 #define SF_FL_BEFORE_MEOL       (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
184 #define SF_IS_INF               0x40
185 #define SF_HAS_PAR              0x80
186 #define SF_IN_PAR               0x100
187 #define SF_HAS_EVAL             0x200
188 #define SCF_DO_SUBSTR           0x400
189 #define SCF_DO_STCLASS_AND      0x0800
190 #define SCF_DO_STCLASS_OR       0x1000
191 #define SCF_DO_STCLASS          (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR)
192
193 #define RF_utf8         8
194 #define UTF (PL_reg_flags & RF_utf8)
195 #define LOC (PL_regflags & PMf_LOCALE)
196 #define FOLD (PL_regflags & PMf_FOLD)
197
198 #define OOB_CHAR8               1234
199 #define OOB_UTF8                123456
200 #define OOB_NAMEDCLASS          -1
201
202 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
203 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
204
205
206 /* length of regex to show in messages that don't mark a position within */
207 #define RegexLengthToShowInErrorMessages 127
208
209 /*
210  * If MARKER[12] are adjusted, be sure to adjust the constants at the top
211  * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
212  * op/pragma/warn/regcomp.
213  */
214 #define MARKER1 "HERE"      /* marker as it appears in the description */
215 #define MARKER2 " << HERE "  /* marker as it appears within the regex */
216    
217 #define REPORT_LOCATION " before " MARKER1 " mark in regex m/%.*s" MARKER2 "%s/"
218
219 /*
220  * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
221  * arg. Show regex, up to a maximum length. If it's too long, chop and add
222  * "...".
223  */
224 #define FAIL(msg)                                                             \
225     STMT_START {                                                             \
226         char *ellipses = "";                                                 \
227         unsigned len = strlen(PL_regprecomp);                                \
228                                                                              \
229         if (!SIZE_ONLY)                                                      \
230             SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
231                                                                              \
232         if (len > RegexLengthToShowInErrorMessages) {                        \
233             /* chop 10 shorter than the max, to ensure meaning of "..." */   \
234             len = RegexLengthToShowInErrorMessages - 10;                     \
235             ellipses = "...";                                                \
236         }                                                                    \
237         Perl_croak(aTHX_ "%s in regex m/%.*s%s/",                            \
238                    msg, (int)len, PL_regprecomp, ellipses);                  \
239     } STMT_END
240
241 /*
242  * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
243  * args. Show regex, up to a maximum length. If it's too long, chop and add
244  * "...".
245  */
246 #define FAIL2(pat,msg)                                                        \
247     STMT_START {                                                             \
248         char *ellipses = "";                                                 \
249         unsigned len = strlen(PL_regprecomp);                                \
250                                                                              \
251         if (!SIZE_ONLY)                                                      \
252             SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
253                                                                              \
254         if (len > RegexLengthToShowInErrorMessages) {                        \
255             /* chop 10 shorter than the max, to ensure meaning of "..." */   \
256             len = RegexLengthToShowInErrorMessages - 10;                     \
257             ellipses = "...";                                                \
258         }                                                                    \
259         S_re_croak2(aTHX_ pat, " in regex m/%.*s%s/",                        \
260                     msg, (int)len, PL_regprecomp, ellipses);                \
261     } STMT_END
262
263
264 /*
265  * Simple_vFAIL -- like FAIL, but marks the current location in the scan
266  */
267 #define Simple_vFAIL(m)                                                      \
268     STMT_START {                                                             \
269       unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
270                                                                              \
271       Perl_croak(aTHX_ "%s" REPORT_LOCATION,               \
272                  m, (int)offset, PL_regprecomp, PL_regprecomp + offset);     \
273     } STMT_END
274
275 /*
276  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
277  */
278 #define vFAIL(m)                                                             \
279     STMT_START {                                                             \
280       if (!SIZE_ONLY)                                                        \
281             SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
282       Simple_vFAIL(m);                                                       \
283     } STMT_END
284
285 /*
286  * Like Simple_vFAIL(), but accepts two arguments.
287  */
288 #define Simple_vFAIL2(m,a1)                                                  \
289     STMT_START {                                                             \
290       unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
291                                                                              \
292       S_re_croak2(aTHX_ m, REPORT_LOCATION, a1,       \
293                   (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
294     } STMT_END
295
296 /*
297  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
298  */
299 #define vFAIL2(m,a1)                                                         \
300     STMT_START {                                                             \
301       if (!SIZE_ONLY)                                                        \
302             SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
303       Simple_vFAIL2(m, a1);                                                  \
304     } STMT_END
305
306
307 /*
308  * Like Simple_vFAIL(), but accepts three arguments.
309  */
310 #define Simple_vFAIL3(m, a1, a2)                                             \
311     STMT_START {                                                             \
312       unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
313                                                                              \
314       S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2,   \
315                   (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
316     } STMT_END
317
318 /*
319  * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
320  */
321 #define vFAIL3(m,a1,a2)                                                      \
322     STMT_START {                                                             \
323       if (!SIZE_ONLY)                                                        \
324             SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
325       Simple_vFAIL3(m, a1, a2);                                              \
326     } STMT_END
327
328 /*
329  * Like Simple_vFAIL(), but accepts four arguments.
330  */
331 #define Simple_vFAIL4(m, a1, a2, a3)                                         \
332     STMT_START {                                                             \
333       unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
334                                                                              \
335       S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3,\
336                   (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
337     } STMT_END
338
339 /*
340  * Like Simple_vFAIL(), but accepts five arguments.
341  */
342 #define Simple_vFAIL5(m, a1, a2, a3, a4)                                     \
343     STMT_START {                                                             \
344       unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
345       S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3, a4,\
346                   (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
347     } STMT_END
348
349
350 #define vWARN(loc,m)                                                         \
351     STMT_START {                                                             \
352         unsigned offset = strlen(PL_regprecomp)-(PL_regxend-(loc));          \
353         Perl_warner(aTHX_ WARN_REGEXP, "%s" REPORT_LOCATION,\
354                  m, (int)offset, PL_regprecomp, PL_regprecomp + offset);          \
355     } STMT_END                                                               \
356
357
358 #define vWARN2(loc, m, a1)                                                   \
359     STMT_START {                                                             \
360         unsigned offset = strlen(PL_regprecomp)-(PL_regxend-(loc));          \
361         Perl_warner(aTHX_ WARN_REGEXP, m REPORT_LOCATION,\
362                  a1,                                                         \
363                  (int)offset, PL_regprecomp, PL_regprecomp + offset);        \
364     } STMT_END
365
366 #define vWARN3(loc, m, a1, a2)                                               \
367     STMT_START {                                                             \
368       unsigned offset = strlen(PL_regprecomp) - (PL_regxend - (loc));        \
369         Perl_warner(aTHX_ WARN_REGEXP, m REPORT_LOCATION,                    \
370                  a1, a2,                                                     \
371                  (int)offset, PL_regprecomp, PL_regprecomp + offset);        \
372     } STMT_END
373
374 #define vWARN4(loc, m, a1, a2, a3)                                           \
375     STMT_START {                                                             \
376       unsigned offset = strlen(PL_regprecomp)-(PL_regxend-(loc));            \
377         Perl_warner(aTHX_ WARN_REGEXP, m REPORT_LOCATION,\
378                  a1, a2, a3,                                                 \
379                  (int)offset, PL_regprecomp, PL_regprecomp + offset);        \
380     } STMT_END
381
382
383
384 /* Allow for side effects in s */
385 #define REGC(c,s) STMT_START { if (!SIZE_ONLY) *(s) = (c); else (s);} STMT_END
386
387 static void clear_re(pTHXo_ void *r);
388
389 /* Mark that we cannot extend a found fixed substring at this point.
390    Updata the longest found anchored substring and the longest found
391    floating substrings if needed. */
392
393 STATIC void
394 S_scan_commit(pTHX_ scan_data_t *data)
395 {
396     dTHR;
397     STRLEN l = CHR_SVLEN(data->last_found);
398     STRLEN old_l = CHR_SVLEN(*data->longest);
399     
400     if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
401         sv_setsv(*data->longest, data->last_found);
402         if (*data->longest == data->longest_fixed) {
403             data->offset_fixed = l ? data->last_start_min : data->pos_min;
404             if (data->flags & SF_BEFORE_EOL)
405                 data->flags 
406                     |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
407             else
408                 data->flags &= ~SF_FIX_BEFORE_EOL;
409         }
410         else {
411             data->offset_float_min = l ? data->last_start_min : data->pos_min;
412             data->offset_float_max = (l 
413                                       ? data->last_start_max 
414                                       : data->pos_min + data->pos_delta);
415             if (data->flags & SF_BEFORE_EOL)
416                 data->flags 
417                     |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
418             else
419                 data->flags &= ~SF_FL_BEFORE_EOL;
420         }
421     }
422     SvCUR_set(data->last_found, 0);
423     data->last_end = -1;
424     data->flags &= ~SF_BEFORE_EOL;
425 }
426
427 /* Can match anything (initialization) */
428 STATIC void
429 S_cl_anything(pTHX_ struct regnode_charclass_class *cl)
430 {
431     int value;
432
433     ANYOF_CLASS_ZERO(cl);
434     for (value = 0; value < 256; ++value)
435         ANYOF_BITMAP_SET(cl, value);
436     cl->flags = ANYOF_EOS;
437     if (LOC)
438         cl->flags |= ANYOF_LOCALE;
439 }
440
441 /* Can match anything (initialization) */
442 STATIC int
443 S_cl_is_anything(pTHX_ struct regnode_charclass_class *cl)
444 {
445     int value;
446
447     for (value = 0; value <= ANYOF_MAX; value += 2)
448         if (ANYOF_CLASS_TEST(cl, value) && ANYOF_CLASS_TEST(cl, value + 1))
449             return 1;
450     for (value = 0; value < 256; ++value)
451         if (!ANYOF_BITMAP_TEST(cl, value))
452             return 0;
453     return 1;
454 }
455
456 /* Can match anything (initialization) */
457 STATIC void
458 S_cl_init(pTHX_ struct regnode_charclass_class *cl)
459 {
460     Zero(cl, 1, struct regnode_charclass_class);
461     cl->type = ANYOF;
462     cl_anything(cl);
463 }
464
465 STATIC void
466 S_cl_init_zero(pTHX_ struct regnode_charclass_class *cl)
467 {
468     Zero(cl, 1, struct regnode_charclass_class);
469     cl->type = ANYOF;
470     cl_anything(cl);
471     if (LOC)
472         cl->flags |= ANYOF_LOCALE;
473 }
474
475 /* 'And' a given class with another one.  Can create false positives */
476 /* We assume that cl is not inverted */
477 STATIC void
478 S_cl_and(pTHX_ struct regnode_charclass_class *cl,
479          struct regnode_charclass_class *and_with)
480 {
481     if (!(and_with->flags & ANYOF_CLASS)
482         && !(cl->flags & ANYOF_CLASS)
483         && (and_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
484         && !(and_with->flags & ANYOF_FOLD)
485         && !(cl->flags & ANYOF_FOLD)) {
486         int i;
487
488         if (and_with->flags & ANYOF_INVERT)
489             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
490                 cl->bitmap[i] &= ~and_with->bitmap[i];
491         else
492             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
493                 cl->bitmap[i] &= and_with->bitmap[i];
494     } /* XXXX: logic is complicated otherwise, leave it along for a moment. */
495     if (!(and_with->flags & ANYOF_EOS))
496         cl->flags &= ~ANYOF_EOS;
497 }
498
499 /* 'OR' a given class with another one.  Can create false positives */
500 /* We assume that cl is not inverted */
501 STATIC void
502 S_cl_or(pTHX_ struct regnode_charclass_class *cl, struct regnode_charclass_class *or_with)
503 {
504     if (or_with->flags & ANYOF_INVERT) {
505         /* We do not use
506          * (B1 | CL1) | (!B2 & !CL2) = (B1 | !B2 & !CL2) | (CL1 | (!B2 & !CL2))
507          *   <= (B1 | !B2) | (CL1 | !CL2)
508          * which is wasteful if CL2 is small, but we ignore CL2:
509          *   (B1 | CL1) | (!B2 & !CL2) <= (B1 | CL1) | !B2 = (B1 | !B2) | CL1
510          * XXXX Can we handle case-fold?  Unclear:
511          *   (OK1(i) | OK1(i')) | !(OK1(i) | OK1(i')) =
512          *   (OK1(i) | OK1(i')) | (!OK1(i) & !OK1(i'))
513          */
514         if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
515              && !(or_with->flags & ANYOF_FOLD)
516              && !(cl->flags & ANYOF_FOLD) ) {
517             int i;
518
519             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
520                 cl->bitmap[i] |= ~or_with->bitmap[i];
521         } /* XXXX: logic is complicated otherwise */
522         else {
523             cl_anything(cl);
524         }
525     } else {
526         /* (B1 | CL1) | (B2 | CL2) = (B1 | B2) | (CL1 | CL2)) */
527         if ( (or_with->flags & ANYOF_LOCALE) == (cl->flags & ANYOF_LOCALE)
528              && (!(or_with->flags & ANYOF_FOLD) 
529                  || (cl->flags & ANYOF_FOLD)) ) {
530             int i;
531
532             /* OR char bitmap and class bitmap separately */
533             for (i = 0; i < ANYOF_BITMAP_SIZE; i++)
534                 cl->bitmap[i] |= or_with->bitmap[i];
535             if (or_with->flags & ANYOF_CLASS) {
536                 for (i = 0; i < ANYOF_CLASSBITMAP_SIZE; i++)
537                     cl->classflags[i] |= or_with->classflags[i];
538                 cl->flags |= ANYOF_CLASS;
539             }
540         }
541         else { /* XXXX: logic is complicated, leave it along for a moment. */
542             cl_anything(cl);
543         }
544     }
545     if (or_with->flags & ANYOF_EOS)
546         cl->flags |= ANYOF_EOS;
547 }
548
549 /* REx optimizer.  Converts nodes into quickier variants "in place".
550    Finds fixed substrings.  */
551
552 /* Stops at toplevel WHILEM as well as at `last'. At end *scanp is set
553    to the position after last scanned or to NULL. */
554
555 STATIC I32
556 S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags)
557                         /* scanp: Start here (read-write). */
558                         /* deltap: Write maxlen-minlen here. */
559                         /* last: Stop before this one. */
560 {
561     dTHR;
562     I32 min = 0, pars = 0, code;
563     regnode *scan = *scanp, *next;
564     I32 delta = 0;
565     int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
566     int is_inf_internal = 0;            /* The studied chunk is infinite */
567     I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
568     scan_data_t data_fake;
569     struct regnode_charclass_class and_with; /* Valid if flags & SCF_DO_STCLASS_OR */
570     
571     while (scan && OP(scan) != END && scan < last) {
572         /* Peephole optimizer: */
573
574         if (PL_regkind[(U8)OP(scan)] == EXACT) {
575             /* Merge several consecutive EXACTish nodes into one. */
576             regnode *n = regnext(scan);
577             U32 stringok = 1;
578 #ifdef DEBUGGING
579             regnode *stop = scan;
580 #endif 
581
582             next = scan + NODE_SZ_STR(scan);
583             /* Skip NOTHING, merge EXACT*. */
584             while (n &&
585                    ( PL_regkind[(U8)OP(n)] == NOTHING || 
586                      (stringok && (OP(n) == OP(scan))))
587                    && NEXT_OFF(n)
588                    && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) {
589                 if (OP(n) == TAIL || n > next)
590                     stringok = 0;
591                 if (PL_regkind[(U8)OP(n)] == NOTHING) {
592                     NEXT_OFF(scan) += NEXT_OFF(n);
593                     next = n + NODE_STEP_REGNODE;
594 #ifdef DEBUGGING
595                     if (stringok)
596                         stop = n;
597 #endif 
598                     n = regnext(n);
599                 }
600                 else {
601                     int oldl = STR_LEN(scan);
602                     regnode *nnext = regnext(n);
603                     
604                     if (oldl + STR_LEN(n) > U8_MAX) 
605                         break;
606                     NEXT_OFF(scan) += NEXT_OFF(n);
607                     STR_LEN(scan) += STR_LEN(n);
608                     next = n + NODE_SZ_STR(n);
609                     /* Now we can overwrite *n : */
610                     Move(STRING(n), STRING(scan) + oldl,
611                          STR_LEN(n), char);
612 #ifdef DEBUGGING
613                     if (stringok)
614                         stop = next - 1;
615 #endif 
616                     n = nnext;
617                 }
618             }
619 #ifdef DEBUGGING
620             /* Allow dumping */
621             n = scan + NODE_SZ_STR(scan);
622             while (n <= stop) {
623                 if (PL_regkind[(U8)OP(n)] != NOTHING || OP(n) == NOTHING) {
624                     OP(n) = OPTIMIZED;
625                     NEXT_OFF(n) = 0;
626                 }
627                 n++;
628             }
629 #endif
630         }
631         /* Follow the next-chain of the current node and optimize
632            away all the NOTHINGs from it.  */
633         if (OP(scan) != CURLYX) {
634             int max = (reg_off_by_arg[OP(scan)]
635                        ? I32_MAX
636                        /* I32 may be smaller than U16 on CRAYs! */
637                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
638             int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
639             int noff;
640             regnode *n = scan;
641             
642             /* Skip NOTHING and LONGJMP. */
643             while ((n = regnext(n))
644                    && ((PL_regkind[(U8)OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
645                        || ((OP(n) == LONGJMP) && (noff = ARG(n))))
646                    && off + noff < max)
647                 off += noff;
648             if (reg_off_by_arg[OP(scan)])
649                 ARG(scan) = off;
650             else 
651                 NEXT_OFF(scan) = off;
652         }
653         /* The principal pseudo-switch.  Cannot be a switch, since we
654            look into several different things.  */
655         if (OP(scan) == BRANCH || OP(scan) == BRANCHJ 
656                    || OP(scan) == IFTHEN || OP(scan) == SUSPEND) {
657             next = regnext(scan);
658             code = OP(scan);
659             
660             if (OP(next) == code || code == IFTHEN || code == SUSPEND) { 
661                 I32 max1 = 0, min1 = I32_MAX, num = 0;
662                 struct regnode_charclass_class accum;
663                 
664                 if (flags & SCF_DO_SUBSTR) /* XXXX Add !SUSPEND? */
665                     scan_commit(data);  /* Cannot merge strings after this. */
666                 if (flags & SCF_DO_STCLASS)
667                     cl_init_zero(&accum);
668                 while (OP(scan) == code) {
669                     I32 deltanext, minnext, f = 0, fake = 0;
670                     struct regnode_charclass_class this_class;
671
672                     num++;
673                     data_fake.flags = 0;
674                     if (data) {             
675                         data_fake.whilem_c = data->whilem_c;
676                         data_fake.last_closep = data->last_closep;
677                     }
678                     else
679                         data_fake.last_closep = &fake;
680                     next = regnext(scan);
681                     scan = NEXTOPER(scan);
682                     if (code != BRANCH)
683                         scan = NEXTOPER(scan);
684                     if (flags & SCF_DO_STCLASS) {
685                         cl_init(&this_class);
686                         data_fake.start_class = &this_class;
687                         f = SCF_DO_STCLASS_AND;
688                     }               
689                     /* we suppose the run is continuous, last=next...*/
690                     minnext = study_chunk(&scan, &deltanext, next,
691                                           &data_fake, f);
692                     if (min1 > minnext) 
693                         min1 = minnext;
694                     if (max1 < minnext + deltanext)
695                         max1 = minnext + deltanext;
696                     if (deltanext == I32_MAX)
697                         is_inf = is_inf_internal = 1;
698                     scan = next;
699                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
700                         pars++;
701                     if (data && (data_fake.flags & SF_HAS_EVAL))
702                         data->flags |= SF_HAS_EVAL;
703                     if (data)
704                         data->whilem_c = data_fake.whilem_c;
705                     if (flags & SCF_DO_STCLASS)
706                         cl_or(&accum, &this_class);
707                     if (code == SUSPEND) 
708                         break;
709                 }
710                 if (code == IFTHEN && num < 2) /* Empty ELSE branch */
711                     min1 = 0;
712                 if (flags & SCF_DO_SUBSTR) {
713                     data->pos_min += min1;
714                     data->pos_delta += max1 - min1;
715                     if (max1 != min1 || is_inf)
716                         data->longest = &(data->longest_float);
717                 }
718                 min += min1;
719                 delta += max1 - min1;
720                 if (flags & SCF_DO_STCLASS_OR) {
721                     cl_or(data->start_class, &accum);
722                     if (min1) {
723                         cl_and(data->start_class, &and_with);
724                         flags &= ~SCF_DO_STCLASS;
725                     }
726                 }
727                 else if (flags & SCF_DO_STCLASS_AND) {
728                     if (min1) {
729                         cl_and(data->start_class, &accum);
730                         flags &= ~SCF_DO_STCLASS;
731                     }
732                     else {
733                         /* Switch to OR mode: cache the old value of 
734                          * data->start_class */
735                         StructCopy(data->start_class, &and_with,
736                                    struct regnode_charclass_class);
737                         flags &= ~SCF_DO_STCLASS_AND;
738                         StructCopy(&accum, data->start_class,
739                                    struct regnode_charclass_class);
740                         flags |= SCF_DO_STCLASS_OR;
741                         data->start_class->flags |= ANYOF_EOS;
742                     }
743                 }
744             }
745             else if (code == BRANCHJ)   /* single branch is optimized. */
746                 scan = NEXTOPER(NEXTOPER(scan));
747             else                        /* single branch is optimized. */
748                 scan = NEXTOPER(scan);
749             continue;
750         }
751         else if (OP(scan) == EXACT) {
752             I32 l = STR_LEN(scan);
753             if (UTF) {
754                 unsigned char *s = (unsigned char *)STRING(scan);
755                 unsigned char *e = s + l;
756                 I32 newl = 0;
757                 while (s < e) {
758                     newl++;
759                     s += UTF8SKIP(s);
760                 }
761                 l = newl;
762             }
763             min += l;
764             if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
765                 /* The code below prefers earlier match for fixed
766                    offset, later match for variable offset.  */
767                 if (data->last_end == -1) { /* Update the start info. */
768                     data->last_start_min = data->pos_min;
769                     data->last_start_max = is_inf
770                         ? I32_MAX : data->pos_min + data->pos_delta; 
771                 }
772                 sv_catpvn(data->last_found, STRING(scan), STR_LEN(scan));
773                 data->last_end = data->pos_min + l;
774                 data->pos_min += l; /* As in the first entry. */
775                 data->flags &= ~SF_BEFORE_EOL;
776             }
777             if (flags & SCF_DO_STCLASS_AND) {
778                 /* Check whether it is compatible with what we know already! */
779                 int compat = 1;
780
781                 if (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE)) 
782                     && !ANYOF_BITMAP_TEST(data->start_class, *STRING(scan))
783                     && (!(data->start_class->flags & ANYOF_FOLD)
784                         || !ANYOF_BITMAP_TEST(data->start_class,
785                                               PL_fold[*(U8*)STRING(scan)])))
786                     compat = 0;
787                 ANYOF_CLASS_ZERO(data->start_class);
788                 ANYOF_BITMAP_ZERO(data->start_class);
789                 if (compat)
790                     ANYOF_BITMAP_SET(data->start_class, *STRING(scan));
791                 data->start_class->flags &= ~ANYOF_EOS;
792             }
793             else if (flags & SCF_DO_STCLASS_OR) {
794                 /* false positive possible if the class is case-folded */
795                 ANYOF_BITMAP_SET(data->start_class, *STRING(scan));     
796                 data->start_class->flags &= ~ANYOF_EOS;
797                 cl_and(data->start_class, &and_with);
798             }
799             flags &= ~SCF_DO_STCLASS;
800         }
801         else if (PL_regkind[(U8)OP(scan)] == EXACT) { /* But OP != EXACT! */
802             I32 l = STR_LEN(scan);
803
804             /* Search for fixed substrings supports EXACT only. */
805             if (flags & SCF_DO_SUBSTR) 
806                 scan_commit(data);
807             if (UTF) {
808                 unsigned char *s = (unsigned char *)STRING(scan);
809                 unsigned char *e = s + l;
810                 I32 newl = 0;
811                 while (s < e) {
812                     newl++;
813                     s += UTF8SKIP(s);
814                 }
815                 l = newl;
816             }
817             min += l;
818             if (data && (flags & SCF_DO_SUBSTR))
819                 data->pos_min += l;
820             if (flags & SCF_DO_STCLASS_AND) {
821                 /* Check whether it is compatible with what we know already! */
822                 int compat = 1;
823
824                 if (!(data->start_class->flags & (ANYOF_CLASS | ANYOF_LOCALE)) 
825                     && !ANYOF_BITMAP_TEST(data->start_class, *STRING(scan))
826                     && !ANYOF_BITMAP_TEST(data->start_class, 
827                                           PL_fold[*(U8*)STRING(scan)]))
828                     compat = 0;
829                 ANYOF_CLASS_ZERO(data->start_class);
830                 ANYOF_BITMAP_ZERO(data->start_class);
831                 if (compat) {
832                     ANYOF_BITMAP_SET(data->start_class, *STRING(scan));
833                     data->start_class->flags &= ~ANYOF_EOS;
834                     data->start_class->flags |= ANYOF_FOLD;
835                     if (OP(scan) == EXACTFL)
836                         data->start_class->flags |= ANYOF_LOCALE;
837                 }
838             }
839             else if (flags & SCF_DO_STCLASS_OR) {
840                 if (data->start_class->flags & ANYOF_FOLD) {
841                     /* false positive possible if the class is case-folded.
842                        Assume that the locale settings are the same... */
843                     ANYOF_BITMAP_SET(data->start_class, *STRING(scan)); 
844                     data->start_class->flags &= ~ANYOF_EOS;
845                 }
846                 cl_and(data->start_class, &and_with);
847             }
848             flags &= ~SCF_DO_STCLASS;
849         }
850         else if (strchr((char*)PL_varies,OP(scan))) {
851             I32 mincount, maxcount, minnext, deltanext, fl;
852             I32 f = flags, pos_before = 0;
853             regnode *oscan = scan;
854             struct regnode_charclass_class this_class;
855             struct regnode_charclass_class *oclass = NULL;
856
857             switch (PL_regkind[(U8)OP(scan)]) {
858             case WHILEM:                /* End of (?:...)* . */
859                 scan = NEXTOPER(scan);
860                 goto finish;
861             case PLUS:
862                 if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) {
863                     next = NEXTOPER(scan);
864                     if (OP(next) == EXACT || (flags & SCF_DO_STCLASS)) {
865                         mincount = 1; 
866                         maxcount = REG_INFTY; 
867                         next = regnext(scan);
868                         scan = NEXTOPER(scan);
869                         goto do_curly;
870                     }
871                 }
872                 if (flags & SCF_DO_SUBSTR)
873                     data->pos_min++;
874                 min++;
875                 /* Fall through. */
876             case STAR:
877                 if (flags & SCF_DO_STCLASS) {
878                     mincount = 0;
879                     maxcount = REG_INFTY; 
880                     next = regnext(scan);
881                     scan = NEXTOPER(scan);
882                     goto do_curly;
883                 }
884                 is_inf = is_inf_internal = 1; 
885                 scan = regnext(scan);
886                 if (flags & SCF_DO_SUBSTR) {
887                     scan_commit(data);  /* Cannot extend fixed substrings */
888                     data->longest = &(data->longest_float);
889                 }
890                 goto optimize_curly_tail;
891             case CURLY:
892                 mincount = ARG1(scan); 
893                 maxcount = ARG2(scan);
894                 next = regnext(scan);
895                 if (OP(scan) == CURLYX) {
896                     I32 lp = (data ? *(data->last_closep) : 0);
897
898                     scan->flags = ((lp <= U8_MAX) ? lp : U8_MAX);
899                 }
900                 scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
901               do_curly:
902                 if (flags & SCF_DO_SUBSTR) {
903                     if (mincount == 0) scan_commit(data); /* Cannot extend fixed substrings */
904                     pos_before = data->pos_min;
905                 }
906                 if (data) {
907                     fl = data->flags;
908                     data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
909                     if (is_inf)
910                         data->flags |= SF_IS_INF;
911                 }
912                 if (flags & SCF_DO_STCLASS) {
913                     cl_init(&this_class);
914                     oclass = data->start_class;
915                     data->start_class = &this_class;
916                     f |= SCF_DO_STCLASS_AND;
917                     f &= ~SCF_DO_STCLASS_OR;
918                 }
919
920                 /* This will finish on WHILEM, setting scan, or on NULL: */
921                 minnext = study_chunk(&scan, &deltanext, last, data, 
922                                       mincount == 0 
923                                         ? (f & ~SCF_DO_SUBSTR) : f);
924
925                 if (flags & SCF_DO_STCLASS)
926                     data->start_class = oclass;
927                 if (mincount == 0 || minnext == 0) {
928                     if (flags & SCF_DO_STCLASS_OR) {
929                         cl_or(data->start_class, &this_class);
930                     }
931                     else if (flags & SCF_DO_STCLASS_AND) {
932                         /* Switch to OR mode: cache the old value of 
933                          * data->start_class */
934                         StructCopy(data->start_class, &and_with,
935                                    struct regnode_charclass_class);
936                         flags &= ~SCF_DO_STCLASS_AND;
937                         StructCopy(&this_class, data->start_class,
938                                    struct regnode_charclass_class);
939                         flags |= SCF_DO_STCLASS_OR;
940                         data->start_class->flags |= ANYOF_EOS;
941                     }
942                 } else {                /* Non-zero len */
943                     if (flags & SCF_DO_STCLASS_OR) {
944                         cl_or(data->start_class, &this_class);
945                         cl_and(data->start_class, &and_with);
946                     }
947                     else if (flags & SCF_DO_STCLASS_AND)
948                         cl_and(data->start_class, &this_class);
949                     flags &= ~SCF_DO_STCLASS;
950                 }
951                 if (!scan)              /* It was not CURLYX, but CURLY. */
952                     scan = next;
953                 if (ckWARN(WARN_REGEXP) && (minnext + deltanext == 0) 
954                     && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
955                     && maxcount <= REG_INFTY/3) /* Complement check for big count */
956                 {
957                     vWARN(PL_regcomp_parse,
958                           "Quantifier unexpected on zero-length expression");
959                 }
960
961                 min += minnext * mincount;
962                 is_inf_internal |= ((maxcount == REG_INFTY 
963                                      && (minnext + deltanext) > 0)
964                                     || deltanext == I32_MAX);
965                 is_inf |= is_inf_internal;
966                 delta += (minnext + deltanext) * maxcount - minnext * mincount;
967
968                 /* Try powerful optimization CURLYX => CURLYN. */
969                 if (  OP(oscan) == CURLYX && data 
970                       && data->flags & SF_IN_PAR
971                       && !(data->flags & SF_HAS_EVAL)
972                       && !deltanext && minnext == 1 ) {
973                     /* Try to optimize to CURLYN.  */
974                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
975                     regnode *nxt1 = nxt, *nxt2;
976
977                     /* Skip open. */
978                     nxt = regnext(nxt);
979                     if (!strchr((char*)PL_simple,OP(nxt))
980                         && !(PL_regkind[(U8)OP(nxt)] == EXACT
981                              && STR_LEN(nxt) == 1)) 
982                         goto nogo;
983                     nxt2 = nxt;
984                     nxt = regnext(nxt);
985                     if (OP(nxt) != CLOSE) 
986                         goto nogo;
987                     /* Now we know that nxt2 is the only contents: */
988                     oscan->flags = ARG(nxt);
989                     OP(oscan) = CURLYN;
990                     OP(nxt1) = NOTHING; /* was OPEN. */
991 #ifdef DEBUGGING
992                     OP(nxt1 + 1) = OPTIMIZED; /* was count. */
993                     NEXT_OFF(nxt1+ 1) = 0; /* just for consistancy. */
994                     NEXT_OFF(nxt2) = 0; /* just for consistancy with CURLY. */
995                     OP(nxt) = OPTIMIZED;        /* was CLOSE. */
996                     OP(nxt + 1) = OPTIMIZED; /* was count. */
997                     NEXT_OFF(nxt+ 1) = 0; /* just for consistancy. */
998 #endif 
999                 }
1000               nogo:
1001
1002                 /* Try optimization CURLYX => CURLYM. */
1003                 if (  OP(oscan) == CURLYX && data 
1004                       && !(data->flags & SF_HAS_PAR)
1005                       && !(data->flags & SF_HAS_EVAL)
1006                       && !deltanext  ) {
1007                     /* XXXX How to optimize if data == 0? */
1008                     /* Optimize to a simpler form.  */
1009                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
1010                     regnode *nxt2;
1011
1012                     OP(oscan) = CURLYM;
1013                     while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
1014                             && (OP(nxt2) != WHILEM)) 
1015                         nxt = nxt2;
1016                     OP(nxt2)  = SUCCEED; /* Whas WHILEM */
1017                     /* Need to optimize away parenths. */
1018                     if (data->flags & SF_IN_PAR) {
1019                         /* Set the parenth number.  */
1020                         regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
1021
1022                         if (OP(nxt) != CLOSE) 
1023                             FAIL("Panic opt close");
1024                         oscan->flags = ARG(nxt);
1025                         OP(nxt1) = OPTIMIZED;   /* was OPEN. */
1026                         OP(nxt) = OPTIMIZED;    /* was CLOSE. */
1027 #ifdef DEBUGGING
1028                         OP(nxt1 + 1) = OPTIMIZED; /* was count. */
1029                         OP(nxt + 1) = OPTIMIZED; /* was count. */
1030                         NEXT_OFF(nxt1 + 1) = 0; /* just for consistancy. */
1031                         NEXT_OFF(nxt + 1) = 0; /* just for consistancy. */
1032 #endif 
1033 #if 0
1034                         while ( nxt1 && (OP(nxt1) != WHILEM)) {
1035                             regnode *nnxt = regnext(nxt1);
1036                             
1037                             if (nnxt == nxt) {
1038                                 if (reg_off_by_arg[OP(nxt1)])
1039                                     ARG_SET(nxt1, nxt2 - nxt1);
1040                                 else if (nxt2 - nxt1 < U16_MAX)
1041                                     NEXT_OFF(nxt1) = nxt2 - nxt1;
1042                                 else
1043                                     OP(nxt) = NOTHING;  /* Cannot beautify */
1044                             }
1045                             nxt1 = nnxt;
1046                         }
1047 #endif
1048                         /* Optimize again: */
1049                         study_chunk(&nxt1, &deltanext, nxt, NULL, 0);
1050                     }
1051                     else
1052                         oscan->flags = 0;
1053                 }
1054                 else if (OP(oscan) == CURLYX && data && ++data->whilem_c < 16) {
1055                     /* This stays as CURLYX, and can put the count/of pair. */
1056                     /* Find WHILEM (as in regexec.c) */
1057                     regnode *nxt = oscan + NEXT_OFF(oscan);
1058
1059                     if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */
1060                         nxt += ARG(nxt);
1061                     PREVOPER(nxt)->flags = data->whilem_c
1062                         | (PL_reg_whilem_seen << 4); /* On WHILEM */
1063                 }
1064                 if (data && fl & (SF_HAS_PAR|SF_IN_PAR)) 
1065                     pars++;
1066                 if (flags & SCF_DO_SUBSTR) {
1067                     SV *last_str = Nullsv;
1068                     int counted = mincount != 0;
1069
1070                     if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
1071                         I32 b = pos_before >= data->last_start_min 
1072                             ? pos_before : data->last_start_min;
1073                         STRLEN l;
1074                         char *s = SvPV(data->last_found, l);
1075                         I32 old = b - data->last_start_min;
1076
1077                         if (UTF)
1078                             old = utf8_hop((U8*)s, old) - (U8*)s;
1079                         
1080                         l -= old;
1081                         /* Get the added string: */
1082                         last_str = newSVpvn(s  + old, l);
1083                         if (deltanext == 0 && pos_before == b) {
1084                             /* What was added is a constant string */
1085                             if (mincount > 1) {
1086                                 SvGROW(last_str, (mincount * l) + 1);
1087                                 repeatcpy(SvPVX(last_str) + l, 
1088                                           SvPVX(last_str), l, mincount - 1);
1089                                 SvCUR(last_str) *= mincount;
1090                                 /* Add additional parts. */
1091                                 SvCUR_set(data->last_found, 
1092                                           SvCUR(data->last_found) - l);
1093                                 sv_catsv(data->last_found, last_str);
1094                                 data->last_end += l * (mincount - 1);
1095                             }
1096                         } else {
1097                             /* start offset must point into the last copy */
1098                             data->last_start_min += minnext * (mincount - 1);
1099                             data->last_start_max += is_inf ? 0 : (maxcount - 1)
1100                                 * (minnext + data->pos_delta);
1101                         }
1102                     }
1103                     /* It is counted once already... */
1104                     data->pos_min += minnext * (mincount - counted);
1105                     data->pos_delta += - counted * deltanext +
1106                         (minnext + deltanext) * maxcount - minnext * mincount;
1107                     if (mincount != maxcount) {
1108                          /* Cannot extend fixed substrings found inside
1109                             the group.  */
1110                         scan_commit(data);
1111                         if (mincount && last_str) {
1112                             sv_setsv(data->last_found, last_str);
1113                             data->last_end = data->pos_min;
1114                             data->last_start_min = 
1115                                 data->pos_min - CHR_SVLEN(last_str);
1116                             data->last_start_max = is_inf 
1117                                 ? I32_MAX 
1118                                 : data->pos_min + data->pos_delta
1119                                 - CHR_SVLEN(last_str);
1120                         }
1121                         data->longest = &(data->longest_float);
1122                     }
1123                     SvREFCNT_dec(last_str);
1124                 }
1125                 if (data && (fl & SF_HAS_EVAL))
1126                     data->flags |= SF_HAS_EVAL;
1127               optimize_curly_tail:
1128                 if (OP(oscan) != CURLYX) {
1129                     while (PL_regkind[(U8)OP(next = regnext(oscan))] == NOTHING
1130                            && NEXT_OFF(next))
1131                         NEXT_OFF(oscan) += NEXT_OFF(next);
1132                 }
1133                 continue;
1134             default:                    /* REF and CLUMP only? */
1135                 if (flags & SCF_DO_SUBSTR) {
1136                     scan_commit(data);  /* Cannot expect anything... */
1137                     data->longest = &(data->longest_float);
1138                 }
1139                 is_inf = is_inf_internal = 1;
1140                 if (flags & SCF_DO_STCLASS_OR)
1141                     cl_anything(data->start_class);
1142                 flags &= ~SCF_DO_STCLASS;
1143                 break;
1144             }
1145         }
1146         else if (strchr((char*)PL_simple,OP(scan)) || PL_regkind[(U8)OP(scan)] == ANYUTF8) {
1147             int value;
1148
1149             if (flags & SCF_DO_SUBSTR) {
1150                 scan_commit(data);
1151                 data->pos_min++;
1152             }
1153             min++;
1154             if (flags & SCF_DO_STCLASS) {
1155                 data->start_class->flags &= ~ANYOF_EOS; /* No match on empty */
1156
1157                 /* Some of the logic below assumes that switching
1158                    locale on will only add false positives. */
1159                 switch (PL_regkind[(U8)OP(scan)]) {
1160                 case ANYUTF8:
1161                 case SANY:
1162                 case SANYUTF8:
1163                 case ALNUMUTF8:
1164                 case ANYOFUTF8:
1165                 case ALNUMLUTF8:
1166                 case NALNUMUTF8:
1167                 case NALNUMLUTF8:
1168                 case SPACEUTF8:
1169                 case NSPACEUTF8:
1170                 case SPACELUTF8:
1171                 case NSPACELUTF8:
1172                 case DIGITUTF8:
1173                 case NDIGITUTF8:
1174                 default:
1175                   do_default:
1176                     /* Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", OP(scan)); */
1177                     if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
1178                         cl_anything(data->start_class);
1179                     break;
1180                 case REG_ANY:
1181                     if (OP(scan) == SANY)
1182                         goto do_default;
1183                     if (flags & SCF_DO_STCLASS_OR) { /* Everything but \n */
1184                         value = (ANYOF_BITMAP_TEST(data->start_class,'\n')
1185                                  || (data->start_class->flags & ANYOF_CLASS));
1186                         cl_anything(data->start_class);
1187                     }
1188                     if (flags & SCF_DO_STCLASS_AND || !value)
1189                         ANYOF_BITMAP_CLEAR(data->start_class,'\n');
1190                     break;
1191                 case ANYOF:
1192                     if (flags & SCF_DO_STCLASS_AND)
1193                         cl_and(data->start_class,
1194                                (struct regnode_charclass_class*)scan);
1195                     else
1196                         cl_or(data->start_class,
1197                               (struct regnode_charclass_class*)scan);
1198                     break;
1199                 case ALNUM:
1200                     if (flags & SCF_DO_STCLASS_AND) {
1201                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
1202                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
1203                             for (value = 0; value < 256; value++)
1204                                 if (!isALNUM(value))
1205                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
1206                         }
1207                     }
1208                     else {
1209                         if (data->start_class->flags & ANYOF_LOCALE)
1210                             ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
1211                         else {
1212                             for (value = 0; value < 256; value++)
1213                                 if (isALNUM(value))
1214                                     ANYOF_BITMAP_SET(data->start_class, value);                     
1215                         }
1216                     }
1217                     break;
1218                 case ALNUML:
1219                     if (flags & SCF_DO_STCLASS_AND) {
1220                         if (data->start_class->flags & ANYOF_LOCALE)
1221                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NALNUM);
1222                     }
1223                     else {
1224                         ANYOF_CLASS_SET(data->start_class,ANYOF_ALNUM);
1225                         data->start_class->flags |= ANYOF_LOCALE;
1226                     }
1227                     break;
1228                 case NALNUM:
1229                     if (flags & SCF_DO_STCLASS_AND) {
1230                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
1231                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
1232                             for (value = 0; value < 256; value++)
1233                                 if (isALNUM(value))
1234                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
1235                         }
1236                     }
1237                     else {
1238                         if (data->start_class->flags & ANYOF_LOCALE)
1239                             ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
1240                         else {
1241                             for (value = 0; value < 256; value++)
1242                                 if (!isALNUM(value))
1243                                     ANYOF_BITMAP_SET(data->start_class, value);                     
1244                         }
1245                     }
1246                     break;
1247                 case NALNUML:
1248                     if (flags & SCF_DO_STCLASS_AND) {
1249                         if (data->start_class->flags & ANYOF_LOCALE)
1250                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_ALNUM);
1251                     }
1252                     else {
1253                         data->start_class->flags |= ANYOF_LOCALE;
1254                         ANYOF_CLASS_SET(data->start_class,ANYOF_NALNUM);
1255                     }
1256                     break;
1257                 case SPACE:
1258                     if (flags & SCF_DO_STCLASS_AND) {
1259                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
1260                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
1261                             for (value = 0; value < 256; value++)
1262                                 if (!isSPACE(value))
1263                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
1264                         }
1265                     }
1266                     else {
1267                         if (data->start_class->flags & ANYOF_LOCALE)
1268                             ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
1269                         else {
1270                             for (value = 0; value < 256; value++)
1271                                 if (isSPACE(value))
1272                                     ANYOF_BITMAP_SET(data->start_class, value);                     
1273                         }
1274                     }
1275                     break;
1276                 case SPACEL:
1277                     if (flags & SCF_DO_STCLASS_AND) {
1278                         if (data->start_class->flags & ANYOF_LOCALE)
1279                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NSPACE);
1280                     }
1281                     else {
1282                         data->start_class->flags |= ANYOF_LOCALE;
1283                         ANYOF_CLASS_SET(data->start_class,ANYOF_SPACE);
1284                     }
1285                     break;
1286                 case NSPACE:
1287                     if (flags & SCF_DO_STCLASS_AND) {
1288                         if (!(data->start_class->flags & ANYOF_LOCALE)) {
1289                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
1290                             for (value = 0; value < 256; value++)
1291                                 if (isSPACE(value))
1292                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
1293                         }
1294                     }
1295                     else {
1296                         if (data->start_class->flags & ANYOF_LOCALE)
1297                             ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
1298                         else {
1299                             for (value = 0; value < 256; value++)
1300                                 if (!isSPACE(value))
1301                                     ANYOF_BITMAP_SET(data->start_class, value);                     
1302                         }
1303                     }
1304                     break;
1305                 case NSPACEL:
1306                     if (flags & SCF_DO_STCLASS_AND) {
1307                         if (data->start_class->flags & ANYOF_LOCALE) {
1308                             ANYOF_CLASS_CLEAR(data->start_class,ANYOF_SPACE);
1309                             for (value = 0; value < 256; value++)
1310                                 if (!isSPACE(value))
1311                                     ANYOF_BITMAP_CLEAR(data->start_class, value);
1312                         }
1313                     }
1314                     else {
1315                         data->start_class->flags |= ANYOF_LOCALE;
1316                         ANYOF_CLASS_SET(data->start_class,ANYOF_NSPACE);
1317                     }
1318                     break;
1319                 case DIGIT:
1320                     if (flags & SCF_DO_STCLASS_AND) {
1321                         ANYOF_CLASS_CLEAR(data->start_class,ANYOF_NDIGIT);
1322                         for (value = 0; value < 256; value++)
1323                             if (!isDIGIT(value))
1324                                 ANYOF_BITMAP_CLEAR(data->start_class, value);
1325                     }
1326                     else {
1327                         if (data->start_class->flags & ANYOF_LOCALE)
1328                             ANYOF_CLASS_SET(data->start_class,ANYOF_DIGIT);
1329                         else {
1330                             for (value = 0; value < 256; value++)
1331                                 if (isDIGIT(value))
1332                                     ANYOF_BITMAP_SET(data->start_class, value);                     
1333                         }
1334                     }
1335                     break;
1336                 case NDIGIT:
1337                     if (flags & SCF_DO_STCLASS_AND) {
1338                         ANYOF_CLASS_CLEAR(data->start_class,ANYOF_DIGIT);
1339                         for (value = 0; value < 256; value++)
1340                             if (isDIGIT(value))
1341                                 ANYOF_BITMAP_CLEAR(data->start_class, value);
1342                     }
1343                     else {
1344                         if (data->start_class->flags & ANYOF_LOCALE)
1345                             ANYOF_CLASS_SET(data->start_class,ANYOF_NDIGIT);
1346                         else {
1347                             for (value = 0; value < 256; value++)
1348                                 if (!isDIGIT(value))
1349                                     ANYOF_BITMAP_SET(data->start_class, value);                     
1350                         }
1351                     }
1352                     break;
1353                 }
1354                 if (flags & SCF_DO_STCLASS_OR)
1355                     cl_and(data->start_class, &and_with);
1356                 flags &= ~SCF_DO_STCLASS;
1357             }
1358         }
1359         else if (PL_regkind[(U8)OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
1360             data->flags |= (OP(scan) == MEOL
1361                             ? SF_BEFORE_MEOL
1362                             : SF_BEFORE_SEOL);
1363         }
1364         else if (  PL_regkind[(U8)OP(scan)] == BRANCHJ
1365                  /* Lookbehind, or need to calculate parens/evals/stclass: */
1366                    && (scan->flags || data || (flags & SCF_DO_STCLASS))
1367                    && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
1368             /* Lookahead/lookbehind */
1369             I32 deltanext, minnext, fake = 0;
1370             regnode *nscan;
1371             struct regnode_charclass_class intrnl;
1372             int f = 0;
1373
1374             data_fake.flags = 0;
1375             if (data) {             
1376                 data_fake.whilem_c = data->whilem_c;
1377                 data_fake.last_closep = data->last_closep;
1378             }
1379             else
1380                 data_fake.last_closep = &fake;
1381             if ( flags & SCF_DO_STCLASS && !scan->flags
1382                  && OP(scan) == IFMATCH ) { /* Lookahead */
1383                 cl_init(&intrnl);
1384                 data_fake.start_class = &intrnl;
1385                 f = SCF_DO_STCLASS_AND;
1386             }
1387             next = regnext(scan);
1388             nscan = NEXTOPER(NEXTOPER(scan));
1389             minnext = study_chunk(&nscan, &deltanext, last, &data_fake, f);
1390             if (scan->flags) {
1391                 if (deltanext) {
1392                     vFAIL("Variable length lookbehind not implemented");
1393                 }
1394                 else if (minnext > U8_MAX) {
1395                     vFAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
1396                 }
1397                 scan->flags = minnext;
1398             }
1399             if (data && data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
1400                 pars++;
1401             if (data && (data_fake.flags & SF_HAS_EVAL))
1402                 data->flags |= SF_HAS_EVAL;
1403             if (data)
1404                 data->whilem_c = data_fake.whilem_c;
1405             if (f) {
1406                 int was = (data->start_class->flags & ANYOF_EOS);
1407
1408                 cl_and(data->start_class, &intrnl);
1409                 if (was)
1410                     data->start_class->flags |= ANYOF_EOS;
1411             }
1412         }
1413         else if (OP(scan) == OPEN) {
1414             pars++;
1415         }
1416         else if (OP(scan) == CLOSE) {
1417             if (ARG(scan) == is_par) {
1418                 next = regnext(scan);
1419
1420                 if ( next && (OP(next) != WHILEM) && next < last)
1421                     is_par = 0;         /* Disable optimization */
1422             }
1423             if (data)
1424                 *(data->last_closep) = ARG(scan);
1425         }
1426         else if (OP(scan) == EVAL) {
1427                 if (data)
1428                     data->flags |= SF_HAS_EVAL;
1429         }
1430         else if (OP(scan) == LOGICAL && scan->flags == 2) { /* Embedded follows */
1431                 if (flags & SCF_DO_SUBSTR) {
1432                     scan_commit(data);
1433                     data->longest = &(data->longest_float);
1434                 }
1435                 is_inf = is_inf_internal = 1;
1436                 if (flags & SCF_DO_STCLASS_OR) /* Allow everything */
1437                     cl_anything(data->start_class);
1438                 flags &= ~SCF_DO_STCLASS;
1439         }
1440         /* Else: zero-length, ignore. */
1441         scan = regnext(scan);
1442     }
1443
1444   finish:
1445     *scanp = scan;
1446     *deltap = is_inf_internal ? I32_MAX : delta;
1447     if (flags & SCF_DO_SUBSTR && is_inf) 
1448         data->pos_delta = I32_MAX - data->pos_min;
1449     if (is_par > U8_MAX)
1450         is_par = 0;
1451     if (is_par && pars==1 && data) {
1452         data->flags |= SF_IN_PAR;
1453         data->flags &= ~SF_HAS_PAR;
1454     }
1455     else if (pars && data) {
1456         data->flags |= SF_HAS_PAR;
1457         data->flags &= ~SF_IN_PAR;
1458     }
1459     if (flags & SCF_DO_STCLASS_OR)
1460         cl_and(data->start_class, &and_with);
1461     return min;
1462 }
1463
1464 STATIC I32
1465 S_add_data(pTHX_ I32 n, char *s)
1466 {
1467     dTHR;
1468     if (PL_regcomp_rx->data) {
1469         Renewc(PL_regcomp_rx->data, 
1470                sizeof(*PL_regcomp_rx->data) + sizeof(void*) * (PL_regcomp_rx->data->count + n - 1), 
1471                char, struct reg_data);
1472         Renew(PL_regcomp_rx->data->what, PL_regcomp_rx->data->count + n, U8);
1473         PL_regcomp_rx->data->count += n;
1474     }
1475     else {
1476         Newc(1207, PL_regcomp_rx->data, sizeof(*PL_regcomp_rx->data) + sizeof(void*) * (n - 1),
1477              char, struct reg_data);
1478         New(1208, PL_regcomp_rx->data->what, n, U8);
1479         PL_regcomp_rx->data->count = n;
1480     }
1481     Copy(s, PL_regcomp_rx->data->what + PL_regcomp_rx->data->count - n, n, U8);
1482     return PL_regcomp_rx->data->count - n;
1483 }
1484
1485 void
1486 Perl_reginitcolors(pTHX)
1487 {
1488     dTHR;
1489     int i = 0;
1490     char *s = PerlEnv_getenv("PERL_RE_COLORS");
1491             
1492     if (s) {
1493         PL_colors[0] = s = savepv(s);
1494         while (++i < 6) {
1495             s = strchr(s, '\t');
1496             if (s) {
1497                 *s = '\0';
1498                 PL_colors[i] = ++s;
1499             }
1500             else
1501                 PL_colors[i] = s = "";
1502         }
1503     } else {
1504         while (i < 6) 
1505             PL_colors[i++] = "";
1506     }
1507     PL_colorset = 1;
1508 }
1509
1510
1511 /*
1512  - pregcomp - compile a regular expression into internal code
1513  *
1514  * We can't allocate space until we know how big the compiled form will be,
1515  * but we can't compile it (and thus know how big it is) until we've got a
1516  * place to put the code.  So we cheat:  we compile it twice, once with code
1517  * generation turned off and size counting turned on, and once "for real".
1518  * This also means that we don't allocate space until we are sure that the
1519  * thing really will compile successfully, and we never have to move the
1520  * code and thus invalidate pointers into it.  (Note that it has to be in
1521  * one piece because free() must be able to free it all.) [NB: not true in perl]
1522  *
1523  * Beware that the optimization-preparation code in here knows about some
1524  * of the structure of the compiled regexp.  [I'll say.]
1525  */
1526 regexp *
1527 Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm)
1528 {
1529     dTHR;
1530     register regexp *r;
1531     regnode *scan;
1532     regnode *first;
1533     I32 flags;
1534     I32 minlen = 0;
1535     I32 sawplus = 0;
1536     I32 sawopen = 0;
1537     scan_data_t data;
1538
1539     if (exp == NULL)
1540         FAIL("NULL regexp argument");
1541
1542     if (pm->op_pmdynflags & PMdf_UTF8) {
1543         PL_reg_flags |= RF_utf8;
1544     }
1545     else
1546         PL_reg_flags = 0;
1547
1548     PL_regprecomp = savepvn(exp, xend - exp);
1549     DEBUG_r(if (!PL_colorset) reginitcolors());
1550     DEBUG_r(PerlIO_printf(Perl_debug_log, "%sCompiling REx%s `%s%*s%s'\n",
1551                       PL_colors[4],PL_colors[5],PL_colors[0],
1552                       (int)(xend - exp), PL_regprecomp, PL_colors[1]));
1553     PL_regflags = pm->op_pmflags;
1554     PL_regsawback = 0;
1555
1556     PL_regseen = 0;
1557     PL_seen_zerolen = *exp == '^' ? -1 : 0;
1558     PL_seen_evals = 0;
1559     PL_extralen = 0;
1560
1561     /* First pass: determine size, legality. */
1562     PL_regcomp_parse = exp;
1563     PL_regxend = xend;
1564     PL_regnaughty = 0;
1565     PL_regnpar = 1;
1566     PL_regsize = 0L;
1567     PL_regcode = &PL_regdummy;
1568     PL_reg_whilem_seen = 0;
1569 #if 0 /* REGC() is (currently) a NOP at the first pass.
1570        * Clever compilers notice this and complain. --jhi */
1571     REGC((U8)REG_MAGIC, (char*)PL_regcode);
1572 #endif
1573     if (reg(0, &flags) == NULL) {
1574         Safefree(PL_regprecomp);
1575         PL_regprecomp = Nullch;
1576         return(NULL);
1577     }
1578     DEBUG_r(PerlIO_printf(Perl_debug_log, "size %"IVdf" ", (IV)PL_regsize));
1579
1580     /* Small enough for pointer-storage convention?
1581        If extralen==0, this means that we will not need long jumps. */
1582     if (PL_regsize >= 0x10000L && PL_extralen)
1583         PL_regsize += PL_extralen;
1584     else
1585         PL_extralen = 0;
1586     if (PL_reg_whilem_seen > 15)
1587         PL_reg_whilem_seen = 15;
1588
1589     /* Allocate space and initialize. */
1590     Newc(1001, r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode),
1591          char, regexp);
1592     if (r == NULL)
1593         FAIL("Regexp out of space");
1594
1595 #ifdef DEBUGGING
1596     /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
1597     Zero(r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode), char);
1598 #endif
1599     r->refcnt = 1;
1600     r->prelen = xend - exp;
1601     r->precomp = PL_regprecomp;
1602     r->subbeg = NULL;
1603     r->reganch = pm->op_pmflags & PMf_COMPILETIME;
1604     r->nparens = PL_regnpar - 1;        /* set early to validate backrefs */
1605
1606     r->substrs = 0;                     /* Useful during FAIL. */
1607     r->startp = 0;                      /* Useful during FAIL. */
1608     r->endp = 0;                        /* Useful during FAIL. */
1609
1610     PL_regcomp_rx = r;
1611
1612     /* Second pass: emit code. */
1613     PL_regcomp_parse = exp;
1614     PL_regxend = xend;
1615     PL_regnaughty = 0;
1616     PL_regnpar = 1;
1617     PL_regcode = r->program;
1618     /* Store the count of eval-groups for security checks: */
1619     PL_regcode->next_off = ((PL_seen_evals > U16_MAX) ? U16_MAX : PL_seen_evals);
1620     REGC((U8)REG_MAGIC, (char*) PL_regcode++);
1621     r->data = 0;
1622     if (reg(0, &flags) == NULL)
1623         return(NULL);
1624
1625     /* Dig out information for optimizations. */
1626     r->reganch = pm->op_pmflags & PMf_COMPILETIME; /* Again? */
1627     pm->op_pmflags = PL_regflags;
1628     if (UTF)
1629         r->reganch |= ROPT_UTF8;
1630     r->regstclass = NULL;
1631     if (PL_regnaughty >= 10)    /* Probably an expensive pattern. */
1632         r->reganch |= ROPT_NAUGHTY;
1633     scan = r->program + 1;              /* First BRANCH. */
1634
1635     /* XXXX To minimize changes to RE engine we always allocate
1636        3-units-long substrs field. */
1637     Newz(1004, r->substrs, 1, struct reg_substr_data);
1638
1639     StructCopy(&zero_scan_data, &data, scan_data_t);
1640     /* XXXX Should not we check for something else?  Usually it is OPEN1... */
1641     if (OP(scan) != BRANCH) {   /* Only one top-level choice. */
1642         I32 fake;
1643         STRLEN longest_float_length, longest_fixed_length;
1644         struct regnode_charclass_class ch_class;
1645         int stclass_flag;
1646         I32 last_close = 0;
1647
1648         first = scan;
1649         /* Skip introductions and multiplicators >= 1. */
1650         while ((OP(first) == OPEN && (sawopen = 1)) ||
1651                /* An OR of *one* alternative - should not happen now. */
1652             (OP(first) == BRANCH && OP(regnext(first)) != BRANCH) ||
1653             (OP(first) == PLUS) ||
1654             (OP(first) == MINMOD) ||
1655                /* An {n,m} with n>0 */
1656             (PL_regkind[(U8)OP(first)] == CURLY && ARG1(first) > 0) ) {
1657                 if (OP(first) == PLUS)
1658                     sawplus = 1;
1659                 else
1660                     first += regarglen[(U8)OP(first)];
1661                 first = NEXTOPER(first);
1662         }
1663
1664         /* Starting-point info. */
1665       again:
1666         if (PL_regkind[(U8)OP(first)] == EXACT) {
1667             if (OP(first) == EXACT);    /* Empty, get anchored substr later. */
1668             else if ((OP(first) == EXACTF || OP(first) == EXACTFL)
1669                      && !UTF)
1670                 r->regstclass = first;
1671         }
1672         else if (strchr((char*)PL_simple,OP(first)))
1673             r->regstclass = first;
1674         else if (PL_regkind[(U8)OP(first)] == BOUND ||
1675                  PL_regkind[(U8)OP(first)] == NBOUND)
1676             r->regstclass = first;
1677         else if (PL_regkind[(U8)OP(first)] == BOL) {
1678             r->reganch |= (OP(first) == MBOL
1679                            ? ROPT_ANCH_MBOL
1680                            : (OP(first) == SBOL
1681                               ? ROPT_ANCH_SBOL
1682                               : ROPT_ANCH_BOL));
1683             first = NEXTOPER(first);
1684             goto again;
1685         }
1686         else if (OP(first) == GPOS) {
1687             r->reganch |= ROPT_ANCH_GPOS;
1688             first = NEXTOPER(first);
1689             goto again;
1690         }
1691         else if ((OP(first) == STAR &&
1692             PL_regkind[(U8)OP(NEXTOPER(first))] == REG_ANY) &&
1693             !(r->reganch & ROPT_ANCH) )
1694         {
1695             /* turn .* into ^.* with an implied $*=1 */
1696             int type = OP(NEXTOPER(first));
1697
1698             if (type == REG_ANY || type == ANYUTF8)
1699                 type = ROPT_ANCH_MBOL;
1700             else
1701                 type = ROPT_ANCH_SBOL;
1702
1703             r->reganch |= type | ROPT_IMPLICIT;
1704             first = NEXTOPER(first);
1705             goto again;
1706         }
1707         if (sawplus && (!sawopen || !PL_regsawback) 
1708             && !(PL_regseen & REG_SEEN_EVAL)) /* May examine pos and $& */
1709             /* x+ must match at the 1st pos of run of x's */
1710             r->reganch |= ROPT_SKIP;
1711
1712         /* Scan is after the zeroth branch, first is atomic matcher. */
1713         DEBUG_r(PerlIO_printf(Perl_debug_log, "first at %"IVdf"\n", 
1714                               (IV)(first - scan + 1)));
1715         /*
1716         * If there's something expensive in the r.e., find the
1717         * longest literal string that must appear and make it the
1718         * regmust.  Resolve ties in favor of later strings, since
1719         * the regstart check works with the beginning of the r.e.
1720         * and avoiding duplication strengthens checking.  Not a
1721         * strong reason, but sufficient in the absence of others.
1722         * [Now we resolve ties in favor of the earlier string if
1723         * it happens that c_offset_min has been invalidated, since the
1724         * earlier string may buy us something the later one won't.]
1725         */
1726         minlen = 0;
1727
1728         data.longest_fixed = newSVpvn("",0);
1729         data.longest_float = newSVpvn("",0);
1730         data.last_found = newSVpvn("",0);
1731         data.longest = &(data.longest_fixed);
1732         first = scan;
1733         if (!r->regstclass) {
1734             cl_init(&ch_class);
1735             data.start_class = &ch_class;
1736             stclass_flag = SCF_DO_STCLASS_AND;
1737         } else                          /* XXXX Check for BOUND? */
1738             stclass_flag = 0;
1739         data.last_closep = &last_close;
1740
1741         minlen = study_chunk(&first, &fake, scan + PL_regsize, /* Up to end */
1742                              &data, SCF_DO_SUBSTR | stclass_flag);
1743         if ( PL_regnpar == 1 && data.longest == &(data.longest_fixed)
1744              && data.last_start_min == 0 && data.last_end > 0 
1745              && !PL_seen_zerolen
1746              && (!(PL_regseen & REG_SEEN_GPOS) || (r->reganch & ROPT_ANCH_GPOS)))
1747             r->reganch |= ROPT_CHECK_ALL;
1748         scan_commit(&data);
1749         SvREFCNT_dec(data.last_found);
1750
1751         longest_float_length = CHR_SVLEN(data.longest_float);
1752         if (longest_float_length
1753             || (data.flags & SF_FL_BEFORE_EOL
1754                 && (!(data.flags & SF_FL_BEFORE_MEOL)
1755                     || (PL_regflags & PMf_MULTILINE)))) {
1756             int t;
1757
1758             if (SvCUR(data.longest_fixed)                       /* ok to leave SvCUR */
1759                 && data.offset_fixed == data.offset_float_min
1760                 && SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
1761                     goto remove_float;          /* As in (a)+. */
1762
1763             r->float_substr = data.longest_float;
1764             r->float_min_offset = data.offset_float_min;
1765             r->float_max_offset = data.offset_float_max;
1766             t = (data.flags & SF_FL_BEFORE_EOL /* Can't have SEOL and MULTI */
1767                        && (!(data.flags & SF_FL_BEFORE_MEOL)
1768                            || (PL_regflags & PMf_MULTILINE)));
1769             fbm_compile(r->float_substr, t ? FBMcf_TAIL : 0);
1770         }
1771         else {
1772           remove_float:
1773             r->float_substr = Nullsv;
1774             SvREFCNT_dec(data.longest_float);
1775             longest_float_length = 0;
1776         }
1777
1778         longest_fixed_length = CHR_SVLEN(data.longest_fixed);
1779         if (longest_fixed_length
1780             || (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
1781                 && (!(data.flags & SF_FIX_BEFORE_MEOL)
1782                     || (PL_regflags & PMf_MULTILINE)))) {
1783             int t;
1784
1785             r->anchored_substr = data.longest_fixed;
1786             r->anchored_offset = data.offset_fixed;
1787             t = (data.flags & SF_FIX_BEFORE_EOL /* Can't have SEOL and MULTI */
1788                  && (!(data.flags & SF_FIX_BEFORE_MEOL)
1789                      || (PL_regflags & PMf_MULTILINE)));
1790             fbm_compile(r->anchored_substr, t ? FBMcf_TAIL : 0);
1791         }
1792         else {
1793             r->anchored_substr = Nullsv;
1794             SvREFCNT_dec(data.longest_fixed);
1795             longest_fixed_length = 0;
1796         }
1797         if (r->regstclass 
1798             && (OP(r->regstclass) == REG_ANY || OP(r->regstclass) == ANYUTF8
1799                 || OP(r->regstclass) == SANYUTF8 || OP(r->regstclass) == SANY))
1800             r->regstclass = NULL;
1801         if ((!r->anchored_substr || r->anchored_offset) && stclass_flag
1802             && !(data.start_class->flags & ANYOF_EOS)
1803             && !cl_is_anything(data.start_class)) {
1804             SV *sv;
1805             I32 n = add_data(1, "f");
1806
1807             New(1006, PL_regcomp_rx->data->data[n], 1, 
1808                 struct regnode_charclass_class);
1809             StructCopy(data.start_class,
1810                        (struct regnode_charclass_class*)PL_regcomp_rx->data->data[n],
1811                        struct regnode_charclass_class);
1812             r->regstclass = (regnode*)PL_regcomp_rx->data->data[n];
1813             r->reganch &= ~ROPT_SKIP;   /* Used in find_byclass(). */
1814             DEBUG_r((sv = sv_newmortal(),
1815                      regprop(sv, (regnode*)data.start_class),
1816                      PerlIO_printf(Perl_debug_log, "synthetic stclass `%s'.\n",
1817                                    SvPVX(sv))));
1818         }
1819
1820         /* A temporary algorithm prefers floated substr to fixed one to dig more info. */
1821         if (longest_fixed_length > longest_float_length) {
1822             r->check_substr = r->anchored_substr;
1823             r->check_offset_min = r->check_offset_max = r->anchored_offset;
1824             if (r->reganch & ROPT_ANCH_SINGLE)
1825                 r->reganch |= ROPT_NOSCAN;
1826         }
1827         else {
1828             r->check_substr = r->float_substr;
1829             r->check_offset_min = data.offset_float_min;
1830             r->check_offset_max = data.offset_float_max;
1831         }
1832         /* XXXX Currently intuiting is not compatible with ANCH_GPOS.
1833            This should be changed ASAP!  */
1834         if (r->check_substr && !(r->reganch & ROPT_ANCH_GPOS)) {
1835             r->reganch |= RE_USE_INTUIT;
1836             if (SvTAIL(r->check_substr))
1837                 r->reganch |= RE_INTUIT_TAIL;
1838         }
1839     }
1840     else {
1841         /* Several toplevels. Best we can is to set minlen. */
1842         I32 fake;
1843         struct regnode_charclass_class ch_class;
1844         I32 last_close = 0;
1845         
1846         DEBUG_r(PerlIO_printf(Perl_debug_log, "\n"));
1847         scan = r->program + 1;
1848         cl_init(&ch_class);
1849         data.start_class = &ch_class;
1850         data.last_closep = &last_close;
1851         minlen = study_chunk(&scan, &fake, scan + PL_regsize, &data, SCF_DO_STCLASS_AND);
1852         r->check_substr = r->anchored_substr = r->float_substr = Nullsv;
1853         if (!(data.start_class->flags & ANYOF_EOS)
1854             && !cl_is_anything(data.start_class)) {
1855             SV *sv;
1856             I32 n = add_data(1, "f");
1857
1858             New(1006, PL_regcomp_rx->data->data[n], 1, 
1859                 struct regnode_charclass_class);
1860             StructCopy(data.start_class,
1861                        (struct regnode_charclass_class*)PL_regcomp_rx->data->data[n],
1862                        struct regnode_charclass_class);
1863             r->regstclass = (regnode*)PL_regcomp_rx->data->data[n];
1864             r->reganch &= ~ROPT_SKIP;   /* Used in find_byclass(). */
1865             DEBUG_r((sv = sv_newmortal(),
1866                      regprop(sv, (regnode*)data.start_class),
1867                      PerlIO_printf(Perl_debug_log, "synthetic stclass `%s'.\n",
1868                                    SvPVX(sv))));
1869         }
1870     }
1871
1872     r->minlen = minlen;
1873     if (PL_regseen & REG_SEEN_GPOS) 
1874         r->reganch |= ROPT_GPOS_SEEN;
1875     if (PL_regseen & REG_SEEN_LOOKBEHIND)
1876         r->reganch |= ROPT_LOOKBEHIND_SEEN;
1877     if (PL_regseen & REG_SEEN_EVAL)
1878         r->reganch |= ROPT_EVAL_SEEN;
1879     Newz(1002, r->startp, PL_regnpar, I32);
1880     Newz(1002, r->endp, PL_regnpar, I32);
1881     DEBUG_r(regdump(r));
1882     return(r);
1883 }
1884
1885 /*
1886  - reg - regular expression, i.e. main body or parenthesized thing
1887  *
1888  * Caller must absorb opening parenthesis.
1889  *
1890  * Combining parenthesis handling with the base level of regular expression
1891  * is a trifle forced, but the need to tie the tails of the branches to what
1892  * follows makes it hard to avoid.
1893  */
1894 STATIC regnode *
1895 S_reg(pTHX_ I32 paren, I32 *flagp)
1896     /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
1897 {
1898     dTHR;
1899     register regnode *ret;              /* Will be the head of the group. */
1900     register regnode *br;
1901     register regnode *lastbr;
1902     register regnode *ender = 0;
1903     register I32 parno = 0;
1904     I32 flags, oregflags = PL_regflags, have_branch = 0, open = 0;
1905     char *oregcomp_parse = PL_regcomp_parse;
1906     char c;
1907
1908     *flagp = 0;                         /* Tentatively. */
1909
1910     /* Make an OPEN node, if parenthesized. */
1911     if (paren) {
1912         if (*PL_regcomp_parse == '?') {
1913             U16 posflags = 0, negflags = 0;
1914             U16 *flagsp = &posflags;
1915             int logical = 0;
1916             char *seqstart = PL_regcomp_parse;
1917
1918             PL_regcomp_parse++;
1919             paren = *PL_regcomp_parse++;
1920             ret = NULL;                 /* For look-ahead/behind. */
1921             switch (paren) {
1922             case '<':
1923                 PL_regseen |= REG_SEEN_LOOKBEHIND;
1924                 if (*PL_regcomp_parse == '!') 
1925                     paren = ',';
1926                 if (*PL_regcomp_parse != '=' && *PL_regcomp_parse != '!') 
1927                     goto unknown;
1928                 PL_regcomp_parse++;
1929             case '=':
1930             case '!':
1931                 PL_seen_zerolen++;
1932             case ':':
1933             case '>':
1934                 break;
1935             case '$':
1936             case '@':
1937                 vFAIL2("Sequence (?%c...) not implemented", (int)paren);
1938                 break;
1939             case '#':
1940                 while (*PL_regcomp_parse && *PL_regcomp_parse != ')')
1941                     PL_regcomp_parse++;
1942                 if (*PL_regcomp_parse != ')')
1943                     FAIL("Sequence (?#... not terminated");
1944                 nextchar();
1945                 *flagp = TRYAGAIN;
1946                 return NULL;
1947             case 'p':
1948                 if (SIZE_ONLY)
1949                     vWARN(PL_regcomp_parse, "(?p{}) is deprecated - use (??{})");
1950                 /* FALL THROUGH*/
1951             case '?':
1952                 logical = 1;
1953                 paren = *PL_regcomp_parse++;
1954                 /* FALL THROUGH */
1955             case '{':
1956             {
1957                 dTHR;
1958                 I32 count = 1, n = 0;
1959                 char c;
1960                 char *s = PL_regcomp_parse;
1961                 SV *sv;
1962                 OP_4tree *sop, *rop;
1963
1964                 PL_seen_zerolen++;
1965                 PL_regseen |= REG_SEEN_EVAL;
1966                 while (count && (c = *PL_regcomp_parse)) {
1967                     if (c == '\\' && PL_regcomp_parse[1])
1968                         PL_regcomp_parse++;
1969                     else if (c == '{') 
1970                         count++;
1971                     else if (c == '}') 
1972                         count--;
1973                     PL_regcomp_parse++;
1974                 }
1975                 if (*PL_regcomp_parse != ')')
1976                 {
1977                     PL_regcomp_parse = s;                   
1978                     vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
1979                 }
1980                 if (!SIZE_ONLY) {
1981                     AV *av;
1982                     
1983                     if (PL_regcomp_parse - 1 - s) 
1984                         sv = newSVpvn(s, PL_regcomp_parse - 1 - s);
1985                     else
1986                         sv = newSVpvn("", 0);
1987
1988                     ENTER;
1989                     Perl_save_re_context(aTHX);
1990                     rop = sv_compile_2op(sv, &sop, "re", &av);
1991                     LEAVE;
1992
1993                     n = add_data(3, "nop");
1994                     PL_regcomp_rx->data->data[n] = (void*)rop;
1995                     PL_regcomp_rx->data->data[n+1] = (void*)sop;
1996                     PL_regcomp_rx->data->data[n+2] = (void*)av;
1997                     SvREFCNT_dec(sv);
1998                 }
1999                 else {                                          /* First pass */
2000                     if (PL_reginterp_cnt < ++PL_seen_evals
2001                         && PL_curcop != &PL_compiling)
2002                         /* No compiled RE interpolated, has runtime
2003                            components ===> unsafe.  */
2004                         FAIL("Eval-group not allowed at runtime, use re 'eval'");
2005                     if (PL_tainted)
2006                         FAIL("Eval-group in insecure regular expression");
2007                 }
2008                 
2009                 nextchar();
2010                 if (logical) {
2011                     ret = reg_node(LOGICAL);
2012                     if (!SIZE_ONLY)
2013                         ret->flags = 2;
2014                     regtail(ret, reganode(EVAL, n));
2015                     return ret;
2016                 }
2017                 return reganode(EVAL, n);
2018             }
2019             case '(':
2020             {
2021                 if (PL_regcomp_parse[0] == '?') {
2022                     if (PL_regcomp_parse[1] == '=' || PL_regcomp_parse[1] == '!' 
2023                         || PL_regcomp_parse[1] == '<' 
2024                         || PL_regcomp_parse[1] == '{') { /* Lookahead or eval. */
2025                         I32 flag;
2026                         
2027                         ret = reg_node(LOGICAL);
2028                         if (!SIZE_ONLY)
2029                             ret->flags = 1;
2030                         regtail(ret, reg(1, &flag));
2031                         goto insert_if;
2032                     } 
2033                 }
2034                 else if (PL_regcomp_parse[0] >= '1' && PL_regcomp_parse[0] <= '9' ) {
2035                     parno = atoi(PL_regcomp_parse++);
2036
2037                     while (isDIGIT(*PL_regcomp_parse))
2038                         PL_regcomp_parse++;
2039                     ret = reganode(GROUPP, parno);
2040                     if ((c = *nextchar()) != ')')
2041                         vFAIL("Switch condition not recognized");
2042                   insert_if:
2043                     regtail(ret, reganode(IFTHEN, 0));
2044                     br = regbranch(&flags, 1);
2045                     if (br == NULL)
2046                         br = reganode(LONGJMP, 0);
2047                     else
2048                         regtail(br, reganode(LONGJMP, 0));
2049                     c = *nextchar();
2050                     if (flags&HASWIDTH)
2051                         *flagp |= HASWIDTH;
2052                     if (c == '|') {
2053                         lastbr = reganode(IFTHEN, 0); /* Fake one for optimizer. */
2054                         regbranch(&flags, 1);
2055                         regtail(ret, lastbr);
2056                         if (flags&HASWIDTH)
2057                             *flagp |= HASWIDTH;
2058                         c = *nextchar();
2059                     }
2060                     else
2061                         lastbr = NULL;
2062                     if (c != ')')
2063                         vFAIL("Switch (?(condition)... contains too many branches");
2064                     ender = reg_node(TAIL);
2065                     regtail(br, ender);
2066                     if (lastbr) {
2067                         regtail(lastbr, ender);
2068                         regtail(NEXTOPER(NEXTOPER(lastbr)), ender);
2069                     }
2070                     else
2071                         regtail(ret, ender);
2072                     return ret;
2073                 }
2074                 else {
2075                     vFAIL2("Unknown switch condition (?(%.2s", PL_regcomp_parse);
2076                 }
2077             }
2078             case 0:
2079                 PL_regcomp_parse--; /* for vFAIL to print correctly */
2080                 vFAIL("Sequence (? incomplete");
2081                 break;
2082             default:
2083                 --PL_regcomp_parse;
2084               parse_flags:
2085                 while (*PL_regcomp_parse && strchr("iogcmsx", *PL_regcomp_parse)) {
2086                     if (*PL_regcomp_parse != 'o')
2087                         pmflag(flagsp, *PL_regcomp_parse);
2088                     ++PL_regcomp_parse;
2089                 }
2090                 if (*PL_regcomp_parse == '-') {
2091                     flagsp = &negflags;
2092                     ++PL_regcomp_parse;
2093                     goto parse_flags;
2094                 }
2095                 PL_regflags |= posflags;
2096                 PL_regflags &= ~negflags;
2097                 if (*PL_regcomp_parse == ':') {
2098                     PL_regcomp_parse++;
2099                     paren = ':';
2100                     break;
2101                 }               
2102               unknown:
2103                 if (*PL_regcomp_parse != ')') {
2104                     PL_regcomp_parse++;
2105                     vFAIL3("Sequence (%.*s...) not recognized", PL_regcomp_parse-seqstart, seqstart);
2106                 }
2107                 nextchar();
2108                 *flagp = TRYAGAIN;
2109                 return NULL;
2110             }
2111         }
2112         else {
2113             parno = PL_regnpar;
2114             PL_regnpar++;
2115             ret = reganode(OPEN, parno);
2116             open = 1;
2117         }
2118     }
2119     else
2120         ret = NULL;
2121
2122     /* Pick up the branches, linking them together. */
2123     br = regbranch(&flags, 1);
2124     if (br == NULL)
2125         return(NULL);
2126     if (*PL_regcomp_parse == '|') {
2127         if (!SIZE_ONLY && PL_extralen) {
2128             reginsert(BRANCHJ, br);
2129         }
2130         else
2131             reginsert(BRANCH, br);
2132         have_branch = 1;
2133         if (SIZE_ONLY)
2134             PL_extralen += 1;           /* For BRANCHJ-BRANCH. */
2135     }
2136     else if (paren == ':') {
2137         *flagp |= flags&SIMPLE;
2138     }
2139     if (open) {                         /* Starts with OPEN. */
2140         regtail(ret, br);               /* OPEN -> first. */
2141     }
2142     else if (paren != '?')              /* Not Conditional */
2143         ret = br;
2144     if (flags&HASWIDTH)
2145         *flagp |= HASWIDTH;
2146     *flagp |= flags&SPSTART;
2147     lastbr = br;
2148     while (*PL_regcomp_parse == '|') {
2149         if (!SIZE_ONLY && PL_extralen) {
2150             ender = reganode(LONGJMP,0);
2151             regtail(NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
2152         }
2153         if (SIZE_ONLY)
2154             PL_extralen += 2;           /* Account for LONGJMP. */
2155         nextchar();
2156         br = regbranch(&flags, 0);
2157         if (br == NULL)
2158             return(NULL);
2159         regtail(lastbr, br);            /* BRANCH -> BRANCH. */
2160         lastbr = br;
2161         if (flags&HASWIDTH)
2162             *flagp |= HASWIDTH;
2163         *flagp |= flags&SPSTART;
2164     }
2165
2166     if (have_branch || paren != ':') {
2167         /* Make a closing node, and hook it on the end. */
2168         switch (paren) {
2169         case ':':
2170             ender = reg_node(TAIL);
2171             break;
2172         case 1:
2173             ender = reganode(CLOSE, parno);
2174             break;
2175         case '<':
2176         case ',':
2177         case '=':
2178         case '!':
2179             *flagp &= ~HASWIDTH;
2180             /* FALL THROUGH */
2181         case '>':
2182             ender = reg_node(SUCCEED);
2183             break;
2184         case 0:
2185             ender = reg_node(END);
2186             break;
2187         }
2188         regtail(lastbr, ender);
2189
2190         if (have_branch) {
2191             /* Hook the tails of the branches to the closing node. */
2192             for (br = ret; br != NULL; br = regnext(br)) {
2193                 regoptail(br, ender);
2194             }
2195         }
2196     }
2197
2198     {
2199         char *p;
2200         static char parens[] = "=!<,>";
2201
2202         if (paren && (p = strchr(parens, paren))) {
2203             int node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
2204             int flag = (p - parens) > 1;
2205
2206             if (paren == '>')
2207                 node = SUSPEND, flag = 0;
2208             reginsert(node,ret);
2209             ret->flags = flag;
2210             regtail(ret, reg_node(TAIL));
2211         }
2212     }
2213
2214     /* Check for proper termination. */
2215     if (paren) {
2216         PL_regflags = oregflags;
2217         if (PL_regcomp_parse >= PL_regxend || *nextchar() != ')') {
2218             PL_regcomp_parse = oregcomp_parse;
2219             vFAIL("Unmatched (");
2220         }
2221     }
2222     else if (!paren && PL_regcomp_parse < PL_regxend) {
2223         if (*PL_regcomp_parse == ')') {
2224             PL_regcomp_parse++;
2225             vFAIL("Unmatched )");
2226         }
2227         else
2228             FAIL("Junk on end of regexp");      /* "Can't happen". */
2229         /* NOTREACHED */
2230     }
2231
2232     return(ret);
2233 }
2234
2235 /*
2236  - regbranch - one alternative of an | operator
2237  *
2238  * Implements the concatenation operator.
2239  */
2240 STATIC regnode *
2241 S_regbranch(pTHX_ I32 *flagp, I32 first)
2242 {
2243     dTHR;
2244     register regnode *ret;
2245     register regnode *chain = NULL;
2246     register regnode *latest;
2247     I32 flags = 0, c = 0;
2248
2249     if (first) 
2250         ret = NULL;
2251     else {
2252         if (!SIZE_ONLY && PL_extralen) 
2253             ret = reganode(BRANCHJ,0);
2254         else
2255             ret = reg_node(BRANCH);
2256     }
2257         
2258     if (!first && SIZE_ONLY) 
2259         PL_extralen += 1;                       /* BRANCHJ */
2260     
2261     *flagp = WORST;                     /* Tentatively. */
2262
2263     PL_regcomp_parse--;
2264     nextchar();
2265     while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != '|' && *PL_regcomp_parse != ')') {
2266         flags &= ~TRYAGAIN;
2267         latest = regpiece(&flags);
2268         if (latest == NULL) {
2269             if (flags & TRYAGAIN)
2270                 continue;
2271             return(NULL);
2272         }
2273         else if (ret == NULL)
2274             ret = latest;
2275         *flagp |= flags&HASWIDTH;
2276         if (chain == NULL)      /* First piece. */
2277             *flagp |= flags&SPSTART;
2278         else {
2279             PL_regnaughty++;
2280             regtail(chain, latest);
2281         }
2282         chain = latest;
2283         c++;
2284     }
2285     if (chain == NULL) {        /* Loop ran zero times. */
2286         chain = reg_node(NOTHING);
2287         if (ret == NULL)
2288             ret = chain;
2289     }
2290     if (c == 1) {
2291         *flagp |= flags&SIMPLE;
2292     }
2293
2294     return(ret);
2295 }
2296
2297 /*
2298  - regpiece - something followed by possible [*+?]
2299  *
2300  * Note that the branching code sequences used for ? and the general cases
2301  * of * and + are somewhat optimized:  they use the same NOTHING node as
2302  * both the endmarker for their branch list and the body of the last branch.
2303  * It might seem that this node could be dispensed with entirely, but the
2304  * endmarker role is not redundant.
2305  */
2306 STATIC regnode *
2307 S_regpiece(pTHX_ I32 *flagp)
2308 {
2309     dTHR;
2310     register regnode *ret;
2311     register char op;
2312     register char *next;
2313     I32 flags;
2314     char *origparse = PL_regcomp_parse;
2315     char *maxpos;
2316     I32 min;
2317     I32 max = REG_INFTY;
2318
2319     ret = regatom(&flags);
2320     if (ret == NULL) {
2321         if (flags & TRYAGAIN)
2322             *flagp |= TRYAGAIN;
2323         return(NULL);
2324     }
2325
2326     op = *PL_regcomp_parse;
2327
2328     if (op == '{' && regcurly(PL_regcomp_parse)) {
2329         next = PL_regcomp_parse + 1;
2330         maxpos = Nullch;
2331         while (isDIGIT(*next) || *next == ',') {
2332             if (*next == ',') {
2333                 if (maxpos)
2334                     break;
2335                 else
2336                     maxpos = next;
2337             }
2338             next++;
2339         }
2340         if (*next == '}') {             /* got one */
2341             if (!maxpos)
2342                 maxpos = next;
2343             PL_regcomp_parse++;
2344             min = atoi(PL_regcomp_parse);
2345             if (*maxpos == ',')
2346                 maxpos++;
2347             else
2348                 maxpos = PL_regcomp_parse;
2349             max = atoi(maxpos);
2350             if (!max && *maxpos != '0')
2351                 max = REG_INFTY;                /* meaning "infinity" */
2352             else if (max >= REG_INFTY)
2353                 vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
2354             PL_regcomp_parse = next;
2355             nextchar();
2356
2357         do_curly:
2358             if ((flags&SIMPLE)) {
2359                 PL_regnaughty += 2 + PL_regnaughty / 2;
2360                 reginsert(CURLY, ret);
2361             }
2362             else {
2363                 regnode *w = reg_node(WHILEM);
2364
2365                 w->flags = 0;
2366                 regtail(ret, w);
2367                 if (!SIZE_ONLY && PL_extralen) {
2368                     reginsert(LONGJMP,ret);
2369                     reginsert(NOTHING,ret);
2370                     NEXT_OFF(ret) = 3;  /* Go over LONGJMP. */
2371                 }
2372                 reginsert(CURLYX,ret);
2373                 if (!SIZE_ONLY && PL_extralen)
2374                     NEXT_OFF(ret) = 3;  /* Go over NOTHING to LONGJMP. */
2375                 regtail(ret, reg_node(NOTHING));
2376                 if (SIZE_ONLY)
2377                     PL_reg_whilem_seen++, PL_extralen += 3;
2378                 PL_regnaughty += 4 + PL_regnaughty;     /* compound interest */
2379             }
2380             ret->flags = 0;
2381
2382             if (min > 0)
2383                 *flagp = WORST;
2384             if (max > 0)
2385                 *flagp |= HASWIDTH;
2386             if (max && max < min)
2387                 vFAIL("Can't do {n,m} with n > m");
2388             if (!SIZE_ONLY) {
2389                 ARG1_SET(ret, min);
2390                 ARG2_SET(ret, max);
2391             }
2392
2393             goto nest_check;
2394         }
2395     }
2396
2397     if (!ISMULT1(op)) {
2398         *flagp = flags;
2399         return(ret);
2400     }
2401
2402 #if 0                           /* Now runtime fix should be reliable. */
2403
2404     /* if this is reinstated, don't forget to put this back into perldiag:
2405
2406             =item Regexp *+ operand could be empty at {#} in regex m/%s/
2407
2408            (F) The part of the regexp subject to either the * or + quantifier
2409            could match an empty string. The {#} shows in the regular
2410            expression about where the problem was discovered.
2411
2412     */
2413
2414     if (!(flags&HASWIDTH) && op != '?')
2415       vFAIL("Regexp *+ operand could be empty");
2416 #endif 
2417
2418     nextchar();
2419
2420     *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
2421
2422     if (op == '*' && (flags&SIMPLE)) {
2423         reginsert(STAR, ret);
2424         ret->flags = 0;
2425         PL_regnaughty += 4;
2426     }
2427     else if (op == '*') {
2428         min = 0;
2429         goto do_curly;
2430     }
2431     else if (op == '+' && (flags&SIMPLE)) {
2432         reginsert(PLUS, ret);
2433         ret->flags = 0;
2434         PL_regnaughty += 3;
2435     }
2436     else if (op == '+') {
2437         min = 1;
2438         goto do_curly;
2439     }
2440     else if (op == '?') {
2441         min = 0; max = 1;
2442         goto do_curly;
2443     }
2444   nest_check:
2445     if (ckWARN(WARN_REGEXP) && !SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3) {
2446         vWARN3(PL_regcomp_parse,
2447                "%.*s matches null string many times",
2448                PL_regcomp_parse - origparse,
2449                origparse);
2450     }
2451
2452     if (*PL_regcomp_parse == '?') {
2453         nextchar();
2454         reginsert(MINMOD, ret);
2455         regtail(ret, ret + NODE_STEP_REGNODE);
2456     }
2457     if (ISMULT2(PL_regcomp_parse)) {
2458         PL_regcomp_parse++;
2459         vFAIL("Nested quantifiers");
2460     }
2461
2462     return(ret);
2463 }
2464
2465 /*
2466  - regatom - the lowest level
2467  *
2468  * Optimization:  gobbles an entire sequence of ordinary characters so that
2469  * it can turn them into a single node, which is smaller to store and
2470  * faster to run.  Backslashed characters are exceptions, each becoming a
2471  * separate node; the code is simpler that way and it's not worth fixing.
2472  *
2473  * [Yes, it is worth fixing, some scripts can run twice the speed.] */
2474 STATIC regnode *
2475 S_regatom(pTHX_ I32 *flagp)
2476 {
2477     dTHR;
2478     register regnode *ret = 0;
2479     I32 flags;
2480
2481     *flagp = WORST;             /* Tentatively. */
2482
2483 tryagain:
2484     switch (*PL_regcomp_parse) {
2485     case '^':
2486         PL_seen_zerolen++;
2487         nextchar();
2488         if (PL_regflags & PMf_MULTILINE)
2489             ret = reg_node(MBOL);
2490         else if (PL_regflags & PMf_SINGLELINE)
2491             ret = reg_node(SBOL);
2492         else
2493             ret = reg_node(BOL);
2494         break;
2495     case '$':
2496         nextchar();
2497         if (*PL_regcomp_parse) 
2498             PL_seen_zerolen++;
2499         if (PL_regflags & PMf_MULTILINE)
2500             ret = reg_node(MEOL);
2501         else if (PL_regflags & PMf_SINGLELINE)
2502             ret = reg_node(SEOL);
2503         else
2504             ret = reg_node(EOL);
2505         break;
2506     case '.':
2507         nextchar();
2508         if (UTF) {
2509             if (PL_regflags & PMf_SINGLELINE)
2510                 ret = reg_node(SANYUTF8);
2511             else
2512                 ret = reg_node(ANYUTF8);
2513             *flagp |= HASWIDTH;
2514         }
2515         else {
2516             if (PL_regflags & PMf_SINGLELINE)
2517                 ret = reg_node(SANY);
2518             else
2519                 ret = reg_node(REG_ANY);
2520             *flagp |= HASWIDTH|SIMPLE;
2521         }
2522         PL_regnaughty++;
2523         break;
2524     case '[':
2525     {
2526         char *oregcomp_parse = ++PL_regcomp_parse;
2527         ret = (UTF ? regclassutf8() : regclass());
2528         if (*PL_regcomp_parse != ']') {
2529             PL_regcomp_parse = oregcomp_parse;
2530             vFAIL("Unmatched [");
2531         }
2532         nextchar();
2533         *flagp |= HASWIDTH|SIMPLE;
2534         break;
2535     }
2536     case '(':
2537         nextchar();
2538         ret = reg(1, &flags);
2539         if (ret == NULL) {
2540                 if (flags & TRYAGAIN) {
2541                     if (PL_regcomp_parse == PL_regxend) {
2542                          /* Make parent create an empty node if needed. */
2543                         *flagp |= TRYAGAIN;
2544                         return(NULL);
2545                     }
2546                     goto tryagain;
2547                 }
2548                 return(NULL);
2549         }
2550         *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE);
2551         break;
2552     case '|':
2553     case ')':
2554         if (flags & TRYAGAIN) {
2555             *flagp |= TRYAGAIN;
2556             return NULL;
2557         }
2558         vFAIL("Internal urp");
2559                                 /* Supposed to be caught earlier. */
2560         break;
2561     case '{':
2562         if (!regcurly(PL_regcomp_parse)) {
2563             PL_regcomp_parse++;
2564             goto defchar;
2565         }
2566         /* FALL THROUGH */
2567     case '?':
2568     case '+':
2569     case '*':
2570         PL_regcomp_parse++;
2571         vFAIL("Quantifier follows nothing");
2572         break;
2573     case '\\':
2574         switch (*++PL_regcomp_parse) {
2575         case 'A':
2576             PL_seen_zerolen++;
2577             ret = reg_node(SBOL);
2578             *flagp |= SIMPLE;
2579             nextchar();
2580             break;
2581         case 'G':
2582             ret = reg_node(GPOS);
2583             PL_regseen |= REG_SEEN_GPOS;
2584             *flagp |= SIMPLE;
2585             nextchar();
2586             break;
2587         case 'Z':
2588             ret = reg_node(SEOL);
2589             *flagp |= SIMPLE;
2590             nextchar();
2591             break;
2592         case 'z':
2593             ret = reg_node(EOS);
2594             *flagp |= SIMPLE;
2595             PL_seen_zerolen++;          /* Do not optimize RE away */
2596             nextchar();
2597             break;
2598         case 'C':
2599             ret = reg_node(SANY);
2600             *flagp |= HASWIDTH|SIMPLE;
2601             nextchar();
2602             break;
2603         case 'X':
2604             ret = reg_node(CLUMP);
2605             *flagp |= HASWIDTH;
2606             nextchar();
2607             if (UTF && !PL_utf8_mark)
2608                 is_utf8_mark((U8*)"~");         /* preload table */
2609             break;
2610         case 'w':
2611             ret = reg_node(
2612                 UTF
2613                     ? (LOC ? ALNUMLUTF8 : ALNUMUTF8)
2614                     : (LOC ? ALNUML     : ALNUM));
2615             *flagp |= HASWIDTH|SIMPLE;
2616             nextchar();
2617             if (UTF && !PL_utf8_alnum)
2618                 is_utf8_alnum((U8*)"a");        /* preload table */
2619             break;
2620         case 'W':
2621             ret = reg_node(
2622                 UTF
2623                     ? (LOC ? NALNUMLUTF8 : NALNUMUTF8)
2624                     : (LOC ? NALNUML     : NALNUM));
2625             *flagp |= HASWIDTH|SIMPLE;
2626             nextchar();
2627             if (UTF && !PL_utf8_alnum)
2628                 is_utf8_alnum((U8*)"a");        /* preload table */
2629             break;
2630         case 'b':
2631             PL_seen_zerolen++;
2632             PL_regseen |= REG_SEEN_LOOKBEHIND;
2633             ret = reg_node(
2634                 UTF
2635                     ? (LOC ? BOUNDLUTF8 : BOUNDUTF8)
2636                     : (LOC ? BOUNDL     : BOUND));
2637             *flagp |= SIMPLE;
2638             nextchar();
2639             if (UTF && !PL_utf8_alnum)
2640                 is_utf8_alnum((U8*)"a");        /* preload table */
2641             break;
2642         case 'B':
2643             PL_seen_zerolen++;
2644             PL_regseen |= REG_SEEN_LOOKBEHIND;
2645             ret = reg_node(
2646                 UTF
2647                     ? (LOC ? NBOUNDLUTF8 : NBOUNDUTF8)
2648                     : (LOC ? NBOUNDL     : NBOUND));
2649             *flagp |= SIMPLE;
2650             nextchar();
2651             if (UTF && !PL_utf8_alnum)
2652                 is_utf8_alnum((U8*)"a");        /* preload table */
2653             break;
2654         case 's':
2655             ret = reg_node(
2656                 UTF
2657                     ? (LOC ? SPACELUTF8 : SPACEUTF8)
2658                     : (LOC ? SPACEL     : SPACE));
2659             *flagp |= HASWIDTH|SIMPLE;
2660             nextchar();
2661             if (UTF && !PL_utf8_space)
2662                 is_utf8_space((U8*)" ");        /* preload table */
2663             break;
2664         case 'S':
2665             ret = reg_node(
2666                 UTF
2667                     ? (LOC ? NSPACELUTF8 : NSPACEUTF8)
2668                     : (LOC ? NSPACEL     : NSPACE));
2669             *flagp |= HASWIDTH|SIMPLE;
2670             nextchar();
2671             if (UTF && !PL_utf8_space)
2672                 is_utf8_space((U8*)" ");        /* preload table */
2673             break;
2674         case 'd':
2675             ret = reg_node(UTF ? DIGITUTF8 : DIGIT);
2676             *flagp |= HASWIDTH|SIMPLE;
2677             nextchar();
2678             if (UTF && !PL_utf8_digit)
2679                 is_utf8_digit((U8*)"1");        /* preload table */
2680             break;
2681         case 'D':
2682             ret = reg_node(UTF ? NDIGITUTF8 : NDIGIT);
2683             *flagp |= HASWIDTH|SIMPLE;
2684             nextchar();
2685             if (UTF && !PL_utf8_digit)
2686                 is_utf8_digit((U8*)"1");        /* preload table */
2687             break;
2688         case 'p':
2689         case 'P':
2690             {   /* a lovely hack--pretend we saw [\pX] instead */
2691                 char* oldregxend = PL_regxend;
2692
2693                 if (PL_regcomp_parse[1] == '{') {
2694                     PL_regxend = strchr(PL_regcomp_parse, '}');
2695                     if (!PL_regxend) {
2696                         PL_regcomp_parse += 2;
2697                         PL_regxend = oldregxend;
2698                         vFAIL("Missing right brace on \\p{}");
2699                     }
2700                     PL_regxend++;
2701                 }
2702                 else
2703                     PL_regxend = PL_regcomp_parse + 2;
2704                 PL_regcomp_parse--;
2705
2706                 ret = regclassutf8();
2707
2708                 PL_regxend = oldregxend;
2709                 PL_regcomp_parse--;
2710                 nextchar();
2711                 *flagp |= HASWIDTH|SIMPLE;
2712             }
2713             break;
2714         case 'n':
2715         case 'r':
2716         case 't':
2717         case 'f':
2718         case 'e':
2719         case 'a':
2720         case 'x':
2721         case 'c':
2722         case '0':
2723             goto defchar;
2724         case '1': case '2': case '3': case '4':
2725         case '5': case '6': case '7': case '8': case '9':
2726             {
2727                 I32 num = atoi(PL_regcomp_parse);
2728
2729                 if (num > 9 && num >= PL_regnpar)
2730                     goto defchar;
2731                 else {
2732                     while (isDIGIT(*PL_regcomp_parse))
2733                         PL_regcomp_parse++;
2734
2735                     if (!SIZE_ONLY && num > PL_regcomp_rx->nparens)
2736                         vFAIL("Reference to nonexistent group");
2737                     PL_regsawback = 1;
2738                     ret = reganode(FOLD
2739                                    ? (LOC ? REFFL : REFF)
2740                                    : REF, num);
2741                     *flagp |= HASWIDTH;
2742                     PL_regcomp_parse--;
2743                     nextchar();
2744                 }
2745             }
2746             break;
2747         case '\0':
2748             if (PL_regcomp_parse >= PL_regxend)
2749                 FAIL("Trailing \\");
2750             /* FALL THROUGH */
2751         default:
2752             /* Do not generate `unrecognized' warnings here, we fall
2753                back into the quick-grab loop below */
2754             goto defchar;
2755         }
2756         break;
2757
2758     case '#':
2759         if (PL_regflags & PMf_EXTENDED) {
2760             while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != '\n') PL_regcomp_parse++;
2761             if (PL_regcomp_parse < PL_regxend)
2762                 goto tryagain;
2763         }
2764         /* FALL THROUGH */
2765
2766     default: {
2767             register STRLEN len;
2768             register UV ender;
2769             register char *p;
2770             char *oldp, *s;
2771             STRLEN numlen;
2772
2773             PL_regcomp_parse++;
2774
2775         defchar:
2776             ret = reg_node(FOLD
2777                           ? (LOC ? EXACTFL : EXACTF)
2778                           : EXACT);
2779             s = STRING(ret);
2780             for (len = 0, p = PL_regcomp_parse - 1;
2781               len < 127 && p < PL_regxend;
2782               len++)
2783             {
2784                 oldp = p;
2785
2786                 if (PL_regflags & PMf_EXTENDED)
2787                     p = regwhite(p, PL_regxend);
2788                 switch (*p) {
2789                 case '^':
2790                 case '$':
2791                 case '.':
2792                 case '[':
2793                 case '(':
2794                 case ')':
2795                 case '|':
2796                     goto loopdone;
2797                 case '\\':
2798                     switch (*++p) {
2799                     case 'A':
2800                     case 'G':
2801                     case 'Z':
2802                     case 'z':
2803                     case 'w':
2804                     case 'W':
2805                     case 'b':
2806                     case 'B':
2807                     case 's':
2808                     case 'S':
2809                     case 'd':
2810                     case 'D':
2811                     case 'p':
2812                     case 'P':
2813                         --p;
2814                         goto loopdone;
2815                     case 'n':
2816                         ender = '\n';
2817                         p++;
2818                         break;
2819                     case 'r':
2820                         ender = '\r';
2821                         p++;
2822                         break;
2823                     case 't':
2824                         ender = '\t';
2825                         p++;
2826                         break;
2827                     case 'f':
2828                         ender = '\f';
2829                         p++;
2830                         break;
2831                     case 'e':
2832 #ifdef ASCIIish
2833                           ender = '\033';
2834 #else
2835                           ender = '\047';
2836 #endif
2837                         p++;
2838                         break;
2839                     case 'a':
2840 #ifdef ASCIIish
2841                           ender = '\007';
2842 #else
2843                           ender = '\057';
2844 #endif
2845                         p++;
2846                         break;
2847                     case 'x':
2848                         if (*++p == '{') {
2849                             char* e = strchr(p, '}');
2850          
2851                             if (!e) {
2852                                 PL_regcomp_parse = p + 1;
2853                                 vFAIL("Missing right brace on \\x{}");
2854                             }
2855                             else if (UTF) {
2856                                 numlen = 1;     /* allow underscores */
2857                                 ender = (UV)scan_hex(p + 1, e - p - 1, &numlen);
2858                                 /* numlen is generous */
2859                                 if (numlen + len >= 127) {
2860                                     p--;
2861                                     goto loopdone;
2862                                 }
2863                                 p = e + 1;
2864                             }
2865                             else
2866                             {
2867                                 PL_regcomp_parse = e + 1;
2868                                 vFAIL("Can't use \\x{} without 'use utf8' declaration");
2869                             }
2870
2871                         }
2872                         else {
2873                             numlen = 0;         /* disallow underscores */
2874                             ender = (UV)scan_hex(p, 2, &numlen);
2875                             p += numlen;
2876                         }
2877                         break;
2878                     case 'c':
2879                         p++;
2880                         ender = UCHARAT(p++);
2881                         ender = toCTRL(ender);
2882                         break;
2883                     case '0': case '1': case '2': case '3':case '4':
2884                     case '5': case '6': case '7': case '8':case '9':
2885                         if (*p == '0' ||
2886                           (isDIGIT(p[1]) && atoi(p) >= PL_regnpar) ) {
2887                             numlen = 0;         /* disallow underscores */
2888                             ender = (UV)scan_oct(p, 3, &numlen);
2889                             p += numlen;
2890                         }
2891                         else {
2892                             --p;
2893                             goto loopdone;
2894                         }
2895                         break;
2896                     case '\0':
2897                         if (p >= PL_regxend)
2898                             FAIL("Trailing \\");
2899                         /* FALL THROUGH */
2900                     default:
2901                         if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(*p))
2902                             vWARN2(p +1, "Unrecognized escape \\%c passed through", *p);
2903                         goto normal_default;
2904                     }
2905                     break;
2906                 default:
2907                   normal_default:
2908                     if ((*p & 0xc0) == 0xc0 && UTF) {
2909                         ender = utf8_to_uv((U8*)p, PL_regxend - p,
2910                                                &numlen, 0);
2911                         p += numlen;
2912                     }
2913                     else
2914                         ender = *p++;
2915                     break;
2916                 }
2917                 if (PL_regflags & PMf_EXTENDED)
2918                     p = regwhite(p, PL_regxend);
2919                 if (UTF && FOLD) {
2920                     if (LOC)
2921                         ender = toLOWER_LC_uni(ender);
2922                     else
2923                         ender = toLOWER_uni(ender);
2924                 }
2925                 if (ISMULT2(p)) { /* Back off on ?+*. */
2926                     if (len)
2927                         p = oldp;
2928                     else if (ender >= 0x80 && UTF) {
2929                         reguni(ender, s, &numlen);
2930                         s += numlen;
2931                         len += numlen;
2932                     }
2933                     else {
2934                         len++;
2935                         REGC(ender, s++);
2936                     }
2937                     break;
2938                 }
2939                 if (ender >= 0x80 && UTF) {
2940                     reguni(ender, s, &numlen);
2941                     s += numlen;
2942                     len += numlen - 1;
2943                 }
2944                 else
2945                     REGC(ender, s++);
2946             }
2947         loopdone:
2948             PL_regcomp_parse = p - 1;
2949             nextchar();
2950             if (len < 0)
2951                 vFAIL("Internal disaster");
2952             if (len > 0)
2953                 *flagp |= HASWIDTH;
2954             if (len == 1)
2955                 *flagp |= SIMPLE;
2956             if (!SIZE_ONLY)
2957                 STR_LEN(ret) = len;
2958             if (SIZE_ONLY)
2959                 PL_regsize += STR_SZ(len);
2960             else
2961                 PL_regcode += STR_SZ(len);
2962         }
2963         break;
2964     }
2965
2966     return(ret);
2967 }
2968
2969 STATIC char *
2970 S_regwhite(pTHX_ char *p, char *e)
2971 {
2972     while (p < e) {
2973         if (isSPACE(*p))
2974             ++p;
2975         else if (*p == '#') {
2976             do {
2977                 p++;
2978             } while (p < e && *p != '\n');
2979         }
2980         else
2981             break;
2982     }
2983     return p;
2984 }
2985
2986 /* Parse POSIX character classes: [[:foo:]], [[=foo=]], [[.foo.]].
2987    Character classes ([:foo:]) can also be negated ([:^foo:]).
2988    Returns a named class id (ANYOF_XXX) if successful, -1 otherwise.
2989    Equivalence classes ([=foo=]) and composites ([.foo.]) are parsed,
2990    but trigger warnings because they are currently unimplemented. */
2991 STATIC I32
2992 S_regpposixcc(pTHX_ I32 value)
2993 {
2994     dTHR;
2995     char *posixcc = 0;
2996     I32 namedclass = OOB_NAMEDCLASS;
2997
2998     if (value == '[' && PL_regcomp_parse + 1 < PL_regxend &&
2999         /* I smell either [: or [= or [. -- POSIX has been here, right? */
3000         (*PL_regcomp_parse == ':' ||
3001          *PL_regcomp_parse == '=' ||
3002          *PL_regcomp_parse == '.')) {
3003         char  c = *PL_regcomp_parse;
3004         char* s = PL_regcomp_parse++;
3005             
3006         while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != c)
3007             PL_regcomp_parse++;
3008         if (PL_regcomp_parse == PL_regxend)
3009             /* Grandfather lone [:, [=, [. */
3010             PL_regcomp_parse = s;
3011         else {
3012             char* t = PL_regcomp_parse++; /* skip over the c */
3013
3014             if (*PL_regcomp_parse == ']') {
3015                 PL_regcomp_parse++; /* skip over the ending ] */
3016                 posixcc = s + 1;
3017                 if (*s == ':') {
3018                     I32 complement = *posixcc == '^' ? *posixcc++ : 0;
3019                     I32 skip = 5; /* the most common skip */
3020
3021                     switch (*posixcc) {
3022                     case 'a':
3023                         if (strnEQ(posixcc, "alnum", 5))
3024                             namedclass =
3025                                 complement ? ANYOF_NALNUMC : ANYOF_ALNUMC;
3026                         else if (strnEQ(posixcc, "alpha", 5))
3027                             namedclass =
3028                                 complement ? ANYOF_NALPHA : ANYOF_ALPHA;
3029                         else if (strnEQ(posixcc, "ascii", 5))
3030                             namedclass =
3031                                 complement ? ANYOF_NASCII : ANYOF_ASCII;
3032                         break;
3033                     case 'b':
3034                         if (strnEQ(posixcc, "blank", 5))
3035                             namedclass =
3036                                 complement ? ANYOF_NBLANK : ANYOF_BLANK;
3037                         break;
3038                     case 'c':
3039                         if (strnEQ(posixcc, "cntrl", 5))
3040                             namedclass =
3041                                 complement ? ANYOF_NCNTRL : ANYOF_CNTRL;
3042                         break;
3043                     case 'd':
3044                         if (strnEQ(posixcc, "digit", 5))
3045                             namedclass =
3046                                 complement ? ANYOF_NDIGIT : ANYOF_DIGIT;
3047                         break;
3048                     case 'g':
3049                         if (strnEQ(posixcc, "graph", 5))
3050                             namedclass =
3051                                 complement ? ANYOF_NGRAPH : ANYOF_GRAPH;
3052                         break;
3053                     case 'l':
3054                         if (strnEQ(posixcc, "lower", 5))
3055                             namedclass =
3056                                 complement ? ANYOF_NLOWER : ANYOF_LOWER;
3057                         break;
3058                     case 'p':
3059                         if (strnEQ(posixcc, "print", 5))
3060                             namedclass =
3061                                 complement ? ANYOF_NPRINT : ANYOF_PRINT;
3062                         else if (strnEQ(posixcc, "punct", 5))
3063                             namedclass =
3064                                 complement ? ANYOF_NPUNCT : ANYOF_PUNCT;
3065                         break;
3066                     case 's':
3067                         if (strnEQ(posixcc, "space", 5))
3068                             namedclass =
3069                                 complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
3070                         break;
3071                     case 'u':
3072                         if (strnEQ(posixcc, "upper", 5))
3073                             namedclass =
3074                                 complement ? ANYOF_NUPPER : ANYOF_UPPER;
3075                         break;
3076                     case 'w': /* this is not POSIX, this is the Perl \w */
3077                         if (strnEQ(posixcc, "word", 4)) {
3078                             namedclass =
3079                                 complement ? ANYOF_NALNUM : ANYOF_ALNUM;
3080                             skip = 4;
3081                         }
3082                         break;
3083                     case 'x':
3084                         if (strnEQ(posixcc, "xdigit", 6)) {
3085                             namedclass =
3086                                 complement ? ANYOF_NXDIGIT : ANYOF_XDIGIT;
3087                             skip = 6;
3088                         }
3089                         break;
3090                     }
3091                     if (namedclass == OOB_NAMEDCLASS ||
3092                         posixcc[skip] != ':' ||
3093                         posixcc[skip+1] != ']')
3094                     {
3095                         Simple_vFAIL3("POSIX class [:%.*s:] unknown",
3096                                       t - s - 1, s + 1);
3097                     }
3098                 } else if (!SIZE_ONLY) {
3099                     /* [[=foo=]] and [[.foo.]] are still future. */
3100
3101                     /* adjust PL_regcomp_parse so the warning shows after
3102                        the class closes */
3103                     while (*PL_regcomp_parse && *PL_regcomp_parse != ']')
3104                         PL_regcomp_parse++;
3105                     Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
3106                 }
3107             } else {
3108                 /* Maternal grandfather:
3109                  * "[:" ending in ":" but not in ":]" */
3110                 PL_regcomp_parse = s;
3111             }
3112         }
3113     }
3114
3115     return namedclass;
3116 }
3117
3118 STATIC void
3119 S_checkposixcc(pTHX)
3120 {
3121     if (!SIZE_ONLY && ckWARN(WARN_REGEXP) &&
3122         (*PL_regcomp_parse == ':' ||
3123          *PL_regcomp_parse == '=' ||
3124          *PL_regcomp_parse == '.')) {
3125         char *s = PL_regcomp_parse;
3126         char  c = *s++;
3127
3128         while(*s && isALNUM(*s))
3129             s++;
3130         if (*s && c == *s && s[1] == ']') {
3131             vWARN3(s+2, "POSIX syntax [%c %c] belongs inside character classes", c, c);
3132
3133             /* [[=foo=]] and [[.foo.]] are still future. */
3134             if (c == '=' || c == '.')
3135             {
3136                 /* adjust PL_regcomp_parse so the error shows after
3137                    the class closes */
3138                 while (*PL_regcomp_parse && *PL_regcomp_parse++ != ']')
3139                     ;
3140                 Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
3141             }
3142         }
3143     }
3144 }
3145
3146 STATIC regnode *
3147 S_regclass(pTHX)
3148 {
3149     dTHR;
3150     register U32 value;
3151     register I32 lastvalue = OOB_CHAR8;
3152     register I32 range = 0;
3153     register regnode *ret;
3154     STRLEN numlen;
3155     I32 namedclass;
3156     char *rangebegin;
3157     bool need_class = 0;
3158
3159     ret = reg_node(ANYOF);
3160     if (SIZE_ONLY)
3161         PL_regsize += ANYOF_SKIP;
3162     else {
3163         ret->flags = 0;
3164         ANYOF_BITMAP_ZERO(ret);
3165         PL_regcode += ANYOF_SKIP;
3166         if (FOLD)
3167             ANYOF_FLAGS(ret) |= ANYOF_FOLD;
3168         if (LOC)
3169             ANYOF_FLAGS(ret) |= ANYOF_LOCALE;
3170     }
3171     if (*PL_regcomp_parse == '^') {     /* Complement of range. */
3172         PL_regnaughty++;
3173         PL_regcomp_parse++;
3174         if (!SIZE_ONLY)
3175             ANYOF_FLAGS(ret) |= ANYOF_INVERT;
3176     }
3177
3178     if (!SIZE_ONLY && ckWARN(WARN_REGEXP))
3179         checkposixcc();
3180
3181     if (*PL_regcomp_parse == ']' || *PL_regcomp_parse == '-')
3182         goto skipcond;          /* allow 1st char to be ] or - */
3183     while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != ']') {
3184        skipcond:
3185         namedclass = OOB_NAMEDCLASS;
3186         if (!range)
3187             rangebegin = PL_regcomp_parse;
3188         value = UCHARAT(PL_regcomp_parse++);
3189         if (value == '[')
3190             namedclass = regpposixcc(value);
3191         else if (value == '\\') {
3192             value = UCHARAT(PL_regcomp_parse++);
3193             /* Some compilers cannot handle switching on 64-bit integer
3194              * values, therefore the 'value' cannot be an UV. --jhi */
3195             switch (value) {
3196             case 'w':   namedclass = ANYOF_ALNUM;       break;
3197             case 'W':   namedclass = ANYOF_NALNUM;      break;
3198             case 's':   namedclass = ANYOF_SPACE;       break;
3199             case 'S':   namedclass = ANYOF_NSPACE;      break;
3200             case 'd':   namedclass = ANYOF_DIGIT;       break;
3201             case 'D':   namedclass = ANYOF_NDIGIT;      break;
3202             case 'n':   value = '\n';                   break;
3203             case 'r':   value = '\r';                   break;
3204             case 't':   value = '\t';                   break;
3205             case 'f':   value = '\f';                   break;
3206             case 'b':   value = '\b';                   break;
3207 #ifdef ASCIIish
3208             case 'e':   value = '\033';                 break;
3209             case 'a':   value = '\007';                 break;
3210 #else
3211             case 'e':   value = '\047';                 break;
3212             case 'a':   value = '\057';                 break;
3213 #endif
3214             case 'x':
3215                 numlen = 0;             /* disallow underscores */
3216                 value = (UV)scan_hex(PL_regcomp_parse, 2, &numlen);
3217                 PL_regcomp_parse += numlen;
3218                 break;
3219             case 'c':
3220                 value = UCHARAT(PL_regcomp_parse++);
3221                 value = toCTRL(value);
3222                 break;
3223             case '0': case '1': case '2': case '3': case '4':
3224             case '5': case '6': case '7': case '8': case '9':
3225                 numlen = 0;             /* disallow underscores */
3226                 value = (UV)scan_oct(--PL_regcomp_parse, 3, &numlen);
3227                 PL_regcomp_parse += numlen;
3228                 break;
3229             default:
3230                 if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
3231
3232                     vWARN2(PL_regcomp_parse, "Unrecognized escape \\%c in character class passed through", (int)value);
3233                 break;
3234             }
3235         }
3236         if (namedclass > OOB_NAMEDCLASS) {
3237             if (!need_class && !SIZE_ONLY)
3238                 ANYOF_CLASS_ZERO(ret);
3239             need_class = 1;
3240             if (range) { /* a-\d, a-[:digit:] */
3241                 if (!SIZE_ONLY) {
3242                     if (ckWARN(WARN_REGEXP))
3243                         vWARN4(PL_regcomp_parse,
3244                                "False [] range \"%*.*s\"",
3245                                PL_regcomp_parse - rangebegin,
3246                                PL_regcomp_parse - rangebegin,
3247                                rangebegin);
3248                     ANYOF_BITMAP_SET(ret, lastvalue);
3249                     ANYOF_BITMAP_SET(ret, '-');
3250                 }
3251                 range = 0; /* this is not a true range */
3252             }
3253             if (!SIZE_ONLY) {
3254                 switch (namedclass) {
3255                 case ANYOF_ALNUM:
3256                     if (LOC)
3257                         ANYOF_CLASS_SET(ret, ANYOF_ALNUM);
3258                     else {
3259                         for (value = 0; value < 256; value++)
3260                             if (isALNUM(value))
3261                                 ANYOF_BITMAP_SET(ret, value);
3262                     }
3263                     break;
3264                 case ANYOF_NALNUM:
3265                     if (LOC)
3266                         ANYOF_CLASS_SET(ret, ANYOF_NALNUM);
3267                     else {
3268                         for (value = 0; value < 256; value++)
3269                             if (!isALNUM(value))
3270                                 ANYOF_BITMAP_SET(ret, value);
3271                     }
3272                     break;
3273                 case ANYOF_SPACE:
3274                     if (LOC)
3275                         ANYOF_CLASS_SET(ret, ANYOF_SPACE);
3276                     else {
3277                         for (value = 0; value < 256; value++)
3278                             if (isSPACE(value))
3279                                 ANYOF_BITMAP_SET(ret, value);
3280                     }
3281                     break;
3282                 case ANYOF_NSPACE:
3283                     if (LOC)
3284                         ANYOF_CLASS_SET(ret, ANYOF_NSPACE);
3285                     else {
3286                         for (value = 0; value < 256; value++)
3287                             if (!isSPACE(value))
3288                                 ANYOF_BITMAP_SET(ret, value);
3289                     }
3290                     break;
3291                 case ANYOF_DIGIT:
3292                     if (LOC)
3293                         ANYOF_CLASS_SET(ret, ANYOF_DIGIT);
3294                     else {
3295                         for (value = '0'; value <= '9'; value++)
3296                             ANYOF_BITMAP_SET(ret, value);
3297                     }
3298                     break;
3299                 case ANYOF_NDIGIT:
3300                     if (LOC)
3301                         ANYOF_CLASS_SET(ret, ANYOF_NDIGIT);
3302                     else {
3303                         for (value = 0; value < '0'; value++)
3304                             ANYOF_BITMAP_SET(ret, value);
3305                         for (value = '9' + 1; value < 256; value++)
3306                             ANYOF_BITMAP_SET(ret, value);
3307                     }
3308                     break;
3309                 case ANYOF_NALNUMC:
3310                     if (LOC)
3311                         ANYOF_CLASS_SET(ret, ANYOF_NALNUMC);
3312                     else {
3313                         for (value = 0; value < 256; value++)
3314                             if (!isALNUMC(value))
3315                                 ANYOF_BITMAP_SET(ret, value);
3316                     }
3317                     break;
3318                 case ANYOF_ALNUMC:
3319                     if (LOC)
3320                         ANYOF_CLASS_SET(ret, ANYOF_ALNUMC);
3321                     else {
3322                         for (value = 0; value < 256; value++)
3323                             if (isALNUMC(value))
3324                                 ANYOF_BITMAP_SET(ret, value);
3325                     }
3326                     break;
3327                 case ANYOF_ALPHA:
3328                     if (LOC)
3329                         ANYOF_CLASS_SET(ret, ANYOF_ALPHA);
3330                     else {
3331                         for (value = 0; value < 256; value++)
3332                             if (isALPHA(value))
3333                                 ANYOF_BITMAP_SET(ret, value);
3334                     }
3335                     break;
3336                 case ANYOF_NALPHA:
3337                     if (LOC)
3338                         ANYOF_CLASS_SET(ret, ANYOF_NALPHA);
3339                     else {
3340                         for (value = 0; value < 256; value++)
3341                             if (!isALPHA(value))
3342                                 ANYOF_BITMAP_SET(ret, value);
3343                     }
3344                     break;
3345                 case ANYOF_ASCII:
3346                     if (LOC)
3347                         ANYOF_CLASS_SET(ret, ANYOF_ASCII);
3348                     else {
3349 #ifdef ASCIIish
3350                         for (value = 0; value < 128; value++)
3351                             ANYOF_BITMAP_SET(ret, value);
3352 #else  /* EBCDIC */
3353                         for (value = 0; value < 256; value++)
3354                             if (isASCII(value))
3355                                 ANYOF_BITMAP_SET(ret, value);
3356 #endif /* EBCDIC */
3357                     }
3358                     break;
3359                 case ANYOF_NASCII:
3360                     if (LOC)
3361                         ANYOF_CLASS_SET(ret, ANYOF_NASCII);
3362                     else {
3363 #ifdef ASCIIish
3364                         for (value = 128; value < 256; value++)
3365                             ANYOF_BITMAP_SET(ret, value);
3366 #else  /* EBCDIC */
3367                         for (value = 0; value < 256; value++)
3368                             if (!isASCII(value))
3369                                 ANYOF_BITMAP_SET(ret, value);
3370 #endif /* EBCDIC */
3371                     }
3372                     break;
3373                 case ANYOF_BLANK:
3374                     if (LOC)
3375                         ANYOF_CLASS_SET(ret, ANYOF_BLANK);
3376                     else {
3377                         for (value = 0; value < 256; value++)
3378                             if (isBLANK(value))
3379                                 ANYOF_BITMAP_SET(ret, value);
3380                     }
3381                     break;
3382                 case ANYOF_NBLANK:
3383                     if (LOC)
3384                         ANYOF_CLASS_SET(ret, ANYOF_NBLANK);
3385                     else {
3386                         for (value = 0; value < 256; value++)
3387                             if (!isBLANK(value))
3388                                 ANYOF_BITMAP_SET(ret, value);
3389                     }
3390                     break;
3391                 case ANYOF_CNTRL:
3392                     if (LOC)
3393                         ANYOF_CLASS_SET(ret, ANYOF_CNTRL);
3394                     else {
3395                         for (value = 0; value < 256; value++)
3396                             if (isCNTRL(value))
3397                                 ANYOF_BITMAP_SET(ret, value);
3398                     }
3399                     lastvalue = OOB_CHAR8;
3400                     break;
3401                 case ANYOF_NCNTRL:
3402                     if (LOC)
3403                         ANYOF_CLASS_SET(ret, ANYOF_NCNTRL);
3404                     else {
3405                         for (value = 0; value < 256; value++)
3406                             if (!isCNTRL(value))
3407                                 ANYOF_BITMAP_SET(ret, value);
3408                     }
3409                     break;
3410                 case ANYOF_GRAPH:
3411                     if (LOC)
3412                         ANYOF_CLASS_SET(ret, ANYOF_GRAPH);
3413                     else {
3414                         for (value = 0; value < 256; value++)
3415                             if (isGRAPH(value))
3416                                 ANYOF_BITMAP_SET(ret, value);
3417                     }
3418                     break;
3419                 case ANYOF_NGRAPH:
3420                     if (LOC)
3421                         ANYOF_CLASS_SET(ret, ANYOF_NGRAPH);
3422                     else {
3423                         for (value = 0; value < 256; value++)
3424                             if (!isGRAPH(value))
3425                                 ANYOF_BITMAP_SET(ret, value);
3426                     }
3427                     break;
3428                 case ANYOF_LOWER:
3429                     if (LOC)
3430                         ANYOF_CLASS_SET(ret, ANYOF_LOWER);
3431                     else {
3432                         for (value = 0; value < 256; value++)
3433                             if (isLOWER(value))
3434                                 ANYOF_BITMAP_SET(ret, value);
3435                     }
3436                     break;
3437                 case ANYOF_NLOWER:
3438                     if (LOC)
3439                         ANYOF_CLASS_SET(ret, ANYOF_NLOWER);
3440                     else {
3441                         for (value = 0; value < 256; value++)
3442                             if (!isLOWER(value))
3443                                 ANYOF_BITMAP_SET(ret, value);
3444                     }
3445                     break;
3446                 case ANYOF_PRINT:
3447                     if (LOC)
3448                         ANYOF_CLASS_SET(ret, ANYOF_PRINT);
3449                     else {
3450                         for (value = 0; value < 256; value++)
3451                             if (isPRINT(value))
3452                                 ANYOF_BITMAP_SET(ret, value);
3453                     }
3454                     break;
3455                 case ANYOF_NPRINT:
3456                     if (LOC)
3457                         ANYOF_CLASS_SET(ret, ANYOF_NPRINT);
3458                     else {
3459                         for (value = 0; value < 256; value++)
3460                             if (!isPRINT(value))
3461                                 ANYOF_BITMAP_SET(ret, value);
3462                     }
3463                     break;
3464                 case ANYOF_PSXSPC:
3465                     if (LOC)
3466                         ANYOF_CLASS_SET(ret, ANYOF_PSXSPC);
3467                     else {
3468                         for (value = 0; value < 256; value++)
3469                             if (isPSXSPC(value))
3470                                 ANYOF_BITMAP_SET(ret, value);
3471                     }
3472                     break;
3473                 case ANYOF_NPSXSPC:
3474                     if (LOC)
3475                         ANYOF_CLASS_SET(ret, ANYOF_NPSXSPC);
3476                     else {
3477                         for (value = 0; value < 256; value++)
3478                             if (!isPSXSPC(value))
3479                                 ANYOF_BITMAP_SET(ret, value);
3480                     }
3481                     break;
3482                 case ANYOF_PUNCT:
3483                     if (LOC)
3484                         ANYOF_CLASS_SET(ret, ANYOF_PUNCT);
3485                     else {
3486                         for (value = 0; value < 256; value++)
3487                             if (isPUNCT(value))
3488                                 ANYOF_BITMAP_SET(ret, value);
3489                     }
3490                     break;
3491                 case ANYOF_NPUNCT:
3492                     if (LOC)
3493                         ANYOF_CLASS_SET(ret, ANYOF_NPUNCT);
3494                     else {
3495                         for (value = 0; value < 256; value++)
3496                             if (!isPUNCT(value))
3497                                 ANYOF_BITMAP_SET(ret, value);
3498                     }
3499                     break;
3500                 case ANYOF_UPPER:
3501                     if (LOC)
3502                         ANYOF_CLASS_SET(ret, ANYOF_UPPER);
3503                     else {
3504                         for (value = 0; value < 256; value++)
3505                             if (isUPPER(value))
3506                                 ANYOF_BITMAP_SET(ret, value);
3507                     }
3508                     break;
3509                 case ANYOF_NUPPER:
3510                     if (LOC)
3511                         ANYOF_CLASS_SET(ret, ANYOF_NUPPER);
3512                     else {
3513                         for (value = 0; value < 256; value++)
3514                             if (!isUPPER(value))
3515                                 ANYOF_BITMAP_SET(ret, value);
3516                     }
3517                     break;
3518                 case ANYOF_XDIGIT:
3519                     if (LOC)
3520                         ANYOF_CLASS_SET(ret, ANYOF_XDIGIT);
3521                     else {
3522                         for (value = 0; value < 256; value++)
3523                             if (isXDIGIT(value))
3524                                 ANYOF_BITMAP_SET(ret, value);
3525                     }
3526                     break;
3527                 case ANYOF_NXDIGIT:
3528                     if (LOC)
3529                         ANYOF_CLASS_SET(ret, ANYOF_NXDIGIT);
3530                     else {
3531                         for (value = 0; value < 256; value++)
3532                             if (!isXDIGIT(value))
3533                                 ANYOF_BITMAP_SET(ret, value);
3534                     }
3535                     break;
3536                 default:
3537                     vFAIL("Invalid [::] class");
3538                     break;
3539                 }
3540                 if (LOC)
3541                     ANYOF_FLAGS(ret) |= ANYOF_CLASS;
3542                 continue;
3543             }
3544         }
3545         if (range) {
3546             if (lastvalue > value) /* b-a */ {
3547                 Simple_vFAIL4("Invalid [] range \"%*.*s\"",
3548                               PL_regcomp_parse - rangebegin,
3549                               PL_regcomp_parse - rangebegin,
3550                               rangebegin);
3551             }
3552             range = 0;
3553         }
3554         else {
3555             lastvalue = value;
3556             if (*PL_regcomp_parse == '-' && PL_regcomp_parse+1 < PL_regxend &&
3557                 PL_regcomp_parse[1] != ']') {
3558                 PL_regcomp_parse++;
3559                 if (namedclass > OOB_NAMEDCLASS) { /* \w-, [:word:]- */
3560                     if (ckWARN(WARN_REGEXP))
3561                         vWARN4(PL_regcomp_parse,
3562                                "False [] range \"%*.*s\"",
3563                                PL_regcomp_parse - rangebegin,
3564                                PL_regcomp_parse - rangebegin,
3565                                rangebegin);
3566                     if (!SIZE_ONLY)
3567                         ANYOF_BITMAP_SET(ret, '-');
3568                 } else
3569                     range = 1;
3570                 continue;       /* do it next time */
3571             }
3572         }
3573         /* now is the next time */
3574         if (!SIZE_ONLY) {
3575 #ifndef ASCIIish /* EBCDIC, for example. */
3576             if ((isLOWER(lastvalue) && isLOWER(value)) ||
3577                 (isUPPER(lastvalue) && isUPPER(value)))
3578             {
3579                 I32 i;
3580                 if (isLOWER(lastvalue)) {
3581                     for (i = lastvalue; i <= value; i++)
3582                         if (isLOWER(i))
3583                             ANYOF_BITMAP_SET(ret, i);
3584                 } else {
3585                     for (i = lastvalue; i <= value; i++)
3586                         if (isUPPER(i))
3587                             ANYOF_BITMAP_SET(ret, i);
3588                 }
3589             }
3590             else
3591 #endif
3592                 for ( ; lastvalue <= value; lastvalue++)
3593                     ANYOF_BITMAP_SET(ret, lastvalue);
3594         }
3595         range = 0;
3596     }
3597     if (need_class) {
3598         if (SIZE_ONLY)
3599             PL_regsize += ANYOF_CLASS_ADD_SKIP;
3600         else
3601             PL_regcode += ANYOF_CLASS_ADD_SKIP;
3602     }
3603     /* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
3604     if (!SIZE_ONLY &&
3605         (ANYOF_FLAGS(ret) & (ANYOF_FLAGS_ALL ^ ANYOF_INVERT)) == ANYOF_FOLD) {
3606         for (value = 0; value < 256; ++value) {
3607             if (ANYOF_BITMAP_TEST(ret, value)) {
3608                 I32 cf = PL_fold[value];
3609                 ANYOF_BITMAP_SET(ret, cf);
3610             }
3611         }
3612         ANYOF_FLAGS(ret) &= ~ANYOF_FOLD;
3613     }
3614     /* optimize inverted simple patterns (e.g. [^a-z]) */
3615     if (!SIZE_ONLY && (ANYOF_FLAGS(ret) & ANYOF_FLAGS_ALL) == ANYOF_INVERT) {
3616         for (value = 0; value < ANYOF_BITMAP_SIZE; ++value)
3617             ANYOF_BITMAP(ret)[value] ^= ANYOF_FLAGS_ALL;
3618         ANYOF_FLAGS(ret) = 0;
3619     }
3620     return ret;
3621 }
3622
3623 STATIC regnode *
3624 S_regclassutf8(pTHX)
3625 {
3626     dTHR;
3627     register char *e;
3628     register U32 value;
3629     register U32 lastvalue = OOB_UTF8;
3630     register I32 range = 0;
3631     register regnode *ret;
3632     STRLEN numlen;
3633     I32 n;
3634     SV *listsv;
3635     U8 flags = 0;
3636     I32 namedclass;
3637     char *rangebegin;
3638
3639     if (*PL_regcomp_parse == '^') {     /* Complement of range. */
3640         PL_regnaughty++;
3641         PL_regcomp_parse++;
3642         if (!SIZE_ONLY)
3643             flags |= ANYOF_INVERT;
3644     }
3645     if (!SIZE_ONLY) {
3646         if (FOLD)
3647             flags |= ANYOF_FOLD;
3648         if (LOC)
3649             flags |= ANYOF_LOCALE;
3650         listsv = newSVpvn("# comment\n",10);
3651     }
3652
3653     if (!SIZE_ONLY && ckWARN(WARN_REGEXP))
3654         checkposixcc();
3655
3656     if (*PL_regcomp_parse == ']' || *PL_regcomp_parse == '-')
3657         goto skipcond;          /* allow 1st char to be ] or - */
3658
3659     while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != ']') {
3660        skipcond:
3661         namedclass = OOB_NAMEDCLASS;
3662         if (!range)
3663             rangebegin = PL_regcomp_parse;
3664         value = utf8_to_uv((U8*)PL_regcomp_parse,
3665                                PL_regxend - PL_regcomp_parse,
3666                                &numlen, 0);
3667         PL_regcomp_parse += numlen;
3668         if (value == '[')
3669             namedclass = regpposixcc(value);
3670         else if (value == '\\') {
3671             value = (U32)utf8_to_uv((U8*)PL_regcomp_parse,
3672                                         PL_regxend - PL_regcomp_parse,
3673                                         &numlen, 0);
3674             PL_regcomp_parse += numlen;
3675             /* Some compilers cannot handle switching on 64-bit integer
3676              * values, therefore value cannot be an UV.  Yes, this will
3677              * be a problem later if we want switch on Unicode.  --jhi */
3678             switch (value) {
3679             case 'w':           namedclass = ANYOF_ALNUM;               break;
3680             case 'W':           namedclass = ANYOF_NALNUM;              break;
3681             case 's':           namedclass = ANYOF_SPACE;               break;
3682             case 'S':           namedclass = ANYOF_NSPACE;              break;
3683             case 'd':           namedclass = ANYOF_DIGIT;               break;
3684             case 'D':           namedclass = ANYOF_NDIGIT;              break;
3685             case 'p':
3686             case 'P':
3687                 if (*PL_regcomp_parse == '{') {
3688                     e = strchr(PL_regcomp_parse++, '}');
3689                     if (!e)
3690                         vFAIL("Missing right brace on \\p{}");
3691                     n = e - PL_regcomp_parse;
3692                 }
3693                 else {
3694                     e = PL_regcomp_parse;
3695                     n = 1;
3696                 }
3697                 if (!SIZE_ONLY) {
3698                     if (value == 'p')
3699                         Perl_sv_catpvf(aTHX_ listsv,
3700                                        "+utf8::%.*s\n", (int)n, PL_regcomp_parse);
3701                     else
3702                         Perl_sv_catpvf(aTHX_ listsv,
3703                                        "!utf8::%.*s\n", (int)n, PL_regcomp_parse);
3704                 }
3705                 PL_regcomp_parse = e + 1;
3706                 lastvalue = OOB_UTF8;
3707                 continue;
3708             case 'n':           value = '\n';           break;
3709             case 'r':           value = '\r';           break;
3710             case 't':           value = '\t';           break;
3711             case 'f':           value = '\f';           break;
3712             case 'b':           value = '\b';           break;
3713 #ifdef ASCIIish
3714             case 'e':           value = '\033';         break;
3715             case 'a':           value = '\007';         break;
3716 #else
3717             case 'e':           value = '\047';         break;
3718             case 'a':           value = '\057';         break;
3719 #endif
3720             case 'x':
3721                 if (*PL_regcomp_parse == '{') {
3722                     e = strchr(PL_regcomp_parse++, '}');
3723                     if (!e) 
3724                         vFAIL("Missing right brace on \\x{}");
3725                     numlen = 1;         /* allow underscores */
3726                     value = (UV)scan_hex(PL_regcomp_parse,
3727                                      e - PL_regcomp_parse,
3728                                      &numlen);
3729                     PL_regcomp_parse = e + 1;
3730                 }
3731                 else {
3732                     numlen = 0;         /* disallow underscores */
3733                     value = (UV)scan_hex(PL_regcomp_parse, 2, &numlen);
3734                     PL_regcomp_parse += numlen;
3735                 }
3736                 break;
3737             case 'c':
3738                 value = UCHARAT(PL_regcomp_parse++);
3739                 value = toCTRL(value);
3740                 break;
3741             case '0': case '1': case '2': case '3': case '4':
3742             case '5': case '6': case '7': case '8': case '9':
3743                 numlen = 0;             /* disallow underscores */
3744                 value = (UV)scan_oct(--PL_regcomp_parse, 3, &numlen);
3745                 PL_regcomp_parse += numlen;
3746                 break;
3747             default:
3748                 if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
3749                     vWARN2(PL_regcomp_parse,
3750                            "Unrecognized escape \\%c in character class passed through",
3751                            (int)value);
3752                 break;
3753             }
3754         }
3755         if (namedclass > OOB_NAMEDCLASS) {
3756             if (range) { /* a-\d, a-[:digit:] */
3757                 if (!SIZE_ONLY) {
3758                     if (ckWARN(WARN_REGEXP))
3759                         vWARN4(PL_regcomp_parse,
3760                                "False [] range \"%*.*s\"",
3761                                PL_regcomp_parse - rangebegin,
3762                                PL_regcomp_parse - rangebegin,
3763                                rangebegin);
3764                     Perl_sv_catpvf(aTHX_ listsv,
3765                                    /* 0x002D is Unicode for '-' */
3766                                    "%04"UVxf"\n002D\n", (UV)lastvalue);
3767                 }
3768                 range = 0;
3769             }
3770             if (!SIZE_ONLY) {
3771                 switch (namedclass) {
3772                 case ANYOF_ALNUM:
3773                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsWord\n");    break;
3774                 case ANYOF_NALNUM:
3775                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsWord\n");    break;
3776                 case ANYOF_ALNUMC:
3777                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsAlnum\n");   break;
3778                 case ANYOF_NALNUMC:
3779                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsAlnum\n");   break;
3780                 case ANYOF_ALPHA:
3781                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsAlpha\n");   break;
3782                 case ANYOF_NALPHA:
3783                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsAlpha\n");   break;
3784                 case ANYOF_ASCII:
3785                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsASCII\n");   break;
3786                 case ANYOF_NASCII:
3787                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsASCII\n");   break;
3788                 case ANYOF_CNTRL:
3789                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsCntrl\n");   break;
3790                 case ANYOF_NCNTRL:
3791                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsCntrl\n");   break;
3792                 case ANYOF_GRAPH:
3793                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsGraph\n");   break;
3794                 case ANYOF_NGRAPH:
3795                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsGraph\n");   break;
3796                 case ANYOF_DIGIT:
3797                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsDigit\n");   break;
3798                 case ANYOF_NDIGIT:
3799                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsDigit\n");   break;
3800                 case ANYOF_LOWER:
3801                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsLower\n");   break;
3802                 case ANYOF_NLOWER:
3803                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsLower\n");   break;
3804                 case ANYOF_PRINT:
3805                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsPrint\n");   break;
3806                 case ANYOF_NPRINT:
3807                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsPrint\n");   break;
3808                 case ANYOF_PUNCT:
3809                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsPunct\n");   break;
3810                 case ANYOF_NPUNCT:
3811                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsPunct\n");   break;
3812                 case ANYOF_SPACE:
3813                 case ANYOF_PSXSPC:
3814                 case ANYOF_BLANK:
3815                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsSpace\n");   break;
3816                 case ANYOF_NSPACE:
3817                 case ANYOF_NPSXSPC:
3818                 case ANYOF_NBLANK:
3819                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsSpace\n");   break;
3820                 case ANYOF_UPPER:
3821                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsUpper\n");   break;
3822                 case ANYOF_NUPPER:
3823                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsUpper\n");   break;
3824                 case ANYOF_XDIGIT:
3825                     Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsXDigit\n");  break;
3826                 case ANYOF_NXDIGIT:
3827                     Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsXDigit\n");  break;
3828                 }
3829                 continue;
3830             }
3831         }
3832         if (range) {
3833             if (lastvalue > value) { /* b-a */
3834                 Simple_vFAIL4("invalid [] range \"%*.*s\"",
3835                               PL_regcomp_parse - rangebegin,
3836                               PL_regcomp_parse - rangebegin,
3837                               rangebegin);
3838             }
3839             range = 0;
3840         }
3841         else {
3842             lastvalue = value;
3843             if (*PL_regcomp_parse == '-' && PL_regcomp_parse+1 < PL_regxend &&
3844                 PL_regcomp_parse[1] != ']') {
3845                 PL_regcomp_parse++;
3846                 if (namedclass > OOB_NAMEDCLASS) { /* \w-, [:word:]- */
3847                     if (ckWARN(WARN_REGEXP))
3848                         vWARN4(PL_regcomp_parse,
3849                                "False [] range \"%*.*s\"",
3850                                PL_regcomp_parse - rangebegin,
3851                                PL_regcomp_parse - rangebegin,
3852                                rangebegin);
3853                     if (!SIZE_ONLY)
3854                         Perl_sv_catpvf(aTHX_ listsv,
3855                                        /* 0x002D is Unicode for '-' */
3856                                        "002D\n");
3857                 } else
3858                     range = 1;
3859                 continue;       /* do it next time */
3860             }
3861         }
3862         /* now is the next time */
3863         if (!SIZE_ONLY)
3864             Perl_sv_catpvf(aTHX_ listsv, "%04"UVxf"\t%04"UVxf"\n",
3865                            (UV)lastvalue, (UV)value);
3866         range = 0;
3867     }
3868
3869     ret = reganode(ANYOFUTF8, 0);
3870
3871     if (!SIZE_ONLY) {
3872         SV *rv = swash_init("utf8", "", listsv, 1, 0);
3873         SvREFCNT_dec(listsv);
3874         n = add_data(1,"s");
3875         PL_regcomp_rx->data->data[n] = (void*)rv;
3876         ARG1_SET(ret, flags);
3877         ARG2_SET(ret, n);
3878     }
3879
3880     return ret;
3881 }
3882
3883 STATIC char*
3884 S_nextchar(pTHX)
3885 {
3886     dTHR;
3887     char* retval = PL_regcomp_parse++;
3888
3889     for (;;) {
3890         if (*PL_regcomp_parse == '(' && PL_regcomp_parse[1] == '?' &&
3891                 PL_regcomp_parse[2] == '#') {
3892             while (*PL_regcomp_parse && *PL_regcomp_parse != ')')
3893                 PL_regcomp_parse++;
3894             PL_regcomp_parse++;
3895             continue;
3896         }
3897         if (PL_regflags & PMf_EXTENDED) {
3898             if (isSPACE(*PL_regcomp_parse)) {
3899                 PL_regcomp_parse++;
3900                 continue;
3901             }
3902             else if (*PL_regcomp_parse == '#') {
3903                 while (*PL_regcomp_parse && *PL_regcomp_parse != '\n')
3904                     PL_regcomp_parse++;
3905                 PL_regcomp_parse++;
3906                 continue;
3907             }
3908         }
3909         return retval;
3910     }
3911 }
3912
3913 /*
3914 - reg_node - emit a node
3915 */
3916 STATIC regnode *                        /* Location. */
3917 S_reg_node(pTHX_ U8 op)
3918 {
3919     dTHR;
3920     register regnode *ret;
3921     register regnode *ptr;
3922
3923     ret = PL_regcode;
3924     if (SIZE_ONLY) {
3925         SIZE_ALIGN(PL_regsize);
3926         PL_regsize += 1;
3927         return(ret);
3928     }
3929
3930     NODE_ALIGN_FILL(ret);
3931     ptr = ret;
3932     FILL_ADVANCE_NODE(ptr, op);
3933     PL_regcode = ptr;
3934
3935     return(ret);
3936 }
3937
3938 /*
3939 - reganode - emit a node with an argument
3940 */
3941 STATIC regnode *                        /* Location. */
3942 S_reganode(pTHX_ U8 op, U32 arg)
3943 {
3944     dTHR;
3945     register regnode *ret;
3946     register regnode *ptr;
3947
3948     ret = PL_regcode;
3949     if (SIZE_ONLY) {
3950         SIZE_ALIGN(PL_regsize);
3951         PL_regsize += 2;
3952         return(ret);
3953     }
3954
3955     NODE_ALIGN_FILL(ret);
3956     ptr = ret;
3957     FILL_ADVANCE_NODE_ARG(ptr, op, arg);
3958     PL_regcode = ptr;
3959
3960     return(ret);
3961 }
3962
3963 /*
3964 - reguni - emit (if appropriate) a Unicode character
3965 */
3966 STATIC void
3967 S_reguni(pTHX_ UV uv, char* s, STRLEN* lenp)
3968 {
3969     dTHR;
3970     if (SIZE_ONLY) {
3971         U8 tmpbuf[UTF8_MAXLEN];
3972         *lenp = uv_to_utf8(tmpbuf, uv) - tmpbuf;
3973     }
3974     else
3975         *lenp = uv_to_utf8((U8*)s, uv) - (U8*)s;
3976
3977 }
3978
3979 /*
3980 - reginsert - insert an operator in front of already-emitted operand
3981 *
3982 * Means relocating the operand.
3983 */
3984 STATIC void
3985 S_reginsert(pTHX_ U8 op, regnode *opnd)
3986 {
3987     dTHR;
3988     register regnode *src;
3989     register regnode *dst;
3990     register regnode *place;
3991     register int offset = regarglen[(U8)op];
3992     
3993 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
3994
3995     if (SIZE_ONLY) {
3996         PL_regsize += NODE_STEP_REGNODE + offset;
3997         return;
3998     }
3999
4000     src = PL_regcode;
4001     PL_regcode += NODE_STEP_REGNODE + offset;
4002     dst = PL_regcode;
4003     while (src > opnd)
4004         StructCopy(--src, --dst, regnode);
4005
4006     place = opnd;               /* Op node, where operand used to be. */
4007     src = NEXTOPER(place);
4008     FILL_ADVANCE_NODE(place, op);
4009     Zero(src, offset, regnode);
4010 }
4011
4012 /*
4013 - regtail - set the next-pointer at the end of a node chain of p to val.
4014 */
4015 STATIC void
4016 S_regtail(pTHX_ regnode *p, regnode *val)
4017 {
4018     dTHR;
4019     register regnode *scan;
4020     register regnode *temp;
4021
4022     if (SIZE_ONLY)
4023         return;
4024
4025     /* Find last node. */
4026     scan = p;
4027     for (;;) {
4028         temp = regnext(scan);
4029         if (temp == NULL)
4030             break;
4031         scan = temp;
4032     }
4033
4034     if (reg_off_by_arg[OP(scan)]) {
4035         ARG_SET(scan, val - scan);
4036     }
4037     else {
4038         NEXT_OFF(scan) = val - scan;
4039     }
4040 }
4041
4042 /*
4043 - regoptail - regtail on operand of first argument; nop if operandless
4044 */
4045 STATIC void
4046 S_regoptail(pTHX_ regnode *p, regnode *val)
4047 {
4048     dTHR;
4049     /* "Operandless" and "op != BRANCH" are synonymous in practice. */
4050     if (p == NULL || SIZE_ONLY)
4051         return;
4052     if (PL_regkind[(U8)OP(p)] == BRANCH) {
4053         regtail(NEXTOPER(p), val);
4054     }
4055     else if ( PL_regkind[(U8)OP(p)] == BRANCHJ) {
4056         regtail(NEXTOPER(NEXTOPER(p)), val);
4057     }
4058     else
4059         return;
4060 }
4061
4062 /*
4063  - regcurly - a little FSA that accepts {\d+,?\d*}
4064  */
4065 STATIC I32
4066 S_regcurly(pTHX_ register char *s)
4067 {
4068     if (*s++ != '{')
4069         return FALSE;
4070     if (!isDIGIT(*s))
4071         return FALSE;
4072     while (isDIGIT(*s))
4073         s++;
4074     if (*s == ',')
4075         s++;
4076     while (isDIGIT(*s))
4077         s++;
4078     if (*s != '}')
4079         return FALSE;
4080     return TRUE;
4081 }
4082
4083
4084 STATIC regnode *
4085 S_dumpuntil(pTHX_ regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
4086 {
4087 #ifdef DEBUGGING
4088     register U8 op = EXACT;     /* Arbitrary non-END op. */
4089     register regnode *next;
4090
4091     while (op != END && (!last || node < last)) {
4092         /* While that wasn't END last time... */
4093
4094         NODE_ALIGN(node);
4095         op = OP(node);
4096         if (op == CLOSE)
4097             l--;        
4098         next = regnext(node);
4099         /* Where, what. */
4100         if (OP(node) == OPTIMIZED)
4101             goto after_print;
4102         regprop(sv, node);
4103         PerlIO_printf(Perl_debug_log, "%4"IVdf":%*s%s", (IV)(node - start),
4104                       (int)(2*l + 1), "", SvPVX(sv));
4105         if (next == NULL)               /* Next ptr. */
4106             PerlIO_printf(Perl_debug_log, "(0)");
4107         else 
4108             PerlIO_printf(Perl_debug_log, "(%"IVdf")", (IV)(next - start));
4109         (void)PerlIO_putc(Perl_debug_log, '\n');
4110       after_print:
4111         if (PL_regkind[(U8)op] == BRANCHJ) {
4112             register regnode *nnode = (OP(next) == LONGJMP 
4113                                        ? regnext(next) 
4114                                        : next);
4115             if (last && nnode > last)
4116                 nnode = last;
4117             node = dumpuntil(start, NEXTOPER(NEXTOPER(node)), nnode, sv, l + 1);
4118         }
4119         else if (PL_regkind[(U8)op] == BRANCH) {
4120             node = dumpuntil(start, NEXTOPER(node), next, sv, l + 1);
4121         }
4122         else if ( op == CURLY) {   /* `next' might be very big: optimizer */
4123             node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
4124                              NEXTOPER(node) + EXTRA_STEP_2ARGS + 1, sv, l + 1);
4125         }
4126         else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
4127             node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
4128                              next, sv, l + 1);
4129         }
4130         else if ( op == PLUS || op == STAR) {
4131             node = dumpuntil(start, NEXTOPER(node), NEXTOPER(node) + 1, sv, l + 1);
4132         }
4133         else if (op == ANYOF) {
4134             node = NEXTOPER(node);
4135             node += ANYOF_SKIP;
4136         }
4137         else if (PL_regkind[(U8)op] == EXACT) {
4138             /* Literal string, where present. */
4139             node += NODE_SZ_STR(node) - 1;
4140             node = NEXTOPER(node);
4141         }
4142         else {
4143             node = NEXTOPER(node);
4144             node += regarglen[(U8)op];
4145         }
4146         if (op == CURLYX || op == OPEN)
4147             l++;
4148         else if (op == WHILEM)
4149             l--;
4150     }
4151 #endif  /* DEBUGGING */
4152     return node;
4153 }
4154
4155 /*
4156  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
4157  */
4158 void
4159 Perl_regdump(pTHX_ regexp *r)
4160 {
4161 #ifdef DEBUGGING
4162     dTHR;
4163     SV *sv = sv_newmortal();
4164
4165     (void)dumpuntil(r->program, r->program + 1, NULL, sv, 0);
4166
4167     /* Header fields of interest. */
4168     if (r->anchored_substr)
4169         PerlIO_printf(Perl_debug_log,
4170                       "anchored `%s%.*s%s'%s at %"IVdf" ", 
4171                       PL_colors[0],
4172                       (int)(SvCUR(r->anchored_substr) - (SvTAIL(r->anchored_substr)!=0)),
4173                       SvPVX(r->anchored_substr), 
4174                       PL_colors[1],
4175                       SvTAIL(r->anchored_substr) ? "$" : "",
4176                       (IV)r->anchored_offset);
4177     if (r->float_substr)
4178         PerlIO_printf(Perl_debug_log,
4179                       "floating `%s%.*s%s'%s at %"IVdf"..%"UVuf" ", 
4180                       PL_colors[0],
4181                       (int)(SvCUR(r->float_substr) - (SvTAIL(r->float_substr)!=0)), 
4182                       SvPVX(r->float_substr),
4183                       PL_colors[1],
4184                       SvTAIL(r->float_substr) ? "$" : "",
4185                       (IV)r->float_min_offset, (UV)r->float_max_offset);
4186     if (r->check_substr)
4187         PerlIO_printf(Perl_debug_log, 
4188                       r->check_substr == r->float_substr 
4189                       ? "(checking floating" : "(checking anchored");
4190     if (r->reganch & ROPT_NOSCAN)
4191         PerlIO_printf(Perl_debug_log, " noscan");
4192     if (r->reganch & ROPT_CHECK_ALL)
4193         PerlIO_printf(Perl_debug_log, " isall");
4194     if (r->check_substr)
4195         PerlIO_printf(Perl_debug_log, ") ");
4196
4197     if (r->regstclass) {
4198         regprop(sv, r->regstclass);
4199         PerlIO_printf(Perl_debug_log, "stclass `%s' ", SvPVX(sv));
4200     }
4201     if (r->reganch & ROPT_ANCH) {
4202         PerlIO_printf(Perl_debug_log, "anchored");
4203         if (r->reganch & ROPT_ANCH_BOL)
4204             PerlIO_printf(Perl_debug_log, "(BOL)");
4205         if (r->reganch & ROPT_ANCH_MBOL)
4206             PerlIO_printf(Perl_debug_log, "(MBOL)");
4207         if (r->reganch & ROPT_ANCH_SBOL)
4208             PerlIO_printf(Perl_debug_log, "(SBOL)");
4209         if (r->reganch & ROPT_ANCH_GPOS)
4210             PerlIO_printf(Perl_debug_log, "(GPOS)");
4211         PerlIO_putc(Perl_debug_log, ' ');
4212     }
4213     if (r->reganch & ROPT_GPOS_SEEN)
4214         PerlIO_printf(Perl_debug_log, "GPOS ");
4215     if (r->reganch & ROPT_SKIP)
4216         PerlIO_printf(Perl_debug_log, "plus ");
4217     if (r->reganch & ROPT_IMPLICIT)
4218         PerlIO_printf(Perl_debug_log, "implicit ");
4219     PerlIO_printf(Perl_debug_log, "minlen %ld ", (long) r->minlen);
4220     if (r->reganch & ROPT_EVAL_SEEN)
4221         PerlIO_printf(Perl_debug_log, "with eval ");
4222     PerlIO_printf(Perl_debug_log, "\n");
4223 #endif  /* DEBUGGING */
4224 }
4225
4226 STATIC void
4227 S_put_byte(pTHX_ SV *sv, int c)
4228 {
4229     if (c <= ' ' || c == 127 || c == 255)
4230         Perl_sv_catpvf(aTHX_ sv, "\\%o", c);
4231     else if (c == '-' || c == ']' || c == '\\' || c == '^')
4232         Perl_sv_catpvf(aTHX_ sv, "\\%c", c);
4233     else
4234         Perl_sv_catpvf(aTHX_ sv, "%c", c);
4235 }
4236
4237 /*
4238 - regprop - printable representation of opcode
4239 */
4240 void
4241 Perl_regprop(pTHX_ SV *sv, regnode *o)
4242 {
4243 #ifdef DEBUGGING
4244     dTHR;
4245     register int k;
4246
4247     sv_setpvn(sv, "", 0);
4248     if (OP(o) >= reg_num)               /* regnode.type is unsigned */
4249         FAIL("Corrupted regexp opcode");
4250     sv_catpv(sv, (char*)reg_name[OP(o)]); /* Take off const! */
4251
4252     k = PL_regkind[(U8)OP(o)];
4253
4254     if (k == EXACT)
4255         Perl_sv_catpvf(aTHX_ sv, " <%s%.*s%s>", PL_colors[0],
4256                        STR_LEN(o), STRING(o), PL_colors[1]);
4257     else if (k == CURLY) {
4258         if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX)
4259             Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */
4260         Perl_sv_catpvf(aTHX_ sv, " {%d,%d}", ARG1(o), ARG2(o));
4261     }
4262     else if (k == WHILEM && o->flags)                   /* Ordinal/of */
4263         Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4);
4264     else if (k == REF || k == OPEN || k == CLOSE || k == GROUPP )
4265         Perl_sv_catpvf(aTHX_ sv, "%d", (int)ARG(o));    /* Parenth number */
4266     else if (k == LOGICAL)
4267         Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);     /* 2: embedded, otherwise 1 */
4268     else if (k == ANYOF) {
4269         int i, rangestart = -1;
4270         const char * const out[] = {    /* Should be syncronized with
4271                                            ANYOF_ #xdefines in regcomp.h */
4272             "\\w",
4273             "\\W",
4274             "\\s",
4275             "\\S",
4276             "\\d",
4277             "\\D",
4278             "[:alnum:]",
4279             "[:^alnum:]",
4280             "[:alpha:]",
4281             "[:^alpha:]",
4282             "[:ascii:]",
4283             "[:^ascii:]",
4284             "[:ctrl:]",
4285             "[:^ctrl:]",
4286             "[:graph:]",
4287             "[:^graph:]",
4288             "[:lower:]",
4289             "[:^lower:]",
4290             "[:print:]",
4291             "[:^print:]",
4292             "[:punct:]",
4293             "[:^punct:]",
4294             "[:upper:]",
4295             "[:^upper:]",
4296             "[:xdigit:]",
4297             "[:^xdigit:]",
4298             "[:space:]",
4299             "[:^space:]",
4300             "[:blank:]",
4301             "[:^blank:]"
4302         };
4303
4304         if (o->flags & ANYOF_LOCALE)
4305             sv_catpv(sv, "{loc}");
4306         if (o->flags & ANYOF_FOLD)
4307             sv_catpv(sv, "{i}");
4308         Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
4309         if (o->flags & ANYOF_INVERT)
4310             sv_catpv(sv, "^");
4311         for (i = 0; i <= 256; i++) {
4312             if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
4313                 if (rangestart == -1)
4314                     rangestart = i;
4315             } else if (rangestart != -1) {
4316                 if (i <= rangestart + 3)
4317                     for (; rangestart < i; rangestart++)
4318                         put_byte(sv, rangestart);
4319                 else {
4320                     put_byte(sv, rangestart);
4321                     sv_catpv(sv, "-");
4322                     put_byte(sv, i - 1);
4323                 }
4324                 rangestart = -1;
4325             }
4326         }
4327         if (o->flags & ANYOF_CLASS)
4328             for (i = 0; i < sizeof(out)/sizeof(char*); i++)
4329                 if (ANYOF_CLASS_TEST(o,i))
4330                     sv_catpv(sv, out[i]);
4331         Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
4332     }
4333     else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
4334         Perl_sv_catpvf(aTHX_ sv, "[-%d]", o->flags);
4335 #endif  /* DEBUGGING */
4336 }
4337
4338 SV *
4339 Perl_re_intuit_string(pTHX_ regexp *prog)
4340 {                               /* Assume that RE_INTUIT is set */
4341     DEBUG_r(
4342         {   STRLEN n_a;
4343             char *s = SvPV(prog->check_substr,n_a);
4344
4345             if (!PL_colorset) reginitcolors();
4346             PerlIO_printf(Perl_debug_log,
4347                       "%sUsing REx substr:%s `%s%.60s%s%s'\n",
4348                       PL_colors[4],PL_colors[5],PL_colors[0],
4349                       s,
4350                       PL_colors[1],
4351                       (strlen(s) > 60 ? "..." : ""));
4352         } );
4353
4354     return prog->check_substr;
4355 }
4356
4357 void
4358 Perl_pregfree(pTHX_ struct regexp *r)
4359 {
4360     dTHR;
4361     DEBUG_r(if (!PL_colorset) reginitcolors());
4362
4363     if (!r || (--r->refcnt > 0))
4364         return;
4365     DEBUG_r(PerlIO_printf(Perl_debug_log,
4366                       "%sFreeing REx:%s `%s%.60s%s%s'\n",
4367                       PL_colors[4],PL_colors[5],PL_colors[0],
4368                       r->precomp,
4369                       PL_colors[1],
4370                       (strlen(r->precomp) > 60 ? "..." : "")));
4371
4372     if (r->precomp)
4373         Safefree(r->precomp);
4374     if (RX_MATCH_COPIED(r))
4375         Safefree(r->subbeg);
4376     if (r->substrs) {
4377         if (r->anchored_substr)
4378             SvREFCNT_dec(r->anchored_substr);
4379         if (r->float_substr)
4380             SvREFCNT_dec(r->float_substr);
4381         Safefree(r->substrs);
4382     }
4383     if (r->data) {
4384         int n = r->data->count;
4385         AV* new_comppad = NULL;
4386         AV* old_comppad;
4387         SV** old_curpad;
4388
4389         while (--n >= 0) {
4390             switch (r->data->what[n]) {
4391             case 's':
4392                 SvREFCNT_dec((SV*)r->data->data[n]);
4393                 break;
4394             case 'f':
4395                 Safefree(r->data->data[n]);
4396                 break;
4397             case 'p':
4398                 new_comppad = (AV*)r->data->data[n];
4399                 break;
4400             case 'o':
4401                 if (new_comppad == NULL)
4402                     Perl_croak(aTHX_ "panic: pregfree comppad");
4403                 old_comppad = PL_comppad;
4404                 old_curpad = PL_curpad;
4405                 /* Watch out for global destruction's random ordering. */
4406                 if (SvTYPE(new_comppad) == SVt_PVAV) {
4407                     PL_comppad = new_comppad;
4408                     PL_curpad = AvARRAY(new_comppad);
4409                 }
4410                 else
4411                     PL_curpad = NULL;
4412                 op_free((OP_4tree*)r->data->data[n]);
4413                 PL_comppad = old_comppad;
4414                 PL_curpad = old_curpad;
4415                 SvREFCNT_dec((SV*)new_comppad);
4416                 new_comppad = NULL;
4417                 break;
4418             case 'n':
4419                 break;
4420             default:
4421                 FAIL2("panic: regfree data code '%c'", r->data->what[n]);
4422             }
4423         }
4424         Safefree(r->data->what);
4425         Safefree(r->data);
4426     }
4427     Safefree(r->startp);
4428     Safefree(r->endp);
4429     Safefree(r);
4430 }
4431
4432 /*
4433  - regnext - dig the "next" pointer out of a node
4434  *
4435  * [Note, when REGALIGN is defined there are two places in regmatch()
4436  * that bypass this code for speed.]
4437  */
4438 regnode *
4439 Perl_regnext(pTHX_ register regnode *p)
4440 {
4441     dTHR;
4442     register I32 offset;
4443
4444     if (p == &PL_regdummy)
4445         return(NULL);
4446
4447     offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
4448     if (offset == 0)
4449         return(NULL);
4450
4451     return(p+offset);
4452 }
4453
4454 STATIC void     
4455 S_re_croak2(pTHX_ const char* pat1,const char* pat2,...)
4456 {
4457     va_list args;
4458     STRLEN l1 = strlen(pat1);
4459     STRLEN l2 = strlen(pat2);
4460     char buf[512];
4461     SV *msv;
4462     char *message;
4463
4464     if (l1 > 510)
4465         l1 = 510;
4466     if (l1 + l2 > 510)
4467         l2 = 510 - l1;
4468     Copy(pat1, buf, l1 , char);
4469     Copy(pat2, buf + l1, l2 , char);
4470     buf[l1 + l2] = '\n';
4471     buf[l1 + l2 + 1] = '\0';
4472 #ifdef I_STDARG
4473     /* ANSI variant takes additional second argument */
4474     va_start(args, pat2);
4475 #else
4476     va_start(args);
4477 #endif
4478     msv = vmess(buf, &args);
4479     va_end(args);
4480     message = SvPV(msv,l1);
4481     if (l1 > 512)
4482         l1 = 512;
4483     Copy(message, buf, l1 , char);
4484     buf[l1] = '\0';                     /* Overwrite \n */
4485     Perl_croak(aTHX_ "%s", buf);
4486 }
4487
4488 /* XXX Here's a total kludge.  But we need to re-enter for swash routines. */
4489
4490 void
4491 Perl_save_re_context(pTHX)
4492 {                   
4493     dTHR;
4494     SAVEPPTR(PL_bostr);
4495     SAVEPPTR(PL_regprecomp);            /* uncompiled string. */
4496     SAVEI32(PL_regnpar);                /* () count. */
4497     SAVEI32(PL_regsize);                /* Code size. */
4498     SAVEI16(PL_regflags);               /* are we folding, multilining? */
4499     SAVEPPTR(PL_reginput);              /* String-input pointer. */
4500     SAVEPPTR(PL_regbol);                /* Beginning of input, for ^ check. */
4501     SAVEPPTR(PL_regeol);                /* End of input, for $ check. */
4502     SAVEVPTR(PL_regstartp);             /* Pointer to startp array. */
4503     SAVEVPTR(PL_regendp);               /* Ditto for endp. */
4504     SAVEVPTR(PL_reglastparen);          /* Similarly for lastparen. */
4505     SAVEPPTR(PL_regtill);               /* How far we are required to go. */
4506     SAVEI8(PL_regprev);                 /* char before regbol, \n if none */
4507     SAVEVPTR(PL_reg_start_tmp);         /* from regexec.c */
4508     PL_reg_start_tmp = 0;
4509     SAVEFREEPV(PL_reg_start_tmp);
4510     SAVEI32(PL_reg_start_tmpl);         /* from regexec.c */
4511     PL_reg_start_tmpl = 0;
4512     SAVEVPTR(PL_regdata);
4513     SAVEI32(PL_reg_flags);              /* from regexec.c */
4514     SAVEI32(PL_reg_eval_set);           /* from regexec.c */
4515     SAVEI32(PL_regnarrate);             /* from regexec.c */
4516     SAVEVPTR(PL_regprogram);            /* from regexec.c */
4517     SAVEINT(PL_regindent);              /* from regexec.c */
4518     SAVEVPTR(PL_regcc);                 /* from regexec.c */
4519     SAVEVPTR(PL_curcop);
4520     SAVEVPTR(PL_regcomp_rx);            /* from regcomp.c */
4521     SAVEI32(PL_regseen);                /* from regcomp.c */
4522     SAVEI32(PL_regsawback);             /* Did we see \1, ...? */
4523     SAVEI32(PL_regnaughty);             /* How bad is this pattern? */
4524     SAVEVPTR(PL_regcode);               /* Code-emit pointer; &regdummy = don't */
4525     SAVEPPTR(PL_regxend);               /* End of input for compile */
4526     SAVEPPTR(PL_regcomp_parse);         /* Input-scan pointer. */
4527     SAVEVPTR(PL_reg_call_cc);           /* from regexec.c */
4528     SAVEVPTR(PL_reg_re);                /* from regexec.c */
4529     SAVEPPTR(PL_reg_ganch);             /* from regexec.c */
4530     SAVESPTR(PL_reg_sv);                /* from regexec.c */
4531     SAVEVPTR(PL_reg_magic);             /* from regexec.c */
4532     SAVEI32(PL_reg_oldpos);                     /* from regexec.c */
4533     SAVEVPTR(PL_reg_oldcurpm);          /* from regexec.c */
4534     SAVEVPTR(PL_reg_curpm);             /* from regexec.c */
4535 #ifdef DEBUGGING
4536     SAVEPPTR(PL_reg_starttry);          /* from regexec.c */    
4537 #endif
4538 }
4539
4540 #ifdef PERL_OBJECT
4541 #include "XSUB.h"
4542 #undef this
4543 #define this pPerl
4544 #endif
4545
4546 static void
4547 clear_re(pTHXo_ void *r)
4548 {
4549     ReREFCNT_dec((regexp *)r);
4550 }
4551