* 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
This commit is contained in:
nobu 2014-11-05 01:54:22 +00:00
Родитель 6c41b73dec
Коммит 3614f8bd1c
4 изменённых файлов: 41 добавлений и 9 удалений

Просмотреть файл

@ -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> Tue Nov 4 21:23:22 2014 NAKAMURA Usaku <usa@ruby-lang.org>
* ext/win32/lib/Win32API.rb: Fiddle::Importer is defined in * ext/win32/lib/Win32API.rb: Fiddle::Importer is defined in

Просмотреть файл

@ -19,8 +19,22 @@ bug_str_cstr_term(VALUE str)
return INT2NUM(c); 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 void
Init_cstr(VALUE klass) Init_cstr(VALUE klass)
{ {
rb_define_method(klass, "cstr_term", bug_str_cstr_term, 0); 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_str_lstrip_bang(VALUE str)
{ {
rb_encoding *enc; rb_encoding *enc;
char *s, *t, *e; char *start, *s, *t, *e;
str_modify_keep_cr(str); str_modify_keep_cr(str);
enc = STR_ENC_GET(str); enc = STR_ENC_GET(str);
s = RSTRING_PTR(str); start = s = RSTRING_PTR(str);
if (!s || RSTRING_LEN(str) == 0) return Qnil; if (!s || RSTRING_LEN(str) == 0) return Qnil;
e = t = RSTRING_END(str); e = t = RSTRING_END(str);
/* remove spaces at head */ /* remove spaces at head */
@ -7215,9 +7215,10 @@ rb_str_lstrip_bang(VALUE str)
} }
if (s > RSTRING_PTR(str)) { if (s > RSTRING_PTR(str)) {
STR_SET_LEN(str, t-s); long len = t - s;
memmove(RSTRING_PTR(str), s, RSTRING_LEN(str)); memmove(start, s, len);
RSTRING_PTR(str)[RSTRING_LEN(str)] = '\0'; STR_SET_LEN(str, len);
TERM_FILL(start+len, rb_enc_mbminlen(enc));
return str; return str;
} }
return Qnil; return Qnil;
@ -7260,12 +7261,12 @@ static VALUE
rb_str_rstrip_bang(VALUE str) rb_str_rstrip_bang(VALUE str)
{ {
rb_encoding *enc; rb_encoding *enc;
char *s, *t, *e; char *start, *s, *t, *e;
str_modify_keep_cr(str); str_modify_keep_cr(str);
enc = STR_ENC_GET(str); enc = STR_ENC_GET(str);
rb_str_check_dummy_enc(enc); rb_str_check_dummy_enc(enc);
s = RSTRING_PTR(str); start = s = RSTRING_PTR(str);
if (!s || RSTRING_LEN(str) == 0) return Qnil; if (!s || RSTRING_LEN(str) == 0) return Qnil;
t = e = RSTRING_END(str); t = e = RSTRING_END(str);
@ -7284,10 +7285,10 @@ rb_str_rstrip_bang(VALUE str)
} }
} }
if (t < e) { if (t < e) {
long len = t-RSTRING_PTR(str); long len = t-start;
STR_SET_LEN(str, len); STR_SET_LEN(str, len);
RSTRING_PTR(str)[len] = '\0'; TERM_FILL(start+len, rb_enc_mbminlen(enc));
return str; return str;
} }
return Qnil; return Qnil;

Просмотреть файл

@ -39,4 +39,16 @@ class Test_StringCStr < Test::Unit::TestCase
assert_equal(0, s.cstr_term) assert_equal(0, s.cstr_term)
end end
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 end