diff options
author | kosako <kosako@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-03-21 13:16:21 +0000 |
---|---|---|
committer | kosako <kosako@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-03-21 13:16:21 +0000 |
commit | a350e9c6e2935b2c2d358b94327a0c7028668c11 (patch) | |
tree | 3e968ad13d9c32422052d30f626b4fe9996b9f99 | |
parent | 1e608d0dffa714e65390d428c1f6fa48a9dbbba8 (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
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gc.c | 1 | ||||
-rw-r--r-- | re.c | 41 | ||||
-rw-r--r-- | re.h | 1 | ||||
-rw-r--r-- | version.h | 6 |
5 files changed, 53 insertions, 6 deletions
@@ -1,3 +1,13 @@ +Tue Mar 21 22:14:01 2006 K.Kosako <sndgk393 AT ybb.ne.jp> + + * re.c (match_alloc): initialize member regexp. + + * re.c (match_aref): add String and Symbol argument. [ruby-dev:28448] + + * re.h : add member regexp to RMatch. + + * gc.c (gc_mark_children): add gc_mark() to regexp member. + Mon Mar 20 11:12:38 2006 NAKAMURA Usaku <[email protected]> * ext/win32ole/win32ole.c (folevariant_value): could not compile @@ -970,6 +970,7 @@ gc_mark_children(VALUE ptr, int lev) break; case T_MATCH: + gc_mark(obj->as.match.regexp, lev); if (obj->as.match.str) { ptr = obj->as.match.str; goto again; @@ -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, ®s); 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 @@ -24,6 +24,7 @@ struct RMatch { struct RBasic basic; VALUE str; struct re_registers *regs; + VALUE regexp; /* RRegexp */ }; #define RMATCH(obj) (R_CAST(RMatch)(obj)) @@ -1,14 +1,14 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2006-03-20" +#define RUBY_RELEASE_DATE "2006-03-21" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20060320 +#define RUBY_RELEASE_CODE 20060321 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2006 #define RUBY_RELEASE_MONTH 3 -#define RUBY_RELEASE_DAY 20 +#define RUBY_RELEASE_DAY 21 RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_release_date[]; |