From 34f40b0a0112dc613d89f6561cea59636fcd083d Mon Sep 17 00:00:00 2001 From: mattn Date: Mon, 11 Aug 2014 14:01:10 +0900 Subject: Fix String#succ. "-".succ should be "." --- mrbgems/mruby-string-ext/src/string.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'mrbgems/mruby-string-ext/src') 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); -- cgit v1.2.3 From 3103d063e247768be9e87b5a67f5a7b6849a552c Mon Sep 17 00:00:00 2001 From: mattn Date: Mon, 11 Aug 2014 14:28:05 +0900 Subject: Fix String#succ. "-a-".succ should be "-b-" --- mrbgems/mruby-string-ext/src/string.c | 17 +++++++++++++++-- mrbgems/mruby-string-ext/test/string.rb | 6 ++++++ 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'mrbgems/mruby-string-ext/src') 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! -- cgit v1.2.3 From 4ece1e3e293501d4e65a0ad007c86c5254342a88 Mon Sep 17 00:00:00 2001 From: mattn Date: Mon, 11 Aug 2014 15:00:44 +0900 Subject: "-a-a-".succ should be "-a-b-" --- mrbgems/mruby-string-ext/src/string.c | 28 +++++++++++++++------------- mrbgems/mruby-string-ext/test/string.rb | 3 +++ 2 files changed, 18 insertions(+), 13 deletions(-) (limited to 'mrbgems/mruby-string-ext/src') 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! -- cgit v1.2.3