ruby-changes:11342
From: akr <ko1@a...>
Date: Sun, 15 Mar 2009 03:05:06 +0900 (JST)
Subject: [ruby-changes:11342] Ruby:r22959 (trunk): * string.c (rb_str_subpat): accept capture name.
akr 2009-03-15 03:04:21 +0900 (Sun, 15 Mar 2009) New Revision: 22959 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22959 Log: * string.c (rb_str_subpat): accept capture name. (rb_str_aref): follow above change. (rb_str_aref_m): pass the 2nd argument to rb_str_subpat. (rb_str_subpat_set): accept capture name. (rb_str_aset): follow above change. (rb_str_partition): ditto. (rb_str_aset_m): pass the 2nd argument to rb_str_subpat_set. * include/ruby/intern.h (rb_reg_backref_number): declared. * re.c (rb_reg_backref_number): defined. [ruby-core:21057] Modified files: trunk/ChangeLog trunk/NEWS trunk/include/ruby/intern.h trunk/re.c trunk/string.c trunk/test/ruby/test_regexp.rb Index: include/ruby/intern.h =================================================================== --- include/ruby/intern.h (revision 22958) +++ include/ruby/intern.h (revision 22959) @@ -518,6 +518,7 @@ void rb_match_busy(VALUE); VALUE rb_reg_nth_defined(int, VALUE); VALUE rb_reg_nth_match(int, VALUE); +int rb_reg_backref_number(VALUE match, VALUE backref); VALUE rb_reg_last_match(VALUE); VALUE rb_reg_match_pre(VALUE); VALUE rb_reg_match_post(VALUE); Index: re.c =================================================================== --- re.c (revision 22958) +++ re.c (revision 22959) @@ -1008,6 +1008,11 @@ return num; } +int +rb_reg_backref_number(VALUE match, VALUE backref) +{ + return match_backref_number(match, backref); +} /* * call-seq: Index: ChangeLog =================================================================== --- ChangeLog (revision 22958) +++ ChangeLog (revision 22959) @@ -1,3 +1,19 @@ +Sun Mar 15 02:53:13 2009 Tanaka Akira <akr@f...> + + * string.c (rb_str_subpat): accept capture name. + (rb_str_aref): follow above change. + (rb_str_aref_m): pass the 2nd argument to rb_str_subpat. + (rb_str_subpat_set): accept capture name. + (rb_str_aset): follow above change. + (rb_str_partition): ditto. + (rb_str_aset_m): pass the 2nd argument to rb_str_subpat_set. + + * include/ruby/intern.h (rb_reg_backref_number): declared. + + * re.c (rb_reg_backref_number): defined. + + [ruby-core:21057] + Sun Mar 15 02:09:31 2009 Nobuyoshi Nakada <nobu@r...> * proc.c (bmcall): should not uninitialized variable. a patch from Index: string.c =================================================================== --- string.c (revision 22958) +++ string.c (revision 22959) @@ -3024,10 +3024,12 @@ } static VALUE -rb_str_subpat(VALUE str, VALUE re, int nth) +rb_str_subpat(VALUE str, VALUE re, VALUE backref) { if (rb_reg_search(re, str, 0, 0) >= 0) { - return rb_reg_nth_match(nth, rb_backref_get()); + VALUE match = rb_backref_get(); + int nth = rb_reg_backref_number(match, backref); + return rb_reg_nth_match(nth, match); } return Qnil; } @@ -3047,7 +3049,7 @@ return str; case T_REGEXP: - return rb_str_subpat(str, indx, 0); + return rb_str_subpat(str, indx, INT2FIX(0)); case T_STRING: if (rb_str_index(str, indx, 0) != -1) @@ -3091,6 +3093,7 @@ * str.slice(range) => new_str or nil * str.slice(regexp) => new_str or nil * str.slice(regexp, fixnum) => new_str or nil + * str.slice(regexp, capname) => new_str or nil * str.slice(other_str) => new_str or nil * * Element Reference---If passed a single <code>Fixnum</code>, returns a @@ -3103,7 +3106,7 @@ * is negative, or the beginning of the range is greater than the end. * * If a <code>Regexp</code> is supplied, the matching portion of <i>str</i> is - * returned. If a numeric parameter follows the regular expression, that + * returned. If a numeric or name parameter follows the regular expression, that * component of the <code>MatchData</code> is returned instead. If a * <code>String</code> is given, that string is returned if it occurs in * <i>str</i>. In both cases, <code>nil</code> is returned if there is no @@ -3130,7 +3133,7 @@ { if (argc == 2) { if (TYPE(argv[0]) == T_REGEXP) { - return rb_str_subpat(str, argv[0], NUM2INT(argv[1])); + return rb_str_subpat(str, argv[0], argv[1]); } return rb_str_substr(str, NUM2LONG(argv[0]), NUM2LONG(argv[1])); } @@ -3251,8 +3254,9 @@ } static void -rb_str_subpat_set(VALUE str, VALUE re, int nth, VALUE val) +rb_str_subpat_set(VALUE str, VALUE re, VALUE backref, VALUE val) { + int nth; VALUE match; long start, end, len; rb_encoding *enc; @@ -3262,6 +3266,7 @@ rb_raise(rb_eIndexError, "regexp not matched"); } match = rb_backref_get(); + nth = rb_reg_backref_number(match, backref); regs = RMATCH_REGS(match); if (nth >= regs->num_regs) { out_of_range: @@ -3299,7 +3304,7 @@ return val; case T_REGEXP: - rb_str_subpat_set(str, indx, 0, val); + rb_str_subpat_set(str, indx, INT2FIX(0), val); return val; case T_STRING: @@ -3332,6 +3337,7 @@ * str[range] = aString * str[regexp] = new_str * str[regexp, fixnum] = new_str + * str[regexp, name] = new_str * str[other_str] = new_str * * Element Assignment---Replaces some or all of the content of <i>str</i>. The @@ -3354,7 +3360,7 @@ { if (argc == 3) { if (TYPE(argv[0]) == T_REGEXP) { - rb_str_subpat_set(str, argv[0], NUM2INT(argv[1]), argv[2]); + rb_str_subpat_set(str, argv[0], argv[1], argv[2]); } else { rb_str_splice(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]); @@ -6760,7 +6766,7 @@ return rb_ary_new3(3, str, rb_str_new(0,0),rb_str_new(0,0)); } if (regex) { - sep = rb_str_subpat(str, sep, 0); + sep = rb_str_subpat(str, sep, INT2FIX(0)); if (pos == 0 && RSTRING_LEN(sep) == 0) goto failed; } return rb_ary_new3(3, rb_str_subseq(str, 0, pos), Index: NEWS =================================================================== --- NEWS (revision 22958) +++ NEWS (revision 22959) @@ -38,6 +38,10 @@ * extended methods: * Process.spawn accepts [:child, FD] for a redirect target. + * String + * extended methods: + * string[regexp, name] supported. + * rss * 0.2.4 -> 0.2.5 Index: test/ruby/test_regexp.rb =================================================================== --- test/ruby/test_regexp.rb (revision 22958) +++ test/ruby/test_regexp.rb (revision 22959) @@ -104,6 +104,12 @@ assert_equal({}, /(.)(.)/.named_captures) assert_equal("a[b]c", "abc".sub(/(?<x>[bc])/, "[\\k<x>]")) + + assert_equal("o", "foo"[/(?<bar>o)/, "bar"]) + + s = "foo" + s[/(?<bar>o)/, "bar"] = "baz" + assert_equal("fbazo", s) end def test_assign_named_capture -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/