Feature #13110 ยป byteindex.diff
| re.c | ||
|---|---|---|
|
INT2FIX(RMATCH(match)->rmatch->char_offset[i].end));
|
||
|
}
|
||
|
static VALUE
|
||
|
match_byteoffset(VALUE match, VALUE n)
|
||
|
{
|
||
|
int i = match_backref_number(match, n);
|
||
|
struct re_registers *regs = RMATCH_REGS(match);
|
||
|
match_check(match);
|
||
|
if (i < 0 || regs->num_regs <= i)
|
||
|
rb_raise(rb_eIndexError, "index %d out of matches", i);
|
||
|
if (BEG(i) < 0)
|
||
|
return rb_assoc_new(Qnil, Qnil);
|
||
|
return rb_assoc_new(INT2FIX(BEG(i)), INT2FIX(END(i)));
|
||
|
}
|
||
|
/*
|
||
|
* call-seq:
|
||
| ... | ... | |
|
rb_define_method(rb_cMatch, "size", match_size, 0);
|
||
|
rb_define_method(rb_cMatch, "length", match_size, 0);
|
||
|
rb_define_method(rb_cMatch, "offset", match_offset, 1);
|
||
|
rb_define_method(rb_cMatch, "byteoffset", match_byteoffset, 1);
|
||
|
rb_define_method(rb_cMatch, "begin", match_begin, 1);
|
||
|
rb_define_method(rb_cMatch, "end", match_end, 1);
|
||
|
rb_define_method(rb_cMatch, "to_a", match_to_a, 0);
|
||
| string.c | ||
|---|---|---|
|
return LONG2NUM(pos);
|
||
|
}
|
||
|
static VALUE
|
||
|
rb_str_byteindex_m(int argc, VALUE *argv, VALUE str)
|
||
|
{
|
||
|
VALUE sub;
|
||
|
VALUE initpos;
|
||
|
long pos;
|
||
|
if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) {
|
||
|
pos = NUM2LONG(initpos);
|
||
|
}
|
||
|
else {
|
||
|
pos = 0;
|
||
|
}
|
||
|
if (pos < 0) {
|
||
|
pos += LONG2NUM(RSTRING_LEN(str));
|
||
|
if (pos < 0) {
|
||
|
if (RB_TYPE_P(sub, T_REGEXP)) {
|
||
|
rb_backref_set(Qnil);
|
||
|
}
|
||
|
return Qnil;
|
||
|
}
|
||
|
}
|
||
|
if (SPECIAL_CONST_P(sub)) goto generic;
|
||
|
switch (BUILTIN_TYPE(sub)) {
|
||
|
case T_REGEXP:
|
||
|
if (pos > RSTRING_LEN(str))
|
||
|
return Qnil;
|
||
|
pos = rb_reg_search(sub, str, pos, 0);
|
||
|
break;
|
||
|
generic:
|
||
|
default: {
|
||
|
VALUE tmp;
|
||
|
tmp = rb_check_string_type(sub);
|
||
|
if (NIL_P(tmp)) {
|
||
|
rb_raise(rb_eTypeError, "type mismatch: %s given",
|
||
|
rb_obj_classname(sub));
|
||
|
}
|
||
|
sub = tmp;
|
||
|
}
|
||
|
/* fall through */
|
||
|
case T_STRING:
|
||
|
pos = rb_strseq_index(str, sub, pos, 1);
|
||
|
break;
|
||
|
}
|
||
|
if (pos == -1) return Qnil;
|
||
|
return LONG2NUM(pos);
|
||
|
}
|
||
|
#ifdef HAVE_MEMRCHR
|
||
|
static long
|
||
|
str_rindex(VALUE str, VALUE sub, const char *s, long pos, rb_encoding *enc)
|
||
| ... | ... | |
|
rb_define_method(rb_cString, "next!", rb_str_succ_bang, 0);
|
||
|
rb_define_method(rb_cString, "upto", rb_str_upto, -1);
|
||
|
rb_define_method(rb_cString, "index", rb_str_index_m, -1);
|
||
|
rb_define_method(rb_cString, "byteindex", rb_str_byteindex_m, -1);
|
||
|
rb_define_method(rb_cString, "rindex", rb_str_rindex_m, -1);
|
||
|
rb_define_method(rb_cString, "replace", rb_str_replace, 1);
|
||
|
rb_define_method(rb_cString, "clear", rb_str_clear, 0);
|
||