This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Convert Perl_do_chomp() to the same prototype as Perl_do_chop().
authorNicholas Clark <nick@ccl4.org>
Mon, 27 Dec 2010 08:22:21 +0000 (08:22 +0000)
committerNicholas Clark <nick@ccl4.org>
Mon, 27 Dec 2010 08:22:21 +0000 (08:22 +0000)
Pass in an SV to hold the count, rather than returning the count.

doop.c
embed.fnc
embed.h
pp.c
proto.h

diff --git a/doop.c b/doop.c
index 550e6fb..1b71fe1 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -1060,11 +1060,10 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
     SvSETMAGIC(sv);
 }
 
-I32
-Perl_do_chomp(pTHX_ register SV *sv)
+void
+Perl_do_chomp(pTHX_ SV *count, SV *sv)
 {
     dVAR;
-    register I32 count;
     STRLEN len;
     char *s;
     char *temp_buffer = NULL;
@@ -1073,10 +1072,9 @@ Perl_do_chomp(pTHX_ register SV *sv)
     PERL_ARGS_ASSERT_DO_CHOMP;
 
     if (RsSNARF(PL_rs))
-       return 0;
+       return;
     if (RsRECORD(PL_rs))
-      return 0;
-    count = 0;
+       return;
     if (SvTYPE(sv) == SVt_PVAV) {
        register I32 i;
        AV *const av = MUTABLE_AV(sv);
@@ -1085,17 +1083,17 @@ Perl_do_chomp(pTHX_ register SV *sv)
        for (i = 0; i <= max; i++) {
            sv = MUTABLE_SV(av_fetch(av, i, FALSE));
            if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
-               count += do_chomp(sv);
+               do_chomp(count, sv);
        }
-        return count;
+        return;
     }
     else if (SvTYPE(sv) == SVt_PVHV) {
        HV* const hv = MUTABLE_HV(sv);
        HE* entry;
         (void)hv_iterinit(hv);
         while ((entry = hv_iternext(hv)))
-            count += do_chomp(hv_iterval(hv,entry));
-        return count;
+            do_chomp(count, hv_iterval(hv,entry));
+       return;
     }
     else if (SvREADONLY(sv)) {
         if (SvFAKE(sv)) {
@@ -1123,11 +1121,11 @@ Perl_do_chomp(pTHX_ register SV *sv)
        if (RsPARA(PL_rs)) {
            if (*s != '\n')
                goto nope;
-           ++count;
+           ++SvIVX(count);
            while (len && s[-1] == '\n') {
                --len;
                --s;
-               ++count;
+               ++SvIVX(count);
            }
        }
        else {
@@ -1171,7 +1169,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
            if (rslen == 1) {
                if (*s != *rsptr)
                    goto nope;
-               ++count;
+               ++SvIVX(count);
            }
            else {
                if (len < rslen - 1)
@@ -1180,7 +1178,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
                s -= rslen - 1;
                if (memNE(s, rsptr, rslen))
                    goto nope;
-               count += rs_charlen;
+               SvIVX(count) += rs_charlen;
            }
        }
        s = SvPV_force_nolen(sv);
@@ -1194,7 +1192,6 @@ Perl_do_chomp(pTHX_ register SV *sv)
     SvREFCNT_dec(svrecode);
 
     Safefree(temp_buffer);
-    return count;
 }
 
 void
index ed1cd71..88129d7 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -355,7 +355,7 @@ p   |bool   |do_print       |NULLOK SV* sv|NN PerlIO* fp
 : Used in pp_sys.c
 pR     |OP*    |do_readline
 : Used in pp.c
-p      |I32    |do_chomp       |NN SV* sv
+p      |void   |do_chomp       |NN SV *count|NN SV *sv
 : Defined in doio.c, used only in pp_sys.c
 p      |bool   |do_seek        |NULLOK GV* gv|Off_t pos|int whence
 Ap     |void   |do_sprintf     |NN SV* sv|I32 len|NN SV** sarg
diff --git a/embed.h b/embed.h
index 5f846f5..a427ef5 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define delete_eval_scope()    Perl_delete_eval_scope(aTHX)
 #define die_unwind(a)          Perl_die_unwind(aTHX_ a)
 #define do_aexec5(a,b,c,d,e)   Perl_do_aexec5(aTHX_ a,b,c,d,e)
-#define do_chomp(a)            Perl_do_chomp(aTHX_ a)
+#define do_chomp(a,b)          Perl_do_chomp(aTHX_ a,b)
 #define do_chop(a,b)           Perl_do_chop(aTHX_ a,b)
 #define do_dump_pad(a,b,c,d)   Perl_do_dump_pad(aTHX_ a,b,c,d)
 #define do_eof(a)              Perl_do_eof(aTHX_ a)
diff --git a/pp.c b/pp.c
index 78b03ea..ef325a9 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -812,17 +812,19 @@ PP(pp_chop)
 PP(pp_schomp)
 {
     dVAR; dSP; dTARGET;
-    SETi(do_chomp(TOPs));
+    sv_setiv(TARG, 0);
+    do_chomp(TARG, TOPs);
+    SETs(TARG);
     RETURN;
 }
 
 PP(pp_chomp)
 {
     dVAR; dSP; dMARK; dTARGET; dORIGMARK;
-    register I32 count = 0;
 
+    sv_setiv(TARG, 0);
     while (MARK < SP)
-       count += do_chomp(*++MARK);
+       do_chomp(TARG, *++MARK);
     SP = ORIGMARK;
     XPUSHTARG;
     RETURN;
diff --git a/proto.h b/proto.h
index c4df3e2..1ee666e 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -707,10 +707,11 @@ PERL_CALLCONV int Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode)
 #define PERL_ARGS_ASSERT_DO_BINMODE    \
        assert(fp)
 
-PERL_CALLCONV I32      Perl_do_chomp(pTHX_ SV* sv)
-                       __attribute__nonnull__(pTHX_1);
+PERL_CALLCONV void     Perl_do_chomp(pTHX_ SV *count, SV *sv)
+                       __attribute__nonnull__(pTHX_1)
+                       __attribute__nonnull__(pTHX_2);
 #define PERL_ARGS_ASSERT_DO_CHOMP      \
-       assert(sv)
+       assert(count); assert(sv)
 
 PERL_CALLCONV void     Perl_do_chop(pTHX_ SV *astr, SV *sv)
                        __attribute__nonnull__(pTHX_1)