summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authormattn <[email protected]>2014-08-11 15:00:44 +0900
committermattn <[email protected]>2014-08-11 15:00:44 +0900
commit4ece1e3e293501d4e65a0ad007c86c5254342a88 (patch)
tree5c7ea39a04e8d7be2a1ed434e480047d4f75bfd7 /mrbgems
parent3103d063e247768be9e87b5a67f5a7b6849a552c (diff)
downloadmruby-4ece1e3e293501d4e65a0ad007c86c5254342a88.tar.gz
mruby-4ece1e3e293501d4e65a0ad007c86c5254342a88.zip
"-a-a-".succ should be "-a-b-"
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-string-ext/src/string.c28
-rw-r--r--mrbgems/mruby-string-ext/test/string.rb3
2 files changed, 18 insertions, 13 deletions
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index 2732f8599..085de76ef 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -266,25 +266,27 @@ mrb_str_succ_bang(mrb_state *mrb, mrb_value self)
t = e = p + l;
*(e--) = 0;
- while (b < e) {
- if (ISALNUM(*b))
- break;
- b++;
- }
-
- if (b > e) {
- b = p;
- result = mrb_str_new_lit(mrb, "");
- } else
- result = mrb_str_new(mrb, (char*) p, b - p);
-
+ // find trailing ascii/number
while (e >= b) {
if (ISALNUM(*e))
break;
e--;
}
- if (e < b)
+ if (e < b) {
e = p + l - 1;
+ result = mrb_str_new_lit(mrb, "");
+ } else {
+ // find leading letter of the ascii/number
+ b = e;
+ while (b > p) {
+ if (!ISALNUM(*b) || (ISALNUM(*b) && *b != '9' && *b != 'z' && *b != 'Z'))
+ break;
+ b--;
+ }
+ if (!ISALNUM(*b))
+ b++;
+ result = mrb_str_new(mrb, (char*) p, b - p);
+ }
while (e >= b) {
if (!ISALNUM(*e)) {
diff --git a/mrbgems/mruby-string-ext/test/string.rb b/mrbgems/mruby-string-ext/test/string.rb
index 64a14baf0..eba666e13 100644
--- a/mrbgems/mruby-string-ext/test/string.rb
+++ b/mrbgems/mruby-string-ext/test/string.rb
@@ -285,6 +285,7 @@ assert('String#succ') do
assert_equal "\x01\x00", "\xff".succ
assert_equal "-b", "-a".succ
assert_equal "-aa", "-z".succ
+ assert_equal "-a-b-", "-a-a-".succ
assert_equal "-b-", "-a-".succ
assert_equal "-aa-", "-z-".succ
assert_equal "あb", "あa".succ
@@ -351,6 +352,8 @@ assert('String#succ') do
assert_equal "-b", a
a = "-z"; a.succ!
assert_equal "-aa", a
+ a = "-a-a-"; a.succ!
+ assert_equal "-a-b-", a
a = "-a-"; a.succ!
assert_equal "-b-", a
a = "-z-"; a.succ!