Run embed.pl and keywords.pl to complete RESTART -> INIT change
[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 /*SUPPRESS 112*/
23 /*
24  * pregcomp and pregexec -- regsub and regerror are not used in perl
25  *
26  *      Copyright (c) 1986 by University of Toronto.
27  *      Written by Henry Spencer.  Not derived from licensed software.
28  *
29  *      Permission is granted to anyone to use this software for any
30  *      purpose on any computer system, and to redistribute it freely,
31  *      subject to the following restrictions:
32  *
33  *      1. The author is not responsible for the consequences of use of
34  *              this software, no matter how awful, even if they arise
35  *              from defects in it.
36  *
37  *      2. The origin of this software must not be misrepresented, either
38  *              by explicit claim or by omission.
39  *
40  *      3. Altered versions must be plainly marked as such, and must not
41  *              be misrepresented as being the original software.
42  *
43  *
44  ****    Alterations to Henry's code are...
45  ****
46  ****    Copyright (c) 1991-1997, Larry Wall
47  ****
48  ****    You may distribute under the terms of either the GNU General Public
49  ****    License or the Artistic License, as specified in the README file.
50
51  *
52  * Beware that some of this code is subtly aware of the way operator
53  * precedence is structured in regular expressions.  Serious changes in
54  * regular-expression syntax might require a total rethink.
55  */
56 #include "EXTERN.h"
57 #include "perl.h"
58 #include "INTERN.h"
59 #include "regcomp.h"
60
61 #ifdef USE_THREADS
62 #undef op
63 #endif /* USE_THREADS */
64
65 #ifdef MSDOS
66 # if defined(BUGGY_MSC6)
67  /* MSC 6.00A breaks on op/regexp.t test 85 unless we turn this off */
68  # pragma optimize("a",off)
69  /* But MSC 6.00A is happy with 'w', for aliases only across function calls*/
70  # pragma optimize("w",on )
71 # endif /* BUGGY_MSC6 */
72 #endif /* MSDOS */
73
74 #ifndef STATIC
75 #define STATIC  static
76 #endif
77
78 #define ISMULT1(c)      ((c) == '*' || (c) == '+' || (c) == '?')
79 #define ISMULT2(s)      ((*s) == '*' || (*s) == '+' || (*s) == '?' || \
80         ((*s) == '{' && regcurly(s)))
81 #ifdef atarist
82 #define PERL_META       "^$.[()|?+*\\"
83 #else
84 #define META    "^$.[()|?+*\\"
85 #endif
86
87 #ifdef SPSTART
88 #undef SPSTART          /* dratted cpp namespace... */
89 #endif
90 /*
91  * Flags to be passed up and down.
92  */
93 #define WORST           0       /* Worst case. */
94 #define HASWIDTH        0x1     /* Known never to match null string. */
95 #define SIMPLE          0x2     /* Simple enough to be STAR/PLUS operand. */
96 #define SPSTART         0x4     /* Starts with * or +. */
97 #define TRYAGAIN        0x8     /* Weeded out a declaration. */
98
99 /*
100  * Forward declarations for pregcomp()'s friends.
101  */
102
103 static char *reg _((I32, I32 *));
104 static char *reganode _((char, unsigned short));
105 static char *regatom _((I32 *));
106 static char *regbranch _((I32 *));
107 static void regc _((char));
108 static char *regclass _((void));
109 STATIC I32 regcurly _((char *));
110 static char *regnode _((char));
111 static char *regpiece _((I32 *));
112 static void reginsert _((char, char *));
113 static void regoptail _((char *, char *));
114 static void regset _((char *, I32));
115 static void regtail _((char *, char *));
116 static char* regwhite _((char *, char *));
117 static char* nextchar _((void));
118
119 /*
120  - pregcomp - compile a regular expression into internal code
121  *
122  * We can't allocate space until we know how big the compiled form will be,
123  * but we can't compile it (and thus know how big it is) until we've got a
124  * place to put the code.  So we cheat:  we compile it twice, once with code
125  * generation turned off and size counting turned on, and once "for real".
126  * This also means that we don't allocate space until we are sure that the
127  * thing really will compile successfully, and we never have to move the
128  * code and thus invalidate pointers into it.  (Note that it has to be in
129  * one piece because free() must be able to free it all.) [NB: not true in perl]
130  *
131  * Beware that the optimization-preparation code in here knows about some
132  * of the structure of the compiled regexp.  [I'll say.]
133  */
134 regexp *
135 pregcomp(exp,xend,pm)
136 char* exp;
137 char* xend;
138 PMOP* pm;
139 {
140     register regexp *r;
141     register char *scan;
142     register SV *longish;
143     SV *longest;
144     register I32 len;
145     register char *first;
146     I32 flags;
147     I32 backish;
148     I32 backest;
149     I32 curback;
150     I32 minlen = 0;
151     I32 sawplus = 0;
152     I32 sawopen = 0;
153 #define MAX_REPEAT_DEPTH 12
154     struct {
155         char *opcode;
156         I32 count;
157     } repeat_stack[MAX_REPEAT_DEPTH];
158     I32 repeat_depth = 0;
159     I32 repeat_count = 1;       /* We start unmultiplied. */
160
161     if (exp == NULL)
162         croak("NULL regexp argument");
163
164     regprecomp = savepvn(exp, xend - exp);
165     regflags = pm->op_pmflags;
166     regsawback = 0;
167
168     /* First pass: determine size, legality. */
169     regparse = exp;
170     regxend = xend;
171     regnaughty = 0;
172     regnpar = 1;
173     regsize = 0L;
174     regcode = &regdummy;
175     regc((char)MAGIC);
176     if (reg(0, &flags) == NULL) {
177         Safefree(regprecomp);
178         regprecomp = Nullch;
179         return(NULL);
180     }
181
182     /* Small enough for pointer-storage convention? */
183     if (regsize >= 32767L)              /* Probably could be 65535L. */
184         FAIL("regexp too big");
185
186     /* Allocate space and initialize. */
187     Newc(1001, r, sizeof(regexp) + (unsigned)regsize, char, regexp);
188     if (r == NULL)
189         FAIL("regexp out of space");
190     r->prelen = xend - exp;
191     r->precomp = regprecomp;
192     r->subbeg = r->subbase = NULL;
193
194     /* Second pass: emit code. */
195     regparse = exp;
196     regxend = xend;
197     regnaughty = 0;
198     regnpar = 1;
199     regcode = r->program;
200     regc((char)MAGIC);
201     if (reg(0, &flags) == NULL)
202         return(NULL);
203
204     /* Dig out information for optimizations. */
205     pm->op_pmflags = regflags;
206     r->regstart = Nullsv;       /* Worst-case defaults. */
207     r->reganch = 0;
208     r->regmust = Nullsv;
209     r->regback = -1;
210     r->regstclass = Nullch;
211     r->naughty = regnaughty >= 10;      /* Probably an expensive pattern. */
212     scan = r->program+1;                        /* First BRANCH. */
213     if (OP(regnext(scan)) == END) {/* Only one top-level choice. */
214         scan = NEXTOPER(scan);
215
216         first = scan;
217         while ((OP(first) == OPEN && (sawopen = 1)) ||
218             (OP(first) == BRANCH && OP(regnext(first)) != BRANCH) ||
219             (OP(first) == PLUS) ||
220             (OP(first) == MINMOD) ||
221             (regkind[(U8)OP(first)] == CURLY && ARG1(first) > 0) ) {
222                 if (OP(first) == PLUS)
223                     sawplus = 1;
224                 else
225                     first += regarglen[(U8)OP(first)];
226                 first = NEXTOPER(first);
227         }
228
229         /* Starting-point info. */
230       again:
231         if (OP(first) == EXACT) {
232             r->regstart = newSVpv(OPERAND(first)+1,*OPERAND(first));
233             if (SvCUR(r->regstart) > !sawstudy)
234                 fbm_compile(r->regstart);
235             (void)SvUPGRADE(r->regstart, SVt_PVBM);
236         }
237         else if (strchr(simple+2,OP(first)))
238             r->regstclass = first;
239         else if (regkind[(U8)OP(first)] == BOUND ||
240                  regkind[(U8)OP(first)] == NBOUND)
241             r->regstclass = first;
242         else if (regkind[(U8)OP(first)] == BOL) {
243             r->reganch |= ROPT_ANCH_BOL;
244             first = NEXTOPER(first);
245             goto again;
246         }
247         else if (OP(first) == GPOS) {
248             r->reganch |= ROPT_ANCH_GPOS;
249             first = NEXTOPER(first);
250             goto again;
251         }
252         else if ((OP(first) == STAR &&
253             regkind[(U8)OP(NEXTOPER(first))] == ANY) &&
254             !(r->reganch & ROPT_ANCH) )
255         {
256             /* turn .* into ^.* with an implied $*=1 */
257             r->reganch |= ROPT_ANCH_BOL | ROPT_IMPLICIT;
258             first = NEXTOPER(first);
259             goto again;
260         }
261         if (sawplus && (!sawopen || !regsawback))
262             r->reganch |= ROPT_SKIP;    /* x+ must match 1st of run */
263
264         DEBUG_r(PerlIO_printf(Perl_debug_log, "first %d next %d offset %d\n",
265            OP(first), OP(NEXTOPER(first)), first - scan));
266         /*
267         * If there's something expensive in the r.e., find the
268         * longest literal string that must appear and make it the
269         * regmust.  Resolve ties in favor of later strings, since
270         * the regstart check works with the beginning of the r.e.
271         * and avoiding duplication strengthens checking.  Not a
272         * strong reason, but sufficient in the absence of others.
273         * [Now we resolve ties in favor of the earlier string if
274         * it happens that curback has been invalidated, since the
275         * earlier string may buy us something the later one won't.]
276         */
277         longish = newSVpv("",0);
278         longest = newSVpv("",0);
279         len = 0;
280         minlen = 0;
281         curback = 0;
282         backish = 0;
283         backest = 0;
284         while (OP(scan) != END) {
285             if (OP(scan) == BRANCH) {
286                 if (OP(regnext(scan)) == BRANCH) {
287                     curback = -30000;
288                     while (OP(scan) == BRANCH)
289                         scan = regnext(scan);
290                 }
291                 else    /* single branch is ok */
292                     scan = NEXTOPER(scan);
293                 continue;
294             }
295             if (OP(scan) == UNLESSM) {
296                 curback = -30000;
297                 scan = regnext(scan);
298                 continue;
299             }
300             if (OP(scan) == EXACT) {
301                 char *t;
302
303                 first = scan;
304                 while ((t = regnext(scan)) && OP(t) == CLOSE)
305                     scan = t;
306                 minlen += *OPERAND(first) * repeat_count;
307                 if (curback - backish == len) {
308                     sv_catpvn(longish, OPERAND(first)+1,
309                         *OPERAND(first));
310                     len += *OPERAND(first);
311                     curback += *OPERAND(first);
312                     first = regnext(scan);
313                 }
314                 else if (*OPERAND(first) >= len + (curback >= 0)) {
315                     len = *OPERAND(first);
316                     sv_setpvn(longish, OPERAND(first)+1,len);
317                     backish = curback;
318                     curback += len;
319                     first = regnext(scan);
320                 }
321                 else
322                     curback += *OPERAND(first);
323             }
324             else if (strchr(varies,OP(scan))) {
325                 int tcount;
326                 char *next;
327
328                 if (repeat_depth < MAX_REPEAT_DEPTH
329                     && ((OP(scan) == PLUS
330                          && (tcount = 1)
331                          && (next = NEXTOPER(scan)))
332                         || (regkind[(U8)OP(scan)] == CURLY
333                             && (tcount = ARG1(scan))
334                             && (next = NEXTOPER(scan)+4))))
335                 {
336                     /* We treat (abc)+ as (abc)(abc)*. */
337
338                     /* Mark the place to return back. */
339                     repeat_stack[repeat_depth].opcode = regnext(scan);
340                     repeat_stack[repeat_depth].count = repeat_count;
341                     repeat_depth++;
342                     repeat_count *= tcount;
343
344                     /* Go deeper: */
345                     scan = next;
346                     continue;
347                 }
348                 else {
349                     curback = -30000;
350                     len = 0;
351                     if (SvCUR(longish) > SvCUR(longest)) {
352                         sv_setsv(longest,longish);
353                         backest = backish;
354                     }
355                     sv_setpvn(longish,"",0);
356                 }
357             }
358             else if (strchr(simple,OP(scan))) {
359                 curback++;
360                 minlen += repeat_count;
361                 len = 0;
362                 if (SvCUR(longish) > SvCUR(longest)) {
363                     sv_setsv(longest,longish);
364                     backest = backish;
365                 }
366                 sv_setpvn(longish,"",0);
367             }
368             scan = regnext(scan);
369             if (!scan) {                /* Go up PLUS or CURLY. */
370                 if (!repeat_depth--)
371                     croak("panic: re scan");
372                 scan = repeat_stack[repeat_depth].opcode;
373                 repeat_count = repeat_stack[repeat_depth].count;
374                 /* Need to submit the longest string found: */
375                 curback = -30000;
376                 len = 0;
377                 if (SvCUR(longish) > SvCUR(longest)) {
378                     sv_setsv(longest,longish);
379                     backest = backish;
380                 }
381                 sv_setpvn(longish,"",0);
382             }
383         }
384
385         /* Prefer earlier on tie, unless we can tail match latter */
386
387         if (SvCUR(longish) + (first && regkind[(U8)OP(first)] == EOL)
388                 > SvCUR(longest))
389         {
390             sv_setsv(longest,longish);
391             backest = backish;
392         }
393         else
394             sv_setpvn(longish,"",0);
395         if (SvCUR(longest)
396             && (!r->regstart
397                 || !fbm_instr((unsigned char*) SvPVX(r->regstart),
398                               (unsigned char *) (SvPVX(r->regstart)
399                                                  + SvCUR(r->regstart)),
400                               longest)))
401         {
402             r->regmust = longest;
403             if (backest < 0)
404                 backest = -1;
405             r->regback = backest;
406             if (SvCUR(longest) > !(sawstudy || 
407                                    (first && regkind[(U8)OP(first)] == EOL)))
408                 fbm_compile(r->regmust);
409             (void)SvUPGRADE(r->regmust, SVt_PVBM);
410             BmUSEFUL(r->regmust) = 100;
411             if (first && regkind[(U8)OP(first)] == EOL && SvCUR(longish))
412                 SvTAIL_on(r->regmust);
413         }
414         else {
415             SvREFCNT_dec(longest);
416             longest = Nullsv;
417         }
418         SvREFCNT_dec(longish);
419     }
420
421     r->nparens = regnpar - 1;
422     r->minlen = minlen;
423     Newz(1002, r->startp, regnpar, char*);
424     Newz(1002, r->endp, regnpar, char*);
425     DEBUG_r(regdump(r));
426     return(r);
427 }
428
429 /*
430  - reg - regular expression, i.e. main body or parenthesized thing
431  *
432  * Caller must absorb opening parenthesis.
433  *
434  * Combining parenthesis handling with the base level of regular expression
435  * is a trifle forced, but the need to tie the tails of the branches to what
436  * follows makes it hard to avoid.
437  */
438 static char *
439 reg(paren, flagp)
440 I32 paren;                      /* Parenthesized? */
441 I32 *flagp;
442 {
443     register char *ret;
444     register char *br;
445     register char *ender = 0;
446     register I32 parno = 0;
447     I32 flags;
448
449     *flagp = HASWIDTH;  /* Tentatively. */
450
451     /* Make an OPEN node, if parenthesized. */
452     if (paren) {
453         if (*regparse == '?') {
454             regparse++;
455             paren = *regparse++;
456             ret = NULL;
457             switch (paren) {
458             case ':':
459             case '=':
460             case '!':
461                 break;
462             case '$':
463             case '@':
464                 croak("Sequence (?%c...) not implemented", (int)paren);
465                 break;
466             case '#':
467                 while (*regparse && *regparse != ')')
468                     regparse++;
469                 if (*regparse != ')')
470                     croak("Sequence (?#... not terminated");
471                 nextchar();
472                 *flagp = TRYAGAIN;
473                 return NULL;
474             default:
475                 --regparse;
476                 while (*regparse && strchr("iogcmsx", *regparse))
477                     pmflag(&regflags, *regparse++);
478                 if (*regparse != ')')
479                     croak("Sequence (?%c...) not recognized", *regparse);
480                 nextchar();
481                 *flagp = TRYAGAIN;
482                 return NULL;
483             }
484         }
485         else {
486             parno = regnpar;
487             regnpar++;
488             ret = reganode(OPEN, parno);
489         }
490     } else
491         ret = NULL;
492
493     /* Pick up the branches, linking them together. */
494     br = regbranch(&flags);
495     if (br == NULL)
496         return(NULL);
497     if (ret != NULL)
498         regtail(ret, br);       /* OPEN -> first. */
499     else
500         ret = br;
501     if (!(flags&HASWIDTH))
502         *flagp &= ~HASWIDTH;
503     *flagp |= flags&SPSTART;
504     while (*regparse == '|') {
505         nextchar();
506         br = regbranch(&flags);
507         if (br == NULL)
508             return(NULL);
509         regtail(ret, br);       /* BRANCH -> BRANCH. */
510         if (!(flags&HASWIDTH))
511             *flagp &= ~HASWIDTH;
512         *flagp |= flags&SPSTART;
513     }
514
515     /* Make a closing node, and hook it on the end. */
516     switch (paren) {
517     case ':':
518         ender = regnode(NOTHING);
519         break;
520     case 1:
521         ender = reganode(CLOSE, parno);
522         break;
523     case '=':
524     case '!':
525         ender = regnode(SUCCEED);
526         *flagp &= ~HASWIDTH;
527         break;
528     case 0:
529         ender = regnode(END);
530         break;
531     }
532     regtail(ret, ender);
533
534     /* Hook the tails of the branches to the closing node. */
535     for (br = ret; br != NULL; br = regnext(br))
536         regoptail(br, ender);
537
538     if (paren == '=') {
539         reginsert(IFMATCH,ret);
540         regtail(ret, regnode(NOTHING));
541     }
542     else if (paren == '!') {
543         reginsert(UNLESSM,ret);
544         regtail(ret, regnode(NOTHING));
545     }
546
547     /* Check for proper termination. */
548     if (paren && (regparse >= regxend || *nextchar() != ')')) {
549         FAIL("unmatched () in regexp");
550     } else if (!paren && regparse < regxend) {
551         if (*regparse == ')') {
552             FAIL("unmatched () in regexp");
553         } else
554             FAIL("junk on end of regexp");      /* "Can't happen". */
555         /* NOTREACHED */
556     }
557
558     return(ret);
559 }
560
561 /*
562  - regbranch - one alternative of an | operator
563  *
564  * Implements the concatenation operator.
565  */
566 static char *
567 regbranch(flagp)
568 I32 *flagp;
569 {
570     register char *ret;
571     register char *chain;
572     register char *latest;
573     I32 flags = 0;
574
575     *flagp = WORST;             /* Tentatively. */
576
577     ret = regnode(BRANCH);
578     chain = NULL;
579     regparse--;
580     nextchar();
581     while (regparse < regxend && *regparse != '|' && *regparse != ')') {
582         flags &= ~TRYAGAIN;
583         latest = regpiece(&flags);
584         if (latest == NULL) {
585             if (flags & TRYAGAIN)
586                 continue;
587             return(NULL);
588         }
589         *flagp |= flags&HASWIDTH;
590         if (chain == NULL)      /* First piece. */
591             *flagp |= flags&SPSTART;
592         else {
593             regnaughty++;
594             regtail(chain, latest);
595         }
596         chain = latest;
597     }
598     if (chain == NULL)  /* Loop ran zero times. */
599         (void) regnode(NOTHING);
600
601     return(ret);
602 }
603
604 /*
605  - regpiece - something followed by possible [*+?]
606  *
607  * Note that the branching code sequences used for ? and the general cases
608  * of * and + are somewhat optimized:  they use the same NOTHING node as
609  * both the endmarker for their branch list and the body of the last branch.
610  * It might seem that this node could be dispensed with entirely, but the
611  * endmarker role is not redundant.
612  */
613 static char *
614 regpiece(flagp)
615 I32 *flagp;
616 {
617     register char *ret;
618     register char op;
619     register char *next;
620     I32 flags;
621     char *origparse = regparse;
622     char *maxpos;
623     I32 min;
624     I32 max = 32767;
625
626     ret = regatom(&flags);
627     if (ret == NULL) {
628         if (flags & TRYAGAIN)
629             *flagp |= TRYAGAIN;
630         return(NULL);
631     }
632
633     op = *regparse;
634     if (op == '(' && regparse[1] == '?' && regparse[2] == '#') {
635         while (op && op != ')')
636             op = *++regparse;
637         if (op) {
638             nextchar();
639             op = *regparse;
640         }
641     }
642
643     if (op == '{' && regcurly(regparse)) {
644         next = regparse + 1;
645         maxpos = Nullch;
646         while (isDIGIT(*next) || *next == ',') {
647             if (*next == ',') {
648                 if (maxpos)
649                     break;
650                 else
651                     maxpos = next;
652             }
653             next++;
654         }
655         if (*next == '}') {             /* got one */
656             if (!maxpos)
657                 maxpos = next;
658             regparse++;
659             min = atoi(regparse);
660             if (*maxpos == ',')
661                 maxpos++;
662             else
663                 maxpos = regparse;
664             max = atoi(maxpos);
665             if (!max && *maxpos != '0')
666                 max = 32767;            /* meaning "infinity" */
667             regparse = next;
668             nextchar();
669
670         do_curly:
671             if ((flags&SIMPLE)) {
672                 regnaughty += 2 + regnaughty / 2;
673                 reginsert(CURLY, ret);
674             }
675             else {
676                 regnaughty += 4 + regnaughty;   /* compound interest */
677                 regtail(ret, regnode(WHILEM));
678                 reginsert(CURLYX,ret);
679                 regtail(ret, regnode(NOTHING));
680             }
681
682             if (min > 0)
683                 *flagp = (WORST|HASWIDTH);
684             if (max && max < min)
685                 croak("Can't do {n,m} with n > m");
686             if (regcode != &regdummy) {
687 #ifdef REGALIGN
688                 *(unsigned short *)(ret+3) = min;
689                 *(unsigned short *)(ret+5) = max;
690 #else
691                 ret[3] = min >> 8; ret[4] = min & 0377;
692                 ret[5] = max  >> 8; ret[6] = max  & 0377;
693 #endif
694             }
695
696             goto nest_check;
697         }
698     }
699
700     if (!ISMULT1(op)) {
701         *flagp = flags;
702         return(ret);
703     }
704
705     if (!(flags&HASWIDTH) && op != '?')
706       FAIL("regexp *+ operand could be empty");
707
708     nextchar();
709
710     *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
711
712     if (op == '*' && (flags&SIMPLE)) {
713         reginsert(STAR, ret);
714         regnaughty += 4;
715     }
716     else if (op == '*') {
717         min = 0;
718         goto do_curly;
719     } else if (op == '+' && (flags&SIMPLE)) {
720         reginsert(PLUS, ret);
721         regnaughty += 3;
722     }
723     else if (op == '+') {
724         min = 1;
725         goto do_curly;
726     } else if (op == '?') {
727         min = 0; max = 1;
728         goto do_curly;
729     }
730   nest_check:
731     if (dowarn && regcode != &regdummy && !(flags&HASWIDTH) && max > 10000) {
732         warn("%.*s matches null string many times",
733             regparse - origparse, origparse);
734     }
735
736     if (*regparse == '?') {
737         nextchar();
738         reginsert(MINMOD, ret);
739 #ifdef REGALIGN
740         regtail(ret, ret + 4);
741 #else
742         regtail(ret, ret + 3);
743 #endif
744     }
745     if (ISMULT2(regparse))
746         FAIL("nested *?+ in regexp");
747
748     return(ret);
749 }
750
751 /*
752  - regatom - the lowest level
753  *
754  * Optimization:  gobbles an entire sequence of ordinary characters so that
755  * it can turn them into a single node, which is smaller to store and
756  * faster to run.  Backslashed characters are exceptions, each becoming a
757  * separate node; the code is simpler that way and it's not worth fixing.
758  *
759  * [Yes, it is worth fixing, some scripts can run twice the speed.]
760  */
761 static char *
762 regatom(flagp)
763 I32 *flagp;
764 {
765     register char *ret = 0;
766     I32 flags;
767
768     *flagp = WORST;             /* Tentatively. */
769
770 tryagain:
771     switch (*regparse) {
772     case '^':
773         nextchar();
774         if (regflags & PMf_MULTILINE)
775             ret = regnode(MBOL);
776         else if (regflags & PMf_SINGLELINE)
777             ret = regnode(SBOL);
778         else
779             ret = regnode(BOL);
780         break;
781     case '$':
782         nextchar();
783         if (regflags & PMf_MULTILINE)
784             ret = regnode(MEOL);
785         else if (regflags & PMf_SINGLELINE)
786             ret = regnode(SEOL);
787         else
788             ret = regnode(EOL);
789         break;
790     case '.':
791         nextchar();
792         if (regflags & PMf_SINGLELINE)
793             ret = regnode(SANY);
794         else
795             ret = regnode(ANY);
796         regnaughty++;
797         *flagp |= HASWIDTH|SIMPLE;
798         break;
799     case '[':
800         regparse++;
801         ret = regclass();
802         *flagp |= HASWIDTH|SIMPLE;
803         break;
804     case '(':
805         nextchar();
806         ret = reg(1, &flags);
807         if (ret == NULL) {
808                 if (flags & TRYAGAIN)
809                     goto tryagain;
810                 return(NULL);
811         }
812         *flagp |= flags&(HASWIDTH|SPSTART);
813         break;
814     case '|':
815     case ')':
816         if (flags & TRYAGAIN) {
817             *flagp |= TRYAGAIN;
818             return NULL;
819         }
820         croak("internal urp in regexp at /%s/", regparse);
821                                 /* Supposed to be caught earlier. */
822         break;
823     case '{':
824         if (!regcurly(regparse)) {
825             regparse++;
826             goto defchar;
827         }
828         /* FALL THROUGH */
829     case '?':
830     case '+':
831     case '*':
832         FAIL("?+*{} follows nothing in regexp");
833         break;
834     case '\\':
835         switch (*++regparse) {
836         case 'A':
837             ret = regnode(SBOL);
838             *flagp |= SIMPLE;
839             nextchar();
840             break;
841         case 'G':
842             ret = regnode(GPOS);
843             *flagp |= SIMPLE;
844             nextchar();
845             break;
846         case 'Z':
847             ret = regnode(SEOL);
848             *flagp |= SIMPLE;
849             nextchar();
850             break;
851         case 'w':
852             ret = regnode((regflags & PMf_LOCALE) ? ALNUML : ALNUM);
853             *flagp |= HASWIDTH|SIMPLE;
854             nextchar();
855             break;
856         case 'W':
857             ret = regnode((regflags & PMf_LOCALE) ? NALNUML : NALNUM);
858             *flagp |= HASWIDTH|SIMPLE;
859             nextchar();
860             break;
861         case 'b':
862             ret = regnode((regflags & PMf_LOCALE) ? BOUNDL : BOUND);
863             *flagp |= SIMPLE;
864             nextchar();
865             break;
866         case 'B':
867             ret = regnode((regflags & PMf_LOCALE) ? NBOUNDL : NBOUND);
868             *flagp |= SIMPLE;
869             nextchar();
870             break;
871         case 's':
872             ret = regnode((regflags & PMf_LOCALE) ? SPACEL : SPACE);
873             *flagp |= HASWIDTH|SIMPLE;
874             nextchar();
875             break;
876         case 'S':
877             ret = regnode((regflags & PMf_LOCALE) ? NSPACEL : NSPACE);
878             *flagp |= HASWIDTH|SIMPLE;
879             nextchar();
880             break;
881         case 'd':
882             ret = regnode(DIGIT);
883             *flagp |= HASWIDTH|SIMPLE;
884             nextchar();
885             break;
886         case 'D':
887             ret = regnode(NDIGIT);
888             *flagp |= HASWIDTH|SIMPLE;
889             nextchar();
890             break;
891         case 'n':
892         case 'r':
893         case 't':
894         case 'f':
895         case 'e':
896         case 'a':
897         case 'x':
898         case 'c':
899         case '0':
900             goto defchar;
901         case '1': case '2': case '3': case '4':
902         case '5': case '6': case '7': case '8': case '9':
903             {
904                 I32 num = atoi(regparse);
905
906                 if (num > 9 && num >= regnpar)
907                     goto defchar;
908                 else {
909                     regsawback = 1;
910                     ret = reganode(REF, num);
911                     *flagp |= HASWIDTH;
912                     while (isDIGIT(*regparse))
913                         regparse++;
914                     regparse--;
915                     nextchar();
916                 }
917             }
918             break;
919         case '\0':
920             if (regparse >= regxend)
921                 FAIL("trailing \\ in regexp");
922             /* FALL THROUGH */
923         default:
924             goto defchar;
925         }
926         break;
927
928     case '#':
929         if (regflags & PMf_EXTENDED) {
930             while (regparse < regxend && *regparse != '\n') regparse++;
931             if (regparse < regxend)
932                 goto tryagain;
933         }
934         /* FALL THROUGH */
935
936     default: {
937             register I32 len;
938             register char ender;
939             register char *p;
940             char *oldp;
941             I32 numlen;
942
943             regparse++;
944
945         defchar:
946             ret = regnode((regflags & PMf_FOLD)
947                           ? ((regflags & PMf_LOCALE) ? EXACTFL : EXACTF)
948                           : EXACT);
949             regc(0);            /* save spot for len */
950             for (len = 0, p = regparse - 1;
951               len < 127 && p < regxend;
952               len++)
953             {
954                 oldp = p;
955
956                 if (regflags & PMf_EXTENDED)
957                     p = regwhite(p, regxend);
958                 switch (*p) {
959                 case '^':
960                 case '$':
961                 case '.':
962                 case '[':
963                 case '(':
964                 case ')':
965                 case '|':
966                     goto loopdone;
967                 case '\\':
968                     switch (*++p) {
969                     case 'A':
970                     case 'G':
971                     case 'Z':
972                     case 'w':
973                     case 'W':
974                     case 'b':
975                     case 'B':
976                     case 's':
977                     case 'S':
978                     case 'd':
979                     case 'D':
980                         --p;
981                         goto loopdone;
982                     case 'n':
983                         ender = '\n';
984                         p++;
985                         break;
986                     case 'r':
987                         ender = '\r';
988                         p++;
989                         break;
990                     case 't':
991                         ender = '\t';
992                         p++;
993                         break;
994                     case 'f':
995                         ender = '\f';
996                         p++;
997                         break;
998                     case 'e':
999                         ender = '\033';
1000                         p++;
1001                         break;
1002                     case 'a':
1003                         ender = '\007';
1004                         p++;
1005                         break;
1006                     case 'x':
1007                         ender = scan_hex(++p, 2, &numlen);
1008                         p += numlen;
1009                         break;
1010                     case 'c':
1011                         p++;
1012                         ender = UCHARAT(p++);
1013                         ender = toCTRL(ender);
1014                         break;
1015                     case '0': case '1': case '2': case '3':case '4':
1016                     case '5': case '6': case '7': case '8':case '9':
1017                         if (*p == '0' ||
1018                           (isDIGIT(p[1]) && atoi(p) >= regnpar) ) {
1019                             ender = scan_oct(p, 3, &numlen);
1020                             p += numlen;
1021                         }
1022                         else {
1023                             --p;
1024                             goto loopdone;
1025                         }
1026                         break;
1027                     case '\0':
1028                         if (p >= regxend)
1029                             FAIL("trailing \\ in regexp");
1030                         /* FALL THROUGH */
1031                     default:
1032                         ender = *p++;
1033                         break;
1034                     }
1035                     break;
1036                 default:
1037                     ender = *p++;
1038                     break;
1039                 }
1040                 if (regflags & PMf_EXTENDED)
1041                     p = regwhite(p, regxend);
1042                 if (ISMULT2(p)) { /* Back off on ?+*. */
1043                     if (len)
1044                         p = oldp;
1045                     else {
1046                         len++;
1047                         regc(ender);
1048                     }
1049                     break;
1050                 }
1051                 regc(ender);
1052             }
1053         loopdone:
1054             regparse = p - 1;
1055             nextchar();
1056             if (len < 0)
1057                 FAIL("internal disaster in regexp");
1058             if (len > 0)
1059                 *flagp |= HASWIDTH;
1060             if (len == 1)
1061                 *flagp |= SIMPLE;
1062             if (regcode != &regdummy)
1063                 *OPERAND(ret) = len;
1064             regc('\0');
1065         }
1066         break;
1067     }
1068
1069     return(ret);
1070 }
1071
1072 static char *
1073 regwhite(p, e)
1074 char *p;
1075 char *e;
1076 {
1077     while (p < e) {
1078         if (isSPACE(*p))
1079             ++p;
1080         else if (*p == '#') {
1081             do {
1082                 p++;
1083             } while (p < e && *p != '\n');
1084         }
1085         else
1086             break;
1087     }
1088     return p;
1089 }
1090
1091 static void
1092 regset(opnd, c)
1093 char *opnd;
1094 register I32 c;
1095 {
1096     if (opnd == &regdummy)
1097         return;
1098     c &= 0xFF;
1099     opnd[1 + (c >> 3)] |= (1 << (c & 7));
1100 }
1101
1102 static char *
1103 regclass()
1104 {
1105     register char *opnd;
1106     register I32 class;
1107     register I32 lastclass = 1234;
1108     register I32 range = 0;
1109     register char *ret;
1110     register I32 def;
1111     I32 numlen;
1112
1113     ret = regnode(ANYOF);
1114     opnd = regcode;
1115     for (class = 0; class < 33; class++)
1116         regc(0);
1117     if (*regparse == '^') {     /* Complement of range. */
1118         regnaughty++;
1119         regparse++;
1120         if (opnd != &regdummy)
1121             *opnd |= ANYOF_INVERT;
1122     }
1123     if (opnd != &regdummy) {
1124         if (regflags & PMf_FOLD)
1125             *opnd |= ANYOF_FOLD;
1126         if (regflags & PMf_LOCALE)
1127             *opnd |= ANYOF_LOCALE;
1128     }
1129     if (*regparse == ']' || *regparse == '-')
1130         goto skipcond;          /* allow 1st char to be ] or - */
1131     while (regparse < regxend && *regparse != ']') {
1132        skipcond:
1133         class = UCHARAT(regparse++);
1134         if (class == '\\') {
1135             class = UCHARAT(regparse++);
1136             switch (class) {
1137             case 'w':
1138                 if (regflags & PMf_LOCALE) {
1139                     if (opnd != &regdummy)
1140                         *opnd |= ANYOF_ALNUML;
1141                 }
1142                 else {
1143                     for (class = 0; class < 256; class++)
1144                         if (isALNUM(class))
1145                             regset(opnd, class);
1146                 }
1147                 lastclass = 1234;
1148                 continue;
1149             case 'W':
1150                 if (regflags & PMf_LOCALE) {
1151                     if (opnd != &regdummy)
1152                         *opnd |= ANYOF_NALNUML;
1153                 }
1154                 else {
1155                     for (class = 0; class < 256; class++)
1156                         if (!isALNUM(class))
1157                             regset(opnd, class);
1158                 }
1159                 lastclass = 1234;
1160                 continue;
1161             case 's':
1162                 if (regflags & PMf_LOCALE) {
1163                     if (opnd != &regdummy)
1164                         *opnd |= ANYOF_SPACEL;
1165                 }
1166                 else {
1167                     for (class = 0; class < 256; class++)
1168                         if (isSPACE(class))
1169                             regset(opnd, class);
1170                 }
1171                 lastclass = 1234;
1172                 continue;
1173             case 'S':
1174                 if (regflags & PMf_LOCALE) {
1175                     if (opnd != &regdummy)
1176                         *opnd |= ANYOF_NSPACEL;
1177                 }
1178                 else {
1179                     for (class = 0; class < 256; class++)
1180                         if (!isSPACE(class))
1181                             regset(opnd, class);
1182                 }
1183                 lastclass = 1234;
1184                 continue;
1185             case 'd':
1186                 for (class = '0'; class <= '9'; class++)
1187                     regset(opnd, class);
1188                 lastclass = 1234;
1189                 continue;
1190             case 'D':
1191                 for (class = 0; class < '0'; class++)
1192                     regset(opnd, class);
1193                 for (class = '9' + 1; class < 256; class++)
1194                     regset(opnd, class);
1195                 lastclass = 1234;
1196                 continue;
1197             case 'n':
1198                 class = '\n';
1199                 break;
1200             case 'r':
1201                 class = '\r';
1202                 break;
1203             case 't':
1204                 class = '\t';
1205                 break;
1206             case 'f':
1207                 class = '\f';
1208                 break;
1209             case 'b':
1210                 class = '\b';
1211                 break;
1212             case 'e':
1213                 class = '\033';
1214                 break;
1215             case 'a':
1216                 class = '\007';
1217                 break;
1218             case 'x':
1219                 class = scan_hex(regparse, 2, &numlen);
1220                 regparse += numlen;
1221                 break;
1222             case 'c':
1223                 class = UCHARAT(regparse++);
1224                 class = toCTRL(class);
1225                 break;
1226             case '0': case '1': case '2': case '3': case '4':
1227             case '5': case '6': case '7': case '8': case '9':
1228                 class = scan_oct(--regparse, 3, &numlen);
1229                 regparse += numlen;
1230                 break;
1231             }
1232         }
1233         if (range) {
1234             if (lastclass > class)
1235                 FAIL("invalid [] range in regexp");
1236             range = 0;
1237         }
1238         else {
1239             lastclass = class;
1240             if (*regparse == '-' && regparse+1 < regxend &&
1241               regparse[1] != ']') {
1242                 regparse++;
1243                 range = 1;
1244                 continue;       /* do it next time */
1245             }
1246         }
1247         for ( ; lastclass <= class; lastclass++)
1248             regset(opnd, lastclass);
1249         lastclass = class;
1250     }
1251     if (*regparse != ']')
1252         FAIL("unmatched [] in regexp");
1253     nextchar();
1254     return ret;
1255 }
1256
1257 static char*
1258 nextchar()
1259 {
1260     char* retval = regparse++;
1261
1262     for (;;) {
1263         if (*regparse == '(' && regparse[1] == '?' &&
1264                 regparse[2] == '#') {
1265             while (*regparse && *regparse != ')')
1266                 regparse++;
1267             regparse++;
1268             continue;
1269         }
1270         if (regflags & PMf_EXTENDED) {
1271             if (isSPACE(*regparse)) {
1272                 regparse++;
1273                 continue;
1274             }
1275             else if (*regparse == '#') {
1276                 while (*regparse && *regparse != '\n')
1277                     regparse++;
1278                 regparse++;
1279                 continue;
1280             }
1281         }
1282         return retval;
1283     }
1284 }
1285
1286 /*
1287 - regnode - emit a node
1288 */
1289 #ifdef CAN_PROTOTYPE
1290 static char *                   /* Location. */
1291 regnode(char op)
1292 #else
1293 static char *                   /* Location. */
1294 regnode(op)
1295 char op;
1296 #endif
1297 {
1298     register char *ret;
1299     register char *ptr;
1300
1301     ret = regcode;
1302     if (ret == &regdummy) {
1303 #ifdef REGALIGN
1304         if (!(regsize & 1))
1305             regsize++;
1306 #endif
1307         regsize += 3;
1308         return(ret);
1309     }
1310
1311 #ifdef REGALIGN
1312 #ifndef lint
1313     if (!((long)ret & 1))
1314       *ret++ = 127;
1315 #endif
1316 #endif
1317     ptr = ret;
1318     *ptr++ = op;
1319     *ptr++ = '\0';              /* Null "next" pointer. */
1320     *ptr++ = '\0';
1321     regcode = ptr;
1322
1323     return(ret);
1324 }
1325
1326 /*
1327 - reganode - emit a node with an argument
1328 */
1329 #ifdef CAN_PROTOTYPE
1330 static char *                   /* Location. */
1331 reganode(char op, unsigned short arg)
1332 #else
1333 static char *                   /* Location. */
1334 reganode(op, arg)
1335 char op;
1336 unsigned short arg;
1337 #endif
1338 {
1339     register char *ret;
1340     register char *ptr;
1341
1342     ret = regcode;
1343     if (ret == &regdummy) {
1344 #ifdef REGALIGN
1345         if (!(regsize & 1))
1346             regsize++;
1347 #endif
1348         regsize += 5;
1349         return(ret);
1350     }
1351
1352 #ifdef REGALIGN
1353 #ifndef lint
1354     if (!((long)ret & 1))
1355       *ret++ = 127;
1356 #endif
1357 #endif
1358     ptr = ret;
1359     *ptr++ = op;
1360     *ptr++ = '\0';              /* Null "next" pointer. */
1361     *ptr++ = '\0';
1362 #ifdef REGALIGN
1363     *(unsigned short *)(ret+3) = arg;
1364 #else
1365     ret[3] = arg >> 8; ret[4] = arg & 0377;
1366 #endif
1367     ptr += 2;
1368     regcode = ptr;
1369
1370     return(ret);
1371 }
1372
1373 /*
1374 - regc - emit (if appropriate) a byte of code
1375 */
1376 #ifdef CAN_PROTOTYPE
1377 static void
1378 regc(char b)
1379 #else
1380 static void
1381 regc(b)
1382 char b;
1383 #endif
1384 {
1385     if (regcode != &regdummy)
1386         *regcode++ = b;
1387     else
1388         regsize++;
1389 }
1390
1391 /*
1392 - reginsert - insert an operator in front of already-emitted operand
1393 *
1394 * Means relocating the operand.
1395 */
1396 #ifdef CAN_PROTOTYPE
1397 static void
1398 reginsert(char op, char *opnd)
1399 #else
1400 static void
1401 reginsert(op, opnd)
1402 char op;
1403 char *opnd;
1404 #endif
1405 {
1406     register char *src;
1407     register char *dst;
1408     register char *place;
1409     register int offset = (regkind[(U8)op] == CURLY ? 4 : 0);
1410
1411     if (regcode == &regdummy) {
1412 #ifdef REGALIGN
1413         regsize += 4 + offset;
1414 #else
1415         regsize += 3 + offset;
1416 #endif
1417         return;
1418     }
1419
1420     src = regcode;
1421 #ifdef REGALIGN
1422     regcode += 4 + offset;
1423 #else
1424     regcode += 3 + offset;
1425 #endif
1426     dst = regcode;
1427     while (src > opnd)
1428         *--dst = *--src;
1429
1430     place = opnd;               /* Op node, where operand used to be. */
1431     *place++ = op;
1432     *place++ = '\0';
1433     *place++ = '\0';
1434     while (offset-- > 0)
1435         *place++ = '\0';
1436 #ifdef REGALIGN
1437     *place++ = '\177';
1438 #endif
1439 }
1440
1441 /*
1442 - regtail - set the next-pointer at the end of a node chain
1443 */
1444 static void
1445 regtail(p, val)
1446 char *p;
1447 char *val;
1448 {
1449     register char *scan;
1450     register char *temp;
1451     register I32 offset;
1452
1453     if (p == &regdummy)
1454         return;
1455
1456     /* Find last node. */
1457     scan = p;
1458     for (;;) {
1459         temp = regnext(scan);
1460         if (temp == NULL)
1461             break;
1462         scan = temp;
1463     }
1464
1465 #ifdef REGALIGN
1466     offset = val - scan;
1467 #ifndef lint
1468     *(short*)(scan+1) = offset;
1469 #else
1470     offset = offset;
1471 #endif
1472 #else
1473     if (OP(scan) == BACK)
1474         offset = scan - val;
1475     else
1476         offset = val - scan;
1477     *(scan+1) = (offset>>8)&0377;
1478     *(scan+2) = offset&0377;
1479 #endif
1480 }
1481
1482 /*
1483 - regoptail - regtail on operand of first argument; nop if operandless
1484 */
1485 static void
1486 regoptail(p, val)
1487 char *p;
1488 char *val;
1489 {
1490     /* "Operandless" and "op != BRANCH" are synonymous in practice. */
1491     if (p == NULL || p == &regdummy || regkind[(U8)OP(p)] != BRANCH)
1492         return;
1493     regtail(NEXTOPER(p), val);
1494 }
1495
1496 /*
1497  - regcurly - a little FSA that accepts {\d+,?\d*}
1498  */
1499 STATIC I32
1500 regcurly(s)
1501 register char *s;
1502 {
1503     if (*s++ != '{')
1504         return FALSE;
1505     if (!isDIGIT(*s))
1506         return FALSE;
1507     while (isDIGIT(*s))
1508         s++;
1509     if (*s == ',')
1510         s++;
1511     while (isDIGIT(*s))
1512         s++;
1513     if (*s != '}')
1514         return FALSE;
1515     return TRUE;
1516 }
1517
1518 #ifdef DEBUGGING
1519
1520 /*
1521  - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
1522  */
1523 void
1524 regdump(r)
1525 regexp *r;
1526 {
1527     register char *s;
1528     register char op = EXACT;   /* Arbitrary non-END op. */
1529     register char *next;
1530     SV *sv = sv_newmortal();
1531
1532     s = r->program + 1;
1533     while (op != END) { /* While that wasn't END last time... */
1534 #ifdef REGALIGN
1535         if (!((long)s & 1))
1536             s++;
1537 #endif
1538         op = OP(s);
1539         /* where, what */
1540         regprop(sv, s);
1541         PerlIO_printf(Perl_debug_log, "%2d%s", s - r->program, SvPVX(sv));
1542         next = regnext(s);
1543         s += regarglen[(U8)op];
1544         if (next == NULL)               /* Next ptr. */
1545             PerlIO_printf(Perl_debug_log, "(0)");
1546         else 
1547             PerlIO_printf(Perl_debug_log, "(%d)", (s-r->program)+(next-s));
1548         s += 3;
1549         if (op == ANYOF) {
1550             s += 33;
1551         }
1552         if (regkind[(U8)op] == EXACT) {
1553             /* Literal string, where present. */
1554             s++;
1555             (void)PerlIO_putc(Perl_debug_log, ' ');
1556             (void)PerlIO_putc(Perl_debug_log, '<');
1557             while (*s != '\0') {
1558                 (void)PerlIO_putc(Perl_debug_log,*s);
1559                 s++;
1560             }
1561             (void)PerlIO_putc(Perl_debug_log, '>');
1562             s++;
1563         }
1564         (void)PerlIO_putc(Perl_debug_log, '\n');
1565     }
1566
1567     /* Header fields of interest. */
1568     if (r->regstart)
1569         PerlIO_printf(Perl_debug_log, "start `%s' ", SvPVX(r->regstart));
1570     if (r->regstclass) {
1571         regprop(sv, r->regstclass);
1572         PerlIO_printf(Perl_debug_log, "stclass `%s' ", SvPVX(sv));
1573     }
1574     if (r->reganch & ROPT_ANCH) {
1575         PerlIO_printf(Perl_debug_log, "anchored");
1576         if (r->reganch & ROPT_ANCH_BOL)
1577             PerlIO_printf(Perl_debug_log, "(BOL)");
1578         if (r->reganch & ROPT_ANCH_GPOS)
1579             PerlIO_printf(Perl_debug_log, "(GPOS)");
1580         PerlIO_putc(Perl_debug_log, ' ');
1581     }
1582     if (r->reganch & ROPT_SKIP)
1583         PerlIO_printf(Perl_debug_log, "plus ");
1584     if (r->reganch & ROPT_IMPLICIT)
1585         PerlIO_printf(Perl_debug_log, "implicit ");
1586     if (r->regmust != NULL)
1587         PerlIO_printf(Perl_debug_log, "must have \"%s\" back %ld ", SvPVX(r->regmust),
1588          (long) r->regback);
1589     PerlIO_printf(Perl_debug_log, "minlen %ld ", (long) r->minlen);
1590     PerlIO_printf(Perl_debug_log, "\n");
1591 }
1592
1593 /*
1594 - regprop - printable representation of opcode
1595 */
1596 void
1597 regprop(sv, o)
1598 SV *sv;
1599 char *o;
1600 {
1601     register char *p = 0;
1602
1603     sv_setpv(sv, ":");
1604     switch (OP(o)) {
1605     case BOL:
1606         p = "BOL";
1607         break;
1608     case MBOL:
1609         p = "MBOL";
1610         break;
1611     case SBOL:
1612         p = "SBOL";
1613         break;
1614     case EOL:
1615         p = "EOL";
1616         break;
1617     case MEOL:
1618         p = "MEOL";
1619         break;
1620     case SEOL:
1621         p = "SEOL";
1622         break;
1623     case ANY:
1624         p = "ANY";
1625         break;
1626     case SANY:
1627         p = "SANY";
1628         break;
1629     case ANYOF:
1630         p = "ANYOF";
1631         break;
1632     case BRANCH:
1633         p = "BRANCH";
1634         break;
1635     case EXACT:
1636         p = "EXACT";
1637         break;
1638     case EXACTF:
1639         p = "EXACTF";
1640         break;
1641     case EXACTFL:
1642         p = "EXACTFL";
1643         break;
1644     case NOTHING:
1645         p = "NOTHING";
1646         break;
1647     case BACK:
1648         p = "BACK";
1649         break;
1650     case END:
1651         p = "END";
1652         break;
1653     case BOUND:
1654         p = "BOUND";
1655         break;
1656     case BOUNDL:
1657         p = "BOUNDL";
1658         break;
1659     case NBOUND:
1660         p = "NBOUND";
1661         break;
1662     case NBOUNDL:
1663         p = "NBOUNDL";
1664         break;
1665     case CURLY:
1666         sv_catpvf(sv, "CURLY {%d,%d}", ARG1(o), ARG2(o));
1667         break;
1668     case CURLYX:
1669         sv_catpvf(sv, "CURLYX {%d,%d}", ARG1(o), ARG2(o));
1670         break;
1671     case REF:
1672         sv_catpvf(sv, "REF%d", ARG1(o));
1673         break;
1674     case OPEN:
1675         sv_catpvf(sv, "OPEN%d", ARG1(o));
1676         break;
1677     case CLOSE:
1678         sv_catpvf(sv, "CLOSE%d", ARG1(o));
1679         p = NULL;
1680         break;
1681     case STAR:
1682         p = "STAR";
1683         break;
1684     case PLUS:
1685         p = "PLUS";
1686         break;
1687     case MINMOD:
1688         p = "MINMOD";
1689         break;
1690     case GPOS:
1691         p = "GPOS";
1692         break;
1693     case UNLESSM:
1694         p = "UNLESSM";
1695         break;
1696     case IFMATCH:
1697         p = "IFMATCH";
1698         break;
1699     case SUCCEED:
1700         p = "SUCCEED";
1701         break;
1702     case WHILEM:
1703         p = "WHILEM";
1704         break;
1705     case DIGIT:
1706         p = "DIGIT";
1707         break;
1708     case NDIGIT:
1709         p = "NDIGIT";
1710         break;
1711     case ALNUM:
1712         p = "ALNUM";
1713         break;
1714     case NALNUM:
1715         p = "NALNUM";
1716         break;
1717     case SPACE:
1718         p = "SPACE";
1719         break;
1720     case NSPACE:
1721         p = "NSPACE";
1722         break;
1723     case ALNUML:
1724         p = "ALNUML";
1725         break;
1726     case NALNUML:
1727         p = "NALNUML";
1728         break;
1729     case SPACEL:
1730         p = "SPACEL";
1731         break;
1732     case NSPACEL:
1733         p = "NSPACEL";
1734         break;
1735     default:
1736         FAIL("corrupted regexp opcode");
1737     }
1738     if (p)
1739         sv_catpv(sv, p);
1740 }
1741 #endif /* DEBUGGING */
1742
1743 void
1744 pregfree(r)
1745 struct regexp *r;
1746 {
1747     if (!r)
1748         return;
1749     if (r->precomp) {
1750         Safefree(r->precomp);
1751         r->precomp = Nullch;
1752     }
1753     if (r->subbase) {
1754         Safefree(r->subbase);
1755         r->subbase = Nullch;
1756     }
1757     if (r->regmust) {
1758         SvREFCNT_dec(r->regmust);
1759         r->regmust = Nullsv;
1760     }
1761     if (r->regstart) {
1762         SvREFCNT_dec(r->regstart);
1763         r->regstart = Nullsv;
1764     }
1765     Safefree(r->startp);
1766     Safefree(r->endp);
1767     Safefree(r);
1768 }