summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authormattn <[email protected]>2014-08-11 14:01:10 +0900
committermattn <[email protected]>2014-08-11 14:01:10 +0900
commit34f40b0a0112dc613d89f6561cea59636fcd083d (patch)
tree0569b9ceab6c7511205c79a610c021f08aea6999
parent2b74fa54de355753d2aa2226e73375dc336a34e3 (diff)
downloadmruby-34f40b0a0112dc613d89f6561cea59636fcd083d.tar.gz
mruby-34f40b0a0112dc613d89f6561cea59636fcd083d.zip
Fix String#succ. "-".succ should be "."
-rw-r--r--mrbgems/mruby-string-ext/src/string.c17
-rw-r--r--mrbgems/mruby-string-ext/test/string.rb9
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!