summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-15 11:45:17 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-15 11:45:17 +0000
commit425bd14e235c10fb3c85c6ff47ff671b891fe7dc (patch)
treeb1718bd56a31fb18b340b8a3786801356b0e387a /re.c
parent3be6ebc5ce37dc5f3800484d525e501f66d51d8e (diff)
* re.c (match_inspect): backported from 1.9.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@16041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 're.c')
-rw-r--r--re.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/re.c b/re.c
index ecbbba0905..1a7f9a8c19 100644
--- a/re.c
+++ b/re.c
@@ -1279,6 +1279,55 @@ match_string(match)
return RMATCH(match)->str; /* str is frozen */
}
+/*
+ * call-seq:
+ * mtch.inspect => str
+ *
+ * Returns a printable version of <i>mtch</i>.
+ *
+ * puts /.$/.match("foo").inspect
+ * #=> #<MatchData "o">
+ *
+ * puts /(.)(.)(.)/.match("foo").inspect
+ * #=> #<MatchData "foo" 1:"f" 2:"o" 3:"o">
+ *
+ * puts /(.)(.)?(.)/.match("fo").inspect
+ * #=> #<MatchData "fo" 1:"f" 2:nil 3:"o">
+ *
+ */
+
+static VALUE
+match_inspect(VALUE match)
+{
+ char *cname = rb_obj_classname(match);
+ VALUE str;
+ int i;
+ struct re_registers *regs = RMATCH(match)->regs;
+ int num_regs = regs->num_regs;
+
+ str = rb_str_buf_new2("#<");
+ rb_str_buf_cat2(str, cname);
+
+ for (i = 0; i < num_regs; i++) {
+ VALUE v;
+ rb_str_buf_cat2(str, " ");
+ if (0 < i) {
+ char buf[sizeof(i)*3+1];
+ snprintf(buf, sizeof(buf), "%d", i);
+ rb_str_buf_cat2(str, buf);
+ rb_str_buf_cat2(str, ":");
+ }
+ v = rb_reg_nth_match(i, match);
+ if (v == Qnil)
+ rb_str_buf_cat2(str, "nil");
+ else
+ rb_str_buf_append(str, rb_str_inspect(v));
+ }
+ rb_str_buf_cat2(str, ">");
+
+ return str;
+}
+
VALUE rb_cRegexp;
static void
@@ -2280,6 +2329,6 @@ Init_Regexp()
rb_define_method(rb_cMatch, "pre_match", rb_reg_match_pre, 0);
rb_define_method(rb_cMatch, "post_match", rb_reg_match_post, 0);
rb_define_method(rb_cMatch, "to_s", match_to_s, 0);
- rb_define_method(rb_cMatch, "inspect", rb_any_to_s, 0); /* in object.c */
+ rb_define_method(rb_cMatch, "inspect", match_inspect, 0);
rb_define_method(rb_cMatch, "string", match_string, 0);
}