mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* string.c (rb_str_delete_bang): should recalculate coderange.
[ruby-talk:329267] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22606 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
4b265d3e7b
commit
42eeb2c1b1
3 changed files with 20 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
|||
Wed Feb 25 02:17:30 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* string.c (rb_str_delete_bang): should recalculate coderange.
|
||||
[ruby-talk:329267]
|
||||
|
||||
Wed Feb 25 00:41:21 2009 Akinori MUSHA <knu@iDaemons.org>
|
||||
|
||||
* class.c (rb_scan_args): Allow specifying the number of trailing
|
||||
|
|
12
string.c
12
string.c
|
@ -1255,7 +1255,12 @@ rb_string_value(volatile VALUE *ptr)
|
|||
{
|
||||
VALUE s = *ptr;
|
||||
if (TYPE(s) != T_STRING) {
|
||||
s = rb_str_to_str(s);
|
||||
if (SYMBOL_P(s)) {
|
||||
s = rb_sym_to_s(s);
|
||||
}
|
||||
else {
|
||||
s = rb_str_to_str(s);
|
||||
}
|
||||
*ptr = s;
|
||||
}
|
||||
return s;
|
||||
|
@ -5070,7 +5075,7 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
|
|||
char *s, *send, *t;
|
||||
VALUE del = 0, nodel = 0;
|
||||
int modify = 0;
|
||||
int i, ascompat;
|
||||
int i, ascompat, cr;
|
||||
|
||||
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
|
||||
if (argc < 1) {
|
||||
|
@ -5088,6 +5093,7 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
|
|||
ascompat = rb_enc_asciicompat(enc);
|
||||
s = t = RSTRING_PTR(str);
|
||||
send = RSTRING_END(str);
|
||||
cr = ascompat ? ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID;
|
||||
while (s < send) {
|
||||
unsigned int c;
|
||||
int clen;
|
||||
|
@ -5112,12 +5118,14 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
|
|||
else {
|
||||
if (t != s) rb_enc_mbcput(c, t, enc);
|
||||
t += clen;
|
||||
if (cr == ENC_CODERANGE_7BIT) cr = ENC_CODERANGE_VALID;
|
||||
}
|
||||
s += clen;
|
||||
}
|
||||
}
|
||||
*t = '\0';
|
||||
STR_SET_LEN(str, t - RSTRING_PTR(str));
|
||||
ENC_CODERANGE_SET(str, cr);
|
||||
|
||||
if (modify) return str;
|
||||
return Qnil;
|
||||
|
|
|
@ -474,6 +474,11 @@ class TestString < Test::Unit::TestCase
|
|||
assert_equal(S("he"), S("hello").delete(S("lo")))
|
||||
assert_equal(S("hell"), S("hello").delete(S("aeiou"), S("^e")))
|
||||
assert_equal(S("ho"), S("hello").delete(S("ej-m")))
|
||||
|
||||
assert_equal("a".hash, "a\u0101".delete("\u0101").hash, '[ruby-talk:329267]')
|
||||
assert_equal(true, "a\u0101".delete("\u0101").ascii_only?)
|
||||
assert_equal(true, "a\u3041".delete("\u3041").ascii_only?)
|
||||
assert_equal(false, "a\u3041\u3042".tr("\u3041", "a").ascii_only?)
|
||||
end
|
||||
|
||||
def test_delete!
|
||||
|
|
Loading…
Reference in a new issue