mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #3369 from ksss/fix-str-prepend
Rewrite String#prepend with Ruby
This commit is contained in:
@@ -385,4 +385,18 @@ class String
|
||||
end
|
||||
end
|
||||
alias each_codepoint codepoints
|
||||
|
||||
##
|
||||
# call-seq:
|
||||
# str.prepend(other_str) -> str
|
||||
#
|
||||
# Prepend---Prepend the given string to <i>str</i>.
|
||||
#
|
||||
# a = "world"
|
||||
# a.prepend("hello ") #=> "hello world"
|
||||
# a #=> "hello world"
|
||||
def prepend(arg)
|
||||
self[0, 0] = arg
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
@@ -437,44 +437,6 @@ mrb_str_succ(mrb_state *mrb, mrb_value self)
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* str.prepend(other_str) -> str
|
||||
*
|
||||
* Prepend---Prepend the given string to <i>str</i>.
|
||||
*
|
||||
* a = "world"
|
||||
* a.prepend("hello ") #=> "hello world"
|
||||
* a #=> "hello world"
|
||||
*/
|
||||
static mrb_value
|
||||
mrb_str_prepend(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct RString *s1 = mrb_str_ptr(self), *s2, *temp_s;
|
||||
mrb_int len;
|
||||
mrb_value other, temp_str;
|
||||
|
||||
mrb_get_args(mrb, "S", &other);
|
||||
|
||||
mrb_str_modify(mrb, s1);
|
||||
if (!mrb_string_p(other)) {
|
||||
other = mrb_str_to_str(mrb, other);
|
||||
}
|
||||
s2 = mrb_str_ptr(other);
|
||||
len = RSTR_LEN(s1) + RSTR_LEN(s2);
|
||||
temp_str = mrb_str_new(mrb, NULL, RSTR_LEN(s1));
|
||||
temp_s = mrb_str_ptr(temp_str);
|
||||
memcpy(RSTR_PTR(temp_s), RSTR_PTR(s1), RSTR_LEN(s1));
|
||||
if (RSTRING_CAPA(self) < len) {
|
||||
mrb_str_resize(mrb, self, len);
|
||||
}
|
||||
memcpy(RSTR_PTR(s1), RSTR_PTR(s2), RSTR_LEN(s2));
|
||||
memcpy(RSTR_PTR(s1) + RSTR_LEN(s2), RSTR_PTR(temp_s), RSTR_LEN(temp_s));
|
||||
RSTR_SET_LEN(s1, len);
|
||||
RSTR_PTR(s1)[len] = '\0';
|
||||
return self;
|
||||
}
|
||||
|
||||
#ifdef MRB_UTF8_STRING
|
||||
static const char utf8len_codepage_zero[256] =
|
||||
{
|
||||
@@ -562,7 +524,6 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb)
|
||||
mrb_define_method(mrb, s, "lines", mrb_str_lines, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, s, "succ", mrb_str_succ, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, s, "succ!", mrb_str_succ_bang, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, s, "prepend", mrb_str_prepend, MRB_ARGS_REQ(1));
|
||||
mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ"));
|
||||
mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next!"), mrb_intern_lit(mrb, "succ!"));
|
||||
mrb_define_method(mrb, s, "ord", mrb_str_ord, MRB_ARGS_NONE());
|
||||
|
||||
Reference in New Issue
Block a user