summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-string-ext/src/string.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-12-17 07:45:45 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-12-17 07:45:45 +0900
commit0c4d053a94613926a5f4bc4d5b6370aee5eec78a (patch)
tree49e223bf33628193830e25dcfeee8f96796f9d07 /mrbgems/mruby-string-ext/src/string.c
parentab724104563d20dbe9428b37cf8b30dfda6cc9ee (diff)
parent7ea38ce473816de188e9d45d409e3b5f71f58400 (diff)
downloadmruby-0c4d053a94613926a5f4bc4d5b6370aee5eec78a.tar.gz
mruby-0c4d053a94613926a5f4bc4d5b6370aee5eec78a.zip
Merge pull request #2674 from suzukaze/string.prepend
Add String#prepend
Diffstat (limited to 'mrbgems/mruby-string-ext/src/string.c')
-rw-r--r--mrbgems/mruby-string-ext/src/string.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index 9db3589c7..fa2c52d67 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -331,6 +331,44 @@ 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, "", 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;
+}
+
void
mrb_mruby_string_ext_gem_init(mrb_state* mrb)
{
@@ -350,6 +388,7 @@ 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!"));
}