[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]