summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authormattn <[email protected]>2014-08-11 14:28:05 +0900
committermattn <[email protected]>2014-08-11 14:28:05 +0900
commit3103d063e247768be9e87b5a67f5a7b6849a552c (patch)
tree4ec8e69ec8b777068ca141c8c284f573a1a27741 /mrbgems
parent34f40b0a0112dc613d89f6561cea59636fcd083d (diff)
downloadmruby-3103d063e247768be9e87b5a67f5a7b6849a552c.tar.gz
mruby-3103d063e247768be9e87b5a67f5a7b6849a552c.zip
Fix String#succ. "-a-".succ should be "-b-"
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-string-ext/src/string.c17
-rw-r--r--mrbgems/mruby-string-ext/test/string.rb6
2 files changed, 21 insertions, 2 deletions
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index 42ada9ebd..2732f8599 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -271,14 +271,27 @@ mrb_str_succ_bang(mrb_state *mrb, mrb_value self)
break;
b++;
}
- result = mrb_str_new(mrb, (char*) p, b - p);
+
+ if (b > e) {
+ b = p;
+ result = mrb_str_new_lit(mrb, "");
+ } else
+ result = mrb_str_new(mrb, (char*) p, b - p);
+
+ while (e >= b) {
+ if (ISALNUM(*e))
+ break;
+ e--;
+ }
+ if (e < b)
+ e = p + l - 1;
while (e >= b) {
if (!ISALNUM(*e)) {
if (*e == 0xff) {
mrb_str_cat_cstr(mrb, result, "\x01");
(*e) = 0;
- } else
+ } else
(*e)++;
break;
}
diff --git a/mrbgems/mruby-string-ext/test/string.rb b/mrbgems/mruby-string-ext/test/string.rb
index 23b29d538..64a14baf0 100644
--- a/mrbgems/mruby-string-ext/test/string.rb
+++ b/mrbgems/mruby-string-ext/test/string.rb
@@ -285,6 +285,8 @@ assert('String#succ') do
assert_equal "\x01\x00", "\xff".succ
assert_equal "-b", "-a".succ
assert_equal "-aa", "-z".succ
+ assert_equal "-b-", "-a-".succ
+ assert_equal "-aa-", "-z-".succ
assert_equal "あb", "あa".succ
assert_equal "あba", "あaz".succ
@@ -349,6 +351,10 @@ assert('String#succ') do
assert_equal "-b", a
a = "-z"; a.succ!
assert_equal "-aa", a
+ a = "-a-"; a.succ!
+ assert_equal "-b-", a
+ a = "-z-"; a.succ!
+ assert_equal "-aa-", a
a = "あa"; a.succ!
assert_equal "あb", a
a = "あaz"; a.succ!