This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
remove a compiler warning by making HOPBACKc only hop *back*
[perl5.git] / regexec.c
index e042dfd..94ad06f 100644 (file)
--- a/regexec.c
+++ b/regexec.c
 */
 
 #ifdef PERL_EXT_RE_BUILD
-/* need to replace pregcomp et al, so enable that */
-#  ifndef PERL_IN_XSUB_RE
-#    define PERL_IN_XSUB_RE
-#  endif
-/* need access to debugger hooks */
-#  if defined(PERL_EXT_RE_DEBUG) && !defined(DEBUGGING)
-#    define DEBUGGING
-#  endif
-#endif
-
-#ifdef PERL_IN_XSUB_RE
-/* We *really* need to overwrite these symbols: */
-#  define Perl_regexec_flags my_regexec
-#  define Perl_regdump my_regdump
-#  define Perl_regprop my_regprop
-#  define Perl_re_intuit_start my_re_intuit_start
-/* *These* symbols are masked to allow static link. */
-#  define Perl_pregexec my_pregexec
-#  define Perl_reginitcolors my_reginitcolors
-#  define Perl_regclass_swash my_regclass_swash
-
-#  define PERL_NO_GET_CONTEXT
+#include "re_top.h"
 #endif
 
 /*
 #define PERL_IN_REGEXEC_C
 #include "perl.h"
 
-#include "regcomp.h"
+#ifdef PERL_IN_XSUB_RE
+#  include "re_comp.h"
+#else
+#  include "regcomp.h"
+#endif
 
 #define RF_tainted     1               /* tainted information used? */
 #define RF_warned      2               /* warned about big count? */
            : (U8*)(pos + off)))
 #define HOPBACKc(pos, off) ((char*)    \
     ((PL_reg_match_utf8)               \
-       ? reghopmaybe3((U8*)pos, -off, ((U8*)(off < 0 ? PL_regeol : PL_bostr))) \
+       ? reghopmaybe3((U8*)pos, -off, (U8*)PL_bostr) \
     : (pos - off >= PL_bostr)          \
        ? (U8*)(pos - off)              \
     : (U8*)NULL)                       \
