[asperl] fixups to make it build and pass tests under both compilers
[p5sagit/p5-mst-13.2.git] / regexec.c
index d3b6783..a38e97d 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -74,10 +74,12 @@ static I32 regmatch _((regnode *prog));
 static I32 regrepeat _((regnode *p, I32 max));
 static I32 regrepeat_hard _((regnode *p, I32 max, I32 *lp));
 static I32 regtry _((regexp *prog, char *startpos));
+
 static bool reginclass _((char *p, I32 c));
 static CHECKPOINT regcppush _((I32 parenfloor));
 static char * regcppop _((void));
 #endif
+#define REGINCLASS(p,c)  (*(p) ? reginclass(p,c) : ANYOF_TEST(p,c))
 
 STATIC CHECKPOINT
 regcppush(I32 parenfloor)
@@ -383,7 +385,7 @@ regexec_flags(register regexp *prog, char *stringarg, register char *strend, cha
        case ANYOF:
            Class = (char *) OPERAND(c);
            while (s < strend) {
-               if (reginclass(Class, *s)) {
+               if (REGINCLASS(Class, *s)) {
                    if (tmp && regtry(prog, s))
                        goto got_it;
                    else
@@ -850,7 +852,7 @@ regmatch(regnode *prog)
            s = (char *) OPERAND(scan);
            if (nextchr < 0)
                nextchr = UCHARAT(locinput);
-           if (!reginclass(s, nextchr))
+           if (!REGINCLASS(s, nextchr))
                sayNO;
            if (!nextchr && locinput >= regeol)
                sayNO;
@@ -939,7 +941,7 @@ regmatch(regnode *prog)
            n = ARG(scan);  /* which paren pair */
            s = regstartp[n];
            if (*reglastparen < n || !s)
-               break;                  /* Zero length always matches */
+               sayNO;                  /* Do not match unless seen CLOSEn. */
            if (s == regendp[n])
                break;
            /* Inline the first character, for speed. */
@@ -1273,7 +1275,7 @@ regmatch(regnode *prog)
                    *reglastparen = paren;
            }
 #endif 
-           scan = NEXTOPER(scan) + 4/sizeof(regnode);
+           scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
            if (paren)
                scan += NEXT_OFF(scan); /* Skip former OPEN. */
            reginput = locinput;
@@ -1387,13 +1389,13 @@ regmatch(regnode *prog)
                *reglastparen = paren;
            ln = ARG1(scan);  /* min to match */
            n  = ARG2(scan);  /* max to match */
-            scan = regnext(NEXTOPER(scan) + 4/sizeof(regnode));
+            scan = regnext(NEXTOPER(scan) + NODE_STEP_REGNODE);
            goto repeat;
        case CURLY:
            paren = 0;
            ln = ARG1(scan);  /* min to match */
            n  = ARG2(scan);  /* max to match */
-           scan = NEXTOPER(scan) + 4/sizeof(regnode);
+           scan = NEXTOPER(scan) + NODE_STEP_REGNODE;
            goto repeat;
        case STAR:
            ln = 0;
@@ -1623,7 +1625,7 @@ regrepeat(regnode *p, I32 max)
            scan++;
        break;
     case ANYOF:
-       while (scan < loceol && reginclass(opnd, *scan))
+       while (scan < loceol && REGINCLASS(opnd, *scan))
            scan++;
        break;
     case ALNUM:
@@ -1734,7 +1736,7 @@ reginclass(register char *p, register I32 c)
     bool match = FALSE;
 
     c &= 0xFF;
-    if (p[1 + (c >> 3)] & (1 << (c & 7)))
+    if (ANYOF_TEST(p, c))
        match = TRUE;
     else if (flags & ANYOF_FOLD) {
        I32 cf;
@@ -1744,7 +1746,7 @@ reginclass(register char *p, register I32 c)
        }
        else
            cf = fold[c];
-       if (p[1 + (cf >> 3)] & (1 << (cf & 7)))
+       if (ANYOF_TEST(p, cf))
            match = TRUE;
     }
 
@@ -1760,7 +1762,7 @@ reginclass(register char *p, register I32 c)
        }
     }
 
-    return match ^ ((flags & ANYOF_INVERT) != 0);
+    return (flags & ANYOF_INVERT) ? !match : match;
 }