Re: AIX and gcc (moving targets)
[p5sagit/p5-mst-13.2.git] / regexec.c
index c9096f0..699ba4c 100644 (file)
--- a/regexec.c
+++ b/regexec.c
 #define HOPc(pos,off) ((char*)HOP(pos,off))
 #define HOPMAYBEc(pos,off) ((char*)HOPMAYBE(pos,off))
 
+#define HOPBACK(pos, off) (            \
+    (UTF && DO_UTF8(PL_reg_sv))                \
+       ? reghopmaybe((U8*)pos, -off)   \
+    : (pos - off >= PL_bostr)          \
+       ? (U8*)(pos - off)              \
+    : (U8*)NULL                                \
+)
+#define HOPBACKc(pos, off) (char*)HOPBACK(pos, off)
+
 #define reghop3_c(pos,off,lim) ((char*)reghop3((U8*)pos, off, (U8*)lim))
 #define reghopmaybe3_c(pos,off,lim) ((char*)reghopmaybe3((U8*)pos, off, (U8*)lim))
 #define HOP3(pos,off,lim) (DO_UTF8(PL_reg_sv) ? reghop3((U8*)pos, off, (U8*)lim) : (U8*)(pos + off))
@@ -135,6 +144,9 @@ S_regcppush(pTHX_ I32 parenfloor)
     int paren_elems_to_push = (PL_regsize - parenfloor) * REGCP_PAREN_ELEMS;
     int p;
 