@@ -250,7 +233,7 @@ S_regcppop(pTHX_ const regexp *rex)
        );
     }
     DEBUG_EXECUTE_r(
-       if ((I32)(*PL_reglastparen + 1) <= rex->nparens) {
+       if (*PL_reglastparen + 1 <= rex->nparens) {
            PerlIO_printf(Perl_debug_log,
                          "     restoring \\%"IVdf"..\\%"IVdf" to undef\n",
                          (IV)(*PL_reglastparen + 1), (IV)rex->nparens);
@@ -267,7 +250,7 @@ S_regcppop(pTHX_ const regexp *rex)
      * building DynaLoader will fail:
      * "Error: '*' not in typemap in DynaLoader.xs, line 164"
      * --jhi */
-    for (i = *PL_reglastparen + 1; i <= rex->nparens; i++) {
+    for (i = *PL_reglastparen + 1; (U32)i <= rex->nparens; i++) {
        if (i > PL_regsize)
            PL_regstartp[i] = -1;
        PL_regendp[i] = -1;
@@ -299,6 +282,7 @@ S_regcppop(pTHX_ const regexp *rex)
  * pregexec and friends
  */
 
+#ifndef PERL_IN_XSUB_RE
 /*
  - pregexec - match a regexp against a string
  */
@@ -314,7 +298,7 @@ Perl_pregexec(pTHX_ register regexp *prog, char *stringarg, register char *stren
        regexec_flags(prog, stringarg, strend, strbeg, minend, screamer, NULL,
                      nosave ? 0 : REXEC_COPY_STR);
 }
-
+#endif
 
 /*
  * Need to implement the following flags for reg_anch:
@@ -399,7 +383,7 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                         sv_uni_display(dsv, sv, 60, UNI_DISPLAY_REGEX) :
                         strpos;
         const int   len = PL_reg_match_utf8 ?
-                        strlen(s) : strend - strpos;
+                        (int)strlen(s) : strend - strpos;
         if (!PL_colorset)
              reginitcolors();
         if (PL_reg_match_utf8)
@@ -590,7 +574,7 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                    && (!do_utf8
                        || ((t = reghopmaybe3_c(s, -(prog->check_offset_max), strpos))
                            && t > strpos)))
-                   /* EMPTY */;
+                   NOOP;
                else
                    t = strpos;
                t = HOP3c(t, prog->anchored_offset, strend);
@@ -1162,7 +1146,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char
                LOAD_UTF8_CHARCLASS_ALNUM();
                while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (tmp == !(OP(c) == BOUND ?
-                                swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
+                                (bool)swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
                                 isALNUM_LC_utf8((U8*)s)))
                    {
                        tmp = !tmp;
@@ -1204,7 +1188,7 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char
                LOAD_UTF8_CHARCLASS_ALNUM();
                while (s + (uskip = UTF8SKIP(s)) <= strend) {
                    if (tmp == !(OP(c) == NBOUND ?
-                                swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
+                                (bool)swash_fetch(PL_utf8_alnum, (U8*)s, do_utf8) :
                                 isALNUM_LC_utf8((U8*)s)))
                        tmp = !tmp;
                    else if ((!reginfo || regtry(reginfo, s)))
@@ -1705,10 +1689,10 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *
            ? pv_uni_display(dsv0, (U8*)prog->precomp, prog->prelen, 60,
                          UNI_DISPLAY_REGEX)
            : prog->precomp;
-       const int len0 = UTF ? SvCUR(dsv0) : prog->prelen;
+       const int len0 = UTF ? (int)SvCUR(dsv0) : prog->prelen;
        const char * const s1 = do_utf8 ? sv_uni_display(dsv1, sv, 60,
                                               UNI_DISPLAY_REGEX) : startpos;
-       const int len1 = do_utf8 ? SvCUR(dsv1) : strend - startpos;
+       const int len1 = do_utf8 ? (int)SvCUR(dsv1) : strend - startpos;
         if (!PL_colorset)
             reginitcolors();
         PerlIO_printf(Perl_debug_log,
@@ -1926,7 +1910,7 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *
            len0 = UTF ? SvCUR(dsv0) : SvCUR(prop);
            s1 = UTF ?
              sv_uni_display(dsv1, sv, 60, UNI_DISPLAY_REGEX) : s;
-           len1 = UTF ? SvCUR(dsv1) : strend - s;
+           len1 = UTF ? (int)SvCUR(dsv1) : strend - s;
            PerlIO_printf(Perl_debug_log,
                          "Matching stclass \"%*.*s\" against \"%*.*s\"\n",
                          len0, len0, s0,
@@ -2298,6 +2282,9 @@ typedef union re_unwind_t {
 /* Make sure there is a test for this +1 options in re_tests */
 #define TRIE_INITAL_ACCEPT_BUFFLEN 4;
 
+/* this value indiciates that the c1/c2 "next char" test should be skipped */
+#define CHRTEST_VOID -1000
+
 #define SLAB_FIRST(s) (&(s)->states[0])
 #define SLAB_LAST(s)  (&(s)->states[PERL_REGMATCH_SLAB_SLOTS-1])
 
@@ -2306,6 +2293,9 @@ typedef union re_unwind_t {
 STATIC regmatch_state *
 S_push_slab(pTHX)
 {
+#if PERL_VERSION < 9
+    dMY_CXT;
+#endif
     regmatch_slab *s = PL_regmatch_slab->next;
     if (!s) {
        Newx(s, 1, regmatch_slab);
@@ -2473,6 +2463,9 @@ S_push_slab(pTHX)
 STATIC I32                     /* 0 failure, 1 success */
 S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
 {
+#if PERL_VERSION < 9
+    dMY_CXT;
+#endif
     dVAR;
     register const bool do_utf8 = PL_reg_match_utf8;
     const U32 uniflags = UTF8_ALLOW_DEFAULT;
@@ -2568,18 +2561,18 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                pv_uni_display(PERL_DEBUG_PAD(0), (U8*)(locinput - pref_len),
                               pref0_len, 60, UNI_DISPLAY_REGEX) :
                locinput - pref_len;
-             const int len0 = do_utf8 ? strlen(s0) : pref0_len;
+             const int len0 = do_utf8 ? (int)strlen(s0) : pref0_len;
              const char * const s1 = do_utf8 && OP(scan) != CANY ?
                pv_uni_display(PERL_DEBUG_PAD(1),
                               (U8*)(locinput - pref_len + pref0_len),
                               pref_len - pref0_len, 60, UNI_DISPLAY_REGEX) :
                locinput - pref_len + pref0_len;
-             const int len1 = do_utf8 ? strlen(s1) : pref_len - pref0_len;
+             const int len1 = do_utf8 ? (int)strlen(s1) : pref_len - pref0_len;
              const char * const s2 = do_utf8 && OP(scan) != CANY ?
                pv_uni_display(PERL_DEBUG_PAD(2), (U8*)locinput,
                               PL_regeol - locinput, 60, UNI_DISPLAY_REGEX) :
                locinput;
-             const int len2 = do_utf8 ? strlen(s2) : l;
+             const int len2 = do_utf8 ? (int)strlen(s2) : l;
              PerlIO_printf(Perl_debug_log,
                            "%4"IVdf" <%s%.*s%s%s%.*s%s%s%s%.*s%s>%*s|%3"IVdf":%*s%s\n",
                            (IV)(locinput - PL_bostr),
@@ -2873,7 +2866,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                            PerlIO_printf( Perl_debug_log, "%*s  %strying alternation #%d <%s> at 0x%p%s\n",
                                REPORT_CODE_OFF+PL_regindent*2, "", PL_colors[4],
                                st->u.trie.accept_buff[best].wordnum,
-                               tmp ? SvPV_nolen_const( *tmp ) : "not compiled under -Dr",scan,
+                               tmp ? SvPV_nolen_const( *tmp ) : "not compiled under -Dr", (void*)scan,
                                PL_colors[5] );
                        });
                        if ( best<st->u.trie.accepted ) {
@@ -3048,7 +3041,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS_ALNUM();
                if (!(OP(scan) == ALNUM
-                     ? swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
+                     ? (bool)swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
                      : isALNUM_LC_utf8((U8*)locinput)))
                {
                    sayNO;
@@ -3071,7 +3064,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS_ALNUM();
                if (OP(scan) == NALNUM
-                   ? swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
+                   ? (bool)swash_fetch(PL_utf8_alnum, (U8*)locinput, do_utf8)
                    : isALNUM_LC_utf8((U8*)locinput))
                {
                    sayNO;
@@ -3136,7 +3129,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                if (UTF8_IS_CONTINUED(nextchr)) {
                    LOAD_UTF8_CHARCLASS_SPACE();
                    if (!(OP(scan) == SPACE
-                         ? swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
+                         ? (bool)swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
                          : isSPACE_LC_utf8((U8*)locinput)))
                    {
                        sayNO;
@@ -3166,7 +3159,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS_SPACE();
                if (OP(scan) == NSPACE
-                   ? swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
+                   ? (bool)swash_fetch(PL_utf8_space, (U8*)locinput, do_utf8)
                    : isSPACE_LC_utf8((U8*)locinput))
                {
                    sayNO;
@@ -3189,7 +3182,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS_DIGIT();
                if (!(OP(scan) == DIGIT
-                     ? swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
+                     ? (bool)swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
                      : isDIGIT_LC_utf8((U8*)locinput)))
                {
                    sayNO;
@@ -3212,7 +3205,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
            if (do_utf8) {
                LOAD_UTF8_CHARCLASS_DIGIT();
                if (OP(scan) == NDIGIT
-                   ? swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
+                   ? (bool)swash_fetch(PL_utf8_digit, (U8*)locinput, do_utf8)
                    : isDIGIT_LC_utf8((U8*)locinput))
                {
                    sayNO;
@@ -3916,7 +3909,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
 
            /* calculate c1 and c1 for possible match of 1st char
             * following curly */
-           st->u.curlym.c1 = st->u.curlym.c2 = -1000;
+           st->u.curlym.c1 = st->u.curlym.c2 = CHRTEST_VOID;
            if (HAS_TEXT(next) || JUMPABLE(next)) {
                regnode *text_node = next;
                if (! HAS_TEXT(text_node)) FIND_NEXT_IMPT(text_node);
@@ -3943,7 +3936,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                    || (n == REG_INFTY && st->u.curlym.matches >= 0)))
            { 
                /* If it could work, try it. */
-               if (st->u.curlym.c1 == -1000 ||
+               if (st->u.curlym.c1 == CHRTEST_VOID ||
                    UCHARAT(PL_reginput) == st->u.curlym.c1 ||
                    UCHARAT(PL_reginput) == st->u.curlym.c2)
                {
@@ -4044,10 +4037,11 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
 
                if (! HAS_TEXT(text_node)) FIND_NEXT_IMPT(text_node);
 
-               if (! HAS_TEXT(text_node)) st->u.plus.c1 = st->u.plus.c2 = -1000;
+               if (! HAS_TEXT(text_node))
+                   st->u.plus.c1 = st->u.plus.c2 = CHRTEST_VOID;
                else {
                    if (PL_regkind[(U8)OP(text_node)] == REF) {
-                       st->u.plus.c1 = st->u.plus.c2 = -1000;
+                       st->u.plus.c1 = st->u.plus.c2 = CHRTEST_VOID;
                        goto assume_ok_easy;
                    }
                    else { s = (U8*)STRING(text_node); }
@@ -4081,7 +4075,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                }
            }
            else
-               st->u.plus.c1 = st->u.plus.c2 = -1000;
+               st->u.plus.c1 = st->u.plus.c2 = CHRTEST_VOID;
        assume_ok_easy:
            PL_reginput = locinput;
            if (st->minmod) {
@@ -4090,7 +4084,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                    sayNO;
                locinput = PL_reginput;
                REGCP_SET(st->u.plus.lastcp);
-               if (st->u.plus.c1 != -1000) {
+               if (st->u.plus.c1 != CHRTEST_VOID) {
                    st->u.plus.old = locinput;
                    st->u.plus.count = 0;
 
@@ -4178,7 +4172,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                else
                while (n >= st->ln || (n == REG_INFTY && st->ln > 0)) { /* ln overflow ? */
                    UV c;
-                   if (st->u.plus.c1 != -1000) {
+                   if (st->u.plus.c1 != CHRTEST_VOID) {
                        if (do_utf8)
                            c = utf8n_to_uvchr((U8*)PL_reginput,
                                               UTF8_MAXBYTES, 0,
@@ -4194,7 +4188,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                        }
                    }
                    /* If it could work, try it. */
-                   else if (st->u.plus.c1 == -1000)
+                   else if (st->u.plus.c1 == CHRTEST_VOID)
                    {
                        TRYPAREN(st->u.plus.paren, st->ln, PL_reginput, PLUS3);
                        /*** all unsaved local vars undefined at this point */
@@ -4228,7 +4222,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                {
                    UV c = 0;
                    while (n >= st->ln) {
-                       if (st->u.plus.c1 != -1000) {
+                       if (st->u.plus.c1 != CHRTEST_VOID) {
                            if (do_utf8)
                                c = utf8n_to_uvchr((U8*)PL_reginput,
                                                   UTF8_MAXBYTES, 0,
@@ -4237,7 +4231,7 @@ S_regmatch(pTHX_ const regmatch_info *reginfo, regnode *prog)
                                c = UCHARAT(PL_reginput);
                        }
                        /* If it could work, try it. */
-                       if (st->u.plus.c1 == -1000 || c == (UV)st->u.plus.c1 || c == (UV)st->u.plus.c2)
+                       if (st->u.plus.c1 == CHRTEST_VOID || c == (UV)st->u.plus.c1 || c == (UV)st->u.plus.c2)
                            {
                                TRYPAREN(st->u.plus.paren, n, PL_reginput, PLUS4);
                                /*** all unsaved local vars undefined at this point */
@@ -4924,6 +4918,7 @@ S_regrepeat(pTHX_ const regexp *prog, const regnode *p, I32 max)
 }
 
 
+#ifndef PERL_IN_XSUB_RE
 /*
 - regclass_swash - prepare the utf8 swash
 */
@@ -4971,6 +4966,7 @@ Perl_regclass_swash(pTHX_ const regexp *prog, register const regnode* node, bool
 
     return sw;
 }
+#endif
 
 /*
  - reginclass - determine if a character falls into a character class