diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-07-20 23:35:17 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-07-20 23:35:17 +0900 |
| commit | b1847721e8c53101dcec61cbccb154fba2381b59 (patch) | |
| tree | 68a3fc6d65a2650441c5323318da08b9b6261f12 /mrbgems/mruby-print/src | |
| parent | f0afdf74965aaacebca119a30f71a7d487ae6f9c (diff) | |
| download | mruby-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.c | 81 |
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 |
