diff options
| author | mattn <[email protected]> | 2014-08-11 14:28:05 +0900 |
|---|---|---|
| committer | mattn <[email protected]> | 2014-08-11 14:28:05 +0900 |
| commit | 3103d063e247768be9e87b5a67f5a7b6849a552c (patch) | |
| tree | 4ec8e69ec8b777068ca141c8c284f573a1a27741 /mrbgems | |
| parent | 34f40b0a0112dc613d89f6561cea59636fcd083d (diff) | |
| download | mruby-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.c | 17 | ||||
| -rw-r--r-- | mrbgems/mruby-string-ext/test/string.rb | 6 |
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! |
