aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-12-01 08:09:17 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-12-01 08:09:17 +0000
commit41cbb7f05010b4f37490059ff8f5e52b4f1f8538 (patch)
treeacd50e060201989a20f157bf3e82cc62a41a9519
parent8d7d4e332241ca922b0821c2a5cd4b19c18a6cdf (diff)
downloadruby-41cbb7f05010b4f37490059ff8f5e52b4f1f8538.tar.gz
cstr.c: split bug_str_cstr_unterm
* ext/-test-/string/cstr.c (bug_str_cstr_unterm): split unterminating from bug_str_cstr_term. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52832 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ext/-test-/string/cstr.c30
-rw-r--r--test/-ext-/string/test_cstr.rb6
2 files changed, 34 insertions, 2 deletions
diff --git a/ext/-test-/string/cstr.c b/ext/-test-/string/cstr.c
index ba2e46bc55..897793d7ed 100644
--- a/ext/-test-/string/cstr.c
+++ b/ext/-test-/string/cstr.c
@@ -9,9 +9,7 @@ bug_str_cstr_term(VALUE str)
int c;
rb_encoding *enc;
- rb_str_modify(str);
len = RSTRING_LEN(str);
- RSTRING_PTR(str)[len] = 'x';
s = StringValueCStr(str);
rb_gc();
enc = rb_enc_get(str);
@@ -20,6 +18,17 @@ bug_str_cstr_term(VALUE str)
}
static VALUE
+bug_str_cstr_unterm(VALUE str, VALUE c)
+{
+ long len;
+
+ rb_str_modify(str);
+ len = RSTRING_LEN(str);
+ RSTRING_PTR(str)[len] = NUM2CHR(c);
+ return str;
+}
+
+static VALUE
bug_str_cstr_term_char(VALUE str)
{
long len;
@@ -42,6 +51,20 @@ bug_str_cstr_term_char(VALUE str)
}
static VALUE
+bug_str_s_cstr_term(VALUE self, VALUE str)
+{
+ Check_Type(str, T_STRING);
+ return bug_str_cstr_term(str);
+}
+
+static VALUE
+bug_str_s_cstr_unterm(VALUE self, VALUE str, VALUE c)
+{
+ Check_Type(str, T_STRING);
+ return bug_str_cstr_unterm(str, c);
+}
+
+static VALUE
bug_str_s_cstr_term_char(VALUE self, VALUE str)
{
Check_Type(str, T_STRING);
@@ -52,6 +75,9 @@ void
Init_cstr(VALUE klass)
{
rb_define_method(klass, "cstr_term", bug_str_cstr_term, 0);
+ rb_define_method(klass, "cstr_unterm", bug_str_cstr_unterm, 1);
rb_define_method(klass, "cstr_term_char", bug_str_cstr_term_char, 0);
+ rb_define_singleton_method(klass, "cstr_term", bug_str_s_cstr_term, 1);
+ rb_define_singleton_method(klass, "cstr_unterm", bug_str_s_cstr_unterm, 2);
rb_define_singleton_method(klass, "cstr_term_char", bug_str_s_cstr_term_char, 1);
}
diff --git a/test/-ext-/string/test_cstr.rb b/test/-ext-/string/test_cstr.rb
index 7e24ec6a70..99c1325bf3 100644
--- a/test/-ext-/string/test_cstr.rb
+++ b/test/-ext-/string/test_cstr.rb
@@ -7,11 +7,13 @@ class Test_StringCStr < Test::Unit::TestCase
def test_embed
s = Bug::String.new("abcdef")
s.set_len(3)
+ s.cstr_unterm('x')
assert_equal(0, s.cstr_term, Bug4319)
end
def test_long
s = Bug::String.new("abcdef")*100000
+ s.cstr_unterm('x')
assert_equal(0, s.cstr_term, Bug4319)
end
@@ -20,9 +22,11 @@ class Test_StringCStr < Test::Unit::TestCase
def test_wchar_embed
WCHARS.each do |enc|
s = Bug::String.new("\u{4022}a".encode(enc))
+ s.cstr_unterm('x')
assert_nothing_raised(ArgumentError) {s.cstr_term}
s.set_len(s.bytesize / 2)
assert_equal(1, s.size)
+ s.cstr_unterm('x')
assert_equal(0, s.cstr_term)
end
end
@@ -33,9 +37,11 @@ class Test_StringCStr < Test::Unit::TestCase
len = str.size * n
WCHARS.each do |enc|
s = Bug::String.new(str.encode(enc))*n
+ s.cstr_unterm('x')
assert_nothing_raised(ArgumentError, enc.name) {s.cstr_term}
s.set_len(s.bytesize / 2)
assert_equal(len / 2, s.size, enc.name)
+ s.cstr_unterm('x')
assert_equal(0, s.cstr_term, enc.name)
end
end