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/