diff options
| author | mattn <[email protected]> | 2014-08-11 14:01:10 +0900 |
|---|---|---|
| committer | mattn <[email protected]> | 2014-08-11 14:01:10 +0900 |
| commit | 34f40b0a0112dc613d89f6561cea59636fcd083d (patch) | |
| tree | 0569b9ceab6c7511205c79a610c021f08aea6999 | |
| parent | 2b74fa54de355753d2aa2226e73375dc336a34e3 (diff) | |
| download | mruby-34f40b0a0112dc613d89f6561cea59636fcd083d.tar.gz mruby-34f40b0a0112dc613d89f6561cea59636fcd083d.zip | |
Fix String#succ. "-".succ should be "."
| -rw-r--r-- | mrbgems/mruby-string-ext/src/string.c | 17 | ||||
| -rw-r--r-- | mrbgems/mruby-string-ext/test/string.rb | 9 |
2 files changed, 17 insertions, 9 deletions
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index 2d745589b..42ada9ebd 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -252,7 +252,8 @@ static mrb_value mrb_str_succ_bang(mrb_state *mrb, mrb_value self) { mrb_value result; - char *p, *e, *b, *t, *prepend; + unsigned char *p, *e, *b, *t; + char *prepend; struct RString *s = mrb_str_ptr(self); size_t l; @@ -261,7 +262,7 @@ mrb_str_succ_bang(mrb_state *mrb, mrb_value self) mrb_str_modify(mrb, s); l = RSTRING_LEN(self); - b = p = RSTRING_PTR(self); + b = p = (unsigned char*) RSTRING_PTR(self); t = e = p + l; *(e--) = 0; @@ -270,11 +271,17 @@ mrb_str_succ_bang(mrb_state *mrb, mrb_value self) break; b++; } - result = mrb_str_new(mrb, p, b - p); + result = mrb_str_new(mrb, (char*) p, b - p); while (e >= b) { - if (!ISALNUM(*e)) + if (!ISALNUM(*e)) { + if (*e == 0xff) { + mrb_str_cat_cstr(mrb, result, "\x01"); + (*e) = 0; + } else + (*e)++; break; + } prepend = NULL; if (*e == '9') { if (e == b) prepend = "1"; @@ -292,7 +299,7 @@ mrb_str_succ_bang(mrb_state *mrb, mrb_value self) if (prepend) mrb_str_cat_cstr(mrb, result, prepend); e--; } - result = mrb_str_cat(mrb, result, b, t - b); + result = mrb_str_cat(mrb, result, (char*) b, t - b); l = RSTRING_LEN(result); mrb_str_resize(mrb, self, l); memcpy(RSTRING_PTR(self), RSTRING_PTR(result), l); diff --git a/mrbgems/mruby-string-ext/test/string.rb b/mrbgems/mruby-string-ext/test/string.rb index 4067abdbf..23b29d538 100644 --- a/mrbgems/mruby-string-ext/test/string.rb +++ b/mrbgems/mruby-string-ext/test/string.rb @@ -281,7 +281,8 @@ assert('String#succ') do assert_equal "bA", "aZ".succ assert_equal "1A", "0Z".succ - assert_equal "-", "-".succ + assert_equal ".", "-".succ + assert_equal "\x01\x00", "\xff".succ assert_equal "-b", "-a".succ assert_equal "-aa", "-z".succ assert_equal "あb", "あa".succ @@ -341,13 +342,13 @@ assert('String#succ') do assert_equal "1A", a a = "-"; a.succ! - assert_equal "-", a + assert_equal ".", a + a = "\xff"; a.succ! + assert_equal "\x01\x00", a a = "-a"; a.succ! assert_equal "-b", a a = "-z"; a.succ! assert_equal "-aa", a - a = "あ"; a.succ! - assert_equal "あ", a a = "あa"; a.succ! assert_equal "あb", a a = "あaz"; a.succ! |
