[前][次][番号順一覧][スレッド一覧]

ruby-changes:37625

From: nobu <ko1@a...>
Date: Tue, 24 Feb 2015 09:47:28 +0900 (JST)
Subject: [ruby-changes:37625] nobu:r49706 (trunk): string.c: smart chomp

nobu	2015-02-24 09:47:12 +0900 (Tue, 24 Feb 2015)

  New Revision: 49706

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49706

  Log:
    string.c: smart chomp
    
    * string.c (chompped_length): enable smart chomp for all non-dummy
      encoding strings, not only default_rs.
      [ruby-core:68258] [Bug #10893]

  Modified files:
    trunk/ChangeLog
    trunk/string.c
    trunk/test/ruby/test_m17n_comb.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 49705)
+++ ChangeLog	(revision 49706)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Feb 24 09:47:07 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (chompped_length): enable smart chomp for all non-dummy
+	  encoding strings, not only default_rs.
+	  [ruby-core:68258] [Bug #10893]
+
 Mon Feb 23 23:19:42 2015  Nobuyoshi Nakada  <nobu@r...>
 
 	* tool/vcs.rb (IO.popen): support :chdir option.
Index: string.c
===================================================================
--- string.c	(revision 49705)
+++ string.c	(revision 49706)
@@ -7112,9 +7112,9 @@ chompped_length(VALUE str, VALUE rs) https://github.com/ruby/ruby/blob/trunk/string.c#L7112
 
     if (len == 0) return 0;
     e = p + len;
-    enc = rb_enc_get(str);
     if (rs == rb_default_rs) {
       smart_chomp:
+	enc = rb_enc_get(str);
 	if (rb_enc_mbminlen(enc) > 1) {
 	    pp = rb_enc_left_char_head(p, e-rb_enc_mbminlen(enc), e, enc);
 	    if (rb_enc_is_newline(pp, e, enc)) {
@@ -7143,6 +7143,7 @@ chompped_length(VALUE str, VALUE rs) https://github.com/ruby/ruby/blob/trunk/string.c#L7143
 	return e - p;
     }
 
+    enc = rb_enc_get(str);
     RSTRING_GETMEM(rs, rsptr, rslen);
     if (rslen == 0) {
 	if (rb_enc_mbminlen(enc) > 1) {
@@ -7170,10 +7171,7 @@ chompped_length(VALUE str, VALUE rs) https://github.com/ruby/ruby/blob/trunk/string.c#L7171
     }
     if (rslen > len) return len;
 
-    enc = rb_enc_check(str, rs);
-    if (is_broken_string(rs)) {
-	return len;
-    }
+    enc = rb_enc_get(rs);
     newline = rsptr[rslen-1];
     if (rslen == rb_enc_mbminlen(enc)) {
 	if (rslen == 1) {
@@ -7186,6 +7184,10 @@ chompped_length(VALUE str, VALUE rs) https://github.com/ruby/ruby/blob/trunk/string.c#L7184
 	}
     }
 
+    enc = rb_enc_check(str, rs);
+    if (is_broken_string(rs)) {
+	return len;
+    }
     pp = e - rslen;
     if (p[len-1] == newline &&
 	(rslen <= 1 ||
Index: test/ruby/test_m17n_comb.rb
===================================================================
--- test/ruby/test_m17n_comb.rb	(revision 49705)
+++ test/ruby/test_m17n_comb.rb	(revision 49706)
@@ -659,7 +659,9 @@ class TestM17NComb < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/ruby/test_m17n_comb.rb#L659
     combination(STRINGS, STRINGS) {|s1, s2|
       if !s1.ascii_only? && !s2.ascii_only? && !Encoding.compatible?(s1,s2)
         if s1.bytesize > s2.bytesize
-          assert_raise(Encoding::CompatibilityError) { s1.chomp(s2) }
+          assert_raise(Encoding::CompatibilityError, "#{encdump(s1)}.chomp(#{encdump(s2)})") do
+            s1.chomp(s2)
+          end
         end
         next
       end
@@ -672,6 +674,17 @@ class TestM17NComb < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/ruby/test_m17n_comb.rb#L674
     }
   end
 
+  def test_str_smart_chomp
+    bug10893 = '[ruby-core:68258] [Bug #10893]'
+    encodings = Encoding.list.select {|enc| !enc.dummy?}
+    combination(encodings, encodings) do |e1, e2|
+      expected = "abc".encode(e1)
+      combination(["abc\n", "abc\r\n"], ["", "\n"]) do |str, rs|
+        assert_equal(expected, str.encode(e1).chomp(rs.encode(e2)), bug10893)
+      end
+    end
+  end
+
   def test_str_chop
     STRINGS.each {|s|
       s = s.dup

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]