diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-11-05 01:54:22 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-11-05 01:54:22 +0000 |
commit | 3614f8bd1c813916054079055d13462e90808a96 (patch) | |
tree | 630977a8a3021123bf01dd0e3639f9b2215e1a8d | |
parent | 6c41b73decf61254ac9c3bc3fc0e1d0169d5b524 (diff) | |
download | ruby-3614f8bd1c813916054079055d13462e90808a96.tar.gz |
string.c: wchar terminator
* string.c (rb_str_lstrip_bang, rb_str_rstrip_bang): terminate
wchar strings with wchar 0.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48275 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/-test-/string/cstr.c | 14 | ||||
-rw-r--r-- | string.c | 19 | ||||
-rw-r--r-- | test/-ext-/string/test_cstr.rb | 12 |
4 files changed, 41 insertions, 9 deletions
@@ -1,3 +1,8 @@ +Wed Nov 5 10:54:19 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * string.c (rb_str_lstrip_bang, rb_str_rstrip_bang): terminate + wchar strings with wchar 0. + Tue Nov 4 21:23:22 2014 NAKAMURA Usaku <usa@ruby-lang.org> * ext/win32/lib/Win32API.rb: Fiddle::Importer is defined in diff --git a/ext/-test-/string/cstr.c b/ext/-test-/string/cstr.c index c2ed410b41..7759cbdcf0 100644 --- a/ext/-test-/string/cstr.c +++ b/ext/-test-/string/cstr.c @@ -19,8 +19,22 @@ bug_str_cstr_term(VALUE str) return INT2NUM(c); } +static VALUE +bug_str_cstr_term_char(VALUE str) +{ + long len; + char *s; + int c; + rb_encoding *enc = rb_enc_get(str); + + RSTRING_GETMEM(str, s, len); + c = rb_enc_codepoint(&s[len], &s[len+rb_enc_mbminlen(enc)], enc); + return c ? rb_enc_uint_chr((unsigned int)c, enc) : Qnil; +} + void Init_cstr(VALUE klass) { rb_define_method(klass, "cstr_term", bug_str_cstr_term, 0); + rb_define_method(klass, "cstr_term_char", bug_str_cstr_term_char, 0); } @@ -7198,11 +7198,11 @@ static VALUE rb_str_lstrip_bang(VALUE str) { rb_encoding *enc; - char *s, *t, *e; + char *start, *s, *t, *e; str_modify_keep_cr(str); enc = STR_ENC_GET(str); - s = RSTRING_PTR(str); + start = s = RSTRING_PTR(str); if (!s || RSTRING_LEN(str) == 0) return Qnil; e = t = RSTRING_END(str); /* remove spaces at head */ @@ -7215,9 +7215,10 @@ rb_str_lstrip_bang(VALUE str) } if (s > RSTRING_PTR(str)) { - STR_SET_LEN(str, t-s); - memmove(RSTRING_PTR(str), s, RSTRING_LEN(str)); - RSTRING_PTR(str)[RSTRING_LEN(str)] = '\0'; + long len = t - s; + memmove(start, s, len); + STR_SET_LEN(str, len); + TERM_FILL(start+len, rb_enc_mbminlen(enc)); return str; } return Qnil; @@ -7260,12 +7261,12 @@ static VALUE rb_str_rstrip_bang(VALUE str) { rb_encoding *enc; - char *s, *t, *e; + char *start, *s, *t, *e; str_modify_keep_cr(str); enc = STR_ENC_GET(str); rb_str_check_dummy_enc(enc); - s = RSTRING_PTR(str); + start = s = RSTRING_PTR(str); if (!s || RSTRING_LEN(str) == 0) return Qnil; t = e = RSTRING_END(str); @@ -7284,10 +7285,10 @@ rb_str_rstrip_bang(VALUE str) } } if (t < e) { - long len = t-RSTRING_PTR(str); + long len = t-start; STR_SET_LEN(str, len); - RSTRING_PTR(str)[len] = '\0'; + TERM_FILL(start+len, rb_enc_mbminlen(enc)); return str; } return Qnil; diff --git a/test/-ext-/string/test_cstr.rb b/test/-ext-/string/test_cstr.rb index f691da6f79..1809fa186a 100644 --- a/test/-ext-/string/test_cstr.rb +++ b/test/-ext-/string/test_cstr.rb @@ -39,4 +39,16 @@ class Test_StringCStr < Test::Unit::TestCase assert_equal(0, s.cstr_term) end end + + def test_wchar_lstrip! + str = Bug::String.new(" a".encode(Encoding::UTF_16BE)) + str.lstrip! + assert_nil(str.cstr_term_char) + end + + def test_wchar_rstrip! + str = Bug::String.new("a ".encode(Encoding::UTF_16BE)) + str.rstrip! + assert_nil(str.cstr_term_char) + end end |