diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-19 07:29:51 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-19 07:29:51 +0000 |
commit | 8fb925dfcd34bac51026cfa04ac4108a23b53e5d (patch) | |
tree | 30fff8e34df6ae35a50d08b4f4f546ca4b4050a1 /string.c | |
parent | 72c773b15dd65740807fb93cbd012a8367e738dc (diff) | |
download | ruby-8fb925dfcd34bac51026cfa04ac4108a23b53e5d.tar.gz |
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
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -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; |