summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/string.c11
-rw-r--r--test/t/string.rb25
2 files changed, 36 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c
index 6cad6a4ac..b597c3da9 100644
--- a/src/string.c
+++ b/src/string.c
@@ -1318,7 +1318,18 @@ mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
mrb_str_modify(mrb, s);
if (RSTR_LEN(s) > 0) {
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;
+#endif
if (RSTR_PTR(s)[len] == '\n') {
if (len > 0 &&
RSTR_PTR(s)[len-1] == '\r') {
diff --git a/test/t/string.rb b/test/t/string.rb
index f9a521edd..da75bdd84 100644
--- a/test/t/string.rb
+++ b/test/t/string.rb
@@ -262,6 +262,16 @@ assert('String#chop', '15.2.10.5.11') do
assert_equal 'abc', c
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
a = ''
b = 'abc'
@@ -273,6 +283,21 @@ assert('String#chop!', '15.2.10.5.12') do
assert_equal b, 'ab'
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
a = 'ABC'.downcase
b = 'ABC'