patch for change#2822, done right; add PERL_OBJECT stuff; regen headers
[p5sagit/p5-mst-13.2.git] / regcomp.c
1 /*    regcomp.c
2  */
3
4 /*
5  * "A fair jaw-cracker dwarf-language must be."  --Samwise Gamgee
6  */
7
8 /* 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 #  ifndef 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 /* *These* symbols are masked to allow static link. */
39 #  define Perl_pregfree my_regfree
40 #  define Perl_regnext my_regnext
41 #  define Perl_save_re_context my_save_re_context
42 #  define Perl_reginitcolors my_reginitcolors 
43 #endif 
44
45 /*SUPPRESS 112*/
46 /*
47  * pregcomp and pregexec -- regsub and regerror are not used in perl
48  *
49  *      Copyright (c) 1986 by University of Toronto.
50  *      Written by Henry Spencer.  Not derived from licensed software.
51  *
52  *      Permission is granted to anyone to use this software for any
53  *      purpose on any computer system, and to redistribute it freely,
54  *      subject to the following restrictions:
55  *
56  *      1. The author is not responsible for the consequences of use of
57  *              this software, no matter how awful, even if they arise
58  *              from defects in it.
59  *
60  *      2. The origin of this software must not be misrepresented, either
61  *              by explicit claim or by omission.
62  *
63  *      3. Altered versions must be plainly marked as such, and must not
64  *              be misrepresented as being the original software.
65  *
66  *
67  ****    Alterations to Henry's code are...
68  ****
69  ****    Copyright (c) 1991-1998, Larry Wall
70  ****
71  ****    You may distribute under the terms of either the GNU General Public
72  ****    License or the Artistic License, as specified in the README file.
73
74  *
75  * Beware that some of this code is subtly aware of the way operator
76  * precedence is structured in regular expressions.  Serious changes in
77  * regular-expression syntax might require a total rethink.
78  */
79 #include "EXTERN.h"
80 #include "perl.h"
81
82 #ifndef PERL_IN_XSUB_RE
83 #  include "INTERN.h"
84 #endif
85
86 #define REG_COMP_C
87 #include "regcomp.h"
88
89 #ifdef op
90 #undef op
91 #endif /* op */
92
93 #ifdef MSDOS
94 # if defined(BUGGY_MSC6)
95  /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
96  # pragma optimize("a",off)
97  /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
98  # pragma optimize("w",on )
99 # endif /* BUGGY_MSC6 */
100 #endif /* MSDOS */
101
102 #ifndef STATIC
103 #define STATIC  static
104 #endif
105
106 #define ISMULT1(c)      ((c) == '*' || (c) == '+' || (c) == '?')
107 #define ISMULT2(s)      ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
108         ((*s) == '{' && regcurly(s)))
109 #ifdef atarist
110 #define PERL_META       "^$.[()|?+*\\"
111 #else
112 #define META    "^$.[()|?+*\\"
113 #endif
114
115 #ifdef SPSTART
116 #undef SPSTART          /* dratted cpp namespace... */
117 #endif
118 /*
119  * Flags to be passed up and down.
120  */
121 #define WORST           0       /* Worst case. */
122 #define HASWIDTH        0x1     /* Known to match non-null strings. */
123 #define SIMPLE          0x2     /* Simple enough to be STAR/PLUS operand. */
124 #define SPSTART         0x4     /* Starts with * or +. */
125 #define TRYAGAIN        0x8     /* Weeded out a declaration. */
126
127 /*
128  * Forward declarations for pregcomp()'s friends.
129  */
130
131 #ifndef PERL_OBJECT
132 static regnode *reg _((I32, I32 *));
133 static regnode *reganode _((U8, U32));
134 static regnode *regatom _((I32 *));
135 static regnode *regbranch _((I32 *, I32));
136 static void regc _((U8, char *));
137 static void reguni _((UV, char *, I32*));
138 static regnode *regclass _((void));
139 static regnode *regclassutf8 _((void));
140 STATIC I32 regcurly _((char *));
141 static regnode *reg_node _((U8));
142 static regnode *regpiece _((I32 *));
143 static void reginsert _((U8, regnode *));
144 static void regoptail _((regnode *, regnode *));
145 static void regtail _((regnode *, regnode *));
146 static char* regwhite _((char *, char *));
147 static char* nextchar _((void));
148 static void re_croak2 _((const char* pat1,const char* pat2,...)) __attribute__((noreturn));
149 static char* regpposixcc _((I32 value));
150 static void clear_re _((void *r));
151 #endif
152
153 /* Length of a variant. */
154
155 #ifndef PERL_OBJECT
156 typedef struct {
157     I32 len_min;
158     I32 len_delta;
159     I32 pos_min;                        /* CC */
160     I32 pos_delta;                      /* CC */
161     SV *last_found;
162     I32 last_end;                       /* min value, <0 unless valid. */
163     I32 last_start_min;                 /* CC */
164     I32 last_start_max;                 /* CC */
165     SV **longest;                       /* Either &l_fixed, or &l_float. */
166     SV *longest_fixed;
167     I32 offset_fixed;                   /* CC */
168     SV *longest_float;
169     I32 offset_float_min;               /* CC */
170     I32 offset_float_max;               /* CC */
171     I32 flags;
172 } scan_data_t;
173 #endif
174
175 static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
176
177 #define SF_BEFORE_EOL           (SF_BEFORE_SEOL|SF_BEFORE_MEOL)
178 #define SF_BEFORE_SEOL          0x1
179 #define SF_BEFORE_MEOL          0x2
180 #define SF_FIX_BEFORE_EOL       (SF_FIX_BEFORE_SEOL|SF_FIX_BEFORE_MEOL)
181 #define SF_FL_BEFORE_EOL        (SF_FL_BEFORE_SEOL|SF_FL_BEFORE_MEOL)
182
183 #ifdef NO_UNARY_PLUS
184 #  define SF_FIX_SHIFT_EOL      (0+2)
185 #  define SF_FL_SHIFT_EOL               (0+4)
186 #else
187 #  define SF_FIX_SHIFT_EOL      (+2)
188 #  define SF_FL_SHIFT_EOL               (+4)
189 #endif
190
191 #define SF_FIX_BEFORE_SEOL      (SF_BEFORE_SEOL << SF_FIX_SHIFT_EOL)
192 #define SF_FIX_BEFORE_MEOL      (SF_BEFORE_MEOL << SF_FIX_SHIFT_EOL)
193
194 #define SF_FL_BEFORE_SEOL       (SF_BEFORE_SEOL << SF_FL_SHIFT_EOL)
195 #define SF_FL_BEFORE_MEOL       (SF_BEFORE_MEOL << SF_FL_SHIFT_EOL) /* 0x20 */
196 #define SF_IS_INF               0x40
197 #define SF_HAS_PAR              0x80
198 #define SF_IN_PAR               0x100
199 #define SF_HAS_EVAL             0x200
200 #define SCF_DO_SUBSTR           0x400
201
202 #define RF_utf8         8
203 #define UTF (PL_reg_flags & RF_utf8)
204 #define LOC (PL_regflags & PMf_LOCALE)
205 #define FOLD (PL_regflags & PMf_FOLD)
206
207 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
208 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
209
210 STATIC void
211 clear_re(void *r)
212 {
213     ReREFCNT_dec((regexp *)r);
214 }
215
216 STATIC void
217 scan_commit(scan_data_t *data)
218 {
219     dTHR;
220     STRLEN l = CHR_SVLEN(data->last_found);
221     STRLEN old_l = CHR_SVLEN(*data->longest);
222     
223     if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) {
224         sv_setsv(*data->longest, data->last_found);
225         if (*data->longest == data->longest_fixed) {
226             data->offset_fixed = l ? data->last_start_min : data->pos_min;
227             if (data->flags & SF_BEFORE_EOL)
228                 data->flags 
229                     |= ((data->flags & SF_BEFORE_EOL) << SF_FIX_SHIFT_EOL);
230             else
231                 data->flags &= ~SF_FIX_BEFORE_EOL;
232         }
233         else {
234             data->offset_float_min = l ? data->last_start_min : data->pos_min;
235             data->offset_float_max = (l 
236                                       ? data->last_start_max 
237                                       : data->pos_min + data->pos_delta);
238             if (data->flags & SF_BEFORE_EOL)
239                 data->flags 
240                     |= ((data->flags & SF_BEFORE_EOL) << SF_FL_SHIFT_EOL);
241             else
242                 data->flags &= ~SF_FL_BEFORE_EOL;
243         }
244     }
245     SvCUR_set(data->last_found, 0);
246     data->last_end = -1;
247     data->flags &= ~SF_BEFORE_EOL;
248 }
249
250 /* Stops at toplevel WHILEM as well as at `last'. At end *scanp is set
251    to the position after last scanned or to NULL. */
252
253 STATIC I32
254 study_chunk(regnode **scanp, I32 *deltap, regnode *last, scan_data_t *data, U32 flags)
255                         /* scanp: Start here (read-write). */
256                         /* deltap: Write maxlen-minlen here. */
257                         /* last: Stop before this one. */
258 {
259     dTHR;
260     I32 min = 0, pars = 0, code;
261     regnode *scan = *scanp, *next;
262     I32 delta = 0;
263     int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF);
264     int is_inf_internal = 0;            /* The studied chunk is infinite */
265     I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0;
266     scan_data_t data_fake;
267     
268     while (scan && OP(scan) != END && scan < last) {
269         /* Peephole optimizer: */
270
271         if (PL_regkind[(U8)OP(scan)] == EXACT) {
272             regnode *n = regnext(scan);
273             U32 stringok = 1;
274 #ifdef DEBUGGING
275             regnode *stop = scan;
276 #endif 
277
278             next = scan + (*OPERAND(scan) + 2 - 1)/sizeof(regnode) + 2;
279             /* Skip NOTHING, merge EXACT*. */
280             while (n &&
281                    ( PL_regkind[(U8)OP(n)] == NOTHING || 
282                      (stringok && (OP(n) == OP(scan))))
283                    && NEXT_OFF(n)
284                    && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) {
285                 if (OP(n) == TAIL || n > next)
286                     stringok = 0;
287                 if (PL_regkind[(U8)OP(n)] == NOTHING) {
288                     NEXT_OFF(scan) += NEXT_OFF(n);
289                     next = n + NODE_STEP_REGNODE;
290 #ifdef DEBUGGING
291                     if (stringok)
292                         stop = n;
293 #endif 
294                     n = regnext(n);
295                 }
296                 else {
297                     int oldl = *OPERAND(scan);
298                     regnode *nnext = regnext(n);
299                     
300                     if (oldl + *OPERAND(n) > U8_MAX) 
301                         break;
302                     NEXT_OFF(scan) += NEXT_OFF(n);
303                     *OPERAND(scan) += *OPERAND(n);
304                     next = n + (*OPERAND(n) + 2 - 1)/sizeof(regnode) + 2;
305                     /* Now we can overwrite *n : */
306                     Move(OPERAND(n) + 1, OPERAND(scan) + oldl + 1,
307                          *OPERAND(n) + 1, char);
308 #ifdef DEBUGGING
309                     if (stringok)
310                         stop = next - 1;
311 #endif 
312                     n = nnext;
313                 }
314             }
315 #ifdef DEBUGGING
316             /* Allow dumping */
317             n = scan + (*OPERAND(scan) + 2 - 1)/sizeof(regnode) + 2;
318             while (n <= stop) {
319                 /* Purify reports a benign UMR here sometimes, because we
320                  * don't initialize the OP() slot of a node when that node
321                  * is occupied by just the trailing null of the string in
322                  * an EXACT node */
323                 if (PL_regkind[(U8)OP(n)] != NOTHING || OP(n) == NOTHING) {
324                     OP(n) = OPTIMIZED;
325                     NEXT_OFF(n) = 0;
326                 }
327                 n++;
328             }
329 #endif 
330
331         }
332         if (OP(scan) != CURLYX) {
333             int max = (reg_off_by_arg[OP(scan)]
334                        ? I32_MAX
335                        /* I32 may be smaller than U16 on CRAYs! */
336                        : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX));
337             int off = (reg_off_by_arg[OP(scan)] ? ARG(scan) : NEXT_OFF(scan));
338             int noff;
339             regnode *n = scan;
340             
341             /* Skip NOTHING and LONGJMP. */
342             while ((n = regnext(n))
343                    && ((PL_regkind[(U8)OP(n)] == NOTHING && (noff = NEXT_OFF(n)))
344                        || ((OP(n) == LONGJMP) && (noff = ARG(n))))
345                    && off + noff < max)
346                 off += noff;
347             if (reg_off_by_arg[OP(scan)])
348                 ARG(scan) = off;
349             else 
350                 NEXT_OFF(scan) = off;
351         }
352         if (OP(scan) == BRANCH || OP(scan) == BRANCHJ 
353                    || OP(scan) == IFTHEN || OP(scan) == SUSPEND) {
354             next = regnext(scan);
355             code = OP(scan);
356             
357             if (OP(next) == code || code == IFTHEN || code == SUSPEND) { 
358                 I32 max1 = 0, min1 = I32_MAX, num = 0;
359                 
360                 if (flags & SCF_DO_SUBSTR)
361                     scan_commit(data);
362                 while (OP(scan) == code) {
363                     I32 deltanext, minnext;
364
365                     num++;
366                     data_fake.flags = 0;
367                     next = regnext(scan);
368                     scan = NEXTOPER(scan);
369                     if (code != BRANCH)
370                         scan = NEXTOPER(scan);
371                     /* We suppose the run is continuous, last=next...*/
372                     minnext = study_chunk(&scan, &deltanext, next,
373                                           &data_fake, 0);
374                     if (min1 > minnext) 
375                         min1 = minnext;
376                     if (max1 < minnext + deltanext)
377                         max1 = minnext + deltanext;
378                     if (deltanext == I32_MAX)
379                         is_inf = is_inf_internal = 1;
380                     scan = next;
381                     if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
382                         pars++;
383                     if (data && (data_fake.flags & SF_HAS_EVAL))
384                         data->flags |= SF_HAS_EVAL;
385                     if (code == SUSPEND) 
386                         break;
387                 }
388                 if (code == IFTHEN && num < 2) /* Empty ELSE branch */
389                     min1 = 0;
390                 if (flags & SCF_DO_SUBSTR) {
391                     data->pos_min += min1;
392                     data->pos_delta += max1 - min1;
393                     if (max1 != min1 || is_inf)
394                         data->longest = &(data->longest_float);
395                 }
396                 min += min1;
397                 delta += max1 - min1;
398             }
399             else if (code == BRANCHJ)   /* single branch is optimized. */
400                 scan = NEXTOPER(NEXTOPER(scan));
401             else                        /* single branch is optimized. */
402                 scan = NEXTOPER(scan);
403             continue;
404         }
405         else if (OP(scan) == EXACT) {
406             I32 l = *OPERAND(scan);
407             if (UTF) {
408                 unsigned char *s = (unsigned char *)(OPERAND(scan)+1);
409                 unsigned char *e = s + l;
410                 I32 newl = 0;
411                 while (s < e) {
412                     newl++;
413                     s += UTF8SKIP(s);
414                 }
415                 l = newl;
416             }
417             min += l;
418             if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */
419                 /* The code below prefers earlier match for fixed
420                    offset, later match for variable offset.  */
421                 if (data->last_end == -1) { /* Update the start info. */
422                     data->last_start_min = data->pos_min;
423                     data->last_start_max = is_inf
424                         ? I32_MAX : data->pos_min + data->pos_delta; 
425                 }
426                 sv_catpvn(data->last_found, (char *)(OPERAND(scan)+1), *OPERAND(scan));
427                 data->last_end = data->pos_min + l;
428                 data->pos_min += l; /* As in the first entry. */
429                 data->flags &= ~SF_BEFORE_EOL;
430             }
431         }
432         else if (PL_regkind[(U8)OP(scan)] == EXACT) {
433             I32 l = *OPERAND(scan);
434             if (flags & SCF_DO_SUBSTR) 
435                 scan_commit(data);
436             if (UTF) {
437                 unsigned char *s = (unsigned char *)(OPERAND(scan)+1);
438                 unsigned char *e = s + l;
439                 I32 newl = 0;
440                 while (s < e) {
441                     newl++;
442                     s += UTF8SKIP(s);
443                 }
444                 l = newl;
445             }
446             min += l;
447             if (data && (flags & SCF_DO_SUBSTR))
448                 data->pos_min += l;
449         }
450         else if (strchr(PL_varies,OP(scan))) {
451             I32 mincount, maxcount, minnext, deltanext, pos_before, fl;
452             regnode *oscan = scan;
453             
454             switch (PL_regkind[(U8)OP(scan)]) {
455             case WHILEM:
456                 scan = NEXTOPER(scan);
457                 goto finish;
458             case PLUS:
459                 if (flags & SCF_DO_SUBSTR) {
460                     next = NEXTOPER(scan);
461                     if (OP(next) == EXACT) {
462                         mincount = 1; 
463                         maxcount = REG_INFTY; 
464                         next = regnext(scan);
465                         scan = NEXTOPER(scan);
466                         goto do_curly;
467                     }
468                 }
469                 if (flags & SCF_DO_SUBSTR)
470                     data->pos_min++;
471                 min++;
472                 /* Fall through. */
473             case STAR:
474                 is_inf = is_inf_internal = 1; 
475                 scan = regnext(scan);
476                 if (flags & SCF_DO_SUBSTR) {
477                     scan_commit(data);
478                     data->longest = &(data->longest_float);
479                 }
480                 goto optimize_curly_tail;
481             case CURLY:
482                 mincount = ARG1(scan); 
483                 maxcount = ARG2(scan);
484                 next = regnext(scan);
485                 scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS;
486               do_curly:
487                 if (flags & SCF_DO_SUBSTR) {
488                     if (mincount == 0) scan_commit(data);
489                     pos_before = data->pos_min;
490                 }
491                 if (data) {
492                     fl = data->flags;
493                     data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL);
494                     if (is_inf)
495                         data->flags |= SF_IS_INF;
496                 }
497                 /* This will finish on WHILEM, setting scan, or on NULL: */
498                 minnext = study_chunk(&scan, &deltanext, last, data, 
499                                       mincount == 0 
500                                         ? (flags & ~SCF_DO_SUBSTR) : flags);
501                 if (!scan)              /* It was not CURLYX, but CURLY. */
502                     scan = next;
503                 if (ckWARN(WARN_UNSAFE) && (minnext + deltanext == 0) 
504                     && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
505                     && maxcount <= REG_INFTY/3) /* Complement check for big count */
506                     warner(WARN_UNSAFE, "Strange *+?{} on zero-length expression");
507                 min += minnext * mincount;
508                 is_inf_internal |= (maxcount == REG_INFTY 
509                                     && (minnext + deltanext) > 0
510                                    || deltanext == I32_MAX);
511                 is_inf |= is_inf_internal;
512                 delta += (minnext + deltanext) * maxcount - minnext * mincount;
513
514                 /* Try powerful optimization CURLYX => CURLYN. */
515                 if (  OP(oscan) == CURLYX && data 
516                       && data->flags & SF_IN_PAR
517                       && !(data->flags & SF_HAS_EVAL)
518                       && !deltanext && minnext == 1 ) {
519                     /* Try to optimize to CURLYN.  */
520                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS;
521                     regnode *nxt1 = nxt, *nxt2;
522
523                     /* Skip open. */
524                     nxt = regnext(nxt);
525                     if (!strchr(PL_simple,OP(nxt))
526                         && !(PL_regkind[(U8)OP(nxt)] == EXACT
527                              && *OPERAND(nxt) == 1)) 
528                         goto nogo;
529                     nxt2 = nxt;
530                     nxt = regnext(nxt);
531                     if (OP(nxt) != CLOSE) 
532                         goto nogo;
533                     /* Now we know that nxt2 is the only contents: */
534                     oscan->flags = ARG(nxt);
535                     OP(oscan) = CURLYN;
536                     OP(nxt1) = NOTHING; /* was OPEN. */
537 #ifdef DEBUGGING
538                     OP(nxt1 + 1) = OPTIMIZED; /* was count. */
539                     NEXT_OFF(nxt1+ 1) = 0; /* just for consistancy. */
540                     NEXT_OFF(nxt2) = 0; /* just for consistancy with CURLY. */
541                     OP(nxt) = OPTIMIZED;        /* was CLOSE. */
542                     OP(nxt + 1) = OPTIMIZED; /* was count. */
543                     NEXT_OFF(nxt+ 1) = 0; /* just for consistancy. */
544 #endif 
545                 }
546               nogo:
547
548                 /* Try optimization CURLYX => CURLYM. */
549                 if (  OP(oscan) == CURLYX && data 
550                       && !(data->flags & SF_HAS_PAR)
551                       && !(data->flags & SF_HAS_EVAL)
552                       && !deltanext  ) {
553                     /* XXXX How to optimize if data == 0? */
554                     /* Optimize to a simpler form.  */
555                     regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */
556                     regnode *nxt2;
557
558                     OP(oscan) = CURLYM;
559                     while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/
560                             && (OP(nxt2) != WHILEM)) 
561                         nxt = nxt2;
562                     OP(nxt2)  = SUCCEED; /* Whas WHILEM */
563                     /* Need to optimize away parenths. */
564                     if (data->flags & SF_IN_PAR) {
565                         /* Set the parenth number.  */
566                         regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
567
568                         if (OP(nxt) != CLOSE) 
569                             FAIL("panic opt close");
570                         oscan->flags = ARG(nxt);
571                         OP(nxt1) = OPTIMIZED;   /* was OPEN. */
572                         OP(nxt) = OPTIMIZED;    /* was CLOSE. */
573 #ifdef DEBUGGING
574                         OP(nxt1 + 1) = OPTIMIZED; /* was count. */
575                         OP(nxt + 1) = OPTIMIZED; /* was count. */
576                         NEXT_OFF(nxt1 + 1) = 0; /* just for consistancy. */
577                         NEXT_OFF(nxt + 1) = 0; /* just for consistancy. */
578 #endif 
579 #if 0
580                         while ( nxt1 && (OP(nxt1) != WHILEM)) {
581                             regnode *nnxt = regnext(nxt1);
582                             
583                             if (nnxt == nxt) {
584                                 if (reg_off_by_arg[OP(nxt1)])
585                                     ARG_SET(nxt1, nxt2 - nxt1);
586                                 else if (nxt2 - nxt1 < U16_MAX)
587                                     NEXT_OFF(nxt1) = nxt2 - nxt1;
588                                 else
589                                     OP(nxt) = NOTHING;  /* Cannot beautify */
590                             }
591                             nxt1 = nnxt;
592                         }
593 #endif
594                         /* Optimize again: */
595                         study_chunk(&nxt1, &deltanext, nxt, NULL, 0);
596                     }
597                     else
598                         oscan->flags = 0;
599                 }
600                 if (data && fl & (SF_HAS_PAR|SF_IN_PAR)) 
601                     pars++;
602                 if (flags & SCF_DO_SUBSTR) {
603                     SV *last_str = Nullsv;
604                     int counted = mincount != 0;
605
606                     if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
607                         I32 b = pos_before >= data->last_start_min 
608                             ? pos_before : data->last_start_min;
609                         STRLEN l;
610                         char *s = SvPV(data->last_found, l);
611                         I32 old = b - data->last_start_min;
612
613                         if (UTF)
614                             old = utf8_hop((U8*)s, old) - (U8*)s;
615                         
616                         l -= old;
617                         /* Get the added string: */
618                         last_str = newSVpv(s  + old, l);
619                         if (deltanext == 0 && pos_before == b) {
620                             /* What was added is a constant string */
621                             if (mincount > 1) {
622                                 SvGROW(last_str, (mincount * l) + 1);
623                                 repeatcpy(SvPVX(last_str) + l, 
624                                           SvPVX(last_str), l, mincount - 1);
625                                 SvCUR(last_str) *= mincount;
626                                 /* Add additional parts. */
627                                 SvCUR_set(data->last_found, 
628                                           SvCUR(data->last_found) - l);
629                                 sv_catsv(data->last_found, last_str);
630                                 data->last_end += l * (mincount - 1);
631                             }
632                         }
633                     }
634                     /* It is counted once already... */
635                     data->pos_min += minnext * (mincount - counted);
636                     data->pos_delta += - counted * deltanext +
637                         (minnext + deltanext) * maxcount - minnext * mincount;
638                     if (mincount != maxcount) {
639                         scan_commit(data);
640                         if (mincount && last_str) {
641                             sv_setsv(data->last_found, last_str);
642                             data->last_end = data->pos_min;
643                             data->last_start_min = 
644                                 data->pos_min - CHR_SVLEN(last_str);
645                             data->last_start_max = is_inf 
646                                 ? I32_MAX 
647                                 : data->pos_min + data->pos_delta
648                                 - CHR_SVLEN(last_str);
649                         }
650                         data->longest = &(data->longest_float);
651                     }
652                     SvREFCNT_dec(last_str);
653                 }
654                 if (data && (fl & SF_HAS_EVAL))
655                     data->flags |= SF_HAS_EVAL;
656               optimize_curly_tail:
657                 if (OP(oscan) != CURLYX) {
658                     while (PL_regkind[(U8)OP(next = regnext(oscan))] == NOTHING
659                            && NEXT_OFF(next))
660                         NEXT_OFF(oscan) += NEXT_OFF(next);
661                 }
662                 continue;
663             default:                    /* REF only? */
664                 if (flags & SCF_DO_SUBSTR) {
665                     scan_commit(data);
666                     data->longest = &(data->longest_float);
667                 }
668                 is_inf = is_inf_internal = 1;
669                 break;
670             }
671         }
672         else if (strchr(PL_simple,OP(scan)) || PL_regkind[(U8)OP(scan)] == ANYUTF8) {
673             if (flags & SCF_DO_SUBSTR) {
674                 scan_commit(data);
675                 data->pos_min++;
676             }
677             min++;
678         }
679         else if (PL_regkind[(U8)OP(scan)] == EOL && flags & SCF_DO_SUBSTR) {
680             data->flags |= (OP(scan) == MEOL
681                             ? SF_BEFORE_MEOL
682                             : SF_BEFORE_SEOL);
683         }
684         else if (PL_regkind[(U8)OP(scan)] == BRANCHJ
685                    && (scan->flags || data)
686                    && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) {
687             I32 deltanext, minnext;
688             regnode *nscan;
689
690             data_fake.flags = 0;
691             next = regnext(scan);
692             nscan = NEXTOPER(NEXTOPER(scan));
693             minnext = study_chunk(&nscan, &deltanext, last, &data_fake, 0);
694             if (scan->flags) {
695                 if (deltanext) {
696                     FAIL("variable length lookbehind not implemented");
697                 }
698                 else if (minnext > U8_MAX) {
699                     FAIL2("lookbehind longer than %d not implemented", U8_MAX);
700                 }
701                 scan->flags = minnext;
702             }
703             if (data && data_fake.flags & (SF_HAS_PAR|SF_IN_PAR))
704                 pars++;
705             if (data && (data_fake.flags & SF_HAS_EVAL))
706                 data->flags |= SF_HAS_EVAL;
707         }
708         else if (OP(scan) == OPEN) {
709             pars++;
710         }
711         else if (OP(scan) == CLOSE && ARG(scan) == is_par) {
712             next = regnext(scan);
713
714             if ( next && (OP(next) != WHILEM) && next < last)
715                 is_par = 0;             /* Disable optimization */
716         }
717         else if (OP(scan) == EVAL) {
718                 if (data)
719                     data->flags |= SF_HAS_EVAL;
720         }
721         else if (OP(scan) == LOGICAL && scan->flags == 2) { /* Embedded */
722                 if (flags & SCF_DO_SUBSTR) {
723                     scan_commit(data);
724                     data->longest = &(data->longest_float);
725                 }
726                 is_inf = is_inf_internal = 1;
727         }
728         /* Else: zero-length, ignore. */
729         scan = regnext(scan);
730     }
731
732   finish:
733     *scanp = scan;
734     *deltap = is_inf_internal ? I32_MAX : delta;
735     if (flags & SCF_DO_SUBSTR && is_inf) 
736         data->pos_delta = I32_MAX - data->pos_min;
737     if (is_par > U8_MAX)
738         is_par = 0;
739     if (is_par && pars==1 && data) {
740         data->flags |= SF_IN_PAR;
741         data->flags &= ~SF_HAS_PAR;
742     }
743     else if (pars && data) {
744         data->flags |= SF_HAS_PAR;
745         data->flags &= ~SF_IN_PAR;
746     }
747     return min;
748 }
749
750 STATIC I32
751 add_data(I32 n, char *s)
752 {
753     dTHR;
754     if (PL_regcomp_rx->data) {
755         Renewc(PL_regcomp_rx->data, 
756                sizeof(*PL_regcomp_rx->data) + sizeof(void*) * (PL_regcomp_rx->data->count + n - 1), 
757                char, struct reg_data);
758         Renew(PL_regcomp_rx->data->what, PL_regcomp_rx->data->count + n, U8);
759         PL_regcomp_rx->data->count += n;
760     }
761     else {
762         Newc(1207, PL_regcomp_rx->data, sizeof(*PL_regcomp_rx->data) + sizeof(void*) * (n - 1),
763              char, struct reg_data);
764         New(1208, PL_regcomp_rx->data->what, n, U8);
765         PL_regcomp_rx->data->count = n;
766     }
767     Copy(s, PL_regcomp_rx->data->what + PL_regcomp_rx->data->count - n, n, U8);
768     return PL_regcomp_rx->data->count - n;
769 }
770
771 void
772 reginitcolors(void)
773 {
774     dTHR;
775     int i = 0;
776     char *s = PerlEnv_getenv("PERL_RE_COLORS");
777             
778     if (s) {
779         PL_colors[0] = s = savepv(s);
780         while (++i < 6) {
781             s = strchr(s, '\t');
782             if (s) {
783                 *s = '\0';
784                 PL_colors[i] = ++s;
785             }
786             else
787                 PL_colors[i] = s = "";
788         }
789     } else {
790         while (i < 6) 
791             PL_colors[i++] = "";
792     }
793     PL_colorset = 1;
794 }
795
796 /*
797  - pregcomp - compile a regular expression into internal code
798  *
799  * We can't allocate space until we know how big the compiled form will be,
800  * but we can't compile it (and thus know how big it is) until we've got a
801  * place to put the code.  So we cheat:  we compile it twice, once with code
802  * generation turned off and size counting turned on, and once "for real".
803  * This also means that we don't allocate space until we are sure that the
804  * thing really will compile successfully, and we never have to move the
805  * code and thus invalidate pointers into it.  (Note that it has to be in
806  * one piece because free() must be able to free it all.) [NB: not true in perl]
807  *
808  * Beware that the optimization-preparation code in here knows about some
809  * of the structure of the compiled regexp.  [I'll say.]
810  */
811 regexp *
812 pregcomp(char *exp, char *xend, PMOP *pm)
813 {
814     dTHR;
815     register regexp *r;
816     regnode *scan;
817     SV **longest;
818     SV *longest_fixed;
819     SV *longest_float;
820     regnode *first;
821     I32 flags;
822     I32 minlen = 0;
823     I32 sawplus = 0;
824     I32 sawopen = 0;
825
826     if (exp == NULL)
827         FAIL("NULL regexp argument");
828
829     if (PL_curcop == &PL_compiling ? (PL_hints & HINT_UTF8) : IN_UTF8)
830         PL_reg_flags |= RF_utf8;
831     else
832         PL_reg_flags = 0;
833
834     PL_regprecomp = savepvn(exp, xend - exp);
835     DEBUG_r(if (!PL_colorset) reginitcolors());
836     DEBUG_r(PerlIO_printf(Perl_debug_log, "%sCompiling%s RE `%s%*s%s'\n",
837                       PL_colors[4],PL_colors[5],PL_colors[0],
838                       xend - exp, PL_regprecomp, PL_colors[1]));
839     PL_regflags = pm->op_pmflags;
840     PL_regsawback = 0;
841
842     PL_regseen = 0;
843     PL_seen_zerolen = *exp == '^' ? -1 : 0;
844     PL_seen_evals = 0;
845     PL_extralen = 0;
846
847     /* First pass: determine size, legality. */
848     PL_regcomp_parse = exp;
849     PL_regxend = xend;
850     PL_regnaughty = 0;
851     PL_regnpar = 1;
852     PL_regsize = 0L;
853     PL_regcode = &PL_regdummy;
854     regc((U8)REG_MAGIC, (char*)PL_regcode);
855     if (reg(0, &flags) == NULL) {
856         Safefree(PL_regprecomp);
857         PL_regprecomp = Nullch;
858         return(NULL);
859     }
860     DEBUG_r(PerlIO_printf(Perl_debug_log, "size %d ", PL_regsize));
861
862     /* Small enough for pointer-storage convention?
863        If extralen==0, this means that we will not need long jumps. */
864     if (PL_regsize >= 0x10000L && PL_extralen)
865         PL_regsize += PL_extralen;
866     else
867         PL_extralen = 0;
868
869     /* Allocate space and initialize. */
870     Newc(1001, r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode),
871          char, regexp);
872     if (r == NULL)
873         FAIL("regexp out of space");
874     r->refcnt = 1;
875     r->prelen = xend - exp;
876     r->precomp = PL_regprecomp;
877     r->subbeg = r->subbase = NULL;
878     r->nparens = PL_regnpar - 1;        /* set early to validate backrefs */
879
880     r->substrs = 0;                     /* Useful during FAIL. */
881     r->startp = 0;                      /* Useful during FAIL. */
882     r->endp = 0;                        /* Useful during FAIL. */
883
884     PL_regcomp_rx = r;
885
886     /* Second pass: emit code. */
887     PL_regcomp_parse = exp;
888     PL_regxend = xend;
889     PL_regnaughty = 0;
890     PL_regnpar = 1;
891     PL_regcode = r->program;
892     /* Store the count of eval-groups for security checks: */
893     PL_regcode->next_off = ((PL_seen_evals > U16_MAX) ? U16_MAX : PL_seen_evals);
894     regc((U8)REG_MAGIC, (char*) PL_regcode++);
895     r->data = 0;
896     if (reg(0, &flags) == NULL)
897         return(NULL);
898
899     /* Dig out information for optimizations. */
900     r->reganch = pm->op_pmflags & PMf_COMPILETIME;
901     pm->op_pmflags = PL_regflags;
902     if (UTF)
903         r->reganch |= ROPT_UTF8;
904     r->regstclass = NULL;
905     if (PL_regnaughty >= 10)    /* Probably an expensive pattern. */
906         r->reganch |= ROPT_NAUGHTY;
907     scan = r->program + 1;              /* First BRANCH. */
908
909     /* XXXX To minimize changes to RE engine we always allocate
910        3-units-long substrs field. */
911     Newz(1004, r->substrs, 1, struct reg_substr_data);
912
913     if (OP(scan) != BRANCH) {   /* Only one top-level choice. */
914         scan_data_t data;
915         I32 fake;
916         STRLEN longest_float_length, longest_fixed_length;
917
918         StructCopy(&zero_scan_data, &data, scan_data_t);
919         first = scan;
920         /* Skip introductions and multiplicators >= 1. */
921         while ((OP(first) == OPEN && (sawopen = 1)) ||
922             (OP(first) == BRANCH && OP(regnext(first)) != BRANCH) ||
923             (OP(first) == PLUS) ||
924             (OP(first) == MINMOD) ||
925             (PL_regkind[(U8)OP(first)] == CURLY && ARG1(first) > 0) ) {
926                 if (OP(first) == PLUS)
927                     sawplus = 1;
928                 else
929                     first += regarglen[(U8)OP(first)];
930                 first = NEXTOPER(first);
931         }
932
933         /* Starting-point info. */
934       again:
935         if (OP(first) == EXACT);        /* Empty, get anchored substr later. */
936         else if (strchr(PL_simple+4,OP(first)))
937             r->regstclass = first;
938         else if (PL_regkind[(U8)OP(first)] == BOUND ||
939                  PL_regkind[(U8)OP(first)] == NBOUND)
940             r->regstclass = first;
941         else if (PL_regkind[(U8)OP(first)] == BOL) {
942             r->reganch |= (OP(first) == MBOL ? ROPT_ANCH_MBOL: ROPT_ANCH_BOL);
943             first = NEXTOPER(first);
944             goto again;
945         }
946         else if (OP(first) == GPOS) {
947             r->reganch |= ROPT_ANCH_GPOS;
948             first = NEXTOPER(first);
949             goto again;
950         }
951         else if ((OP(first) == STAR &&
952             PL_regkind[(U8)OP(NEXTOPER(first))] == REG_ANY) &&
953             !(r->reganch & ROPT_ANCH) )
954         {
955             /* turn .* into ^.* with an implied $*=1 */
956             r->reganch |= ROPT_ANCH_BOL | ROPT_IMPLICIT;
957             first = NEXTOPER(first);
958             goto again;
959         }
960         if (sawplus && (!sawopen || !PL_regsawback))
961             r->reganch |= ROPT_SKIP;    /* x+ must match 1st of run */
962
963         /* Scan is after the zeroth branch, first is atomic matcher. */
964         DEBUG_r(PerlIO_printf(Perl_debug_log, "first at %d\n", 
965                               first - scan + 1));
966         /*
967         * If there's something expensive in the r.e., find the
968         * longest literal string that must appear and make it the
969         * regmust.  Resolve ties in favor of later strings, since
970         * the regstart check works with the beginning of the r.e.
971         * and avoiding duplication strengthens checking.  Not a
972         * strong reason, but sufficient in the absence of others.
973         * [Now we resolve ties in favor of the earlier string if
974         * it happens that c_offset_min has been invalidated, since the
975         * earlier string may buy us something the later one won't.]
976         */
977         minlen = 0;
978
979         data.longest_fixed = newSVpv("",0);
980         data.longest_float = newSVpv("",0);
981         data.last_found = newSVpv("",0);
982         data.longest = &(data.longest_fixed);
983         first = scan;
984         
985         minlen = study_chunk(&first, &fake, scan + PL_regsize, /* Up to end */
986                              &data, SCF_DO_SUBSTR);
987         if ( PL_regnpar == 1 && data.longest == &(data.longest_fixed)
988              && data.last_start_min == 0 && data.last_end > 0 
989              && !PL_seen_zerolen
990              && (!(PL_regseen & REG_SEEN_GPOS) || (r->reganch & ROPT_ANCH_GPOS)))
991             r->reganch |= ROPT_CHECK_ALL;
992         scan_commit(&data);
993         SvREFCNT_dec(data.last_found);
994
995         longest_float_length = CHR_SVLEN(data.longest_float);
996         if (longest_float_length
997             || (data.flags & SF_FL_BEFORE_EOL
998                 && (!(data.flags & SF_FL_BEFORE_MEOL)
999                     || (PL_regflags & PMf_MULTILINE)))) {
1000             if (SvCUR(data.longest_fixed)                       /* ok to leave SvCUR */
1001                 && data.offset_fixed == data.offset_float_min
1002                 && SvCUR(data.longest_fixed) == SvCUR(data.longest_float))
1003                     goto remove_float;          /* As in (a)+. */
1004
1005             r->float_substr = data.longest_float;
1006             r->float_min_offset = data.offset_float_min;
1007             r->float_max_offset = data.offset_float_max;
1008             fbm_compile(r->float_substr, 0);
1009             BmUSEFUL(r->float_substr) = 100;
1010             if (data.flags & SF_FL_BEFORE_EOL /* Cannot have SEOL and MULTI */
1011                 && (!(data.flags & SF_FL_BEFORE_MEOL)
1012                     || (PL_regflags & PMf_MULTILINE))) 
1013                 SvTAIL_on(r->float_substr);
1014         }
1015         else {
1016           remove_float:
1017             r->float_substr = Nullsv;
1018             SvREFCNT_dec(data.longest_float);
1019             longest_float_length = 0;
1020         }
1021
1022         longest_fixed_length = CHR_SVLEN(data.longest_fixed);
1023         if (longest_fixed_length
1024             || (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
1025                 && (!(data.flags & SF_FIX_BEFORE_MEOL)
1026                     || (PL_regflags & PMf_MULTILINE)))) {
1027             r->anchored_substr = data.longest_fixed;
1028             r->anchored_offset = data.offset_fixed;
1029             fbm_compile(r->anchored_substr, 0);
1030             BmUSEFUL(r->anchored_substr) = 100;
1031             if (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */
1032                 && (!(data.flags & SF_FIX_BEFORE_MEOL)
1033                     || (PL_regflags & PMf_MULTILINE)))
1034                 SvTAIL_on(r->anchored_substr);
1035         }
1036         else {
1037             r->anchored_substr = Nullsv;
1038             SvREFCNT_dec(data.longest_fixed);
1039             longest_fixed_length = 0;
1040         }
1041
1042         /* A temporary algorithm prefers floated substr to fixed one to dig more info. */
1043         if (longest_fixed_length > longest_float_length) {
1044             r->check_substr = r->anchored_substr;
1045             r->check_offset_min = r->check_offset_max = r->anchored_offset;
1046             if (r->reganch & ROPT_ANCH_SINGLE)
1047                 r->reganch |= ROPT_NOSCAN;
1048         }
1049         else {
1050             r->check_substr = r->float_substr;
1051             r->check_offset_min = data.offset_float_min;
1052             r->check_offset_max = data.offset_float_max;
1053         }
1054     }
1055     else {
1056         /* Several toplevels. Best we can is to set minlen. */
1057         I32 fake;
1058         
1059         DEBUG_r(PerlIO_printf(Perl_debug_log, "\n"));
1060         scan = r->program + 1;
1061         minlen = study_chunk(&scan, &fake, scan + PL_regsize, NULL, 0);
1062         r->check_substr = r->anchored_substr = r->float_substr = Nullsv;
1063     }
1064
1065     r->minlen = minlen;
1066     if (PL_regseen & REG_SEEN_GPOS) 
1067         r->reganch |= ROPT_GPOS_SEEN;
1068     if (PL_regseen & REG_SEEN_LOOKBEHIND)
1069         r->reganch |= ROPT_LOOKBEHIND_SEEN;
1070     if (PL_regseen & REG_SEEN_EVAL)
1071         r->reganch |= ROPT_EVAL_SEEN;
1072     Newz(1002, r->startp, PL_regnpar, char*);
1073     Newz(1002, r->endp, PL_regnpar, char*);
1074     DEBUG_r(regdump(r));
1075     return(r);
1076 }
1077
1078 /*
1079  - reg - regular expression, i.e. main body or parenthesized thing
1080  *
1081  * Caller must absorb opening parenthesis.
1082  *
1083  * Combining parenthesis handling with the base level of regular expression
1084  * is a trifle forced, but the need to tie the tails of the branches to what
1085  * follows makes it hard to avoid.
1086  */
1087 STATIC regnode *
1088 reg(I32 paren, I32 *flagp)
1089     /* paren: Parenthesized? 0=top, 1=(, inside: changed to letter. */
1090 {
1091     dTHR;
1092     register regnode *ret;              /* Will be the head of the group. */
1093     register regnode *br;
1094     register regnode *lastbr;
1095     register regnode *ender = 0;
1096     register I32 parno = 0;
1097     I32 flags, oregflags = PL_regflags, have_branch = 0, open = 0;
1098     char c;
1099
1100     *flagp = 0;                         /* Tentatively. */
1101
1102     /* Make an OPEN node, if parenthesized. */
1103     if (paren) {
1104         if (*PL_regcomp_parse == '?') {
1105             U16 posflags = 0, negflags = 0;
1106             U16 *flagsp = &posflags;
1107             int logical = 0;
1108
1109             PL_regcomp_parse++;
1110             paren = *PL_regcomp_parse++;
1111             ret = NULL;                 /* For look-ahead/behind. */
1112             switch (paren) {
1113             case '<':
1114                 PL_regseen |= REG_SEEN_LOOKBEHIND;
1115                 if (*PL_regcomp_parse == '!') 
1116                     paren = ',';
1117                 if (*PL_regcomp_parse != '=' && *PL_regcomp_parse != '!') 
1118                     goto unknown;
1119                 PL_regcomp_parse++;
1120             case '=':
1121             case '!':
1122                 PL_seen_zerolen++;
1123             case ':':
1124             case '>':
1125                 break;
1126             case '$':
1127             case '@':
1128                 FAIL2("Sequence (?%c...) not implemented", (int)paren);
1129                 break;
1130             case '#':
1131                 while (*PL_regcomp_parse && *PL_regcomp_parse != ')')
1132                     PL_regcomp_parse++;
1133                 if (*PL_regcomp_parse != ')')
1134                     FAIL("Sequence (?#... not terminated");
1135                 nextchar();
1136                 *flagp = TRYAGAIN;
1137                 return NULL;
1138             case 'p':
1139                 logical = 1;
1140                 paren = *PL_regcomp_parse++;
1141                 /* FALL THROUGH */
1142             case '{':
1143             {
1144                 dTHR;
1145                 I32 count = 1, n = 0;
1146                 char c;
1147                 char *s = PL_regcomp_parse;
1148                 SV *sv;
1149                 OP_4tree *sop, *rop;
1150
1151                 PL_seen_zerolen++;
1152                 PL_regseen |= REG_SEEN_EVAL;
1153                 while (count && (c = *PL_regcomp_parse)) {
1154                     if (c == '\\' && PL_regcomp_parse[1])
1155                         PL_regcomp_parse++;
1156                     else if (c == '{') 
1157                         count++;
1158                     else if (c == '}') 
1159                         count--;
1160                     PL_regcomp_parse++;
1161                 }
1162                 if (*PL_regcomp_parse != ')')
1163                     FAIL("Sequence (?{...}) not terminated or not {}-balanced");
1164                 if (!SIZE_ONLY) {
1165                     AV *av;
1166                     
1167                     if (PL_regcomp_parse - 1 - s) 
1168                         sv = newSVpv(s, PL_regcomp_parse - 1 - s);
1169                     else
1170                         sv = newSVpv("", 0);
1171
1172                     rop = sv_compile_2op(sv, &sop, "re", &av);
1173
1174                     n = add_data(3, "nso");
1175                     PL_regcomp_rx->data->data[n] = (void*)rop;
1176                     PL_regcomp_rx->data->data[n+1] = (void*)av;
1177                     PL_regcomp_rx->data->data[n+2] = (void*)sop;
1178                     SvREFCNT_dec(sv);
1179                 }
1180                 else {                                          /* First pass */
1181                     if (PL_reginterp_cnt < ++PL_seen_evals
1182                         && PL_curcop != &PL_compiling)
1183                         /* No compiled RE interpolated, has runtime
1184                            components ===> unsafe.  */
1185                         FAIL("Eval-group not allowed at runtime, use re 'eval'");
1186                     if (PL_tainted)
1187                         FAIL("Eval-group in insecure regular expression");
1188                 }
1189                 
1190                 nextchar();
1191                 if (logical) {
1192                     ret = reg_node(LOGICAL);
1193                     if (!SIZE_ONLY)
1194                         ret->flags = 2;
1195                     regtail(ret, reganode(EVAL, n));
1196                     return ret;
1197                 }
1198                 return reganode(EVAL, n);
1199             }
1200             case '(':
1201             {
1202                 if (PL_regcomp_parse[0] == '?') {
1203                     if (PL_regcomp_parse[1] == '=' || PL_regcomp_parse[1] == '!' 
1204                         || PL_regcomp_parse[1] == '<' 
1205                         || PL_regcomp_parse[1] == '{') { /* Lookahead or eval. */
1206                         I32 flag;
1207                         
1208                         ret = reg_node(LOGICAL);
1209                         if (!SIZE_ONLY)
1210                             ret->flags = 1;
1211                         regtail(ret, reg(1, &flag));
1212                         goto insert_if;
1213                     } 
1214                 }
1215                 else if (PL_regcomp_parse[0] >= '1' && PL_regcomp_parse[0] <= '9' ) {
1216                     parno = atoi(PL_regcomp_parse++);
1217
1218                     while (isDIGIT(*PL_regcomp_parse))
1219                         PL_regcomp_parse++;
1220                     ret = reganode(GROUPP, parno);
1221                     if ((c = *nextchar()) != ')')
1222                         FAIL2("Switch (?(number%c not recognized", c);
1223                   insert_if:
1224                     regtail(ret, reganode(IFTHEN, 0));
1225                     br = regbranch(&flags, 1);
1226                     if (br == NULL)
1227                         br = reganode(LONGJMP, 0);
1228                     else
1229                         regtail(br, reganode(LONGJMP, 0));
1230                     c = *nextchar();
1231                     if (flags&HASWIDTH)
1232                         *flagp |= HASWIDTH;
1233                     if (c == '|') {
1234                         lastbr = reganode(IFTHEN, 0); /* Fake one for optimizer. */
1235                         regbranch(&flags, 1);
1236                         regtail(ret, lastbr);
1237                         if (flags&HASWIDTH)
1238                             *flagp |= HASWIDTH;
1239                         c = *nextchar();
1240                     }
1241                     else
1242                         lastbr = NULL;
1243                     if (c != ')')
1244                         FAIL("Switch (?(condition)... contains too many branches");
1245                     ender = reg_node(TAIL);
1246                     regtail(br, ender);
1247                     if (lastbr) {
1248                         regtail(lastbr, ender);
1249                         regtail(NEXTOPER(NEXTOPER(lastbr)), ender);
1250                     }
1251                     else
1252                         regtail(ret, ender);
1253                     return ret;
1254                 }
1255                 else {
1256                     FAIL2("Unknown condition for (?(%.2s", PL_regcomp_parse);
1257                 }
1258             }
1259             case 0:
1260                 FAIL("Sequence (? incomplete");
1261                 break;
1262             default:
1263                 --PL_regcomp_parse;
1264               parse_flags:
1265                 while (*PL_regcomp_parse && strchr("iogcmsx", *PL_regcomp_parse)) {
1266                     if (*PL_regcomp_parse != 'o')
1267                         pmflag(flagsp, *PL_regcomp_parse);
1268                     ++PL_regcomp_parse;
1269                 }
1270                 if (*PL_regcomp_parse == '-') {
1271                     flagsp = &negflags;
1272                     ++PL_regcomp_parse;
1273                     goto parse_flags;
1274                 }
1275                 PL_regflags |= posflags;
1276                 PL_regflags &= ~negflags;
1277                 if (*PL_regcomp_parse == ':') {
1278                     PL_regcomp_parse++;
1279                     paren = ':';
1280                     break;
1281                 }               
1282               unknown:
1283                 if (*PL_regcomp_parse != ')')
1284                     FAIL2("Sequence (?%c...) not recognized", *PL_regcomp_parse);
1285                 nextchar();
1286                 *flagp = TRYAGAIN;
1287                 return NULL;
1288             }
1289         }
1290         else {
1291             parno = PL_regnpar;
1292             PL_regnpar++;
1293             ret = reganode(OPEN, parno);
1294             open = 1;
1295         }
1296     }
1297     else
1298         ret = NULL;
1299
1300     /* Pick up the branches, linking them together. */
1301     br = regbranch(&flags, 1);
1302     if (br == NULL)
1303         return(NULL);
1304     if (*PL_regcomp_parse == '|') {
1305         if (!SIZE_ONLY && PL_extralen) {
1306             reginsert(BRANCHJ, br);
1307         }
1308         else
1309             reginsert(BRANCH, br);
1310         have_branch = 1;
1311         if (SIZE_ONLY)
1312             PL_extralen += 1;           /* For BRANCHJ-BRANCH. */
1313     }
1314     else if (paren == ':') {
1315         *flagp |= flags&SIMPLE;
1316     }
1317     if (open) {                         /* Starts with OPEN. */
1318         regtail(ret, br);               /* OPEN -> first. */
1319     }
1320     else if (paren != '?')              /* Not Conditional */
1321         ret = br;
1322     if (flags&HASWIDTH)
1323         *flagp |= HASWIDTH;
1324     *flagp |= flags&SPSTART;
1325     lastbr = br;
1326     while (*PL_regcomp_parse == '|') {
1327         if (!SIZE_ONLY && PL_extralen) {
1328             ender = reganode(LONGJMP,0);
1329             regtail(NEXTOPER(NEXTOPER(lastbr)), ender); /* Append to the previous. */
1330         }
1331         if (SIZE_ONLY)
1332             PL_extralen += 2;           /* Account for LONGJMP. */
1333         nextchar();
1334         br = regbranch(&flags, 0);
1335         if (br == NULL)
1336             return(NULL);
1337         regtail(lastbr, br);            /* BRANCH -> BRANCH. */
1338         lastbr = br;
1339         if (flags&HASWIDTH)
1340             *flagp |= HASWIDTH;
1341         *flagp |= flags&SPSTART;
1342     }
1343
1344     if (have_branch || paren != ':') {
1345         /* Make a closing node, and hook it on the end. */
1346         switch (paren) {
1347         case ':':
1348             ender = reg_node(TAIL);
1349             break;
1350         case 1:
1351             ender = reganode(CLOSE, parno);
1352             break;
1353         case '<':
1354         case ',':
1355         case '=':
1356         case '!':
1357             *flagp &= ~HASWIDTH;
1358             /* FALL THROUGH */
1359         case '>':
1360             ender = reg_node(SUCCEED);
1361             break;
1362         case 0:
1363             ender = reg_node(END);
1364             break;
1365         }
1366         regtail(lastbr, ender);
1367
1368         if (have_branch) {
1369             /* Hook the tails of the branches to the closing node. */
1370             for (br = ret; br != NULL; br = regnext(br)) {
1371                 regoptail(br, ender);
1372             }
1373         }
1374     }
1375
1376     {
1377         char *p;
1378         static char parens[] = "=!<,>";
1379
1380         if (paren && (p = strchr(parens, paren))) {
1381             int node = ((p - parens) % 2) ? UNLESSM : IFMATCH;
1382             int flag = (p - parens) > 1;
1383
1384             if (paren == '>')
1385                 node = SUSPEND, flag = 0;
1386             reginsert(node,ret);
1387             ret->flags = flag;
1388             regtail(ret, reg_node(TAIL));
1389         }
1390     }
1391
1392     /* Check for proper termination. */
1393     if (paren && (PL_regcomp_parse >= PL_regxend || *nextchar() != ')')) {
1394         FAIL("unmatched () in regexp");
1395     }
1396     else if (!paren && PL_regcomp_parse < PL_regxend) {
1397         if (*PL_regcomp_parse == ')') {
1398             FAIL("unmatched () in regexp");
1399         }
1400         else
1401             FAIL("junk on end of regexp");      /* "Can't happen". */
1402         /* NOTREACHED */
1403     }
1404     if (paren != 0) {
1405         PL_regflags = oregflags;
1406     }
1407
1408     return(ret);
1409 }
1410
1411 /*
1412  - regbranch - one alternative of an | operator
1413  *
1414  * Implements the concatenation operator.
1415  */
1416 STATIC regnode *
1417 regbranch(I32 *flagp, I32 first)
1418 {
1419     dTHR;
1420     register regnode *ret;
1421     register regnode *chain = NULL;
1422     register regnode *latest;
1423     I32 flags = 0, c = 0;
1424
1425     if (first) 
1426         ret = NULL;
1427     else {
1428         if (!SIZE_ONLY && PL_extralen) 
1429             ret = reganode(BRANCHJ,0);
1430         else
1431             ret = reg_node(BRANCH);
1432     }
1433         
1434     if (!first && SIZE_ONLY) 
1435         PL_extralen += 1;                       /* BRANCHJ */
1436     
1437     *flagp = WORST;                     /* Tentatively. */
1438
1439     PL_regcomp_parse--;
1440     nextchar();
1441     while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != '|' && *PL_regcomp_parse != ')') {
1442         flags &= ~TRYAGAIN;
1443         latest = regpiece(&flags);
1444         if (latest == NULL) {
1445             if (flags & TRYAGAIN)
1446                 continue;
1447             return(NULL);
1448         }
1449         else if (ret == NULL)
1450             ret = latest;
1451         *flagp |= flags&HASWIDTH;
1452         if (chain == NULL)      /* First piece. */
1453             *flagp |= flags&SPSTART;
1454         else {
1455             PL_regnaughty++;
1456             regtail(chain, latest);
1457         }
1458         chain = latest;
1459         c++;
1460     }
1461     if (chain == NULL) {        /* Loop ran zero times. */
1462         chain = reg_node(NOTHING);
1463         if (ret == NULL)
1464             ret = chain;
1465     }
1466     if (c == 1) {
1467         *flagp |= flags&SIMPLE;
1468     }
1469
1470     return(ret);
1471 }
1472
1473 /*
1474  - regpiece - something followed by possible [*+?]
1475  *
1476  * Note that the branching code sequences used for ? and the general cases
1477  * of * and + are somewhat optimized:  they use the same NOTHING node as
1478  * both the endmarker for their branch list and the body of the last branch.
1479  * It might seem that this node could be dispensed with entirely, but the
1480  * endmarker role is not redundant.
1481  */
1482 STATIC regnode *
1483 regpiece(I32 *flagp)
1484 {
1485     dTHR;
1486     register regnode *ret;
1487     register char op;
1488     register char *next;
1489     I32 flags;
1490     char *origparse = PL_regcomp_parse;
1491     char *maxpos;
1492     I32 min;
1493     I32 max = REG_INFTY;
1494
1495     ret = regatom(&flags);
1496     if (ret == NULL) {
1497         if (flags & TRYAGAIN)
1498             *flagp |= TRYAGAIN;
1499         return(NULL);
1500     }
1501
1502     op = *PL_regcomp_parse;
1503
1504     if (op == '{' && regcurly(PL_regcomp_parse)) {
1505         next = PL_regcomp_parse + 1;
1506         maxpos = Nullch;
1507         while (isDIGIT(*next) || *next == ',') {
1508             if (*next == ',') {
1509                 if (maxpos)
1510                     break;
1511                 else
1512                     maxpos = next;
1513             }
1514             next++;
1515         }
1516         if (*next == '}') {             /* got one */
1517             if (!maxpos)
1518                 maxpos = next;
1519             PL_regcomp_parse++;
1520             min = atoi(PL_regcomp_parse);
1521             if (*maxpos == ',')
1522                 maxpos++;
1523             else
1524                 maxpos = PL_regcomp_parse;
1525             max = atoi(maxpos);
1526             if (!max && *maxpos != '0')
1527                 max = REG_INFTY;                /* meaning "infinity" */
1528             else if (max >= REG_INFTY)
1529                 FAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
1530             PL_regcomp_parse = next;
1531             nextchar();
1532
1533         do_curly:
1534             if ((flags&SIMPLE)) {
1535                 PL_regnaughty += 2 + PL_regnaughty / 2;
1536                 reginsert(CURLY, ret);
1537             }
1538             else {
1539                 PL_regnaughty += 4 + PL_regnaughty;     /* compound interest */
1540                 regtail(ret, reg_node(WHILEM));
1541                 if (!SIZE_ONLY && PL_extralen) {
1542                     reginsert(LONGJMP,ret);
1543                     reginsert(NOTHING,ret);
1544                     NEXT_OFF(ret) = 3;  /* Go over LONGJMP. */
1545                 }
1546                 reginsert(CURLYX,ret);
1547                 if (!SIZE_ONLY && PL_extralen)
1548                     NEXT_OFF(ret) = 3;  /* Go over NOTHING to LONGJMP. */
1549                 regtail(ret, reg_node(NOTHING));
1550                 if (SIZE_ONLY)
1551                     PL_extralen += 3;
1552             }
1553             ret->flags = 0;
1554
1555             if (min > 0)
1556                 *flagp = WORST;
1557             if (max > 0)
1558                 *flagp |= HASWIDTH;
1559             if (max && max < min)
1560                 FAIL("Can't do {n,m} with n > m");
1561             if (!SIZE_ONLY) {
1562                 ARG1_SET(ret, min);
1563                 ARG2_SET(ret, max);
1564             }
1565
1566             goto nest_check;
1567         }
1568     }
1569
1570     if (!ISMULT1(op)) {
1571         *flagp = flags;
1572         return(ret);
1573     }
1574
1575 #if 0                           /* Now runtime fix should be reliable. */
1576     if (!(flags&HASWIDTH) && op != '?')
1577       FAIL("regexp *+ operand could be empty");
1578 #endif 
1579
1580     nextchar();
1581
1582     *flagp = (op != '+') ? (WORST|SPSTART|HASWIDTH) : (WORST|HASWIDTH);
1583
1584     if (op == '*' && (flags&SIMPLE)) {
1585         reginsert(STAR, ret);
1586         ret->flags = 0;
1587         PL_regnaughty += 4;
1588     }
1589     else if (op == '*') {
1590         min = 0;
1591         goto do_curly;
1592     }
1593     else if (op == '+' && (flags&SIMPLE)) {
1594         reginsert(PLUS, ret);
1595         ret->flags = 0;
1596         PL_regnaughty += 3;
1597     }
1598     else if (op == '+') {
1599         min = 1;
1600         goto do_curly;
1601     }
1602     else if (op == '?') {
1603         min = 0; max = 1;
1604         goto do_curly;
1605     }
1606   nest_check:
1607     if (ckWARN(WARN_UNSAFE) && !SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3) {
1608         warner(WARN_UNSAFE, "%.*s matches null string many times",
1609             PL_regcomp_parse - origparse, origparse);
1610     }
1611
1612     if (*PL_regcomp_parse == '?') {
1613         nextchar();
1614         reginsert(MINMOD, ret);
1615         regtail(ret, ret + NODE_STEP_REGNODE);
1616     }
1617     if (ISMULT2(PL_regcomp_parse))
1618         FAIL("nested *?+ in regexp");
1619
1620     return(ret);
1621 }
1622
1623 /*
1624  - regatom - the lowest level
1625  *
1626  * Optimization:  gobbles an entire sequence of ordinary characters so that
1627  * it can turn them into a single node, which is smaller to store and
1628  * faster to run.  Backslashed characters are exceptions, each becoming a
1629  * separate node; the code is simpler that way and it's not worth fixing.
1630  *
1631  * [Yes, it is worth fixing, some scripts can run twice the speed.]
1632  */
1633 STATIC regnode *
1634 regatom(I32 *flagp)
1635 {
1636     dTHR;
1637     register regnode *ret = 0;
1638     I32 flags;
1639
1640     *flagp = WORST;             /* Tentatively. */
1641
1642 tryagain:
1643     switch (*PL_regcomp_parse) {
1644     case '^':
1645         PL_seen_zerolen++;
1646         nextchar();
1647         if (PL_regflags & PMf_MULTILINE)
1648             ret = reg_node(MBOL);
1649         else if (PL_regflags & PMf_SINGLELINE)
1650             ret = reg_node(SBOL);
1651         else
1652             ret = reg_node(BOL);
1653         break;
1654     case '$':
1655         if (PL_regcomp_parse[1]) 
1656             PL_seen_zerolen++;
1657         nextchar();
1658         if (PL_regflags & PMf_MULTILINE)
1659             ret = reg_node(MEOL);
1660         else if (PL_regflags & PMf_SINGLELINE)
1661             ret = reg_node(SEOL);
1662         else
1663             ret = reg_node(EOL);
1664         break;
1665     case '.':
1666         nextchar();
1667         if (UTF) {
1668             if (PL_regflags & PMf_SINGLELINE)
1669                 ret = reg_node(SANYUTF8);
1670             else
1671                 ret = reg_node(ANYUTF8);
1672             *flagp |= HASWIDTH;
1673         }
1674         else {
1675             if (PL_regflags & PMf_SINGLELINE)
1676                 ret = reg_node(SANY);
1677             else
1678                 ret = reg_node(REG_ANY);
1679             *flagp |= HASWIDTH|SIMPLE;
1680         }
1681         PL_regnaughty++;
1682         break;
1683     case '[':
1684         PL_regcomp_parse++;
1685         ret = (UTF ? regclassutf8() : regclass());
1686         if (*PL_regcomp_parse != ']')
1687             FAIL("unmatched [] in regexp");
1688         nextchar();
1689         *flagp |= HASWIDTH|SIMPLE;
1690         break;
1691     case '(':
1692         nextchar();
1693         ret = reg(1, &flags);
1694         if (ret == NULL) {
1695                 if (flags & TRYAGAIN)
1696                     goto tryagain;
1697                 return(NULL);
1698         }
1699         *flagp |= flags&(HASWIDTH|SPSTART|SIMPLE);
1700         break;
1701     case '|':
1702     case ')':
1703         if (flags & TRYAGAIN) {
1704             *flagp |= TRYAGAIN;
1705             return NULL;
1706         }
1707         FAIL2("internal urp in regexp at /%s/", PL_regcomp_parse);
1708                                 /* Supposed to be caught earlier. */
1709         break;
1710     case '{':
1711         if (!regcurly(PL_regcomp_parse)) {
1712             PL_regcomp_parse++;
1713             goto defchar;
1714         }
1715         /* FALL THROUGH */
1716     case '?':
1717     case '+':
1718     case '*':
1719         FAIL("?+*{} follows nothing in regexp");
1720         break;
1721     case '\\':
1722         switch (*++PL_regcomp_parse) {
1723         case 'A':
1724             PL_seen_zerolen++;
1725             ret = reg_node(SBOL);
1726             *flagp |= SIMPLE;
1727             nextchar();
1728             break;
1729         case 'G':
1730             ret = reg_node(GPOS);
1731             PL_regseen |= REG_SEEN_GPOS;
1732             *flagp |= SIMPLE;
1733             nextchar();
1734             break;
1735         case 'Z':
1736             ret = reg_node(SEOL);
1737             *flagp |= SIMPLE;
1738             nextchar();
1739             break;
1740         case 'z':
1741             ret = reg_node(EOS);
1742             *flagp |= SIMPLE;
1743             PL_seen_zerolen++;          /* Do not optimize RE away */
1744             nextchar();
1745             break;
1746         case 'C':
1747             ret = reg_node(SANY);
1748             *flagp |= HASWIDTH|SIMPLE;
1749             nextchar();
1750             break;
1751         case 'X':
1752             ret = reg_node(CLUMP);
1753             *flagp |= HASWIDTH;
1754             nextchar();
1755             if (UTF && !PL_utf8_mark)
1756                 is_utf8_mark((U8*)"~");         /* preload table */
1757             break;
1758         case 'w':
1759             ret = reg_node(
1760                 UTF
1761                     ? (LOC ? ALNUMLUTF8 : ALNUMUTF8)
1762                     : (LOC ? ALNUML     : ALNUM));
1763             *flagp |= HASWIDTH|SIMPLE;
1764             nextchar();
1765             if (UTF && !PL_utf8_alnum)
1766                 is_utf8_alnum((U8*)"a");        /* preload table */
1767             break;
1768         case 'W':
1769             ret = reg_node(
1770                 UTF
1771                     ? (LOC ? NALNUMLUTF8 : NALNUMUTF8)
1772                     : (LOC ? NALNUML     : NALNUM));
1773             *flagp |= HASWIDTH|SIMPLE;
1774             nextchar();
1775             if (UTF && !PL_utf8_alnum)
1776                 is_utf8_alnum((U8*)"a");        /* preload table */
1777             break;
1778         case 'b':
1779             PL_seen_zerolen++;
1780             ret = reg_node(
1781                 UTF
1782                     ? (LOC ? BOUNDLUTF8 : BOUNDUTF8)
1783                     : (LOC ? BOUNDL     : BOUND));
1784             *flagp |= SIMPLE;
1785             nextchar();
1786             if (UTF && !PL_utf8_alnum)
1787                 is_utf8_alnum((U8*)"a");        /* preload table */
1788             break;
1789         case 'B':
1790             PL_seen_zerolen++;
1791             ret = reg_node(
1792                 UTF
1793                     ? (LOC ? NBOUNDLUTF8 : NBOUNDUTF8)
1794                     : (LOC ? NBOUNDL     : NBOUND));
1795             *flagp |= SIMPLE;
1796             nextchar();
1797             if (UTF && !PL_utf8_alnum)
1798                 is_utf8_alnum((U8*)"a");        /* preload table */
1799             break;
1800         case 's':
1801             ret = reg_node(
1802                 UTF
1803                     ? (LOC ? SPACELUTF8 : SPACEUTF8)
1804                     : (LOC ? SPACEL     : SPACE));
1805             *flagp |= HASWIDTH|SIMPLE;
1806             nextchar();
1807             if (UTF && !PL_utf8_space)
1808                 is_utf8_space((U8*)" ");        /* preload table */
1809             break;
1810         case 'S':
1811             ret = reg_node(
1812                 UTF
1813                     ? (LOC ? NSPACELUTF8 : NSPACEUTF8)
1814                     : (LOC ? NSPACEL     : NSPACE));
1815             *flagp |= HASWIDTH|SIMPLE;
1816             nextchar();
1817             if (UTF && !PL_utf8_space)
1818                 is_utf8_space((U8*)" ");        /* preload table */
1819             break;
1820         case 'd':
1821             ret = reg_node(UTF ? DIGITUTF8 : DIGIT);
1822             *flagp |= HASWIDTH|SIMPLE;
1823             nextchar();
1824             if (UTF && !PL_utf8_digit)
1825                 is_utf8_digit((U8*)"1");        /* preload table */
1826             break;
1827         case 'D':
1828             ret = reg_node(UTF ? NDIGITUTF8 : NDIGIT);
1829             *flagp |= HASWIDTH|SIMPLE;
1830             nextchar();
1831             if (UTF && !PL_utf8_digit)
1832                 is_utf8_digit((U8*)"1");        /* preload table */
1833             break;
1834         case 'p':
1835         case 'P':
1836             {   /* a lovely hack--pretend we saw [\pX] instead */
1837                 char* oldregxend = PL_regxend;
1838
1839                 if (PL_regcomp_parse[1] == '{') {
1840                     PL_regxend = strchr(PL_regcomp_parse, '}');
1841                     if (!PL_regxend)
1842                         FAIL("Missing right brace on \\p{}");
1843                     PL_regxend++;
1844                 }
1845                 else
1846                     PL_regxend = PL_regcomp_parse + 2;
1847                 PL_regcomp_parse--;
1848
1849                 ret = regclassutf8();
1850
1851                 PL_regxend = oldregxend;
1852                 PL_regcomp_parse--;
1853                 nextchar();
1854                 *flagp |= HASWIDTH|SIMPLE;
1855             }
1856             break;
1857         case 'n':
1858         case 'r':
1859         case 't':
1860         case 'f':
1861         case 'e':
1862         case 'a':
1863         case 'x':
1864         case 'c':
1865         case '0':
1866             goto defchar;
1867         case '1': case '2': case '3': case '4':
1868         case '5': case '6': case '7': case '8': case '9':
1869             {
1870                 I32 num = atoi(PL_regcomp_parse);
1871
1872                 if (num > 9 && num >= PL_regnpar)
1873                     goto defchar;
1874                 else {
1875                     if (!SIZE_ONLY && num > PL_regcomp_rx->nparens)
1876                         FAIL("reference to nonexistent group");
1877                     PL_regsawback = 1;
1878                     ret = reganode(FOLD
1879                                    ? (LOC ? REFFL : REFF)
1880                                    : REF, num);
1881                     *flagp |= HASWIDTH;
1882                     while (isDIGIT(*PL_regcomp_parse))
1883                         PL_regcomp_parse++;
1884                     PL_regcomp_parse--;
1885                     nextchar();
1886                 }
1887             }
1888             break;
1889         case '\0':
1890             if (PL_regcomp_parse >= PL_regxend)
1891                 FAIL("trailing \\ in regexp");
1892             /* FALL THROUGH */
1893         default:
1894             /* Do not generate `unrecognized' warnings here, we fall
1895                back into the quick-grab loop below */
1896             goto defchar;
1897         }
1898         break;
1899
1900     case '#':
1901         if (PL_regflags & PMf_EXTENDED) {
1902             while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != '\n') PL_regcomp_parse++;
1903             if (PL_regcomp_parse < PL_regxend)
1904                 goto tryagain;
1905         }
1906         /* FALL THROUGH */
1907
1908     default: {
1909             register I32 len;
1910             register UV ender;
1911             register char *p;
1912             char *oldp, *s;
1913             I32 numlen;
1914
1915             PL_regcomp_parse++;
1916
1917         defchar:
1918             ret = reg_node(FOLD
1919                           ? (LOC ? EXACTFL : EXACTF)
1920                           : EXACT);
1921             s = (char *) OPERAND(ret);
1922             regc(0, s++);               /* save spot for len */
1923             for (len = 0, p = PL_regcomp_parse - 1;
1924               len < 127 && p < PL_regxend;
1925               len++)
1926             {
1927                 oldp = p;
1928
1929                 if (PL_regflags & PMf_EXTENDED)
1930                     p = regwhite(p, PL_regxend);
1931                 switch (*p) {
1932                 case '^':
1933                 case '$':
1934                 case '.':
1935                 case '[':
1936                 case '(':
1937                 case ')':
1938                 case '|':
1939                     goto loopdone;
1940                 case '\\':
1941                     switch (*++p) {
1942                     case 'A':
1943                     case 'G':
1944                     case 'Z':
1945                     case 'z':
1946                     case 'w':
1947                     case 'W':
1948                     case 'b':
1949                     case 'B':
1950                     case 's':
1951                     case 'S':
1952                     case 'd':
1953                     case 'D':
1954                     case 'p':
1955                     case 'P':
1956                         --p;
1957                         goto loopdone;
1958                     case 'n':
1959                         ender = '\n';
1960                         p++;
1961                         break;
1962                     case 'r':
1963                         ender = '\r';
1964                         p++;
1965                         break;
1966                     case 't':
1967                         ender = '\t';
1968                         p++;
1969                         break;
1970                     case 'f':
1971                         ender = '\f';
1972                         p++;
1973                         break;
1974                     case 'e':
1975                         ender = '\033';
1976                         p++;
1977                         break;
1978                     case 'a':
1979                         ender = '\007';
1980                         p++;
1981                         break;
1982                     case 'x':
1983                         if (*++p == '{') {
1984                             char* e = strchr(p, '}');
1985          
1986                             if (!e)
1987                                 FAIL("Missing right brace on \\x{}");
1988                             else if (UTF) {
1989                                 ender = scan_hex(p + 1, e - p, &numlen);
1990                                 if (numlen + len >= 127) {      /* numlen is generous */
1991                                     p--;
1992                                     goto loopdone;
1993                                 }
1994                                 p = e + 1;
1995                             }
1996                             else
1997                                 FAIL("Can't use \\x{} without 'use utf8' declaration");
1998                         }
1999                         else {
2000                             ender = scan_hex(p, 2, &numlen);
2001                             p += numlen;
2002                         }
2003                         break;
2004                     case 'c':
2005                         p++;
2006                         ender = UCHARAT(p++);
2007                         ender = toCTRL(ender);
2008                         break;
2009                     case '0': case '1': case '2': case '3':case '4':
2010                     case '5': case '6': case '7': case '8':case '9':
2011                         if (*p == '0' ||
2012                           (isDIGIT(p[1]) && atoi(p) >= PL_regnpar) ) {
2013                             ender = scan_oct(p, 3, &numlen);
2014                             p += numlen;
2015                         }
2016                         else {
2017                             --p;
2018                             goto loopdone;
2019                         }
2020                         break;
2021                     case '\0':
2022                         if (p >= PL_regxend)
2023                             FAIL("trailing \\ in regexp");
2024                         /* FALL THROUGH */
2025                     default:
2026                         if (!SIZE_ONLY && ckWARN(WARN_UNSAFE) && isALPHA(*p))
2027                             warner(WARN_UNSAFE, 
2028                                    "/%.127s/: Unrecognized escape \\%c passed through",
2029                                    PL_regprecomp,
2030                                    *p);
2031                         goto normal_default;
2032                     }
2033                     break;
2034                 default:
2035                   normal_default:
2036                     if ((*p & 0xc0) == 0xc0 && UTF) {
2037                         ender = utf8_to_uv((U8*)p, &numlen);
2038                         p += numlen;
2039                     }
2040                     else
2041                         ender = *p++;
2042                     break;
2043                 }
2044                 if (PL_regflags & PMf_EXTENDED)
2045                     p = regwhite(p, PL_regxend);
2046                 if (UTF && FOLD) {
2047                     if (LOC)
2048                         ender = toLOWER_LC_uni(ender);
2049                     else
2050                         ender = toLOWER_uni(ender);
2051                 }
2052                 if (ISMULT2(p)) { /* Back off on ?+*. */
2053                     if (len)
2054                         p = oldp;
2055                     else if (ender >= 0x80 && UTF) {
2056                         reguni(ender, s, &numlen);
2057                         s += numlen;
2058                         len += numlen;
2059                     }
2060                     else {
2061                         len++;
2062                         regc(ender, s++);
2063                     }
2064                     break;
2065                 }
2066                 if (ender >= 0x80 && UTF) {
2067                     reguni(ender, s, &numlen);
2068                     s += numlen;
2069                     len += numlen - 1;
2070                 }
2071                 else
2072                     regc(ender, s++);
2073             }
2074         loopdone:
2075             PL_regcomp_parse = p - 1;
2076             nextchar();
2077             if (len < 0)
2078                 FAIL("internal disaster in regexp");
2079             if (len > 0)
2080                 *flagp |= HASWIDTH;
2081             if (len == 1)
2082                 *flagp |= SIMPLE;
2083             if (!SIZE_ONLY)
2084                 *OPERAND(ret) = len;
2085             regc('\0', s++);
2086             if (SIZE_ONLY) {
2087                 PL_regsize += (len + 2 + sizeof(regnode) - 1) / sizeof(regnode);
2088             }
2089             else {
2090                 PL_regcode += (len + 2 + sizeof(regnode) - 1) / sizeof(regnode);
2091             }
2092         }
2093         break;
2094     }
2095
2096     return(ret);
2097 }
2098
2099 STATIC char *
2100 regwhite(char *p, char *e)
2101 {
2102     while (p < e) {
2103         if (isSPACE(*p))
2104             ++p;
2105         else if (*p == '#') {
2106             do {
2107                 p++;
2108             } while (p < e && *p != '\n');
2109         }
2110         else
2111             break;
2112     }
2113     return p;
2114 }
2115
2116 /* parse POSIX character classes like [[:foo:]] */
2117 STATIC char*
2118 regpposixcc(I32 value)
2119 {
2120     dTHR;
2121     char *posixcc = 0;
2122
2123     if (value == '[' && PL_regcomp_parse + 1 < PL_regxend &&
2124         /* I smell either [: or [= or [. -- POSIX has been here, right? */
2125         (*PL_regcomp_parse == ':' ||
2126          *PL_regcomp_parse == '=' ||
2127          *PL_regcomp_parse == '.')) {
2128         char  c = *PL_regcomp_parse;
2129         char* s = PL_regcomp_parse++;
2130             
2131         while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != c)
2132             PL_regcomp_parse++;
2133         if (PL_regcomp_parse == PL_regxend)
2134             /* Grandfather lone [:, [=, [. */
2135             PL_regcomp_parse = s;
2136         else {
2137             PL_regcomp_parse++; /* skip over the c */
2138             if (*PL_regcomp_parse == ']') {
2139                 /* Not Implemented Yet.
2140                  * (POSIX Extended Character Classes, that is)
2141                  * The text between e.g. [: and :] would start
2142                  * at s + 1 and stop at regcomp_parse - 2. */
2143                 if (ckWARN(WARN_UNSAFE) && !SIZE_ONLY)
2144                     warner(WARN_UNSAFE,
2145                            "Character class syntax [%c %c] is reserved for future extensions", c, c);
2146                 PL_regcomp_parse++; /* skip over the ending ] */
2147                 posixcc = s + 1;
2148             }
2149         }
2150     }
2151
2152     return posixcc;
2153 }
2154
2155 STATIC regnode *
2156 regclass(void)
2157 {
2158     dTHR;
2159     register char *opnd, *s;
2160     register I32 value;
2161     register I32 lastvalue = 1234;
2162     register I32 range = 0;
2163     register regnode *ret;
2164     register I32 def;
2165     I32 numlen;
2166
2167     s = opnd = (char *) OPERAND(PL_regcode);
2168     ret = reg_node(ANYOF);
2169     for (value = 0; value < 33; value++)
2170         regc(0, s++);
2171     if (*PL_regcomp_parse == '^') {     /* Complement of range. */
2172         PL_regnaughty++;
2173         PL_regcomp_parse++;
2174         if (!SIZE_ONLY)
2175             *opnd |= ANYOF_INVERT;
2176     }
2177     if (!SIZE_ONLY) {
2178         PL_regcode += ANY_SKIP;
2179         if (FOLD)
2180             *opnd |= ANYOF_FOLD;
2181         if (LOC)
2182             *opnd |= ANYOF_LOCALE;
2183     }
2184     else {
2185         PL_regsize += ANY_SKIP;
2186     }
2187     if (*PL_regcomp_parse == ']' || *PL_regcomp_parse == '-')
2188         goto skipcond;          /* allow 1st char to be ] or - */
2189     while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != ']') {
2190        skipcond:
2191         value = UCHARAT(PL_regcomp_parse++);
2192         if (value == '[')
2193             (void)regpposixcc(value); /* ignore the return value for now */
2194         else if (value == '\\') {
2195             value = UCHARAT(PL_regcomp_parse++);
2196             switch (value) {
2197             case 'w':
2198                 if (!SIZE_ONLY) {
2199                     if (LOC)
2200                         *opnd |= ANYOF_ALNUML;
2201                     else {
2202                         for (value = 0; value < 256; value++)
2203                             if (isALNUM(value))
2204                                 ANYOF_SET(opnd, value);
2205                     }
2206                 }
2207                 lastvalue = 1234;
2208                 continue;
2209             case 'W':
2210                 if (!SIZE_ONLY) {
2211                     if (LOC)
2212                         *opnd |= ANYOF_NALNUML;
2213                     else {
2214                         for (value = 0; value < 256; value++)
2215                             if (!isALNUM(value))
2216                                 ANYOF_SET(opnd, value);
2217                     }
2218                 }
2219                 lastvalue = 1234;
2220                 continue;
2221             case 's':
2222                 if (!SIZE_ONLY) {
2223                     if (LOC)
2224                         *opnd |= ANYOF_SPACEL;
2225                     else {
2226                         for (value = 0; value < 256; value++)
2227                             if (isSPACE(value))
2228                                 ANYOF_SET(opnd, value);
2229                     }
2230                 }
2231                 lastvalue = 1234;
2232                 continue;
2233             case 'S':
2234                 if (!SIZE_ONLY) {
2235                     if (LOC)
2236                         *opnd |= ANYOF_NSPACEL;
2237                     else {
2238                         for (value = 0; value < 256; value++)
2239                             if (!isSPACE(value))
2240                                 ANYOF_SET(opnd, value);
2241                     }
2242                 }
2243                 lastvalue = 1234;
2244                 continue;
2245             case 'd':
2246                 if (!SIZE_ONLY) {
2247                     for (value = '0'; value <= '9'; value++)
2248                         ANYOF_SET(opnd, value);
2249                 }
2250                 lastvalue = 1234;
2251                 continue;
2252             case 'D':
2253                 if (!SIZE_ONLY) {
2254                     for (value = 0; value < '0'; value++)
2255                         ANYOF_SET(opnd, value);
2256                     for (value = '9' + 1; value < 256; value++)
2257                         ANYOF_SET(opnd, value);
2258                 }
2259                 lastvalue = 1234;
2260                 continue;
2261             case 'n':
2262                 value = '\n';
2263                 break;
2264             case 'r':
2265                 value = '\r';
2266                 break;
2267             case 't':
2268                 value = '\t';
2269                 break;
2270             case 'f':
2271                 value = '\f';
2272                 break;
2273             case 'b':
2274                 value = '\b';
2275                 break;
2276             case 'e':
2277                 value = '\033';
2278                 break;
2279             case 'a':
2280                 value = '\007';
2281                 break;
2282             case 'x':
2283                 value = scan_hex(PL_regcomp_parse, 2, &numlen);
2284                 PL_regcomp_parse += numlen;
2285                 break;
2286             case 'c':
2287                 value = UCHARAT(PL_regcomp_parse++);
2288                 value = toCTRL(value);
2289                 break;
2290             case '0': case '1': case '2': case '3': case '4':
2291             case '5': case '6': case '7': case '8': case '9':
2292                 value = scan_oct(--PL_regcomp_parse, 3, &numlen);
2293                 PL_regcomp_parse += numlen;
2294                 break;
2295             }
2296         }
2297         if (range) {
2298             if (lastvalue > value)
2299                 FAIL("invalid [] range in regexp");
2300             range = 0;
2301         }
2302         else {
2303             lastvalue = value;
2304             if (*PL_regcomp_parse == '-' && PL_regcomp_parse+1 < PL_regxend &&
2305               PL_regcomp_parse[1] != ']') {
2306                 PL_regcomp_parse++;
2307                 range = 1;
2308                 continue;       /* do it next time */
2309             }
2310         }
2311         if (!SIZE_ONLY) {
2312 #ifndef ASCIIish
2313             if ((isLOWER(lastvalue) && isLOWER(value)) ||
2314                 (isUPPER(lastvalue) && isUPPER(value)))
2315             {
2316                 I32 i;
2317                 if (isLOWER(lastvalue)) {
2318                     for (i = lastvalue; i <= value; i++)
2319                         if (isLOWER(i))
2320                             ANYOF_SET(opnd, i);
2321                 } else {
2322                     for (i = lastvalue; i <= value; i++)
2323                         if (isUPPER(i))
2324                             ANYOF_SET(opnd, i);
2325                 }
2326             }
2327             else
2328 #endif
2329                 for ( ; lastvalue <= value; lastvalue++)
2330                     ANYOF_SET(opnd, lastvalue);
2331         }
2332         lastvalue = value;
2333     }
2334     /* optimize case-insensitive simple patterns (e.g. /[a-z]/i) */
2335     if (!SIZE_ONLY && (*opnd & (0xFF ^ ANYOF_INVERT)) == ANYOF_FOLD) {
2336         for (value = 0; value < 256; ++value) {
2337             if (ANYOF_TEST(opnd, value)) {
2338                 I32 cf = PL_fold[value];
2339                 ANYOF_SET(opnd, cf);
2340             }
2341         }
2342         *opnd &= ~ANYOF_FOLD;
2343     }
2344     /* optimize inverted simple patterns (e.g. [^a-z]) */
2345     if (!SIZE_ONLY && (*opnd & 0xFF) == ANYOF_INVERT) {
2346         for (value = 0; value < 32; ++value)
2347             opnd[1 + value] ^= 0xFF;
2348         *opnd = 0;
2349     }
2350     return ret;
2351 }
2352
2353 STATIC regnode *
2354 regclassutf8(void)
2355 {
2356     register char *opnd, *e;
2357     register U32 value;
2358     register U32 lastvalue = 123456;
2359     register I32 range = 0;
2360     register regnode *ret;
2361     I32 numlen;
2362     I32 n;
2363     SV *listsv;
2364     U8 flags = 0;
2365     dTHR;
2366
2367     if (*PL_regcomp_parse == '^') {     /* Complement of range. */
2368         PL_regnaughty++;
2369         PL_regcomp_parse++;
2370         if (!SIZE_ONLY)
2371             flags |= ANYOF_INVERT;
2372     }
2373     if (!SIZE_ONLY) {
2374         if (FOLD)
2375             flags |= ANYOF_FOLD;
2376         if (LOC)
2377             flags |= ANYOF_LOCALE;
2378         listsv = newSVpv("# comment\n",0);
2379     }
2380
2381     if (*PL_regcomp_parse == ']' || *PL_regcomp_parse == '-')
2382         goto skipcond;          /* allow 1st char to be ] or - */
2383
2384     while (PL_regcomp_parse < PL_regxend && *PL_regcomp_parse != ']') {
2385        skipcond:
2386         value = utf8_to_uv((U8*)PL_regcomp_parse, &numlen);
2387         PL_regcomp_parse += numlen;
2388
2389         if (value == '[')
2390             (void)regpposixcc(value); /* ignore the return value for now */
2391         else if (value == '\\') {
2392             value = utf8_to_uv((U8*)PL_regcomp_parse, &numlen);
2393             PL_regcomp_parse += numlen;
2394             switch (value) {
2395             case 'w':
2396                 if (!SIZE_ONLY) {
2397                     if (LOC)
2398                         flags |= ANYOF_ALNUML;
2399
2400                     sv_catpvf(listsv, "+utf8::IsAlnum\n");
2401                 }
2402                 lastvalue = 123456;
2403                 continue;
2404             case 'W':
2405                 if (!SIZE_ONLY) {
2406                     if (LOC)
2407                         flags |= ANYOF_NALNUML;
2408
2409                     sv_catpvf(listsv,
2410                         "-utf8::IsAlpha\n-utf8::IsDigit\n0000\t%04x\n%04x\tffff\n",
2411                         '_' - 1,
2412                         '_' + 1);
2413                 }
2414                 lastvalue = 123456;
2415                 continue;
2416             case 's':
2417                 if (!SIZE_ONLY) {
2418                     if (LOC)
2419                         flags |= ANYOF_SPACEL;
2420                     sv_catpvf(listsv, "+utf8::IsSpace\n");
2421                     if (!PL_utf8_space)
2422                         is_utf8_space((U8*)" ");
2423                 }
2424                 lastvalue = 123456;
2425                 continue;
2426             case 'S':
2427                 if (!SIZE_ONLY) {
2428                     if (LOC)
2429                         flags |= ANYOF_NSPACEL;
2430                     sv_catpvf(listsv,
2431                         "!utf8::IsSpace\n");
2432                     if (!PL_utf8_space)
2433                         is_utf8_space((U8*)" ");
2434                 }
2435                 lastvalue = 123456;
2436                 continue;
2437             case 'd':
2438                 if (!SIZE_ONLY) {
2439                     sv_catpvf(listsv, "+utf8::IsDigit\n");
2440                 }
2441                 lastvalue = 123456;
2442                 continue;
2443             case 'D':
2444                 if (!SIZE_ONLY) {
2445                     sv_catpvf(listsv,
2446                         "!utf8::IsDigit\n");
2447                 }
2448                 lastvalue = 123456;
2449                 continue;
2450             case 'p':
2451             case 'P':
2452                 if (*PL_regcomp_parse == '{') {
2453                     e = strchr(PL_regcomp_parse++, '}');
2454                     if (!e)
2455                         FAIL("Missing right brace on \\p{}");
2456                     n = e - PL_regcomp_parse;
2457                 }
2458                 else {
2459                     e = PL_regcomp_parse;
2460                     n = 1;
2461                 }
2462                 if (!SIZE_ONLY) {
2463                     if (value == 'p')
2464                         sv_catpvf(listsv, "+utf8::%.*s\n", n, PL_regcomp_parse);
2465                     else
2466                         sv_catpvf(listsv,
2467                             "!utf8::%.*s\n", n, PL_regcomp_parse);
2468                 }
2469                 PL_regcomp_parse = e + 1;
2470                 lastvalue = 123456;
2471                 continue;
2472             case 'n':
2473                 value = '\n';
2474                 break;
2475             case 'r':
2476                 value = '\r';
2477                 break;
2478             case 't':
2479                 value = '\t';
2480                 break;
2481             case 'f':
2482                 value = '\f';
2483                 break;
2484             case 'b':
2485                 value = '\b';
2486                 break;
2487             case 'e':
2488                 value = '\033';
2489                 break;
2490             case 'a':
2491                 value = '\007';
2492                 break;
2493             case 'x':
2494                 if (*PL_regcomp_parse == '{') {
2495                     e = strchr(PL_regcomp_parse++, '}');
2496                     if (!e)
2497                         FAIL("Missing right brace on \\x{}");
2498                     value = scan_hex(PL_regcomp_parse + 1, e - PL_regcomp_parse, &numlen);
2499                     PL_regcomp_parse = e + 1;
2500                 }
2501                 else {
2502                     value = scan_hex(PL_regcomp_parse, 2, &numlen);
2503                     PL_regcomp_parse += numlen;
2504                 }
2505                 break;
2506             case 'c':
2507                 value = UCHARAT(PL_regcomp_parse++);
2508                 value = toCTRL(value);
2509                 break;
2510             case '0': case '1': case '2': case '3': case '4':
2511             case '5': case '6': case '7': case '8': case '9':
2512                 value = scan_oct(--PL_regcomp_parse, 3, &numlen);
2513                 PL_regcomp_parse += numlen;
2514                 break;
2515             }
2516         }
2517         if (range) {
2518             if (lastvalue > value)
2519                 FAIL("invalid [] range in regexp");
2520             if (!SIZE_ONLY)
2521                 sv_catpvf(listsv, "%04x\t%04x\n", lastvalue, value);
2522             lastvalue = value;
2523             range = 0;
2524         }
2525         else {
2526             lastvalue = value;
2527             if (*PL_regcomp_parse == '-' && PL_regcomp_parse+1 < PL_regxend &&
2528               PL_regcomp_parse[1] != ']') {
2529                 PL_regcomp_parse++;
2530                 range = 1;
2531                 continue;       /* do it next time */
2532             }
2533             if (!SIZE_ONLY)
2534                 sv_catpvf(listsv, "%04x\n", value);
2535         }
2536     }
2537
2538     ret = reganode(ANYOFUTF8, 0);
2539
2540     if (!SIZE_ONLY) {
2541         SV *rv = swash_init("utf8", "", listsv, 1, 0);
2542         SvREFCNT_dec(listsv);
2543         n = add_data(1,"s");
2544         PL_regcomp_rx->data->data[n] = (void*)rv;
2545         ARG1_SET(ret, flags);
2546         ARG2_SET(ret, n);
2547     }
2548
2549     return ret;
2550 }
2551
2552 STATIC char*
2553 nextchar(void)
2554 {
2555     dTHR;
2556     char* retval = PL_regcomp_parse++;
2557
2558     for (;;) {
2559         if (*PL_regcomp_parse == '(' && PL_regcomp_parse[1] == '?' &&
2560                 PL_regcomp_parse[2] == '#') {
2561             while (*PL_regcomp_parse && *PL_regcomp_parse != ')')
2562                 PL_regcomp_parse++;
2563             PL_regcomp_parse++;
2564             continue;
2565         }
2566         if (PL_regflags & PMf_EXTENDED) {
2567             if (isSPACE(*PL_regcomp_parse)) {
2568                 PL_regcomp_parse++;
2569                 continue;
2570             }
2571             else if (*PL_regcomp_parse == '#') {
2572                 while (*PL_regcomp_parse && *PL_regcomp_parse != '\n')
2573                     PL_regcomp_parse++;
2574                 PL_regcomp_parse++;
2575                 continue;
2576             }
2577         }
2578         return retval;
2579     }
2580 }
2581
2582 /*
2583 - reg_node - emit a node
2584 */
2585 STATIC regnode *                        /* Location. */
2586 reg_node(U8 op)
2587 {
2588     dTHR;
2589     register regnode *ret;
2590     register regnode *ptr;
2591
2592     ret = PL_regcode;
2593     if (SIZE_ONLY) {
2594         SIZE_ALIGN(PL_regsize);
2595         PL_regsize += 1;
2596         return(ret);
2597     }
2598
2599     NODE_ALIGN_FILL(ret);
2600     ptr = ret;
2601     FILL_ADVANCE_NODE(ptr, op);
2602     PL_regcode = ptr;
2603
2604     return(ret);
2605 }
2606
2607 /*
2608 - reganode - emit a node with an argument
2609 */
2610 STATIC regnode *                        /* Location. */
2611 reganode(U8 op, U32 arg)
2612 {
2613     dTHR;
2614     register regnode *ret;
2615     register regnode *ptr;
2616
2617     ret = PL_regcode;
2618     if (SIZE_ONLY) {
2619         SIZE_ALIGN(PL_regsize);
2620         PL_regsize += 2;
2621         return(ret);
2622     }
2623
2624     NODE_ALIGN_FILL(ret);
2625     ptr = ret;
2626     FILL_ADVANCE_NODE_ARG(ptr, op, arg);
2627     PL_regcode = ptr;
2628
2629     return(ret);
2630 }
2631
2632 /*
2633 - regc - emit (if appropriate) a Unicode character
2634 */
2635 STATIC void
2636 reguni(UV uv, char* s, I32* lenp)
2637 {
2638     dTHR;
2639     if (SIZE_ONLY) {
2640         U8 tmpbuf[10];
2641         *lenp = uv_to_utf8(tmpbuf, uv) - tmpbuf;
2642     }
2643     else
2644         *lenp = uv_to_utf8((U8*)s, uv) - (U8*)s;
2645
2646 }
2647
2648 /*
2649 - regc - emit (if appropriate) a byte of code
2650 */
2651 STATIC void
2652 regc(U8 b, char* s)
2653 {
2654     dTHR;
2655     if (!SIZE_ONLY)
2656         *s = b;
2657 }
2658
2659 /*
2660 - reginsert - insert an operator in front of already-emitted operand
2661 *
2662 * Means relocating the operand.
2663 */
2664 STATIC void
2665 reginsert(U8 op, regnode *opnd)
2666 {
2667     dTHR;
2668     register regnode *src;
2669     register regnode *dst;
2670     register regnode *place;
2671     register int offset = regarglen[(U8)op];
2672     
2673 /* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */
2674
2675     if (SIZE_ONLY) {
2676         PL_regsize += NODE_STEP_REGNODE + offset;
2677         return;
2678     }
2679
2680     src = PL_regcode;
2681     PL_regcode += NODE_STEP_REGNODE + offset;
2682     dst = PL_regcode;
2683     while (src > opnd)
2684         StructCopy(--src, --dst, regnode);
2685
2686     place = opnd;               /* Op node, where operand used to be. */
2687     src = NEXTOPER(place);
2688     FILL_ADVANCE_NODE(place, op);
2689     Zero(src, offset, regnode);
2690 }
2691
2692 /*
2693 - regtail - set the next-pointer at the end of a node chain of p to val.
2694 */
2695 STATIC void
2696 regtail(regnode *p, regnode *val)
2697 {
2698     dTHR;
2699     register regnode *scan;
2700     register regnode *temp;
2701     register I32 offset;
2702
2703     if (SIZE_ONLY)
2704         return;
2705
2706     /* Find last node. */
2707     scan = p;
2708     for (;;) {
2709         temp = regnext(scan);
2710         if (temp == NULL)
2711             break;
2712         scan = temp;
2713     }
2714
2715     if (reg_off_by_arg[OP(scan)]) {
2716         ARG_SET(scan, val - scan);
2717     }
2718     else {
2719         NEXT_OFF(scan) = val - scan;
2720     }
2721 }
2722
2723 /*
2724 - regoptail - regtail on operand of first argument; nop if operandless
2725 */
2726 STATIC void
2727 regoptail(regnode *p, regnode *val)
2728 {
2729     dTHR;
2730     /* "Operandless" and "op != BRANCH" are synonymous in practice. */
2731     if (p == NULL || SIZE_ONLY)
2732         return;
2733     if (PL_regkind[(U8)OP(p)] == BRANCH) {
2734         regtail(NEXTOPER(p), val);
2735     }
2736     else if ( PL_regkind[(U8)OP(p)] == BRANCHJ) {
2737         regtail(NEXTOPER(NEXTOPER(p)), val);
2738     }
2739     else
2740         return;
2741 }
2742
2743 /*
2744  - regcurly - a little FSA that accepts {\d+,?\d*}
2745  */
2746 STATIC I32
2747 regcurly(register char *s)
2748 {
2749     if (*s++ != '{')
2750         return FALSE;
2751     if (!isDIGIT(*s))
2752         return FALSE;
2753     while (isDIGIT(*s))
2754         s++;
2755     if (*s == ',')
2756         s++;
2757     while (isDIGIT(*s))
2758         s++;
2759     if (*s != '}')
2760         return FALSE;
2761     return TRUE;
2762 }
2763
2764
2765 STATIC regnode *
2766 dumpuntil(regnode *start, regnode *node, regnode *last, SV* sv, I32 l)
2767 {
2768 #ifdef DEBUGGING
2769     register char op = EXACT;   /* Arbitrary non-END op. */
2770     register regnode *next, *onode;
2771
2772     while (op != END && (!last || node < last)) {
2773         /* While that wasn't END last time... */
2774
2775         NODE_ALIGN(node);
2776         op = OP(node);
2777         if (op == CLOSE)
2778             l--;        
2779         next = regnext(node);
2780         /* Where, what. */
2781         if (OP(node) == OPTIMIZED)
2782             goto after_print;
2783         regprop(sv, node);
2784         PerlIO_printf(Perl_debug_log, "%4d:%*s%s", node - start, 
2785                       2*l + 1, "", SvPVX(sv));
2786         if (next == NULL)               /* Next ptr. */
2787             PerlIO_printf(Perl_debug_log, "(0)");
2788         else 
2789             PerlIO_printf(Perl_debug_log, "(%d)", next - start);
2790         (void)PerlIO_putc(Perl_debug_log, '\n');
2791       after_print:
2792         if (PL_regkind[(U8)op] == BRANCHJ) {
2793             register regnode *nnode = (OP(next) == LONGJMP 
2794                                        ? regnext(next) 
2795                                        : next);
2796             if (last && nnode > last)
2797                 nnode = last;
2798             node = dumpuntil(start, NEXTOPER(NEXTOPER(node)), nnode, sv, l + 1);
2799         }
2800         else if (PL_regkind[(U8)op] == BRANCH) {
2801             node = dumpuntil(start, NEXTOPER(node), next, sv, l + 1);
2802         }
2803         else if ( op == CURLY) {   /* `next' might be very big: optimizer */
2804             node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
2805                              NEXTOPER(node) + EXTRA_STEP_2ARGS + 1, sv, l + 1);
2806         }
2807         else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) {
2808             node = dumpuntil(start, NEXTOPER(node) + EXTRA_STEP_2ARGS,
2809                              next, sv, l + 1);
2810         }
2811         else if ( op == PLUS || op == STAR) {
2812             node = dumpuntil(start, NEXTOPER(node), NEXTOPER(node) + 1, sv, l + 1);
2813         }
2814         else if (op == ANYOF) {
2815             node = NEXTOPER(node);
2816             node += ANY_SKIP;
2817         }
2818         else if (PL_regkind[(U8)op] == EXACT) {
2819             /* Literal string, where present. */
2820             node += ((*OPERAND(node)) + 2 + sizeof(regnode) - 1) / sizeof(regnode);
2821             node = NEXTOPER(node);
2822         }
2823         else {
2824             node = NEXTOPER(node);
2825             node += regarglen[(U8)op];
2826         }
2827         if (op == CURLYX || op == OPEN)
2828             l++;
2829         else if (op == WHILEM)
2830             l--;
2831     }
2832 #endif  /* DEBUGGING */
2833     return node;
2834 }
2835
2836 /*
2837  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
2838  */
2839 void
2840 regdump(regexp *r)
2841 {
2842 #ifdef DEBUGGING
2843     dTHR;
2844     SV *sv = sv_newmortal();
2845
2846     (void)dumpuntil(r->program, r->program + 1, NULL, sv, 0);
2847
2848     /* Header fields of interest. */
2849     if (r->anchored_substr)
2850         PerlIO_printf(Perl_debug_log, "anchored `%s%s%s'%s at %d ", 
2851                       PL_colors[0],
2852                       SvPVX(r->anchored_substr), 
2853                       PL_colors[1],
2854                       SvTAIL(r->anchored_substr) ? "$" : "",
2855                       r->anchored_offset);
2856     if (r->float_substr)
2857         PerlIO_printf(Perl_debug_log, "floating `%s%s%s'%s at %d..%u ", 
2858                       PL_colors[0],
2859                       SvPVX(r->float_substr), 
2860                       PL_colors[1],
2861                       SvTAIL(r->float_substr) ? "$" : "",
2862                       r->float_min_offset, r->float_max_offset);
2863     if (r->check_substr)
2864         PerlIO_printf(Perl_debug_log, 
2865                       r->check_substr == r->float_substr 
2866                       ? "(checking floating" : "(checking anchored");
2867     if (r->reganch & ROPT_NOSCAN)
2868         PerlIO_printf(Perl_debug_log, " noscan");
2869     if (r->reganch & ROPT_CHECK_ALL)
2870         PerlIO_printf(Perl_debug_log, " isall");
2871     if (r->check_substr)
2872         PerlIO_printf(Perl_debug_log, ") ");
2873
2874     if (r->regstclass) {
2875         regprop(sv, r->regstclass);
2876         PerlIO_printf(Perl_debug_log, "stclass `%s' ", SvPVX(sv));
2877     }
2878     if (r->reganch & ROPT_ANCH) {
2879         PerlIO_printf(Perl_debug_log, "anchored");
2880         if (r->reganch & ROPT_ANCH_BOL)
2881             PerlIO_printf(Perl_debug_log, "(BOL)");
2882         if (r->reganch & ROPT_ANCH_MBOL)
2883             PerlIO_printf(Perl_debug_log, "(MBOL)");
2884         if (r->reganch & ROPT_ANCH_GPOS)
2885             PerlIO_printf(Perl_debug_log, "(GPOS)");
2886         PerlIO_putc(Perl_debug_log, ' ');
2887     }
2888     if (r->reganch & ROPT_GPOS_SEEN)
2889         PerlIO_printf(Perl_debug_log, "GPOS ");
2890     if (r->reganch & ROPT_SKIP)
2891         PerlIO_printf(Perl_debug_log, "plus ");
2892     if (r->reganch & ROPT_IMPLICIT)
2893         PerlIO_printf(Perl_debug_log, "implicit ");
2894     PerlIO_printf(Perl_debug_log, "minlen %ld ", (long) r->minlen);
2895     if (r->reganch & ROPT_EVAL_SEEN)
2896         PerlIO_printf(Perl_debug_log, "with eval ");
2897     PerlIO_printf(Perl_debug_log, "\n");
2898 #endif  /* DEBUGGING */
2899 }
2900
2901 /*
2902 - regprop - printable representation of opcode
2903 */
2904 void
2905 regprop(SV *sv, regnode *o)
2906 {
2907 #ifdef DEBUGGING
2908     dTHR;
2909     register char *p = 0;
2910
2911     sv_setpvn(sv, "", 0);
2912     switch (OP(o)) {
2913     case BOL:
2914         p = "BOL";
2915         break;
2916     case MBOL:
2917         p = "MBOL";
2918         break;
2919     case SBOL:
2920         p = "SBOL";
2921         break;
2922     case EOL:
2923         p = "EOL";
2924         break;
2925     case EOS:
2926         p = "EOS";
2927         break;
2928     case MEOL:
2929         p = "MEOL";
2930         break;
2931     case SEOL:
2932         p = "SEOL";
2933         break;
2934     case REG_ANY:
2935         p = "ANY";
2936         break;
2937     case SANY:
2938         p = "SANY";
2939         break;
2940     case ANYUTF8:
2941         p = "ANYUTF8";
2942         break;
2943     case SANYUTF8:
2944         p = "SANYUTF8";
2945         break;
2946     case ANYOFUTF8:
2947         p = "ANYOFUTF8";
2948         break;
2949     case ANYOF:
2950         p = "ANYOF";
2951         break;
2952     case BRANCH:
2953         p = "BRANCH";
2954         break;
2955     case EXACT:
2956         sv_catpvf(sv, "EXACT <%s%s%s>", PL_colors[0], OPERAND(o) + 1, PL_colors[1]);
2957         break;
2958     case EXACTF:
2959         sv_catpvf(sv, "EXACTF <%s%s%s>", PL_colors[0], OPERAND(o) + 1, PL_colors[1]);
2960         break;
2961     case EXACTFL:
2962         sv_catpvf(sv, "EXACTFL <%s%s%s>", PL_colors[0], OPERAND(o) + 1, PL_colors[1]);
2963         break;
2964     case NOTHING:
2965         p = "NOTHING";
2966         break;
2967     case TAIL:
2968         p = "TAIL";
2969         break;
2970     case BACK:
2971         p = "BACK";
2972         break;
2973     case END:
2974         p = "END";
2975         break;
2976     case BOUND:
2977         p = "BOUND";
2978         break;
2979     case BOUNDL:
2980         p = "BOUNDL";
2981         break;
2982     case NBOUND:
2983         p = "NBOUND";
2984         break;
2985     case NBOUNDL:
2986         p = "NBOUNDL";
2987         break;
2988     case CURLY:
2989         sv_catpvf(sv, "CURLY {%d,%d}", ARG1(o), ARG2(o));
2990         break;
2991     case CURLYM:
2992         sv_catpvf(sv, "CURLYM[%d] {%d,%d}", o->flags, ARG1(o), ARG2(o));
2993         break;
2994     case CURLYN:
2995         sv_catpvf(sv, "CURLYN[%d] {%d,%d}", o->flags, ARG1(o), ARG2(o));
2996         break;
2997     case CURLYX:
2998         sv_catpvf(sv, "CURLYX {%d,%d}", ARG1(o), ARG2(o));
2999         break;
3000     case REF:
3001         sv_catpvf(sv, "REF%d", ARG(o));
3002         break;
3003     case REFF:
3004         sv_catpvf(sv, "REFF%d", ARG(o));
3005         break;
3006     case REFFL:
3007         sv_catpvf(sv, "REFFL%d", ARG(o));
3008         break;
3009     case OPEN:
3010         sv_catpvf(sv, "OPEN%d", ARG(o));
3011         break;
3012     case CLOSE:
3013         sv_catpvf(sv, "CLOSE%d", ARG(o));
3014         p = NULL;
3015         break;
3016     case STAR:
3017         p = "STAR";
3018         break;
3019     case PLUS:
3020         p = "PLUS";
3021         break;
3022     case MINMOD:
3023         p = "MINMOD";
3024         break;
3025     case GPOS:
3026         p = "GPOS";
3027         break;
3028     case UNLESSM:
3029         sv_catpvf(sv, "UNLESSM[-%d]", o->flags);
3030         break;
3031     case IFMATCH:
3032         sv_catpvf(sv, "IFMATCH[-%d]", o->flags);
3033         break;
3034     case SUCCEED:
3035         p = "SUCCEED";
3036         break;
3037     case WHILEM:
3038         p = "WHILEM";
3039         break;
3040     case DIGIT:
3041         p = "DIGIT";
3042         break;
3043     case NDIGIT:
3044         p = "NDIGIT";
3045         break;
3046     case ALNUM:
3047         p = "ALNUM";
3048         break;
3049     case NALNUM:
3050         p = "NALNUM";
3051         break;
3052     case SPACE:
3053         p = "SPACE";
3054         break;
3055     case NSPACE:
3056         p = "NSPACE";
3057         break;
3058     case ALNUML:
3059         p = "ALNUML";
3060         break;
3061     case NALNUML:
3062         p = "NALNUML";
3063         break;
3064     case SPACEL:
3065         p = "SPACEL";
3066         break;
3067     case NSPACEL:
3068         p = "NSPACEL";
3069         break;
3070     case EVAL:
3071         p = "EVAL";
3072         break;
3073     case LONGJMP:
3074         p = "LONGJMP";
3075         break;
3076     case BRANCHJ:
3077         p = "BRANCHJ";
3078         break;
3079     case IFTHEN:
3080         p = "IFTHEN";
3081         break;
3082     case GROUPP:
3083         sv_catpvf(sv, "GROUPP%d", ARG(o));
3084         break;
3085     case LOGICAL:
3086         sv_catpvf(sv, "LOGICAL[%d]", o->flags);
3087         break;
3088     case SUSPEND:
3089         p = "SUSPEND";
3090         break;
3091     case RENUM:
3092         p = "RENUM";
3093         break;
3094     case OPTIMIZED:
3095         p = "OPTIMIZED";
3096         break;
3097     default:
3098         FAIL("corrupted regexp opcode");
3099     }
3100     if (p)
3101         sv_catpv(sv, p);
3102 #endif  /* DEBUGGING */
3103 }
3104
3105 void
3106 pregfree(struct regexp *r)
3107 {
3108     dTHR;
3109     if (!r || (--r->refcnt > 0))
3110         return;
3111     if (r->precomp)
3112         Safefree(r->precomp);
3113     if (r->subbase)
3114         Safefree(r->subbase);
3115     if (r->substrs) {
3116         if (r->anchored_substr)
3117             SvREFCNT_dec(r->anchored_substr);
3118         if (r->float_substr)
3119             SvREFCNT_dec(r->float_substr);
3120         Safefree(r->substrs);
3121     }
3122     if (r->data) {
3123         int n = r->data->count;
3124         while (--n >= 0) {
3125             switch (r->data->what[n]) {
3126             case 's':
3127                 SvREFCNT_dec((SV*)r->data->data[n]);
3128                 break;
3129             case 'o':
3130                 op_free((OP_4tree*)r->data->data[n]);
3131                 break;
3132             case 'n':
3133                 break;
3134             default:
3135                 FAIL2("panic: regfree data code '%c'", r->data->what[n]);
3136             }
3137         }
3138         Safefree(r->data->what);
3139         Safefree(r->data);
3140     }
3141     Safefree(r->startp);
3142     Safefree(r->endp);
3143     Safefree(r);
3144 }
3145
3146 /*
3147  - regnext - dig the "next" pointer out of a node
3148  *
3149  * [Note, when REGALIGN is defined there are two places in regmatch()
3150  * that bypass this code for speed.]
3151  */
3152 regnode *
3153 regnext(register regnode *p)
3154 {
3155     dTHR;
3156     register I32 offset;
3157
3158     if (p == &PL_regdummy)
3159         return(NULL);
3160
3161     offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p));
3162     if (offset == 0)
3163         return(NULL);
3164
3165     return(p+offset);
3166 }
3167
3168 STATIC void     
3169 re_croak2(const char* pat1,const char* pat2,...)
3170 {
3171     va_list args;
3172     STRLEN l1 = strlen(pat1);
3173     STRLEN l2 = strlen(pat2);
3174     char buf[512];
3175     char *message;
3176
3177     if (l1 > 510)
3178         l1 = 510;
3179     if (l1 + l2 > 510)
3180         l2 = 510 - l1;
3181     Copy(pat1, buf, l1 , char);
3182     Copy(pat2, buf + l1, l2 , char);
3183     buf[l1 + l2] = '\n';
3184     buf[l1 + l2 + 1] = '\0';
3185     va_start(args, pat2);
3186     message = mess(buf, &args);
3187     va_end(args);
3188     l1 = strlen(message);
3189     if (l1 > 512)
3190         l1 = 512;
3191     Copy(message, buf, l1 , char);
3192     buf[l1] = '\0';                     /* Overwrite \n */
3193     croak("%s", buf);
3194 }
3195
3196 /* XXX Here's a total kludge.  But we need to re-enter for swash routines. */
3197
3198 void
3199 save_re_context(void)
3200 {                   
3201     dTHR;
3202     SAVEPPTR(PL_bostr);
3203     SAVEPPTR(PL_regprecomp);            /* uncompiled string. */
3204     SAVEI32(PL_regnpar);                /* () count. */
3205     SAVEI32(PL_regsize);                /* Code size. */
3206     SAVEI16(PL_regflags);               /* are we folding, multilining? */
3207     SAVEPPTR(PL_reginput);              /* String-input pointer. */
3208     SAVEPPTR(PL_regbol);                /* Beginning of input, for ^ check. */
3209     SAVEPPTR(PL_regeol);                /* End of input, for $ check. */
3210     SAVESPTR(PL_regstartp);             /* Pointer to startp array. */
3211     SAVESPTR(PL_regendp);               /* Ditto for endp. */
3212     SAVESPTR(PL_reglastparen);          /* Similarly for lastparen. */
3213     SAVEPPTR(PL_regtill);               /* How far we are required to go. */
3214     SAVEI32(PL_regprev);                /* char before regbol, \n if none */
3215     SAVESPTR(PL_reg_start_tmp);         /* from regexec.c */
3216     PL_reg_start_tmp = 0;
3217     SAVEFREEPV(PL_reg_start_tmp);
3218     SAVEI32(PL_reg_start_tmpl);         /* from regexec.c */
3219     PL_reg_start_tmpl = 0;
3220     SAVESPTR(PL_regdata);
3221     SAVEI32(PL_reg_flags);              /* from regexec.c */
3222     SAVEI32(PL_reg_eval_set);           /* from regexec.c */
3223     SAVEI32(PL_regnarrate);             /* from regexec.c */
3224     SAVESPTR(PL_regprogram);            /* from regexec.c */
3225     SAVEINT(PL_regindent);              /* from regexec.c */
3226     SAVESPTR(PL_regcc);                 /* from regexec.c */
3227     SAVESPTR(PL_curcop);
3228     SAVESPTR(PL_regcomp_rx);            /* from regcomp.c */
3229     SAVEI32(PL_regseen);                /* from regcomp.c */
3230     SAVEI32(PL_regsawback);             /* Did we see \1, ...? */
3231     SAVEI32(PL_regnaughty);             /* How bad is this pattern? */
3232     SAVESPTR(PL_regcode);               /* Code-emit pointer; &regdummy = don't */
3233     SAVEPPTR(PL_regxend);               /* End of input for compile */
3234     SAVEPPTR(PL_regcomp_parse);         /* Input-scan pointer. */
3235     SAVESPTR(PL_reg_call_cc);           /* from regexec.c */
3236     SAVESPTR(PL_reg_re);                /* from regexec.c */
3237     SAVEPPTR(PL_reg_ganch);             /* from regexec.c */
3238     SAVESPTR(PL_reg_sv);                /* from regexec.c */
3239     SAVESPTR(PL_reg_magic);             /* from regexec.c */
3240     SAVEI32(PL_reg_oldpos);                     /* from regexec.c */
3241     SAVESPTR(PL_reg_oldcurpm);          /* from regexec.c */
3242     SAVESPTR(PL_reg_curpm);             /* from regexec.c */
3243 #ifdef DEBUGGING
3244     SAVEPPTR(PL_reg_starttry);          /* from regexec.c */    
3245 #endif
3246 }