Remove the "Newline in left-justified string" warning.
[p5sagit/p5-mst-13.2.git] / doop.c
diff --git a/doop.c b/doop.c
index 47d64cb..c0c1ef4 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -1,7 +1,7 @@
 /*    doop.c
  *
  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, by Larry Wall and others
+ *    2000, 2001, 2002, 2004, by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  * "'So that was the job I felt I had to do when I started,' thought Sam."
  */
 
+/* This file contains some common functions needed to carry out certain
+ * ops. For example both pp_schomp() and pp_chomp() - scalar and array
+ * chomp operations - call the function do_chomp() found in this file.
+ */
+
 #include "EXTERN.h"
 #define PERL_IN_DOOP_C
 #include "perl.h"
@@ -1009,6 +1014,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
     STRLEN n_a;
     char *s;
     char *temp_buffer = NULL;
+    SV* svrecode = Nullsv;
 
     if (RsSNARF(PL_rs))
        return 0;
@@ -1044,6 +1050,18 @@ Perl_do_chomp(pTHX_ register SV *sv)
         if (SvREADONLY(sv))
             Perl_croak(aTHX_ PL_no_modify);
     }
+
+    if (PL_encoding) {
+       if (!SvUTF8(sv)) {
+       /* XXX, here sv is utf8-ized as a side-effect!
+          If encoding.pm is used properly, almost string-generating
+          operations, including literal strings, chr(), input data, etc.
+          should have been utf8-ized already, right?
+       */
+           sv_recode_to_utf8(sv, PL_encoding);
+       }
+    }
+
     s = SvPV(sv, len);
     if (s && len) {
        s += --len;
@@ -1058,8 +1076,13 @@ Perl_do_chomp(pTHX_ register SV *sv)
            }
        }
        else {
-           STRLEN rslen;
+           STRLEN rslen, rs_charlen;
            char *rsptr = SvPV(PL_rs, rslen);
+
+           rs_charlen = SvUTF8(PL_rs)
+               ? sv_len_utf8(PL_rs)
+               : rslen;
+
            if (SvUTF8(PL_rs) != SvUTF8(sv)) {
                /* Assumption is that rs is shorter than the scalar.  */
                if (SvUTF8(PL_rs)) {
@@ -1075,7 +1098,16 @@ Perl_do_chomp(pTHX_ register SV *sv)
                        goto nope;
                    }
                    rsptr = temp_buffer;
-               } else {
+               }
+               else if (PL_encoding) {
+                   /* RS is 8 bit, encoding.pm is used.
+                    * Do not recode PL_rs as a side-effect. */
+                  svrecode = newSVpvn(rsptr, rslen);
+                  sv_recode_to_utf8(svrecode, PL_encoding);
+                  rsptr = SvPV(svrecode, rslen);
+                  rs_charlen = sv_len_utf8(svrecode);
+               }
+               else {
                    /* RS is 8 bit, scalar is utf8.  */
                    temp_buffer = (char*)bytes_to_utf8((U8*)rsptr, &rslen);
                    rsptr = temp_buffer;
@@ -1093,7 +1125,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
                s -= rslen - 1;
                if (memNE(s, rsptr, rslen))
                    goto nope;
-               count += rslen;
+               count += rs_charlen;
            }
        }
        s = SvPV_force(sv, n_a);
@@ -1103,6 +1135,10 @@ Perl_do_chomp(pTHX_ register SV *sv)
        SvSETMAGIC(sv);
     }
   nope:
+
+    if (svrecode)
+        SvREFCNT_dec(svrecode);
+
     Safefree(temp_buffer);
     return count;
 }