diff options
| author | mattn <[email protected]> | 2014-08-11 15:00:44 +0900 |
|---|---|---|
| committer | mattn <[email protected]> | 2014-08-11 15:00:44 +0900 |
| commit | 4ece1e3e293501d4e65a0ad007c86c5254342a88 (patch) | |
| tree | 5c7ea39a04e8d7be2a1ed434e480047d4f75bfd7 /mrbgems | |
| parent | 3103d063e247768be9e87b5a67f5a7b6849a552c (diff) | |
| download | mruby-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.c | 28 | ||||
| -rw-r--r-- | mrbgems/mruby-string-ext/test/string.rb | 3 |
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! |
