[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]