From fca560bca4caba437a99547a080e30963003e798 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 19 Nov 2002 08:07:51 +0000 Subject: * array.c (rb_ary_zip): iterates over items in the receiver. zipped with nil if argument arrays are shorter. if arrays are longer, left items are ignored. now works with blocks. * enum.c (zip_i): changed for new behavior. * array.c (rb_ary_transpose): added. [new] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@3064 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- enum.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) (limited to 'enum.c') diff --git a/enum.c b/enum.c index c5191fdfb..1200ce35e 100644 --- a/enum.c +++ b/enum.c @@ -491,23 +491,23 @@ zip_i(val, memo) VALUE val; NODE *memo; { - VALUE ary = memo->u1.value; - int i = memo->u3.cnt++; - int elen = memo->u2.argc+1; + VALUE result = memo->u1.value; + VALUE args = memo->u2.value; + int idx = memo->u3.cnt++; VALUE tmp; + int i; - if (i < RARRAY(ary)->len) { - tmp = RARRAY(ary)->ptr[i]; - RARRAY(tmp)->ptr[0] = val; + tmp = rb_ary_new2(RARRAY(args)->len + 1); + rb_ary_store(tmp, 0, val); + RARRAY(tmp)->ptr[0] = val; + for (i=0; ilen; i++) { + rb_ary_push(tmp, rb_ary_entry(RARRAY(args)->ptr[i], idx)); + } + if (rb_block_given_p()) { + rb_yield(tmp); } else { - tmp = rb_ary_new2(elen); - RARRAY(tmp)->ptr[0] = val; - for (i=1; iptr[i] = Qnil; - } - RARRAY(tmp)->len = elen; - rb_ary_push(ary, tmp); + rb_ary_push(result, tmp); } return Qnil; } @@ -525,19 +525,9 @@ enum_zip(argc, argv, obj) len = 0; for (i=0; ilen > len) len = RARRAY(argv[i])->len; - } - result = rb_ary_new2(len); - for (i=0; i