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/