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

ruby-changes:6429

From: nobu <ko1@a...>
Date: Tue, 8 Jul 2008 00:23:24 +0900 (JST)
Subject: [ruby-changes:6429] Ruby:r17945 (trunk, ruby_1_8): * string.c (rb_str_succ): limit carrying in an alphanumeric region if

nobu	2008-07-08 00:23:01 +0900 (Tue, 08 Jul 2008)

  New Revision: 17945

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/string.c
    branches/ruby_1_8/test/ruby/test_string.rb
    trunk/ChangeLog
    trunk/string.c
    trunk/test/ruby/test_string.rb

  Log:
    * string.c (rb_str_succ): limit carrying in an alphanumeric region if
      exists.  [ruby-dev:35094]


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=17945

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 17944)
+++ ChangeLog	(revision 17945)
@@ -1,3 +1,8 @@
+Tue Jul  8 00:22:58 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (rb_str_succ): limit carrying in an alphanumeric region if
+	  exists.  [ruby-dev:35094]
+
 Mon Jul  7 20:39:28 2008  Masaki Suketa  <masaki.suketa@n...>
 
 	* ext/win32ole/win32ole.c(Init_win32ole): add
Index: string.c
===================================================================
--- string.c	(revision 17944)
+++ string.c	(revision 17945)
@@ -2535,13 +2535,16 @@
         enum neighbor_char neighbor;
 	if ((l = rb_enc_precise_mbclen(s, e, enc)) <= 0) continue;
         neighbor = enc_succ_alnum_char(s, l, enc, carry);
-        if (neighbor == NEIGHBOR_NOT_CHAR)
-            continue;
-        if (neighbor == NEIGHBOR_FOUND)
+        if (neighbor == NEIGHBOR_NOT_CHAR) {
+	    if (c == -1) continue;
+            s++;
+	}
+        else if (neighbor == NEIGHBOR_FOUND)
             return str;
         c = 1;
         carry_pos = s - sbeg;
         carry_len = l;
+        if (neighbor == NEIGHBOR_NOT_CHAR) break;
     }
     if (c == -1) {		/* str contains no alnum */
 	s = e;
Index: test/ruby/test_string.rb
===================================================================
--- test/ruby/test_string.rb	(revision 17944)
+++ test/ruby/test_string.rb	(revision 17945)
@@ -1222,6 +1222,7 @@
     assert_equal(S("124"),  S("123").succ)
     assert_equal(S("1000"), S("999").succ)
 
+    assert_equal(S("No.10"), S("No.9").succ)
     assert_equal(S("2000aaa"),  S("1999zzz").succ)
     assert_equal(S("AAAAA000"), S("ZZZZ999").succ)
     assert_equal(S("*+"), S("**").succ)
@@ -1269,6 +1270,10 @@
     assert_equal(S("*+"), a.succ!)
     assert_equal(S("*+"), a)
 
+    a = S("No.9")
+    assert_equal(S("No.10"), a.succ!)
+    assert_equal(S("No.10"), a)
+
     assert_equal("aaaaaaaaaaaa", "zzzzzzzzzzz".succ!)
     assert_equal("aaaaaaaaaaaaaaaaaaaaaaaa", "zzzzzzzzzzzzzzzzzzzzzzz".succ!)
   end
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 17944)
+++ ruby_1_8/ChangeLog	(revision 17945)
@@ -1,3 +1,8 @@
+Tue Jul  8 00:22:58 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (rb_str_succ): limit carrying in an alphanumeric region if
+	  exists.  [ruby-dev:35094]
+
 Mon Jul  7 17:12:20 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/ipaddr.rb (IPAddr#initialize): get rid of ArgumentError in
Index: ruby_1_8/string.c
===================================================================
--- ruby_1_8/string.c	(revision 17944)
+++ ruby_1_8/string.c	(revision 17945)
@@ -1416,6 +1416,10 @@
 	    if ((c = succ_char(s)) == 0) break;
 	    n = s - sbeg;
 	}
+	else if (c != -1) {
+	    n = ++s - sbeg;
+	    break;
+	}
 	s--;
     }
     if (c == -1) {		/* str contains no alnum */
@@ -1425,8 +1429,9 @@
 	    if ((*s += 1) != 0) break;
 	    s--;
 	}
+	c = 0;
     }
-    if (s < sbeg) {
+    if (s < sbeg || c > 0) {
 	RESIZE_CAPA(str, RSTRING(str)->len + 1);
 	s = RSTRING(str)->ptr + n;
 	memmove(s+1, s, RSTRING(str)->len - n);
Index: ruby_1_8/test/ruby/test_string.rb
===================================================================
--- ruby_1_8/test/ruby/test_string.rb	(revision 17944)
+++ ruby_1_8/test/ruby/test_string.rb	(revision 17945)
@@ -7,6 +7,7 @@
     sum = sum & ((1 << bits) - 1) if bits != 0
     assert_equal(sum, str.sum(bits))
   end
+
   def test_sum
     assert_equal(0, "".sum)
     assert_equal(294, "abc".sum)
@@ -16,4 +17,68 @@
       check_sum("xyz", bits)
     }
   end
+
+  def test_succ
+    assert_equal("abd", "abc".succ)
+    assert_equal("z",   "y".succ)
+    assert_equal("aaa", "zz".succ)
+
+    assert_equal("124",  "123".succ)
+    assert_equal("1000", "999".succ)
+
+    assert_equal("No.10", "No.9".succ)
+    assert_equal("2000aaa",  "1999zzz".succ)
+    assert_equal("AAAAA000", "ZZZZ999".succ)
+    assert_equal("*+", "**".succ)
+
+    assert_equal("abce", "abcd".succ)
+    assert_equal("THX1139", "THX1138".succ)
+    assert_equal("<<koalb>>", "<<koala>>".succ)
+    assert_equal("2000aaa", "1999zzz".succ)
+    assert_equal("AAAA0000", "ZZZ9999".succ)
+    assert_equal("**+", "***".succ)
+  end
+
+  def test_succ!
+    a = "abc"
+    b = a.dup
+    assert_equal("abd", a.succ!)
+    assert_equal("abd", a)
+    assert_equal("abc", b)
+
+    a = "y"
+    assert_equal("z", a.succ!)
+    assert_equal("z", a)
+
+    a = "zz"
+    assert_equal("aaa", a.succ!)
+    assert_equal("aaa", a)
+
+    a = "123"
+    assert_equal("124", a.succ!)
+    assert_equal("124", a)
+
+    a = "999"
+    assert_equal("1000", a.succ!)
+    assert_equal("1000", a)
+
+    a = "1999zzz"
+    assert_equal("2000aaa", a.succ!)
+    assert_equal("2000aaa", a)
+
+    a = "ZZZZ999"
+    assert_equal("AAAAA000", a.succ!)
+    assert_equal("AAAAA000", a)
+
+    a = "**"
+    assert_equal("*+", a.succ!)
+    assert_equal("*+", a)
+
+    a = "No.9"
+    assert_equal("No.10", a.succ!)
+    assert_equal("No.10", a)
+
+    assert_equal("aaaaaaaaaaaa", "zzzzzzzzzzz".succ!)
+    assert_equal("aaaaaaaaaaaaaaaaaaaaaaaa", "zzzzzzzzzzzzzzzzzzzzzzz".succ!)
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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