* 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
@ -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>
|
Wed Feb 25 00:41:21 2009 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
* class.c (rb_scan_args): Allow specifying the number of trailing
|
* 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;
|
VALUE s = *ptr;
|
||||||
if (TYPE(s) != T_STRING) {
|
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;
|
*ptr = s;
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
@ -5070,7 +5075,7 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
|
|||||||
char *s, *send, *t;
|
char *s, *send, *t;
|
||||||
VALUE del = 0, nodel = 0;
|
VALUE del = 0, nodel = 0;
|
||||||
int modify = 0;
|
int modify = 0;
|
||||||
int i, ascompat;
|
int i, ascompat, cr;
|
||||||
|
|
||||||
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
|
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
|
||||||
if (argc < 1) {
|
if (argc < 1) {
|
||||||
@ -5088,6 +5093,7 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
|
|||||||
ascompat = rb_enc_asciicompat(enc);
|
ascompat = rb_enc_asciicompat(enc);
|
||||||
s = t = RSTRING_PTR(str);
|
s = t = RSTRING_PTR(str);
|
||||||
send = RSTRING_END(str);
|
send = RSTRING_END(str);
|
||||||
|
cr = ascompat ? ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID;
|
||||||
while (s < send) {
|
while (s < send) {
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
int clen;
|
int clen;
|
||||||
@ -5112,12 +5118,14 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
|
|||||||
else {
|
else {
|
||||||
if (t != s) rb_enc_mbcput(c, t, enc);
|
if (t != s) rb_enc_mbcput(c, t, enc);
|
||||||
t += clen;
|
t += clen;
|
||||||
|
if (cr == ENC_CODERANGE_7BIT) cr = ENC_CODERANGE_VALID;
|
||||||
}
|
}
|
||||||
s += clen;
|
s += clen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*t = '\0';
|
*t = '\0';
|
||||||
STR_SET_LEN(str, t - RSTRING_PTR(str));
|
STR_SET_LEN(str, t - RSTRING_PTR(str));
|
||||||
|
ENC_CODERANGE_SET(str, cr);
|
||||||
|
|
||||||
if (modify) return str;
|
if (modify) return str;
|
||||||
return Qnil;
|
return Qnil;
|
||||||
|
@ -474,6 +474,11 @@ class TestString < Test::Unit::TestCase
|
|||||||
assert_equal(S("he"), S("hello").delete(S("lo")))
|
assert_equal(S("he"), S("hello").delete(S("lo")))
|
||||||
assert_equal(S("hell"), S("hello").delete(S("aeiou"), S("^e")))
|
assert_equal(S("hell"), S("hello").delete(S("aeiou"), S("^e")))
|
||||||
assert_equal(S("ho"), S("hello").delete(S("ej-m")))
|
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
|
end
|
||||||
|
|
||||||
def test_delete!
|
def test_delete!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user