mruby-print/print.c: small refactoring.

Inline `printstr` function which is called from only one place.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2022-10-05 23:11:11 +09:00
parent 268f6dcab3
commit 78c8b649e7
+22 -24
View File
@@ -15,33 +15,33 @@
#endif
#endif
static void
printstr(mrb_state *mrb, const char *p, mrb_int len)
{
#if defined(_WIN32)
if (isatty(fileno(stdout))) {
DWORD written;
int wlen = MultiByteToWideChar(CP_UTF8, 0, p, (int)len, NULL, 0);
wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
if (MultiByteToWideChar(CP_UTF8, 0, p, (int)len, utf16, wlen) > 0) {
utf16[wlen] = 0;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
utf16, (DWORD)wlen, &written, NULL);
}
mrb_free(mrb, utf16);
} else
#endif
fwrite(p, (size_t)len, 1, stdout);
fflush(stdout);
}
static mrb_value
mrb_printstr(mrb_state *mrb, mrb_value self)
{
mrb_value s = mrb_get_arg1(mrb);
if (mrb_string_p(s)) {
printstr(mrb, RSTRING_PTR(s), RSTRING_LEN(s));
const char *p = RSTRING_PTR(s);
mrb_int len = RSTRING_LEN(s);
#if defined(_WIN32)
if (isatty(fileno(stdout))) {
DWORD written;
int wlen = MultiByteToWideChar(CP_UTF8, 0, p, (int)len, NULL, 0);
wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
if (MultiByteToWideChar(CP_UTF8, 0, p, (int)len, utf16, wlen) > 0) {
utf16[wlen] = 0;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
utf16, (DWORD)wlen, &written, NULL);
}
mrb_free(mrb, utf16);
}
else
#endif
{
fwrite(p, (size_t)len, 1, stdout);
}
fflush(stdout);
}
return mrb_nil_value();
}
@@ -49,9 +49,7 @@ mrb_printstr(mrb_state *mrb, mrb_value self)
void
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, mrb->kernel_module, "__printstr__", mrb_printstr, MRB_ARGS_REQ(1));
}
void