diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-17 06:28:10 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-07-17 06:28:10 +0000 |
commit | eabd490119df3f6c15be62d26ed1f4d523a65f17 (patch) | |
tree | 5c1b068fd6bb2ef3571211bb8e321df0287b9c16 /re.c | |
parent | 545bbcf272208f0a286d0614e653492a54a007d8 (diff) | |
download | ruby-eabd490119df3f6c15be62d26ed1f4d523a65f17.tar.gz |
* re.c (rb_reg_match_m): add optional second argugment "pos" to
specify match start point. [ruby-core:03203]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6658 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 're.c')
-rw-r--r-- | re.c | 76 |
1 files changed, 46 insertions, 30 deletions
@@ -1491,36 +1491,34 @@ rb_reg_equal(re1, re2) return Qfalse; } - -/* - * call-seq: - * rxp.match(str) => matchdata or nil - * - * Returns a <code>MatchData</code> object describing the match, or - * <code>nil</code> if there was no match. This is equivalent to retrieving the - * value of the special variable <code>$~</code> following a normal match. - * - * /(.)(.)(.)/.match("abc")[2] #=> "b" - */ - -VALUE -rb_reg_match(re, str) +static VALUE +rb_reg_match_pos(re, str, pos) VALUE re, str; + long pos; { - long start; - - if (NIL_P(str)) { - rb_backref_set(Qnil); - return Qnil; - } StringValue(str); - start = rb_reg_search(re, str, 0, 0); - if (start < 0) { + if (pos != 0) { + if (pos < 0) { + pos += RSTRING(str)->len; + if (pos < 0) { + return Qnil; + } + } + pos = rb_reg_adjust_startpos(re, str, pos, 0); + } + pos = rb_reg_search(re, str, pos, 0); + if (pos < 0) { return Qnil; } - return LONG2FIX(start); + return LONG2FIX(pos); } +VALUE +rb_reg_match(re, str) + VALUE re, str; +{ + return rb_reg_match_pos(re, str, 0); +} /* * call-seq: @@ -1595,22 +1593,40 @@ rb_reg_match2(re) /* * call-seq: - * rxp.match(str) => matchdata or nil + * rxp.match(str) => matchdata or nil + * rxp.match(str,pos) => matchdata or nil * * Returns a <code>MatchData</code> object describing the match, or * <code>nil</code> if there was no match. This is equivalent to retrieving the * value of the special variable <code>$~</code> following a normal match. - * + * If the second parameter is present, it specifies the position in the string + * to begin the search. + * * /(.)(.)(.)/.match("abc")[2] #=> "b" + * /(.)(.)/.match("abc", 1)[2] #=> "c" */ static VALUE -rb_reg_match_m(re, str) - VALUE re, str; +rb_reg_match_m(argc, argv, re) + int argc; + VALUE *argv; + VALUE re; { - VALUE result = rb_reg_match(re, str); + VALUE result, str, initpos; + long pos; - if (NIL_P(result)) return Qnil; + if (rb_scan_args(argc, argv, "11", &str, &initpos) == 2) { + pos = NUM2LONG(initpos); + } + else { + pos = 0; + } + + result = rb_reg_match_pos(re, str, pos); + if (NIL_P(result)) { + rb_backref_set(Qnil); + return Qnil; + } result = rb_backref_get(); rb_match_busy(result); return result; @@ -2267,7 +2283,7 @@ Init_Regexp() rb_define_method(rb_cRegexp, "=~", rb_reg_match, 1); rb_define_method(rb_cRegexp, "===", rb_reg_eqq, 1); rb_define_method(rb_cRegexp, "~", rb_reg_match2, 0); - rb_define_method(rb_cRegexp, "match", rb_reg_match_m, 1); + rb_define_method(rb_cRegexp, "match", rb_reg_match_m, -1); rb_define_method(rb_cRegexp, "to_s", rb_reg_to_s, 0); rb_define_method(rb_cRegexp, "inspect", rb_reg_inspect, 0); rb_define_method(rb_cRegexp, "source", rb_reg_source, 0); |