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);
|