Upgrade to 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-print / src / print.c
1 #include <mruby.h>
2
3 #ifdef MRB_DISABLE_STDIO
4 # error print conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
5 #endif
6
7 #include <mruby/string.h>
8 #include <string.h>
9 #include <stdlib.h>
10 #if defined(_WIN32)
11 # include <windows.h>
12 # include <io.h>
13 #ifdef _MSC_VER
14 # define isatty(x) _isatty(x)
15 # define fileno(x) _fileno(x)
16 #endif
17 #endif
18
19 static void
20 printstr(mrb_state *mrb, mrb_value obj)
21 {
22   if (mrb_string_p(obj)) {
23 #if defined(_WIN32)
24     if (isatty(fileno(stdout))) {
25       DWORD written;
26       int mlen = (int)RSTRING_LEN(obj);
27       char* utf8 = RSTRING_PTR(obj);
28       int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, NULL, 0);
29       wchar_t* utf16 = (wchar_t*)mrb_malloc(mrb, (wlen+1) * sizeof(wchar_t));
30       if (MultiByteToWideChar(CP_UTF8, 0, utf8, mlen, utf16, wlen) > 0) {
31         utf16[wlen] = 0;
32         WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
33           utf16, wlen, &written, NULL);
34       }
35       mrb_free(mrb, utf16);
36     } else
37 #endif
38       fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
39     fflush(stdout);
40   }
41 }
42
43 /* 15.3.1.2.9  */
44 /* 15.3.1.3.34 */
45 mrb_value
46 mrb_printstr(mrb_state *mrb, mrb_value self)
47 {
48   mrb_value argv = mrb_get_arg1(mrb);
49
50   printstr(mrb, argv);
51
52   return argv;
53 }
54
55 void
56 mrb_mruby_print_gem_init(mrb_state* mrb)
57 {
58   struct RClass *krn;
59   krn = mrb->kernel_module;
60   mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, MRB_ARGS_REQ(1));
61 }
62
63 void
64 mrb_mruby_print_gem_final(mrb_state* mrb)
65 {
66 }