Skip to content

Commit

Permalink
Merge pull request godotengine#57336 from bruvzg/win_con_redir
Browse files Browse the repository at this point in the history
  • Loading branch information
akien-mga authored Jan 28, 2022
2 parents 38c6611 + 99a1e55 commit 83c7bf6
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions platform/windows/os_windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,23 @@ static String format_error_message(DWORD id) {
return msg;
}

void RedirectStream(const char *p_file_name, const char *p_mode, FILE *p_cpp_stream, const DWORD p_std_handle) {
const HANDLE h_existing = GetStdHandle(p_std_handle);
if (h_existing != INVALID_HANDLE_VALUE) { // Redirect only if attached console have a valid handle.
const HANDLE h_cpp = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(p_cpp_stream)));
if (h_cpp == INVALID_HANDLE_VALUE) { // Redirect only if it's not already redirected to the pipe or file.
FILE *fp = p_cpp_stream;
freopen_s(&fp, p_file_name, p_mode, p_cpp_stream); // Redirect stream.
setvbuf(p_cpp_stream, nullptr, _IONBF, 0); // Disable stream buffering.
}
}
}

void RedirectIOToConsole() {
if (AttachConsole(ATTACH_PARENT_PROCESS)) {
FILE *fpstdin = stdin;
FILE *fpstdout = stdout;
FILE *fpstderr = stderr;

freopen_s(&fpstdin, "CONIN$", "r", stdin);
freopen_s(&fpstdout, "CONOUT$", "w", stdout);
freopen_s(&fpstderr, "CONOUT$", "w", stderr);
RedirectStream("CONIN$", "r", stdin, STD_INPUT_HANDLE);
RedirectStream("CONOUT$", "w", stdout, STD_OUTPUT_HANDLE);
RedirectStream("CONOUT$", "w", stderr, STD_ERROR_HANDLE);

printf("\n"); // Make sure our output is starting from the new line.
}
Expand Down

0 comments on commit 83c7bf6

Please sign in to comment.