Integrate:
[p5sagit/p5-mst-13.2.git] / regexec.c
index 728b1ae..e843478 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -5,6 +5,11 @@
  * "One Ring to rule them all, One Ring to find them..."
  */
 
+/* This file contains functions for executing a regular expression.  See
+ * also regcomp.c which funnily enough, contains functions for compiling
+ * a regular expression.
+ */
+
 /* NOTE: this is derived from Henry Spencer's regexp code, and should not
  * confused with the original package (see point 3 below).  Thanks, Henry!
  */
@@ -954,6 +959,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        char *m;
        STRLEN ln;
        STRLEN lnc;
+       register STRLEN uskip;
        unsigned int c1;
        unsigned int c2;
        char *e;
@@ -964,7 +970,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        switch (OP(c)) {
        case ANYOF:
            if (do_utf8) {
-                while (s < strend) {
+                while (s + (uskip = UTF8SKIP(s)) <= strend) {
                      if ((ANYOF_FLAGS(c) & ANYOF_UNICODE) ||
                          !UTF8_IS_INVARIANT((U8)s[0]) ?
                          reginclass(c, (U8*)s, 0, do_utf8) :
@@ -976,7 +982,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                      }
                      else 
                           tmp = 1;
-                     s += UTF8SKIP(s);
+                     s += uskip;
                 }
            }
            else {
@@ -1172,7 +1178,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                tmp = ((OP(c) == BOUND ?
                        isALNUM_uni(tmp) : isALNUM_LC_uvchr(UNI_TO_NATIVE(tmp))) != 0);
                LOAD_UTF8_CHARCLASS(alnum,"a");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (tmp == !(OP(c) == BOUND ?
                                 swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
                                 isALNUM_LC_utf8((U8*)s)))
@@ -1181,7 +1187,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                        if ((norun || regtry(prog, s)))
                            goto got_it;
                    }
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1215,14 +1221,14 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                tmp = ((OP(c) == NBOUND ?
                        isALNUM_uni(tmp) : isALNUM_LC_uvchr(UNI_TO_NATIVE(tmp))) != 0);
                LOAD_UTF8_CHARCLASS(alnum,"a");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (tmp == !(OP(c) == NBOUND ?
                                 swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
                                 isALNUM_LC_utf8((U8*)s)))
                        tmp = !tmp;
                    else if ((norun || regtry(prog, s)))
                        goto got_it;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1244,7 +1250,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case ALNUM:
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS(alnum,"a");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1253,7 +1259,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1273,7 +1279,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case ALNUML:
            PL_reg_flags |= RF_tainted;
            if (do_utf8) {
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (isALNUM_LC_utf8((U8*)s)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1282,7 +1288,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1302,7 +1308,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case NALNUM:
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS(alnum,"a");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (!swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1311,7 +1317,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1331,7 +1337,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case NALNUML:
            PL_reg_flags |= RF_tainted;
            if (do_utf8) {
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (!isALNUM_LC_utf8((U8*)s)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1340,7 +1346,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1360,7 +1366,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case SPACE:
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS(space," ");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s, do_utf8)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1369,7 +1375,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1389,7 +1395,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case SPACEL:
            PL_reg_flags |= RF_tainted;
            if (do_utf8) {
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (*s == ' ' || isSPACE_LC_utf8((U8*)s)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1398,7 +1404,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1418,7 +1424,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case NSPACE:
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS(space," ");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (!(*s == ' ' || swash_fetch(PL_utf8_space,(U8*)s, do_utf8))) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1427,7 +1433,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1447,7 +1453,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case NSPACEL:
            PL_reg_flags |= RF_tainted;
            if (do_utf8) {
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (!(*s == ' ' || isSPACE_LC_utf8((U8*)s))) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1456,7 +1462,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1476,7 +1482,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case DIGIT:
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS(digit,"0");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (swash_fetch(PL_utf8_digit,(U8*)s, do_utf8)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1485,7 +1491,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1505,7 +1511,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case DIGITL:
            PL_reg_flags |= RF_tainted;
            if (do_utf8) {
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (isDIGIT_LC_utf8((U8*)s)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1514,7 +1520,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1534,7 +1540,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case NDIGIT:
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS(digit,"0");
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (!swash_fetch(PL_utf8_digit,(U8*)s, do_utf8)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1543,7 +1549,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {
@@ -1563,7 +1569,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
        case NDIGITL:
            PL_reg_flags |= RF_tainted;
            if (do_utf8) {
-               while (s < strend) {
+               while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (!isDIGIT_LC_utf8((U8*)s)) {
                        if (tmp && (norun || regtry(prog, s)))
                            goto got_it;
@@ -1572,7 +1578,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                    }
                    else
                        tmp = 1;
-                   s += UTF8SKIP(s);
+                   s += uskip;
                }
            }
            else {