diff --git a/desktop_version/src/Vlogging.c b/desktop_version/src/Vlogging.c index ed7588be..d2176205 100644 --- a/desktop_version/src/Vlogging.c +++ b/desktop_version/src/Vlogging.c @@ -1,12 +1,61 @@ +#include #include #include +#if defined(__unix__) || defined(__APPLE__) + #include + #define STDOUT_IS_TTY isatty(STDOUT_FILENO) + #define STDERR_IS_TTY isatty(STDERR_FILENO) +#elif defined(_WIN32) + #include + #include + #define STDOUT_IS_TTY _isatty(_fileno(stdout)) + #define STDERR_IS_TTY _isatty(_fileno(stderr)) +#else + #define STDOUT_IS_TTY 0 + #define STDERR_IS_TTY 0 +#endif + +#define COLOR(EXPR) color_enabled ? EXPR : "" + +#define Color_RESET COLOR("\x1b[0m") +#define Color_BOLD COLOR("\x1b[1m") +#define Color_BOLD_YELLOW COLOR("\x1b[1;33m") +#define Color_BOLD_RED COLOR("\x1b[1;31m") + +static int color_enabled = 0; + +void vlog_init(void) +{ +#ifdef _WIN32 + OSVERSIONINFO osvi; + SDL_zero(osvi); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionExW(&osvi); +#endif + + if (STDOUT_IS_TTY + && STDERR_IS_TTY +#ifdef _WIN32 + /* Windows supports ANSI escape sequences starting with Windows 10 + * build 10586. We don't care to emit them on anything lower. */ + && osvi.dwMajorVersion >= 10 + && osvi.dwBuildNumber >= 10586 +#endif + ) { + color_enabled = 1; + } +} + int vlog_info(const char* text, ...) { va_list list; int retval; - printf("[INFO] "); + printf(Color_BOLD); + printf("[INFO]"); + printf(Color_RESET); + printf(" "); va_start(list, text); retval = vprintf(text, list); @@ -22,7 +71,10 @@ int vlog_warn(const char* text, ...) va_list list; int retval; - fprintf(stderr, "[WARN] "); + fprintf(stderr, Color_BOLD_YELLOW); + fprintf(stderr, "[WARN]"); + fprintf(stderr, Color_RESET); + fprintf(stderr, " "); va_start(list, text); retval = vfprintf(stderr, text, list); @@ -38,7 +90,10 @@ int vlog_error(const char* text, ...) va_list list; int retval; - fprintf(stderr, "[ERROR] "); + fprintf(stderr, Color_BOLD_RED); + fprintf(stderr, "[ERROR]"); + fprintf(stderr, Color_RESET); + fprintf(stderr, " "); va_start(list, text); retval = vfprintf(stderr, text, list); diff --git a/desktop_version/src/Vlogging.h b/desktop_version/src/Vlogging.h index 3189fadd..f81aa067 100644 --- a/desktop_version/src/Vlogging.h +++ b/desktop_version/src/Vlogging.h @@ -6,6 +6,8 @@ extern "C" { #endif +void vlog_init(void); + int vlog_info(const char* text, ...); int vlog_warn(const char* text, ...); diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index 7e8031c4..2b909a98 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -361,6 +361,8 @@ int main(int argc, char *argv[]) char* baseDir = NULL; char* assetsPath = NULL; + vlog_init(); + for (int i = 1; i < argc; ++i) { #define ARG(name) (SDL_strcmp(argv[i], name) == 0)