ruby-changes:13287
From: nobu <ko1@a...>
Date: Wed, 23 Sep 2009 13:16:14 +0900 (JST)
Subject: [ruby-changes:13287] Ruby:r25050 (trunk): * string.c (rb_str_upto): keep first width.
nobu 2009-09-23 13:14:23 +0900 (Wed, 23 Sep 2009) New Revision: 25050 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25050 Log: * string.c (rb_str_upto): keep first width. [ruby-dev:39361] Modified files: trunk/ChangeLog trunk/string.c trunk/test/ruby/test_range.rb trunk/test/ruby/test_string.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 25049) +++ ChangeLog (revision 25050) @@ -1,3 +1,7 @@ +Wed Sep 23 13:14:21 2009 Nobuyoshi Nakada <nobu@r...> + + * string.c (rb_str_upto): keep first width. [ruby-dev:39361] + Wed Sep 23 11:28:06 2009 Nobuyoshi Nakada <nobu@r...> * tool/instruction.rb (make_header_prepare_stack): check stack Index: string.c =================================================================== --- string.c (revision 25049) +++ string.c (revision 25050) @@ -26,6 +26,8 @@ #include <unistd.h> #endif +#define numberof(array) (int)(sizeof(array) / sizeof((array)[0])) + #undef rb_str_new_cstr #undef rb_tainted_str_new_cstr #undef rb_usascii_str_new_cstr @@ -3102,8 +3104,10 @@ if (ascii && ISDIGIT(RSTRING_PTR(beg)[0]) && ISDIGIT(RSTRING_PTR(end)[0])) { char *s, *send; VALUE b, e; + int width; s = RSTRING_PTR(beg); send = RSTRING_END(beg); + width = rb_long2int(send - s); while (s < send) { if (!ISDIGIT(*s)) goto no_digits; s++; @@ -3118,20 +3122,22 @@ if (FIXNUM_P(b) && FIXNUM_P(e)) { long bi = FIX2LONG(b); long ei = FIX2LONG(e); - char buf[sizeof(long)*3+1]; + rb_encoding *usascii = rb_usascii_encoding(); while (bi <= ei) { if (excl && bi == ei) break; - sprintf(buf, "%ld", bi); - rb_yield(rb_usascii_str_new_cstr(buf)); + rb_yield(rb_enc_sprintf(usascii, "%.*ld", width, bi)); bi++; } } else { ID op = excl ? '<' : rb_intern("<="); + VALUE args[2], fmt = rb_obj_freeze(rb_usascii_str_new_cstr("%.*d")); + args[0] = INT2FIX(width); while (rb_funcall(b, op, 1, e)) { - rb_yield(rb_obj_as_string(b)); + args[1] = b; + rb_yield(rb_str_format(numberof(args), args, fmt)); b = rb_funcall(b, succ, 0, 0); } } Index: test/ruby/test_range.rb =================================================================== --- test/ruby/test_range.rb (revision 25049) +++ test/ruby/test_range.rb (revision 25050) @@ -14,6 +14,7 @@ assert_equal(["6", "7", "8"], ("6".."8").to_a, "[ruby-talk:343187]") assert_equal(["6", "7"], ("6"..."8").to_a) assert_equal(["9", "10"], ("9".."10").to_a) + assert_equal(["09", "10"], ("09".."10").to_a, "[ruby-dev:39361]") assert_equal(["9", "10"], (SimpleDelegator.new("9").."10").to_a) assert_equal(["9", "10"], ("9"..SimpleDelegator.new("10")).to_a) end Index: test/ruby/test_string.rb =================================================================== --- test/ruby/test_string.rb (revision 25049) +++ test/ruby/test_string.rb (revision 25050) @@ -1577,6 +1577,19 @@ assert_equal(676, count) end + def test_upto_numeric + a = S("00") + start = S("00") + count = 0 + assert_equal(S("00"), a.upto(S("23")) {|s| + assert_equal(start, s, "[ruby-dev:39361]") + assert_equal(Encoding::US_ASCII, s.encoding) + start.succ! + count += 1 + }) + assert_equal(24, count, "[ruby-dev:39361]") + end + def test_mod_check assert_raise(RuntimeError) { s = "" -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/