summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-19 07:29:51 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-19 07:29:51 +0000
commit8fb925dfcd34bac51026cfa04ac4108a23b53e5d (patch)
tree30fff8e34df6ae35a50d08b4f4f546ca4b4050a1 /string.c
parent72c773b15dd65740807fb93cbd012a8367e738dc (diff)
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.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/string.c b/string.c
index 3527db9183..c093433736 100644
--- a/string.c
+++ b/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;