You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
1.9 KiB
99 lines
1.9 KiB
#include "./console.h" |
|
|
|
#if (defined(_WIN64) || defined(_WIN32)) && !defined(NXDK) |
|
#include <cstddef> |
|
#include <cstdio> |
|
#include <string> |
|
|
|
// Suppress definitions of `min` and `max` macros by <windows.h>: |
|
#define NOMINMAX 1 |
|
#define WIN32_LEAN_AND_MEAN |
|
#include <windows.h> |
|
|
|
namespace devilution { |
|
|
|
namespace { |
|
|
|
HANDLE GetStderrHandle() |
|
{ |
|
static HANDLE handle = NULL; |
|
if (handle == NULL) { |
|
if (AttachConsole(ATTACH_PARENT_PROCESS)) { |
|
handle = GetStdHandle(STD_ERROR_HANDLE); |
|
} |
|
} |
|
return handle; |
|
} |
|
|
|
void WriteToStderr(std::string_view str) |
|
{ |
|
HANDLE handle = GetStderrHandle(); |
|
if (handle == NULL) |
|
return; |
|
WriteConsole(handle, str.data(), str.size(), NULL, NULL); |
|
} |
|
|
|
} // namespace |
|
|
|
void printInConsole(std::string_view str) |
|
{ |
|
OutputDebugString(std::string(str).c_str()); |
|
WriteToStderr(str); |
|
} |
|
|
|
void printNewlineInConsole() |
|
{ |
|
OutputDebugString("\r\n"); |
|
WriteToStderr("\r\n"); |
|
} |
|
|
|
void printfInConsole(const char *fmt, ...) |
|
{ |
|
char message[4096]; |
|
va_list ap; |
|
va_start(ap, fmt); |
|
std::vsnprintf(message, sizeof(message), fmt, ap); |
|
va_end(ap); |
|
OutputDebugString(message); |
|
WriteToStderr(message); |
|
} |
|
|
|
void vprintfInConsole(const char *fmt, va_list ap) |
|
{ |
|
char message[4096]; |
|
std::vsnprintf(message, sizeof(message), fmt, ap); |
|
OutputDebugString(message); |
|
WriteToStderr(message); |
|
} |
|
|
|
} // namespace devilution |
|
#else |
|
#include <cstdio> |
|
|
|
namespace devilution { |
|
|
|
void printInConsole(std::string_view str) |
|
{ |
|
std::fwrite(str.data(), sizeof(char), str.size(), stderr); |
|
} |
|
|
|
void printNewlineInConsole() |
|
{ |
|
std::fputs("\n", stderr); |
|
} |
|
|
|
void printfInConsole(const char *fmt, ...) |
|
{ |
|
std::va_list ap; |
|
va_start(ap, fmt); |
|
std::vfprintf(stderr, fmt, ap); |
|
va_end(ap); |
|
} |
|
|
|
void vprintfInConsole(const char *fmt, std::va_list ap) |
|
{ |
|
std::vfprintf(stderr, fmt, ap); |
|
} |
|
|
|
} // namespace devilution |
|
#endif
|
|
|