зеркало из https://github.com/github/ruby.git
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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49706 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
673af3e9f2
Коммит
4c0106ead6
|
@ -1,3 +1,9 @@
|
||||||
|
Tue Feb 24 09:47:07 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Mon Feb 23 23:19:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* tool/vcs.rb (IO.popen): support :chdir option.
|
* tool/vcs.rb (IO.popen): support :chdir option.
|
||||||
|
|
12
string.c
12
string.c
|
@ -7112,9 +7112,9 @@ chompped_length(VALUE str, VALUE rs)
|
||||||
|
|
||||||
if (len == 0) return 0;
|
if (len == 0) return 0;
|
||||||
e = p + len;
|
e = p + len;
|
||||||
enc = rb_enc_get(str);
|
|
||||||
if (rs == rb_default_rs) {
|
if (rs == rb_default_rs) {
|
||||||
smart_chomp:
|
smart_chomp:
|
||||||
|
enc = rb_enc_get(str);
|
||||||
if (rb_enc_mbminlen(enc) > 1) {
|
if (rb_enc_mbminlen(enc) > 1) {
|
||||||
pp = rb_enc_left_char_head(p, e-rb_enc_mbminlen(enc), e, enc);
|
pp = rb_enc_left_char_head(p, e-rb_enc_mbminlen(enc), e, enc);
|
||||||
if (rb_enc_is_newline(pp, e, enc)) {
|
if (rb_enc_is_newline(pp, e, enc)) {
|
||||||
|
@ -7143,6 +7143,7 @@ chompped_length(VALUE str, VALUE rs)
|
||||||
return e - p;
|
return e - p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enc = rb_enc_get(str);
|
||||||
RSTRING_GETMEM(rs, rsptr, rslen);
|
RSTRING_GETMEM(rs, rsptr, rslen);
|
||||||
if (rslen == 0) {
|
if (rslen == 0) {
|
||||||
if (rb_enc_mbminlen(enc) > 1) {
|
if (rb_enc_mbminlen(enc) > 1) {
|
||||||
|
@ -7170,10 +7171,7 @@ chompped_length(VALUE str, VALUE rs)
|
||||||
}
|
}
|
||||||
if (rslen > len) return len;
|
if (rslen > len) return len;
|
||||||
|
|
||||||
enc = rb_enc_check(str, rs);
|
enc = rb_enc_get(rs);
|
||||||
if (is_broken_string(rs)) {
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
newline = rsptr[rslen-1];
|
newline = rsptr[rslen-1];
|
||||||
if (rslen == rb_enc_mbminlen(enc)) {
|
if (rslen == rb_enc_mbminlen(enc)) {
|
||||||
if (rslen == 1) {
|
if (rslen == 1) {
|
||||||
|
@ -7186,6 +7184,10 @@ chompped_length(VALUE str, VALUE rs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enc = rb_enc_check(str, rs);
|
||||||
|
if (is_broken_string(rs)) {
|
||||||
|
return len;
|
||||||
|
}
|
||||||
pp = e - rslen;
|
pp = e - rslen;
|
||||||
if (p[len-1] == newline &&
|
if (p[len-1] == newline &&
|
||||||
(rslen <= 1 ||
|
(rslen <= 1 ||
|
||||||
|
|
|
@ -659,7 +659,9 @@ class TestM17NComb < Test::Unit::TestCase
|
||||||
combination(STRINGS, STRINGS) {|s1, s2|
|
combination(STRINGS, STRINGS) {|s1, s2|
|
||||||
if !s1.ascii_only? && !s2.ascii_only? && !Encoding.compatible?(s1,s2)
|
if !s1.ascii_only? && !s2.ascii_only? && !Encoding.compatible?(s1,s2)
|
||||||
if s1.bytesize > s2.bytesize
|
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
|
end
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
|
@ -672,6 +674,17 @@ class TestM17NComb < Test::Unit::TestCase
|
||||||
}
|
}
|
||||||
end
|
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
|
def test_str_chop
|
||||||
STRINGS.each {|s|
|
STRINGS.each {|s|
|
||||||
s = s.dup
|
s = s.dup
|
||||||
|
|
Загрузка…
Ссылка в новой задаче