summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--string.c7
-rw-r--r--test/ruby/test_string.rb65
3 files changed, 76 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b75a8bc32..dd52225234 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jul 8 00:22:58 2008 Nobuyoshi Nakada <[email protected]>
+
+ * 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 <[email protected]>
* lib/ipaddr.rb (IPAddr#initialize): get rid of ArgumentError in
diff --git a/string.c b/string.c
index 615af97e67..4a37f213ab 100644
--- a/string.c
+++ b/string.c
@@ -1416,6 +1416,10 @@ rb_str_succ(orig)
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 @@ rb_str_succ(orig)
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);
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index f8938cad84..539a5a4623 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -7,6 +7,7 @@ class TestString < Test::Unit::TestCase
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 @@ class TestString < Test::Unit::TestCase
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