summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
authorkosako <kosako@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-03-21 13:16:21 +0000
committerkosako <kosako@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-03-21 13:16:21 +0000
commita350e9c6e2935b2c2d358b94327a0c7028668c11 (patch)
tree3e968ad13d9c32422052d30f626b4fe9996b9f99 /re.c
parent1e608d0dffa714e65390d428c1f6fa48a9dbbba8 (diff)
add String/Symbol argument to MatchData[x]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10045 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 're.c')
-rw-r--r--re.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/re.c b/re.c
index 47876d3fcd..9570a775e1 100644
--- a/re.c
+++ b/re.c
@@ -655,6 +655,7 @@ match_alloc(VALUE klass)
match->str = 0;
match->regs = 0;
+ match->regexp = 0;
match->regs = ALLOC(struct re_registers);
MEMZERO(match->regs, struct re_registers, 1);
@@ -942,6 +943,7 @@ rb_reg_search(VALUE re, VALUE str, long pos, long reverse)
onig_region_copy(RMATCH(match)->regs, &regs);
RMATCH(match)->str = rb_str_new4(str);
+ RMATCH(match)->regexp = re;
rb_backref_set(match);
OBJ_INFECT(match, re);
@@ -1183,10 +1185,43 @@ match_aref(int argc, VALUE *argv, VALUE match)
rb_scan_args(argc, argv, "11", &idx, &rest);
- if (!NIL_P(rest) || !FIXNUM_P(idx) || FIX2INT(idx) < 0) {
- return rb_ary_aref(argc, argv, match_to_a(match));
+ if (NIL_P(rest)) {
+ if (FIXNUM_P(idx)) {
+ if (FIX2INT(idx) >= 0) {
+ return rb_reg_nth_match(FIX2INT(idx), match);
+ }
+ }
+ else {
+ char *p, *end;
+ int num;
+
+ switch (TYPE(idx)) {
+ case T_SYMBOL:
+ p = rb_id2name(SYM2ID(idx));
+ goto name_to_backref;
+ break;
+ case T_STRING:
+ p = StringValuePtr(idx);
+
+ name_to_backref:
+ end = p + strlen(p);
+ num = onig_name_to_backref_number(RREGEXP(RMATCH(match)->regexp)->ptr,
+ (unsigned char* )p, (unsigned char* )end, RMATCH(match)->regs);
+ if (num >= 1) {
+ return rb_reg_nth_match(num, match);
+ }
+ else {
+ rb_raise(rb_eArgError, "undefined group name reference: %s", p);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
}
- return rb_reg_nth_match(FIX2INT(idx), match);
+
+ return rb_ary_aref(argc, argv, match_to_a(match));
}
static VALUE