perl 4.0 patch 14: patch #11, continued
[p5sagit/p5-mst-13.2.git] / regexec.c
index 45076d3..bb63eda 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -7,9 +7,16 @@
  * blame Henry for some of the lack of readability.
  */
 
-/* $Header: regexec.c,v 4.0 91/03/20 01:39:16 lwall Locked $
+/* $RCSfile: regexec.c,v $$Revision: 4.0.1.2 $$Date: 91/06/07 11:50:33 $
  *
  * $Log:       regexec.c,v $
+ * Revision 4.0.1.2  91/06/07  11:50:33  lwall
+ * patch4: new copyright notice
+ * patch4: // wouldn't use previous pattern if it started with a null character
+ * 
+ * Revision 4.0.1.1  91/04/12  09:07:39  lwall
+ * patch1: regexec only allocated space for 9 subexpresssions
+ * 
  * Revision 4.0  91/03/20  01:39:16  lwall
  * 4.0 baseline.
  * 
  *
  ****    Alterations to Henry's code are...
  ****
- ****    Copyright (c) 1989, Larry Wall
+ ****    Copyright (c) 1991, Larry Wall
  ****
- ****    You may distribute under the terms of the GNU General Public License
- ****    as specified in the README file that comes with the perl 3.0 kit.
+ ****    You may distribute under the terms of either the GNU General Public
+ ****    License or the Artistic License, as specified in the README file.
  *
  * Beware that some of this code is subtly aware of the way operator
  * precedence is structured in regular expressions.  Serious changes in
@@ -80,8 +87,9 @@ static char **regendp;                /* Ditto for endp. */
 static char *reglastparen;     /* Similarly for lastparen. */
 static char *regtill;
 
-static char *regmystartp[10];  /* For remembering backreferences. */
-static char *regmyendp[10];
+static int regmyp_size = 0;
+static char **regmystartp = Null(char**);
+static char **regmyendp   = Null(char**);
 
 /*
  * Forwards.
@@ -147,7 +155,8 @@ int safebase;       /* no need to remember string in subbase */
        /* If there is a "must appear" string, look for it. */
        s = string;
        if (prog->regmust != Nullstr &&
-           (!(prog->reganch & 1) || (multiline && prog->regback >= 0)) ) {
+           (!(prog->reganch & ROPT_ANCH)
+            || (multiline && prog->regback >= 0)) ) {
                if (stringarg == strbeg && screamer) {
                        if (screamfirst[prog->regmust->str_rare] >= 0)
                                s = screaminstr(screamer,prog->regmust);
@@ -189,9 +198,27 @@ int safebase;      /* no need to remember string in subbase */
        /* see how far we have to get to not match where we matched before */
        regtill = string+minend;
 
+       /* Allocate our backreference arrays */
+       if ( regmyp_size < prog->nparens + 1 ) {
+           /* Allocate or enlarge the arrays */
+           regmyp_size = prog->nparens + 1;
+           if ( regmyp_size < 10 ) regmyp_size = 10;   /* minimum */
+           if ( regmystartp ) {
+               /* reallocate larger */
+               Renew(regmystartp,regmyp_size,char*);
+               Renew(regmyendp,  regmyp_size,char*);
+           }
+           else {
+               /* Initial allocation */
+               New(1102,regmystartp,regmyp_size,char*);
+               New(1102,regmyendp,  regmyp_size,char*);
+           }
+       
+       }
+
        /* Simplest case:  anchored match need be tried only once. */
        /*  [unless multiline is set] */
-       if (prog->reganch & 1) {
+       if (prog->reganch & ROPT_ANCH) {
                if (regtry(prog, string))
                        goto got_it;
                else if (multiline) {
@@ -213,7 +240,7 @@ int safebase;       /* no need to remember string in subbase */
 
        /* Messy cases:  unanchored match. */
        if (prog->regstart) {
-               if (prog->reganch & 2) {        /* we have /x+whatever/ */
+               if (prog->reganch & ROPT_SKIP) {  /* we have /x+whatever/ */
                    /* it must be a one character string */
                    i = prog->regstart->str_ptr[0];
                    while (s < strend) {
@@ -253,7 +280,7 @@ int safebase;       /* no need to remember string in subbase */
                goto phooey;
        }
        if (c = prog->regstclass) {
-               int doevery = (prog->reganch & 2) == 0;
+               int doevery = (prog->reganch & ROPT_SKIP) == 0;
 
                if (minlen)
                    dontbother = minlen - 1;
@@ -423,7 +450,7 @@ int safebase;       /* no need to remember string in subbase */
                    s = nsavestr(strbeg,i);     /* so $digit will work later */
                    if (prog->subbase)
                            Safefree(prog->subbase);
-                   prog->subbase = s;
+                   prog->subbeg = prog->subbase = s;
                    prog->subend = s+i;
                }
                else