From 6459a984489e3674d4cb108c3b252525b8fd7068 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 7 Jun 2014 22:28:42 +0900 Subject: move String#clear to mruby-string-ext; ref #2370 --- mrbgems/mruby-string-ext/src/string.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'mrbgems/mruby-string-ext/src/string.c') diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index f04f12c4b..48146944d 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -239,6 +239,37 @@ mrb_str_lines(mrb_state *mrb, mrb_value self) return result; } +/* + * call-seq: + * string.clear -> string + * + * Makes string empty. + * + * a = "abcde" + * a.clear #=> "" + */ +static mrb_value +mrb_str_clear(mrb_state *mrb, mrb_value str) +{ + struct RString *s = mrb_str_ptr(str); + + if (!RSTR_SHARED_P(s) && !RSTR_EMBED_P(s)) { + if (s->flags & MRB_STR_NOFREE) { + s->flags &= ~MRB_STR_NOFREE; + } + else { + mrb_free(mrb, s->as.heap.ptr); + } + s->as.heap.ptr = 0; + s->as.heap.len = 0; + } + RSTR_UNSET_SHARED_FLAG(s); + RSTR_SET_EMBED_FLAG(s); + RSTR_SET_EMBED_LEN(s, 0); + RSTRING_PTR(str)[0] = '\0'; + return str; +} + void mrb_mruby_string_ext_gem_init(mrb_state* mrb) { @@ -256,6 +287,7 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, s, "oct", mrb_str_oct, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "chr", mrb_str_chr, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "lines", mrb_str_lines, MRB_ARGS_NONE()); + mrb_define_method(mrb, s, "clear", mrb_str_clear, MRB_ARGS_NONE()); } void -- cgit v1.2.3