From 299d4e66efb48b388ee3d2f3f784f581bd88ddea Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 14 Aug 2001 08:13:31 +0000 Subject: * range.c (range_step): new method. * string.c (rb_str_cmp): remove needless conditional. * string.c (rb_str_lstrip_bang) `return Qnil' was missing. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@1682 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- range.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) (limited to 'range.c') diff --git a/range.c b/range.c index 0b136f167..063da06bc 100644 --- a/range.c +++ b/range.c @@ -232,6 +232,92 @@ range_each(range) return range; } +static VALUE +r_step_str(args) + VALUE *args; +{ + return rb_str_upto(args[0], args[1], EXCL(args[2])); +} + +static VALUE +r_step_str_i(i, iter) + VALUE i; + long *iter; +{ + iter[0]--; + if (iter[0] == 0) { + rb_yield(i); + iter[0] = iter[1]; + } + return Qnil; +} + +static VALUE +range_step(argc, argv, range) + int argc; + VALUE *argv; + VALUE range; +{ + VALUE b, e, step; + + b = rb_ivar_get(range, id_beg); + e = rb_ivar_get(range, id_end); + rb_scan_args(argc, argv, "01", &step); + + if (FIXNUM_P(b) && FIXNUM_P(e)) { /* fixnums are special */ + long end = FIX2LONG(e); + long i, s = (argc == 0) ? 1 : NUM2LONG(step); + + if (!EXCL(range)) end += 1; + for (i=FIX2LONG(b); i