212 lines
No EOL
5.2 KiB
C
212 lines
No EOL
5.2 KiB
C
#include "tracelog.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "format.h"
|
|
|
|
#if COLLA_WIN
|
|
#if COLLA_MSVC
|
|
#pragma warning(disable:4996) // _CRT_SECURE_NO_WARNINGS.
|
|
#endif
|
|
|
|
#include <windows.h>
|
|
|
|
#if COLLA_CMT_LIB
|
|
#pragma comment(lib, "User32")
|
|
#endif
|
|
|
|
#if COLLA_TCC
|
|
#include "tcc/colla_tcc.h"
|
|
#endif
|
|
|
|
//#ifndef TLOG_NO_COLOURS
|
|
// #define TLOG_NO_COLOURS
|
|
//#endif
|
|
#endif
|
|
|
|
#if COLLA_EMC
|
|
#define TLOG_NO_COLOURS
|
|
#endif
|
|
|
|
#if COLLA_EMC
|
|
#define COLOUR_BLACK "<span class=\"black\">"
|
|
#define COLOUR_RED "<span class=\"red\">"
|
|
#define COLOUR_GREEN "<span class=\"green\">"
|
|
#define COLOUR_YELLOW "<span class=\"yellow\">"
|
|
#define COLOUR_BLUE "<span class=\"blue\">"
|
|
#define COLOUR_MAGENTA "<span class=\"magenta\">"
|
|
#define COLOUR_CYAN "<span class=\"cyan\">"
|
|
#define COLOUR_WHITE "<span class=\"white\">"
|
|
#define COLOUR_RESET "</span></b>"
|
|
#define COLOUR_BOLD "<b>"
|
|
#elif defined(TLOG_NO_COLOURS)
|
|
#define COLOUR_BLACK ""
|
|
#define COLOUR_RED ""
|
|
#define COLOUR_GREEN ""
|
|
#define COLOUR_YELLOW ""
|
|
#define COLOUR_BLUE ""
|
|
#define COLOUR_MAGENTA ""
|
|
#define COLOUR_CYAN ""
|
|
#define COLOUR_WHITE ""
|
|
#define COLOUR_RESET ""
|
|
#define COLOUR_BOLD ""
|
|
#else
|
|
#define COLOUR_BLACK "\033[30m"
|
|
#define COLOUR_RED "\033[31m"
|
|
#define COLOUR_GREEN "\033[32m"
|
|
#define COLOUR_YELLOW "\033[33m"
|
|
#define COLOUR_BLUE "\033[22;34m"
|
|
#define COLOUR_MAGENTA "\033[35m"
|
|
#define COLOUR_CYAN "\033[36m"
|
|
#define COLOUR_WHITE "\033[37m"
|
|
#define COLOUR_RESET "\033[0m"
|
|
#define COLOUR_BOLD "\033[1m"
|
|
#endif
|
|
|
|
static bool tl_use_newline = true;
|
|
|
|
#if COLLA_WIN
|
|
static void setLevelColour(int level) {
|
|
WORD attribute = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
|
|
switch (level) {
|
|
case LogDebug: attribute = FOREGROUND_BLUE; break;
|
|
case LogInfo: attribute = FOREGROUND_GREEN; break;
|
|
case LogWarning: attribute = FOREGROUND_RED | FOREGROUND_GREEN; break;
|
|
case LogError: attribute = FOREGROUND_RED; break;
|
|
case LogFatal: attribute = FOREGROUND_RED; break;
|
|
}
|
|
|
|
HANDLE hc = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
SetConsoleTextAttribute(hc, attribute);
|
|
}
|
|
#else
|
|
static void setLevelColour(int level) {
|
|
switch (level) {
|
|
case LogDebug: printf(COLOUR_BLUE); break;
|
|
case LogInfo: printf(COLOUR_GREEN); break;
|
|
case LogWarning: printf(COLOUR_YELLOW); break;
|
|
case LogError: printf(COLOUR_RED); break;
|
|
case LogFatal: printf(COLOUR_MAGENTA); break;
|
|
default: printf(COLOUR_RESET); break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void traceLog(int level, const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
traceLogVaList(level, fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
#ifdef TLOG_MUTEX
|
|
#include "cthreads.h"
|
|
static cmutex_t g_mtx = 0;
|
|
#endif
|
|
|
|
void traceLogVaList(int level, const char *fmt, va_list args) {
|
|
#ifdef TLOG_MUTEX
|
|
if (!g_mtx) g_mtx = mtxInit();
|
|
mtxLock(g_mtx);
|
|
#endif
|
|
|
|
const char *beg = "";
|
|
switch (level) {
|
|
case LogAll: beg = "[ALL" ; break;
|
|
case LogTrace: beg = "[TRACE" ; break;
|
|
case LogDebug: beg = "[DEBUG" ; break;
|
|
case LogInfo: beg = "[INFO" ; break;
|
|
case LogWarning: beg = "[WARNING" ; break;
|
|
case LogError: beg = "[ERROR" ; break;
|
|
case LogFatal: beg = "[FATAL" ; break;
|
|
default: break;
|
|
}
|
|
|
|
#if COLLA_WIN
|
|
SetConsoleOutputCP(CP_UTF8);
|
|
#endif
|
|
setLevelColour(level);
|
|
printf("%s", beg);
|
|
|
|
#if GAME_CLIENT
|
|
putchar(':');
|
|
traceSetColour(COL_CYAN);
|
|
printf("CLIENT");
|
|
#elif GAME_HOST
|
|
putchar(':');
|
|
traceSetColour(COL_MAGENTA);
|
|
printf("HOST");
|
|
#endif
|
|
|
|
setLevelColour(level);
|
|
printf("]: ");
|
|
|
|
// set back to white
|
|
setLevelColour(LogTrace);
|
|
fmtPrintv(fmt, args);
|
|
|
|
if(tl_use_newline) {
|
|
#if COLLA_EMC
|
|
puts("<br>");
|
|
#else
|
|
puts("");
|
|
#endif
|
|
}
|
|
|
|
#ifndef TLOG_DONT_EXIT_ON_FATAL
|
|
if (level == LogFatal) {
|
|
|
|
#ifndef TLOG_NO_MSGBOX
|
|
|
|
#if COLLA_WIN
|
|
char errbuff[1024];
|
|
fmtBufferv(errbuff, sizeof(errbuff), fmt, args);
|
|
|
|
char captionbuf[] =
|
|
#if GAME_HOST
|
|
"Fatal Host Error";
|
|
#elif GAME_CLIENT
|
|
"Fatal Client Error";
|
|
#else
|
|
"Fatal Error";
|
|
#endif
|
|
MessageBoxA(
|
|
NULL,
|
|
errbuff, captionbuf,
|
|
MB_ICONERROR | MB_OK
|
|
);
|
|
#endif
|
|
|
|
#endif
|
|
fflush(stdout);
|
|
abort();
|
|
}
|
|
#endif
|
|
|
|
#ifdef TLOG_MUTEX
|
|
mtxUnlock(g_mtx);
|
|
#endif
|
|
}
|
|
|
|
void traceUseNewline(bool newline) {
|
|
tl_use_newline = newline;
|
|
}
|
|
|
|
void traceSetColour(colour_e colour) {
|
|
#if COLLA_WIN
|
|
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (WORD)colour);
|
|
#else
|
|
switch (colour) {
|
|
case COL_RESET: printf(COLOUR_RESET); break;
|
|
case COL_BLACK: printf(COLOUR_BLACK); break;
|
|
case COL_BLUE: printf(COLOUR_BLUE); break;
|
|
case COL_GREEN: printf(COLOUR_GREEN); break;
|
|
case COL_CYAN: printf(COLOUR_CYAN); break;
|
|
case COL_RED: printf(COLOUR_RED); break;
|
|
case COL_MAGENTA: printf(COLOUR_MAGENTA); break;
|
|
case COL_YELLOW: printf(COLOUR_YELLOW); break;
|
|
}
|
|
#endif
|
|
} |