[macruby-changes] [3685] MacRuby/branches/icu/re.cpp
source_changes at macosforge.org
source_changes at macosforge.org
Wed Mar 3 14:16:53 PST 2010
Revision: 3685
http://trac.macosforge.org/projects/ruby/changeset/3685
Author: lsansonetti at apple.com
Date: 2010-03-03 14:16:51 -0800 (Wed, 03 Mar 2010)
Log Message:
-----------
added #union
Modified Paths:
--------------
MacRuby/branches/icu/re.cpp
Modified: MacRuby/branches/icu/re.cpp
===================================================================
--- MacRuby/branches/icu/re.cpp 2010-03-03 21:40:18 UTC (rev 3684)
+++ MacRuby/branches/icu/re.cpp 2010-03-03 22:16:51 UTC (rev 3685)
@@ -243,6 +243,12 @@
}
}
+static VALUE
+rb_check_regexp_type(VALUE re)
+{
+ return rb_check_convert_type(re, T_REGEXP, "Regexp", "to_regexp");
+}
+
/*
* call-seq:
* Regexp.escape(str) => string
@@ -263,8 +269,82 @@
return rb_reg_quote(reg_operand(pat, true));
}
+
+
/*
* 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 regexp_to_s(VALUE rcv, SEL sel);
+
+static VALUE
+regexp_union(VALUE klass, SEL sel, int argc, VALUE *argv)
+{
+ const VALUE *args;
+
+ if (argc == 0) {
+ return rb_reg_new_str(rb_str_new2("(?!)"), 0);
+ }
+ else if (argc == 1) {
+ VALUE v = rb_check_regexp_type(argv[0]);
+ if (!NIL_P(v)) {
+ return v;
+ }
+ v = rb_check_array_type(argv[0]);
+ if (!NIL_P(v)) {
+ argc = RARRAY_LEN(argv[0]);
+ args = RARRAY_PTR(argv[0]);
+ }
+ else {
+ StringValue(argv[0]);
+ return rb_reg_new_str(rb_reg_quote(argv[0]), 0);
+ }
+ }
+ else {
+ args = argv;
+ }
+
+ VALUE source = rb_unicode_str_new(NULL, 0);
+
+ for (int i = 0; i < argc; i++) {
+ VALUE arg = args[i];
+
+ if (i > 0) {
+ rb_str_cat2(source, "|");
+ }
+
+ VALUE substr;
+ VALUE re = rb_check_regexp_type(arg);
+ if (!NIL_P(re)) {
+ substr = regexp_to_s(re, 0);
+ }
+ else {
+ StringValue(arg);
+ substr = rb_reg_quote(arg);
+ }
+
+ rb_str_append(source, substr);
+ }
+
+ return rb_reg_new_str(source, 0);
+}
+
+/*
+ * call-seq:
* Regexp.last_match => matchdata
* Regexp.last_match(n) => str
*
@@ -323,12 +403,6 @@
*
*/
-VALUE
-rb_check_regexp_type(VALUE re)
-{
- return rb_check_convert_type(re, T_REGEXP, "Regexp", "to_regexp");
-}
-
static VALUE
regexp_try_convert(VALUE klass, SEL sel, VALUE obj)
{
@@ -932,9 +1006,8 @@
(void *)regexp_quote, 1);
rb_objc_define_method(*(VALUE *)rb_cRegexp, "escape",
(void *)regexp_quote, 1);
-#if 0
- rb_objc_define_method(*(VALUE *)rb_cRegexp, "union", rb_reg_s_union_m, -2);
-#endif
+ rb_objc_define_method(*(VALUE *)rb_cRegexp, "union",
+ (void *)regexp_union, -1);
rb_objc_define_method(*(VALUE *)rb_cRegexp, "last_match",
(void *)regexp_last_match, -1);
rb_objc_define_method(*(VALUE *)rb_cRegexp, "try_convert",
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100303/b08e4459/attachment.html>
More information about the macruby-changes
mailing list