source: trunk/third/perl/regcomp.c @ 14545

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