This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regexec.c: Add parameter to static fcn
[perl5.git] / doop.c
diff --git a/doop.c b/doop.c
index edc4038..54e35f1 100644 (file)
--- a/doop.c
+++ b/doop.c
  * or may not be utf8.
  */
 
-STATIC I32
+STATIC Size_t
 S_do_trans_simple(pTHX_ SV * const sv)
 {
-    I32 matches = 0;
+    Size_t matches = 0;
     STRLEN len;
     U8 *s = (U8*)SvPV_nomg(sv,len);
     U8 * const send = s+len;
@@ -52,7 +52,7 @@ S_do_trans_simple(pTHX_ SV * const sv)
     /* First, take care of non-UTF-8 input strings, because they're easy */
     if (!SvUTF8(sv)) {
        while (s < send) {
-           const I32 ch = tbl->map[*s];
+           const short ch = tbl->map[*s];
            if (ch >= 0) {
                matches++;
                *s = (U8)ch;
@@ -62,7 +62,7 @@ S_do_trans_simple(pTHX_ SV * const sv)
        SvSETMAGIC(sv);
     }
     else {
-       const I32 grows = PL_op->op_private & OPpTRANS_GROWS;
+       const bool grows = cBOOL(PL_op->op_private & OPpTRANS_GROWS);
        U8 *d;
        U8 *dstart;
 
@@ -74,13 +74,13 @@ S_do_trans_simple(pTHX_ SV * const sv)
        dstart = d;
        while (s < send) {
            STRLEN ulen;
-           I32 ch;
+           short ch;
 
            /* Need to check this, otherwise 128..255 won't match */
            const UV c = utf8n_to_uvchr(s, send - s, &ulen, UTF8_ALLOW_DEFAULT);
            if (c < 0x100 && (ch = tbl->map[c]) >= 0) {
                matches++;
-               d = uvchr_to_utf8(d, ch);
+               d = uvchr_to_utf8(d, (UV)ch);
                s += ulen;
            }
            else { /* No match -> copy */
@@ -114,13 +114,13 @@ S_do_trans_simple(pTHX_ SV * const sv)
  * or may not be utf8.
  */
 
-STATIC I32
+STATIC Size_t
 S_do_trans_count(pTHX_ SV * const sv)
 {
     STRLEN len;
     const U8 *s = (const U8*)SvPV_nomg_const(sv, len);
     const U8 * const send = s + len;
-    I32 matches = 0;
+    Size_t matches = 0;
     const OPtrans_map * const tbl = (OPtrans_map*)cPVOP->op_pv;
 
     PERL_ARGS_ASSERT_DO_TRANS_COUNT;
@@ -135,7 +135,7 @@ S_do_trans_count(pTHX_ SV * const sv)
        }
     }
     else {
-       const I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT;
+       const bool complement = cBOOL(PL_op->op_private & OPpTRANS_COMPLEMENT);
        while (s < send) {
            STRLEN ulen;
            const UV c = utf8n_to_uvchr(s, send - s, &ulen, UTF8_ALLOW_DEFAULT);
@@ -159,18 +159,18 @@ S_do_trans_count(pTHX_ SV * const sv)
  * or may not be utf8.
  */
 
-STATIC I32
+STATIC Size_t
 S_do_trans_complex(pTHX_ SV * const sv)
 {
     STRLEN len;
     U8 *s = (U8*)SvPV_nomg(sv, len);
     U8 * const send = s+len;
-    I32 matches = 0;
-    const OPtrans_map_ex * const extbl = (OPtrans_map_ex*)cPVOP->op_pv;
+    Size_t matches = 0;
+    const OPtrans_map * const tbl = (OPtrans_map*)cPVOP->op_pv;
 
     PERL_ARGS_ASSERT_DO_TRANS_COMPLEX;
 
-    if (!extbl)
+    if (!tbl)
        Perl_croak(aTHX_ "panic: do_trans_complex line %d",__LINE__);
 
     if (!SvUTF8(sv)) {
@@ -180,7 +180,7 @@ S_do_trans_complex(pTHX_ SV * const sv)
        if (PL_op->op_private & OPpTRANS_SQUASH) {
            const U8* p = send;
            while (s < send) {
-               const I32 ch = extbl->map[*s];
+               const short ch = tbl->map[*s];
                if (ch >= 0) {
                    *d = (U8)ch;
                    matches++;
@@ -196,7 +196,7 @@ S_do_trans_complex(pTHX_ SV * const sv)
        }
        else {
            while (s < send) {
-               const I32 ch = extbl->map[*s];
+               const short ch = tbl->map[*s];
                if (ch >= 0) {
                    matches++;
                    *d++ = (U8)ch;
@@ -212,129 +212,55 @@ S_do_trans_complex(pTHX_ SV * const sv)
        SvCUR_set(sv, d - dstart);
     }
     else { /* is utf8 */
-       const I32 complement = PL_op->op_private & OPpTRANS_COMPLEMENT;
-       const I32 grows = PL_op->op_private & OPpTRANS_GROWS;
-       const I32 del = PL_op->op_private & OPpTRANS_DELETE;
+       const bool squash = cBOOL(PL_op->op_private & OPpTRANS_SQUASH);
+       const bool grows  = cBOOL(PL_op->op_private & OPpTRANS_GROWS);
        U8 *d;
        U8 *dstart;
-       SSize_t excess = 0;
+       Size_t size = tbl->size;
+        UV pch = 0xfeedface;
 
        if (grows)
            Newx(d, len*2+1, U8);
        else
            d = s;
        dstart = d;
-       if (complement)
-            /* number of replacement chars in excess of any 0x00..0xff
-             * search characters */
-           excess = extbl->excess_len;
 
-       if (PL_op->op_private & OPpTRANS_SQUASH) {
-           UV pch = 0xfeedface;
-           while (s < send) {
-               STRLEN len;
-               const UV comp = utf8n_to_uvchr(s, send - s, &len,
-                                              UTF8_ALLOW_DEFAULT);
-               UV     ch;
-                short sch;
-
-               if (comp > 0xff) {
-                   if (!complement) {
-                       Move(s, d, len, U8);
-                       d += len;
-                   }
-                   else {
-                        /* use the implicit 0x100..0x7fffffff search range */
-                        UV comp100 = comp - 0x100;
-                       matches++;
-                        ch = del
-                               /* setting ch to pch forces char to be deleted */
-                             ? ((excess > (IV)comp100)
-                                            ? (UV)extbl->map_ex[comp100]
-                                            : pch           )
-
-                            : (        (excess == -1) ? comp :
-                                 (UV)((  excess ==  0
-                                      || excess <= (IV)comp100)
-                                            ? extbl->repeat_char
-                                            : extbl->map_ex[comp100]
-                                     )
-                               );
-                        if (ch != pch) {
-                            d = uvchr_to_utf8(d, ch);
-                            pch = ch;
-                        }
-                        s += len;
-                        continue;
-                   }
-               }
-               else if ((sch = extbl->map[comp]) >= 0) {
-                    ch = (UV)sch;
-                   matches++;
-                   if (ch != pch) {
-                       d = uvchr_to_utf8(d, ch);
-                       pch = ch;
-                   }
-                   s += len;
-                   continue;
-               }
-               else if (sch == -1) {   /* -1 is unmapped character */
-                   Move(s, d, len, U8);
-                   d += len;
-               }
-               else if (sch == -2)      /* -2 is delete character */
-                   matches++;
-               s += len;
-               pch = 0xfeedface;
-           }
-       }
-       else {
-           while (s < send) {
-               STRLEN len;
-               const UV comp = utf8n_to_uvchr(s, send - s, &len,
-                                              UTF8_ALLOW_DEFAULT);
-               UV     ch;
-               short sch;
-               if (comp > 0xff) {
-                   if (!complement) {
-                       Move(s, d, len, U8);
-                       d += len;
-                   }
-                   else {
-                        /* use the implicit 0x100..0x7fffffff search range */
-                        UV comp100 = comp - 0x100;
-                       matches++;
-                        if (del) {
-                             if (excess > (IV)comp100) {
-                                ch = (UV)extbl->map_ex[comp100];
-                                d = uvchr_to_utf8(d, ch);
-                            }
-                        }
-                        else {
-                            /* tr/...//c should call S_do_trans_count
-                             * instead */
-                            assert(excess != -1);
-                           ch = (   excess ==  0
-                                      || excess <= (IV)comp100)
-                                            ? (UV)extbl->repeat_char
-                                            : (UV)extbl->map_ex[comp100];
-                            d = uvchr_to_utf8(d, ch);
-                        }
-                   }
-               }
-               else if ((sch = extbl->map[comp]) >= 0) {
-                   d = uvchr_to_utf8(d, (UV)sch);
-                   matches++;
-               }
-               else if (sch == -1) {   /* -1 is unmapped character */
-                   Move(s, d, len, U8);
-                   d += len;
-               }
-               else if (sch == -2)      /* -2 is delete character */
-                   matches++;
-               s += len;
-           }
-       }
+        while (s < send) {
+            STRLEN len;
+            const UV comp = utf8n_to_uvchr(s, send - s, &len,
+                                           UTF8_ALLOW_DEFAULT);
+            UV     ch;
+            short sch;
+
+            sch = tbl->map[comp >= size ? size : comp];
+
+            if (sch >= 0) {
+                ch = (UV)sch;
+              replace:
+                matches++;
+                if (LIKELY(!squash || ch != pch)) {
+                    d = uvchr_to_utf8(d, ch);
+                    pch = ch;
+                }
+                s += len;
+                continue;
+            }
+            else if (sch == -1) {      /* -1 is unmapped character */
+                Move(s, d, len, U8);
+                d += len;
+            }
+            else if (sch == -2)     /* -2 is delete character */
+                matches++;
+            else {
+                assert(sch == -3);  /* -3 is empty replacement */
+                ch = comp;
+                goto replace;
+            }
+
+            s += len;
+            pch = 0xfeedface;
+        }
+
        if (grows) {
            sv_setpvn(sv, (char*)dstart, d - dstart);
            Safefree(dstart);
@@ -357,7 +283,7 @@ S_do_trans_complex(pTHX_ SV * const sv)
  * or may not be utf8.
  */
 
-STATIC I32
+STATIC Size_t
 S_do_trans_simple_utf8(pTHX_ SV * const sv)
 {
     U8 *s;
@@ -365,8 +291,8 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv)
     U8 *d;
     U8 *start;
     U8 *dstart, *dend;
-    I32 matches = 0;
-    const I32 grows = PL_op->op_private & OPpTRANS_GROWS;
+    Size_t matches = 0;
+    const bool grows = cBOOL(PL_op->op_private & OPpTRANS_GROWS);
     STRLEN len;
     SV* const  rv =
 #ifdef USE_ITHREADS
@@ -466,13 +392,13 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv)
  * or may not be utf8.
  */
 
-STATIC I32
+STATIC Size_t
 S_do_trans_count_utf8(pTHX_ SV * const sv)
 {
     const U8 *s;
     const U8 *start = NULL;
     const U8 *send;
-    I32 matches = 0;
+    Size_t matches = 0;
     STRLEN len;
     SV* const  rv =
 #ifdef USE_ITHREADS
@@ -517,15 +443,15 @@ S_do_trans_count_utf8(pTHX_ SV * const sv)
  * or may not be utf8.
  */
 
-STATIC I32
+STATIC Size_t
 S_do_trans_complex_utf8(pTHX_ SV * const sv)
 {
     U8 *start, *send;
     U8 *d;
-    I32 matches = 0;
-    const I32 squash   = PL_op->op_private & OPpTRANS_SQUASH;
-    const I32 del      = PL_op->op_private & OPpTRANS_DELETE;
-    const I32 grows    = PL_op->op_private & OPpTRANS_GROWS;
+    Size_t matches = 0;
+    const bool squash   = cBOOL(PL_op->op_private & OPpTRANS_SQUASH);
+    const bool del      = cBOOL(PL_op->op_private & OPpTRANS_DELETE);
+    const bool grows    = cBOOL(PL_op->op_private & OPpTRANS_GROWS);
     SV* const  rv =
 #ifdef USE_ITHREADS
                    PAD_SVl(cPADOP->op_padix);
@@ -685,12 +611,12 @@ S_do_trans_complex_utf8(pTHX_ SV * const sv)
  * Returns a count of number of characters translated
  */
 
-I32
+Size_t
 Perl_do_trans(pTHX_ SV *sv)
 {
     STRLEN len;
-    const I32 flags = PL_op->op_private;
-    const I32 hasutf = flags & (OPpTRANS_FROM_UTF | OPpTRANS_TO_UTF);
+    const U8 flags = PL_op->op_private;
+    const U8 hasutf = flags & (OPpTRANS_FROM_UTF | OPpTRANS_TO_UTF);
 
     PERL_ARGS_ASSERT_DO_TRANS;
 
@@ -1092,7 +1018,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
     STRLEN rightlen;
     const char *lc;
     const char *rc;
-    STRLEN len;
+    STRLEN len = 0;
     STRLEN lensave;
     const char *lsave;
     const char *rsave;
@@ -1169,20 +1095,25 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
      * portion.  That means that at least one of the operands has to be
      * entirely non-UTF-8, and the length of that operand has to be before the
      * first above-FF in the other */
-    if (left_utf8) {
-        if (right_utf8 || rightlen > leftlen) {
-            Perl_croak(aTHX_ fatal_above_ff_msg, PL_op_desc[optype]);
+    if (left_utf8 || right_utf8) {
+        if (left_utf8) {
+            if (right_utf8 || rightlen > leftlen) {
+                Perl_croak(aTHX_ FATAL_ABOVE_FF_MSG, PL_op_desc[optype]);
+            }
+            len = rightlen;
         }
-        len = rightlen;
-    }
-    else if (right_utf8) {
-        if (leftlen > rightlen) {
-            Perl_croak(aTHX_ fatal_above_ff_msg, PL_op_desc[optype]);
+        else if (right_utf8) {
+            if (leftlen > rightlen) {
+                Perl_croak(aTHX_ FATAL_ABOVE_FF_MSG, PL_op_desc[optype]);
+            }
+            len = leftlen;
         }
-        len = leftlen;
+
+        Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
+                               DEPRECATED_ABOVE_FF_MSG, PL_op_desc[optype]);
     }
     else {  /* Neither is UTF-8 */
-        len = leftlen < rightlen ? leftlen : rightlen;
+        len = MIN(leftlen, rightlen);
     }
 
     lensave = len;