mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-11-04 18:29:41 +01:00
Add colors to logging
This includes the bold as well. INFO is just default, WARN is yellow, ERROR is red. We try to automatically detect if the output is a TTY (and thus supports colors), and don't emit colors if so. Windows 10 supports ANSI color codes starting with a specific build, but we don't care to emit whatever garbage Microsoft invented for builds older than that.
This commit is contained in:
parent
96539f891c
commit
ac85f57441
3 changed files with 62 additions and 3 deletions
|
@ -1,12 +1,61 @@
|
||||||
|
#include <SDL_stdinc.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if defined(__unix__) || defined(__APPLE__)
|
||||||
|
#include <unistd.h>
|
||||||
|
#define STDOUT_IS_TTY isatty(STDOUT_FILENO)
|
||||||
|
#define STDERR_IS_TTY isatty(STDERR_FILENO)
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
#include <io.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#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, ...)
|
int vlog_info(const char* text, ...)
|
||||||
{
|
{
|
||||||
va_list list;
|
va_list list;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
printf(Color_BOLD);
|
||||||
printf("[INFO]");
|
printf("[INFO]");
|
||||||
|
printf(Color_RESET);
|
||||||
|
printf(" ");
|
||||||
|
|
||||||
va_start(list, text);
|
va_start(list, text);
|
||||||
retval = vprintf(text, list);
|
retval = vprintf(text, list);
|
||||||
|
@ -22,7 +71,10 @@ int vlog_warn(const char* text, ...)
|
||||||
va_list list;
|
va_list list;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
fprintf(stderr, Color_BOLD_YELLOW);
|
||||||
fprintf(stderr, "[WARN]");
|
fprintf(stderr, "[WARN]");
|
||||||
|
fprintf(stderr, Color_RESET);
|
||||||
|
fprintf(stderr, " ");
|
||||||
|
|
||||||
va_start(list, text);
|
va_start(list, text);
|
||||||
retval = vfprintf(stderr, text, list);
|
retval = vfprintf(stderr, text, list);
|
||||||
|
@ -38,7 +90,10 @@ int vlog_error(const char* text, ...)
|
||||||
va_list list;
|
va_list list;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
fprintf(stderr, Color_BOLD_RED);
|
||||||
fprintf(stderr, "[ERROR]");
|
fprintf(stderr, "[ERROR]");
|
||||||
|
fprintf(stderr, Color_RESET);
|
||||||
|
fprintf(stderr, " ");
|
||||||
|
|
||||||
va_start(list, text);
|
va_start(list, text);
|
||||||
retval = vfprintf(stderr, text, list);
|
retval = vfprintf(stderr, text, list);
|
||||||
|
|
|
@ -6,6 +6,8 @@ extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void vlog_init(void);
|
||||||
|
|
||||||
int vlog_info(const char* text, ...);
|
int vlog_info(const char* text, ...);
|
||||||
|
|
||||||
int vlog_warn(const char* text, ...);
|
int vlog_warn(const char* text, ...);
|
||||||
|
|
|
@ -361,6 +361,8 @@ int main(int argc, char *argv[])
|
||||||
char* baseDir = NULL;
|
char* baseDir = NULL;
|
||||||
char* assetsPath = NULL;
|
char* assetsPath = NULL;
|
||||||
|
|
||||||
|
vlog_init();
|
||||||
|
|
||||||
for (int i = 1; i < argc; ++i)
|
for (int i = 1; i < argc; ++i)
|
||||||
{
|
{
|
||||||
#define ARG(name) (SDL_strcmp(argv[i], name) == 0)
|
#define ARG(name) (SDL_strcmp(argv[i], name) == 0)
|
||||||
|
|
Loading…
Reference in a new issue