summaryrefslogtreecommitdiffhomepage
path: root/src/print.c
diff options
context:
space:
mode:
authormimaki <[email protected]>2012-04-20 09:39:03 +0900
committermimaki <[email protected]>2012-04-20 09:39:03 +0900
commite0d6430f63c4cbe0c71ce82ee23284671389a818 (patch)
tree41abad7f12eced98d9ac14d141cea62464c3332f /src/print.c
parent54ad561098ed353ada70205c39b2c42a2a2eb9e5 (diff)
downloadmruby-e0d6430f63c4cbe0c71ce82ee23284671389a818.tar.gz
mruby-e0d6430f63c4cbe0c71ce82ee23284671389a818.zip
add mruby sources
Diffstat (limited to 'src/print.c')
-rw-r--r--src/print.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/print.c b/src/print.c
new file mode 100644
index 000000000..a3e05b6f0
--- /dev/null
+++ b/src/print.c
@@ -0,0 +1,69 @@
+#include "mruby.h"
+#include "mruby/string.h"
+#include <stdio.h>
+
+mrb_value
+printstr(mrb_state *mrb, mrb_value obj)
+{
+ struct RString *str;
+ char *s;
+ size_t len;
+
+ if (mrb_type(obj) == MRB_TT_STRING) {
+ str = mrb_str_ptr(obj);
+ s = str->buf;
+ len = str->len;
+ while (len--) {
+ putc(*s, stdout);
+ s++;
+ }
+ }
+ return obj;
+}
+
+mrb_value
+mrb_p(mrb_state *mrb, mrb_value obj)
+{
+ obj = mrb_funcall(mrb, obj, "inspect", 0);
+ printstr(mrb, obj);
+ putc('\n', stdout);
+ return obj;
+}
+
+/* 15.3.1.2.9 */
+/* 15.3.1.3.34 */
+static mrb_value
+p_m(mrb_state *mrb, mrb_value self)
+{
+ int argc, i;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ for (i=0; i<argc; i++) {
+ mrb_p(mrb, argv[i]);
+ }
+
+ return argv[0];
+}
+
+mrb_value
+mrb_printstr(mrb_state *mrb, mrb_value self)
+{
+ mrb_value argv;
+
+ mrb_get_args(mrb, "o", &argv);
+ printstr(mrb, argv);
+
+ return argv;
+}
+
+void
+mrb_init_print(mrb_state *mrb)
+{
+ struct RClass *krn;
+
+ krn = mrb->kernel_module;
+
+ mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, ARGS_REQ(1));
+ mrb_define_method(mrb, krn, "p", p_m, ARGS_ANY()); /* 15.3.1.3.34 */
+}