#ifndef TOOLS_EXECUTABLE_WRAPPER_H_ #define TOOLS_EXECUTABLE_WRAPPER_H_ // TODO(joyeecheung): reuse this in mksnapshot. #include "uv.h" #ifdef _WIN32 #include #endif namespace node { #ifdef _WIN32 using argv_type = wchar_t*; #define NODE_MAIN int wmain void FixupMain(int argc, argv_type raw_argv[], char*** argv) { // Convert argv to UTF8. *argv = new char*[argc + 1]; for (int i = 0; i < argc; i++) { // Compute the size of the required buffer DWORD size = WideCharToMultiByte( CP_UTF8, 0, raw_argv[i], -1, nullptr, 0, nullptr, nullptr); if (size == 0) { // This should never happen. fprintf(stderr, "Could not convert arguments to utf8."); exit(1); } // Do the actual conversion (*argv)[i] = new char[size]; DWORD result = WideCharToMultiByte( CP_UTF8, 0, raw_argv[i], -1, (*argv)[i], size, nullptr, nullptr); if (result == 0) { // This should never happen. fprintf(stderr, "Could not convert arguments to utf8."); exit(1); } } (*argv)[argc] = nullptr; } #else using argv_type = char*; #define NODE_MAIN int main void FixupMain(int argc, argv_type raw_argv[], char*** argv) { *argv = uv_setup_args(argc, raw_argv); // Disable stdio buffering, it interacts poorly with printf() // calls elsewhere in the program (e.g., any logging from V8.) setvbuf(stdout, nullptr, _IONBF, 0); setvbuf(stderr, nullptr, _IONBF, 0); } #endif } // namespace node #endif // TOOLS_EXECUTABLE_WRAPPER_H_