summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-print/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-07-20 23:35:17 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-07-20 23:35:17 +0900
commitb1847721e8c53101dcec61cbccb154fba2381b59 (patch)
tree68a3fc6d65a2650441c5323318da08b9b6261f12 /mrbgems/mruby-print/src
parentf0afdf74965aaacebca119a30f71a7d487ae6f9c (diff)
downloadmruby-b1847721e8c53101dcec61cbccb154fba2381b59.tar.gz
mruby-b1847721e8c53101dcec61cbccb154fba2381b59.zip
Implement `Kernel#print` and `Kernel#puts` in C.
Diffstat (limited to 'mrbgems/mruby-print/src')
-rw-r--r--mrbgems/mruby-print/src/print.c81
1 files changed, 57 insertions, 24 deletions
diff --git a/mrbgems/mruby-print/src/print.c b/mrbgems/mruby-print/src/print.c
index 9301dbe55..1ee2e63aa 100644
--- a/mrbgems/mruby-print/src/print.c
+++ b/mrbgems/mruby-print/src/print.c
@@ -17,39 +17,70 @@
#endif
static void
-printstr(mrb_state *mrb, mrb_value obj)
+printstr(mrb_state *mrb, const char *p, size_t len)
{
- if (mrb_string_p(obj)) {
#if defined(_WIN32)
- if (isatty(fileno(stdout))) {
- DWORD written;
- int mlen = (int)RSTRING_LEN(obj);
- char* utf8 = RSTRING_PTR(obj);
- int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, NULL, 0);
- wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
- if (MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, utf16, wlen) > 0) {
- utf16[wlen] = 0;
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
- utf16, wlen, &written, NULL);
- }
- mrb_free(mrb, utf16);
- } else
+ if (isatty(fileno(stdout))) {
+ DWORD written;
+ int wlen = MultiByteToWideChar(CP_UTF8, 0, p, len, NULL, 0);
+ wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
+ if (MultiByteToWideChar(CP_UTF8, 0, p, len, utf16, wlen) > 0) {
+ utf16[wlen] = 0;
+ WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
+ utf16, wlen, &written, NULL);
+ }
+ mrb_free(mrb, utf16);
+ } else
#endif
- fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
- fflush(stdout);
- }
+ fwrite(p, len, 1, stdout);
+ fflush(stdout);
}
-/* 15.3.1.2.9 */
-/* 15.3.1.3.34 */
-mrb_value
+static mrb_value
mrb_printstr(mrb_state *mrb, mrb_value self)
{
- mrb_value argv = mrb_get_arg1(mrb);
+ mrb_value s = mrb_get_arg1(mrb);
+
+ if (mrb_string_p(s)) {
+ printstr(mrb, RSTRING_PTR(s), RSTRING_LEN(s));
+ }
+ return s;
+}
- printstr(mrb, argv);
+/* 15.3.1.2.10 */
+/* 15.3.1.3.35 */
+static mrb_value
+mrb_print(mrb_state *mrb, mrb_value self)
+{
+ mrb_int argc, i;
+ mrb_value *argv;
- return argv;
+ mrb_get_args(mrb, "*", &argv, &argc);
+ for (i=0; i<argc; i++) {
+ mrb_value s = mrb_str_to_str(mrb, argv[i]);
+ printstr(mrb, RSTRING_PTR(s), RSTRING_LEN(s));
+ }
+ return mrb_nil_value();
+}
+
+/* 15.3.1.2.11 */
+/* 15.3.1.3.39 */
+static mrb_value
+mrb_puts(mrb_state *mrb, mrb_value self)
+{
+ mrb_int argc, i;
+ mrb_value *argv;
+
+ mrb_get_args(mrb, "*", &argv, &argc);
+ for (i=0; i<argc; i++) {
+ mrb_value s = mrb_str_to_str(mrb, argv[i]);
+ mrb_int len = RSTRING_LEN(s);
+ printstr(mrb, RSTRING_PTR(s), len);
+ if (len > 0 && RSTRING_PTR(s)[len-1] != '\n') {
+ printstr(mrb, "\n", 1);
+ }
+ }
+ return mrb_nil_value();
}
void
@@ -58,6 +89,8 @@ mrb_mruby_print_gem_init(mrb_state* mrb)
struct RClass *krn;
krn = mrb->kernel_module;
mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, MRB_ARGS_REQ(1));
+ mrb_define_method(mrb, krn, "print", mrb_print, MRB_ARGS_ANY());
+ mrb_define_method(mrb, krn, "puts", mrb_puts, MRB_ARGS_ANY());
}
void