+    if (paren_elems_to_push < 0)
+       Perl_croak(aTHX_ "panic: paren_elems_to_push < 0");
+
 #define REGCP_OTHER_ELEMS 5
     SSCHECK(paren_elems_to_push + REGCP_OTHER_ELEMS);
     for (p = PL_regsize; p > parenfloor; p--) {
@@ -946,7 +958,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
            /* FALL THROUGH */
        case BOUND:
            if (do_utf8) {
-               if (s == startpos)
+               if (s == PL_bostr)
                    tmp = '\n';
                else {
                    U8 *r = reghop3((U8*)s, -1, (U8*)startpos);
@@ -969,7 +981,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                }
            }
            else {
-               tmp = (s != startpos) ? UCHARAT(s - 1) : '\n';
+               tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
                tmp = ((OP(c) == BOUND ? isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
                while (s < strend) {
                    if (tmp ==
@@ -989,7 +1001,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
            /* FALL THROUGH */
        case NBOUND:
            if (do_utf8) {
-               if (s == startpos)
+               if (s == PL_bostr)
                    tmp = '\n';
                else {
                    U8 *r = reghop3((U8*)s, -1, (U8*)startpos);
@@ -1010,7 +1022,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                }
            }
            else {
-               tmp = (s != startpos) ? UCHARAT(s - 1) : '\n';
+               tmp = (s != PL_bostr) ? UCHARAT(s - 1) : '\n';
                tmp = ((OP(c) == NBOUND ?
                        isALNUM(tmp) : isALNUM_LC(tmp)) != 0);
                while (s < strend) {
@@ -1429,19 +1441,6 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *
       if (strend - startpos < minlen) goto phooey;
     }
 
-    if (startpos == strbeg)    /* is ^ valid at stringarg? */
-       PL_regprev = '\n';
-    else {
-        if (prog->reganch & ROPT_UTF8 && do_utf8) {
-           U8 *s = reghop3((U8*)stringarg, -1, (U8*)strbeg);
-           PL_regprev = utf8n_to_uvchr(s, (U8*)stringarg - s, NULL, 0);
-       }
-       else
-           PL_regprev = (U32)stringarg[-1];
-       if (!PL_multiline && PL_regprev == '\n')
-           PL_regprev = '\0';          /* force ^ to NOT match */
-    }
-
     /* Check validity of program. */
     if (UCHARAT(prog->program) != REG_MAGIC) {
        Perl_croak(aTHX_ "corrupted regexp program");
@@ -1478,7 +1477,8 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *
            PL_reg_ganch = startpos;
        else if (sv && SvTYPE(sv) >= SVt_PVMG
                  && SvMAGIC(sv)
-                 && (mg = mg_find(sv, 'g')) && mg->mg_len >= 0) {
+                 && (mg = mg_find(sv, PERL_MAGIC_regex_global))
+                 && mg->mg_len >= 0) {
            PL_reg_ganch = strbeg + mg->mg_len; /* Defined pos() */
            if (prog->reganch & ROPT_ANCH_GPOS) {
                if (s > PL_reg_ganch)
@@ -1829,10 +1829,11 @@ S_regtry(pTHX_ regexp *prog, char *startpos)
            }
        
            if (!(SvTYPE(PL_reg_sv) >= SVt_PVMG && SvMAGIC(PL_reg_sv)
-                 && (mg = mg_find(PL_reg_sv, 'g')))) {
+                 && (mg = mg_find(PL_reg_sv, PERL_MAGIC_regex_global)))) {
                /* prepare for quick setting of pos */
-               sv_magic(PL_reg_sv, (SV*)0, 'g', Nullch, 0);
-               mg = mg_find(PL_reg_sv, 'g');
+               sv_magic(PL_reg_sv, (SV*)0,
+                       PERL_MAGIC_regex_global, Nullch, 0);
+               mg = mg_find(PL_reg_sv, PERL_MAGIC_regex_global);
                mg->mg_len = -1;
            }
            PL_reg_magic    = mg;
@@ -2044,19 +2045,16 @@ S_regmatch(pTHX_ regnode *prog)
 
        switch (OP(scan)) {
        case BOL:
-           if (locinput == PL_bostr
-               ? PL_regprev == '\n'
-               : (PL_multiline &&
-                  (nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
+           if (locinput == PL_bostr || (PL_multiline &&
+               (nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
            {
                /* regtill = regbol; */
                break;
            }
            sayNO;
        case MBOL:
-           if (locinput == PL_bostr
-               ? PL_regprev == '\n'
-               : ((nextchr || locinput < PL_regeol) && locinput[-1] == '\n') )
+           if (locinput == PL_bostr ||
+               ((nextchr || locinput < PL_regeol) && locinput[-1] == '\n'))
            {
                break;
            }
@@ -2213,6 +2211,7 @@ S_regmatch(pTHX_ regnode *prog)
            if (!nextchr)
                sayNO;
            if (do_utf8) {
+               LOAD_UTF8_CHARCLASS(alnum,"a");
                if (!(OP(scan) == ALNUM
                      ? swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
                      : isALNUM_LC_utf8((U8*)locinput)))
@@ -2259,8 +2258,8 @@ S_regmatch(pTHX_ regnode *prog)
        case NBOUND:
            /* was last char in word? */
            if (do_utf8) {
-               if (locinput == PL_regbol)
-                   ln = PL_regprev;
+               if (locinput == PL_bostr)
+                   ln = '\n';
                else {
                    U8 *r = reghop((U8*)locinput, -1);
                
@@ -2277,8 +2276,8 @@ S_regmatch(pTHX_ regnode *prog)
                }
            }
            else {
-               ln = (locinput != PL_regbol) ?
-                   UCHARAT(locinput - 1) : PL_regprev;
+               ln = (locinput != PL_bostr) ?
+                   UCHARAT(locinput - 1) : '\n';
                if (OP(scan) == BOUND || OP(scan) == NBOUND) {
                    ln = isALNUM(ln);
                    n = isALNUM(nextchr);
@@ -2509,7 +2508,7 @@ S_regmatch(pTHX_ regnode *prog)
                        SV *sv = SvROK(ret) ? SvRV(ret) : ret;
 
                        if(SvMAGICAL(sv))
-                           mg = mg_find(sv, 'r');
+                           mg = mg_find(sv, PERL_MAGIC_qr);
                    }
                    if (mg) {
                        re = (regexp *)mg->mg_obj;
@@ -2527,7 +2526,8 @@ S_regmatch(pTHX_ regnode *prog)
                        re = CALLREGCOMP(aTHX_ t, t + len, &pm);
                        if (!(SvFLAGS(ret)
                              & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)))
-                           sv_magic(ret,(SV*)ReREFCNT_inc(re),'r',0,0);
+                           sv_magic(ret,(SV*)ReREFCNT_inc(re),
+                                       PERL_MAGIC_qr,0,0);
                        PL_regprecomp = oprecomp;
                        PL_regsize = osize;
                        PL_regnpar = onpar;
@@ -3384,20 +3384,10 @@ S_regmatch(pTHX_ regnode *prog)
        case UNLESSM:
            n = 0;
            if (scan->flags) {
-               if (UTF) {              /* XXXX This is absolutely
-                                          broken, we read before
-                                          start of string. */
-                   s = HOPMAYBEc(locinput, -scan->flags);
-                   if (!s)
-                       goto say_yes;
-                   PL_reginput = s;
-               }
-               else {
-                   if (locinput < PL_bostr + scan->flags)
-                       goto say_yes;
-                   PL_reginput = locinput - scan->flags;
-                   goto do_ifmatch;
-               }
+               s = HOPBACKc(locinput, scan->flags);
+               if (!s)
+                   goto say_yes;
+               PL_reginput = s;
            }
            else
                PL_reginput = locinput;
@@ -3405,20 +3395,10 @@ S_regmatch(pTHX_ regnode *prog)
        case IFMATCH:
            n = 1;
            if (scan->flags) {
-               if (UTF) {              /* XXXX This is absolutely
-                                          broken, we read before
-                                          start of string. */
-                   s = HOPMAYBEc(locinput, -scan->flags);
-                   if (!s || s < PL_bostr)
-                       goto say_no;
-                   PL_reginput = s;
-               }
-               else {
-                   if (locinput < PL_bostr + scan->flags)
-                       goto say_no;
-                   PL_reginput = locinput - scan->flags;
-                   goto do_ifmatch;
-               }
+               s = HOPBACKc(locinput, scan->flags);
+               if (!s)
+                   goto say_no;
+               PL_reginput = s;
            }
            else
                PL_reginput = locinput;