mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
string.c: byte offset
* string.c (rb_pat_search): advance by byte offset but not by char offset. [ruby-core:62669] [Bug #9849] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46013 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
72c773b15d
commit
8fb925dfcd
3 changed files with 15 additions and 5 deletions
|
@ -1,3 +1,8 @@
|
|||
Mon May 19 16:29:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* string.c (rb_pat_search): advance by byte offset but not by char
|
||||
offset. [ruby-core:62669] [Bug #9849]
|
||||
|
||||
Mon May 19 14:06:18 2014 Shota Fukumori <her@sorah.jp>
|
||||
|
||||
* bin/testrb: Removed. Forgot to remove in r45971.
|
||||
|
|
12
string.c
12
string.c
|
@ -2569,8 +2569,10 @@ rb_str_casecmp(VALUE str1, VALUE str2)
|
|||
return INT2FIX(-1);
|
||||
}
|
||||
|
||||
#define rb_str_index(str, sub, offset) rb_strseq_index(str, sub, offset, 0)
|
||||
|
||||
static long
|
||||
rb_str_index(VALUE str, VALUE sub, long offset)
|
||||
rb_strseq_index(VALUE str, VALUE sub, long offset, int in_byte)
|
||||
{
|
||||
const char *s, *sptr, *e;
|
||||
long pos, len, slen;
|
||||
|
@ -2580,8 +2582,8 @@ rb_str_index(VALUE str, VALUE sub, long offset)
|
|||
enc = rb_enc_check(str, sub);
|
||||
if (is_broken_string(sub)) return -1;
|
||||
|
||||
len = single_byte ? RSTRING_LEN(str) : str_strlen(str, enc); /* rb_enc_check */
|
||||
slen = str_strlen(sub, enc); /* rb_enc_check */
|
||||
len = (in_byte || single_byte) ? RSTRING_LEN(str) : str_strlen(str, enc); /* rb_enc_check */
|
||||
slen = in_byte ? RSTRING_LEN(sub) : str_strlen(sub, enc); /* rb_enc_check */
|
||||
if (offset < 0) {
|
||||
offset += len;
|
||||
if (offset < 0) return -1;
|
||||
|
@ -2591,7 +2593,7 @@ rb_str_index(VALUE str, VALUE sub, long offset)
|
|||
s = RSTRING_PTR(str);
|
||||
e = RSTRING_END(str);
|
||||
if (offset) {
|
||||
offset = str_offset(s, e, offset, enc, single_byte);
|
||||
if (!in_byte) offset = str_offset(s, e, offset, enc, single_byte);
|
||||
s += offset;
|
||||
}
|
||||
if (slen == 0) return offset;
|
||||
|
@ -3873,7 +3875,7 @@ static long
|
|||
rb_pat_search(VALUE pat, VALUE str, long pos, int set_backref_str)
|
||||
{
|
||||
if (BUILTIN_TYPE(pat) == T_STRING) {
|
||||
pos = rb_str_index(str, pat, pos);
|
||||
pos = rb_strseq_index(str, pat, pos, 1);
|
||||
if (set_backref_str) {
|
||||
if (pos >= 0) {
|
||||
VALUE match;
|
||||
|
|
|
@ -834,6 +834,9 @@ class TestString < Test::Unit::TestCase
|
|||
assert_equal Encoding::UTF_8, a.gsub(/world/, c).encoding
|
||||
|
||||
assert_equal S("a\u{e9}apos<"), S("a\u{e9}'<").gsub("'", "apos")
|
||||
|
||||
bug9849 = '[ruby-core:62669] [Bug #9849]'
|
||||
assert_equal S("\u{3042 3042 3042}!foo!"), S("\u{3042 3042 3042}/foo/").gsub("/", "!"), bug9849
|
||||
end
|
||||
|
||||
def test_gsub!
|
||||
|
|
Loading…
Reference in a new issue