ruby-changes:2168
From: ko1@a...
Date: 9 Oct 2007 01:04:25 +0900
Subject: [ruby-changes:2168] akr - Ruby:r13659 (ruby_1_8): * re.c (rb_reg_s_union_m): Regexp.union accepts single
akr 2007-10-09 01:04:07 +0900 (Tue, 09 Oct 2007) New Revision: 13659 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/re.c Log: * re.c (rb_reg_s_union_m): Regexp.union accepts single argument which is an array of patterns. [ruby-list:44084] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/re.c?r1=13659&r2=13658 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=13659&r2=13658 Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 13658) +++ ruby_1_8/ChangeLog (revision 13659) @@ -1,3 +1,8 @@ +Tue Oct 9 01:01:55 2007 Tanaka Akira <akr@f...> + + * re.c (rb_reg_s_union_m): Regexp.union accepts single + argument which is an array of patterns. [ruby-list:44084] + Mon Oct 8 20:06:23 2007 GOTOU Yuuzou <gotoyuzo@n...> * lib/net/http.rb, lib/open-uri.rb: remove Index: ruby_1_8/re.c =================================================================== --- ruby_1_8/re.c (revision 13658) +++ ruby_1_8/re.c (revision 13659) @@ -1892,26 +1892,12 @@ return options; } - -/* - * call-seq: - * Regexp.union([pattern]*) => new_str - * - * Return a <code>Regexp</code> object that is the union of the given - * <em>pattern</em>s, i.e., will match any of its parts. The <em>pattern</em>s - * can be Regexp objects, in which case their options will be preserved, or - * Strings. If no arguments are given, returns <code>/(?!)/</code>. - * - * Regexp.union #=> /(?!)/ - * Regexp.union("penzance") #=> /penzance/ - * Regexp.union("skiing", "sledding") #=> /skiing|sledding/ - * Regexp.union(/dogs/, /cats/i) #=> /(?-mix:dogs)|(?i-mx:cats)/ - */ static VALUE -rb_reg_s_union(argc, argv) - int argc; - VALUE *argv; +rb_reg_s_union(self, args0) + VALUE self; + VALUE args0; { + long argc = RARRAY_LEN(args0); if (argc == 0) { VALUE args[1]; args[0] = rb_str_new2("(?!)"); @@ -1919,12 +1905,12 @@ } else if (argc == 1) { VALUE v; - v = rb_check_convert_type(argv[0], T_REGEXP, "Regexp", "to_regexp"); + v = rb_check_convert_type(rb_ary_entry(args0, 0), T_REGEXP, "Regexp", "to_regexp"); if (!NIL_P(v)) return v; else { VALUE args[1]; - args[0] = rb_reg_s_quote(argc, argv); + args[0] = rb_reg_s_quote(RARRAY_LEN(args0), RARRAY_PTR(args0)); return rb_class_new_instance(1, args, rb_cRegexp); } } @@ -1937,7 +1923,7 @@ volatile VALUE v; if (0 < i) rb_str_buf_cat2(source, "|"); - v = rb_check_convert_type(argv[i], T_REGEXP, "Regexp", "to_regexp"); + v = rb_check_convert_type(rb_ary_entry(args0, i), T_REGEXP, "Regexp", "to_regexp"); if (!NIL_P(v)) { if (FL_TEST(v, KCODE_FIXED)) { if (kcode == -1) { @@ -1955,7 +1941,7 @@ v = rb_reg_to_s(v); } else { - args[0] = argv[i]; + args[0] = rb_ary_entry(args0, i); v = rb_reg_s_quote(1, args); } rb_str_buf_append(source, v); @@ -1983,6 +1969,34 @@ } } +/* + * call-seq: + * Regexp.union(pat1, pat2, ...) => new_regexp + * Regexp.union(pats_ary) => new_regexp + * + * Return a <code>Regexp</code> object that is the union of the given + * <em>pattern</em>s, i.e., will match any of its parts. The <em>pattern</em>s + * can be Regexp objects, in which case their options will be preserved, or + * Strings. If no patterns are given, returns <code>/(?!)/</code>. + * + * Regexp.union #=> /(?!)/ + * Regexp.union("penzance") #=> /penzance/ + * Regexp.union("a+b*c") #=> /a\+b\*c/ + * Regexp.union("skiing", "sledding") #=> /skiing|sledding/ + * Regexp.union(["skiing", "sledding"]) #=> /skiing|sledding/ + * Regexp.union(/dogs/, /cats/i) #=> /(?-mix:dogs)|(?i-mx:cats)/ + */ +static VALUE +rb_reg_s_union_m(VALUE self, VALUE args) +{ + VALUE v; + if (RARRAY_LEN(args) == 1 && + !NIL_P(v = rb_check_array_type(rb_ary_entry(args, 0)))) { + return rb_reg_s_union(self, v); + } + return rb_reg_s_union(self, args); +} + /* :nodoc: */ static VALUE rb_reg_init_copy(copy, re) @@ -2260,7 +2274,7 @@ rb_define_singleton_method(rb_cRegexp, "compile", rb_class_new_instance, -1); rb_define_singleton_method(rb_cRegexp, "quote", rb_reg_s_quote, -1); rb_define_singleton_method(rb_cRegexp, "escape", rb_reg_s_quote, -1); - rb_define_singleton_method(rb_cRegexp, "union", rb_reg_s_union, -1); + rb_define_singleton_method(rb_cRegexp, "union", rb_reg_s_union_m, -2); rb_define_singleton_method(rb_cRegexp, "last_match", rb_reg_s_last_match, -1); rb_define_method(rb_cRegexp, "initialize", rb_reg_initialize_m, -1); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml