Commit cb76ed8e authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2971 from mattn/utf8-chop

chop with utf-8. fix #2967
parents 74457868 7ad75a4a
...@@ -1318,7 +1318,18 @@ mrb_str_chop_bang(mrb_state *mrb, mrb_value str) ...@@ -1318,7 +1318,18 @@ mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
mrb_str_modify(mrb, s); mrb_str_modify(mrb, s);
if (RSTR_LEN(s) > 0) { if (RSTR_LEN(s) > 0) {
mrb_int len; mrb_int len;
#ifdef MRB_UTF8_STRING
const char* t = RSTR_PTR(s), *p = t;
const char* e = p + RSTR_LEN(s);
while (p<e) {
mrb_int clen = utf8len(p, e);
if (p + clen>=e) break;
p += clen;
}
len = p - t;
#else
len = RSTR_LEN(s) - 1; len = RSTR_LEN(s) - 1;
#endif
if (RSTR_PTR(s)[len] == '\n') { if (RSTR_PTR(s)[len] == '\n') {
if (len > 0 && if (len > 0 &&
RSTR_PTR(s)[len-1] == '\r') { RSTR_PTR(s)[len-1] == '\r') {
......
...@@ -262,6 +262,16 @@ assert('String#chop', '15.2.10.5.11') do ...@@ -262,6 +262,16 @@ assert('String#chop', '15.2.10.5.11') do
assert_equal 'abc', c assert_equal 'abc', c
end end
assert('String#chop', '15.2.10.5.11') do
a = ''.chop
b = 'あいう'.chop
c = "あ\nい".chop.chop
assert_equal '', a
assert_equal 'あい', b
assert_equal 'あ', c
end if UTF8STRING
assert('String#chop!', '15.2.10.5.12') do assert('String#chop!', '15.2.10.5.12') do
a = '' a = ''
b = 'abc' b = 'abc'
...@@ -273,6 +283,21 @@ assert('String#chop!', '15.2.10.5.12') do ...@@ -273,6 +283,21 @@ assert('String#chop!', '15.2.10.5.12') do
assert_equal b, 'ab' assert_equal b, 'ab'
end end
assert('String#chop!', '15.2.10.5.12') do
a = ''
b = "あいうえ\n"
c = "あいうえ\n"
a.chop!
b.chop!
c.chop!
c.chop!
assert_equal a, ''
assert_equal b, 'あいうえ'
assert_equal c, 'あいう'
end if UTF8STRING
assert('String#downcase', '15.2.10.5.13') do assert('String#downcase', '15.2.10.5.13') do
a = 'ABC'.downcase a = 'ABC'.downcase
b = 'ABC' b = 'ABC'
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment