312 lines
7.7 KiB
C++
312 lines
7.7 KiB
C++
#include <stdarg.h>
|
|
#include "common.h"
|
|
#include "log.h"
|
|
|
|
#if PLATFORM == PLATFORM_WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
FILE *logfile = NULL;
|
|
uint8 loglevel = 0;
|
|
bool logtime = false;
|
|
|
|
void log_prepare(char *fn, char *mode = NULL)
|
|
{
|
|
if(!mode)
|
|
mode = "a";
|
|
if(logfile)
|
|
{
|
|
fflush(logfile);
|
|
fclose(logfile);
|
|
}
|
|
logfile = fopen(fn,mode);
|
|
}
|
|
|
|
void log_setloglevel(uint8 lvl)
|
|
{
|
|
loglevel = lvl;
|
|
}
|
|
|
|
void log_setlogtime(bool b)
|
|
{
|
|
logtime = b;
|
|
}
|
|
|
|
void log(const char *str, ...)
|
|
{
|
|
if(!str)
|
|
return;
|
|
va_list ap;
|
|
_log_setcolor(true,GREY);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vprintf( str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(true);
|
|
|
|
printf("\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void logdetail(const char *str, ...)
|
|
{
|
|
if(!str || loglevel < 1)
|
|
return;
|
|
va_list ap;
|
|
_log_setcolor(true,LCYAN);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vprintf( str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(true);
|
|
|
|
printf("\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void logdebug(const char *str, ...)
|
|
{
|
|
if(!str || loglevel < 2)
|
|
return;
|
|
va_list ap;
|
|
_log_setcolor(true,LBLUE);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vprintf( str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(true);
|
|
|
|
|
|
printf("\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void logdev(const char *str, ...)
|
|
{
|
|
if(!str || loglevel < 3)
|
|
return;
|
|
va_list ap;
|
|
_log_setcolor(true,LMAGENTA);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vprintf( str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(true);
|
|
|
|
|
|
printf("\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void logerror(const char *str, ...)
|
|
{
|
|
va_list ap;
|
|
_log_setcolor(false,LRED);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf( stderr, str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(false);
|
|
|
|
fprintf(stderr,"\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void logcritical(const char *str, ...)
|
|
{
|
|
va_list ap;
|
|
_log_setcolor(false,RED);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf( stderr, str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(false);
|
|
|
|
fprintf(stderr,"\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void logcustom(uint8 lvl, Color color, const char *str, ...)
|
|
{
|
|
if(!str || loglevel < lvl)
|
|
return;
|
|
va_list ap;
|
|
_log_setcolor(true,color);
|
|
if(logtime)
|
|
printf("%s ", GetTimeString().c_str());
|
|
va_start(ap, str);
|
|
vprintf( str, ap );
|
|
va_end(ap);
|
|
_log_resetcolor(true);
|
|
|
|
printf("\n");
|
|
|
|
if(logfile)
|
|
{
|
|
fprintf(logfile, getDateString().c_str());
|
|
va_start(ap, str);
|
|
vfprintf(logfile, str, ap);
|
|
fprintf(logfile, "\n" );
|
|
va_end(ap);
|
|
fflush(logfile);
|
|
}
|
|
fflush(stdout);
|
|
}
|
|
|
|
void log_close()
|
|
{
|
|
fclose(logfile);
|
|
}
|
|
|
|
void _log_setcolor(bool stdout_stream, Color color)
|
|
{
|
|
#if PLATFORM == PLATFORM_WIN32
|
|
|
|
static WORD WinColorFG[Color_count] =
|
|
{
|
|
0, // BLACK
|
|
FOREGROUND_RED, // RED
|
|
FOREGROUND_GREEN, // GREEN
|
|
FOREGROUND_RED | FOREGROUND_GREEN, // BROWN
|
|
FOREGROUND_BLUE, // BLUE
|
|
FOREGROUND_RED | FOREGROUND_BLUE,// MAGENTA
|
|
FOREGROUND_GREEN | FOREGROUND_BLUE, // CYAN
|
|
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,// WHITE
|
|
// YELLOW
|
|
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
|
|
// RED_BOLD
|
|
FOREGROUND_RED | FOREGROUND_INTENSITY,
|
|
// GREEN_BOLD
|
|
FOREGROUND_GREEN | FOREGROUND_INTENSITY,
|
|
FOREGROUND_BLUE | FOREGROUND_INTENSITY, // BLUE_BOLD
|
|
// MAGENTA_BOLD
|
|
FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
|
|
// CYAN_BOLD
|
|
FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
|
|
// WHITE_BOLD
|
|
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
|
|
};
|
|
|
|
HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE );
|
|
SetConsoleTextAttribute(hConsole, WinColorFG[color]);
|
|
#else
|
|
|
|
enum ANSITextAttr
|
|
{
|
|
TA_NORMAL=0,
|
|
TA_BOLD=1,
|
|
TA_BLINK=5,
|
|
TA_REVERSE=7
|
|
};
|
|
|
|
enum ANSIFgTextAttr
|
|
{
|
|
FG_BLACK=30, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE,
|
|
FG_MAGENTA, FG_CYAN, FG_WHITE, FG_YELLOW
|
|
};
|
|
|
|
enum ANSIBgTextAttr
|
|
{
|
|
BG_BLACK=40, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE,
|
|
BG_MAGENTA, BG_CYAN, BG_WHITE
|
|
};
|
|
|
|
static uint8 UnixColorFG[Color_count] =
|
|
{
|
|
FG_BLACK, // BLACK
|
|
FG_RED, // RED
|
|
FG_GREEN, // GREEN
|
|
FG_BROWN, // BROWN
|
|
FG_BLUE, // BLUE
|
|
FG_MAGENTA, // MAGENTA
|
|
FG_CYAN, // CYAN
|
|
FG_WHITE, // WHITE
|
|
FG_YELLOW, // YELLOW
|
|
FG_RED, // LRED
|
|
FG_GREEN, // LGREEN
|
|
FG_BLUE, // LBLUE
|
|
FG_MAGENTA, // LMAGENTA
|
|
FG_CYAN, // LCYAN
|
|
FG_WHITE // LWHITE
|
|
};
|
|
|
|
fprintf((stdout_stream? stdout : stderr), "\x1b[%d%sm",UnixColorFG[color],(color>=YELLOW&&color<Color_count ?";1":""));
|
|
#endif
|
|
}
|
|
|
|
void _log_resetcolor(bool stdout_stream)
|
|
{
|
|
#if PLATFORM == PLATFORM_WIN32
|
|
HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE );
|
|
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED );
|
|
#else
|
|
fprintf(( stdout_stream ? stdout : stderr ), "\x1b[0m");
|
|
#endif
|
|
}
|