enderalse/source/fs.dll/common/IDebugLog.h

134 lines
3.2 KiB
C++

#pragma once
#include <cstdarg>
/**
* A simple debug log file
*
* This class supports prefix blocks describing the source of the log event.
* It also allows logical blocks and outlining.\n
*/
class IDebugLog
{
public:
IDebugLog();
IDebugLog(const char * name);
~IDebugLog();
static void Open(const char * path);
static void OpenRelative(int folderID, const char * relPath);
static void Message(const char * message, const char * source = NULL, bool newLine = true);
static void FormattedMessage(const char * fmt, ...);
static void FormattedMessage(const char * fmt, va_list args);
enum LogLevel
{
kLevel_FatalError = 0,
kLevel_Error,
kLevel_Warning,
kLevel_Message,
kLevel_VerboseMessage,
kLevel_DebugMessage
};
static void Log(LogLevel level, const char * fmt, va_list args);
static void LogNNL(LogLevel level, const char * fmt, va_list args); // No new line
static void SetSource(const char * source);
static void ClearSource(void);
static void Indent(void);
static void Outdent(void);
static void OpenBlock(void);
static void CloseBlock(void);
static void SetAutoFlush(bool inAutoFlush);
static void SetLogLevel(LogLevel in) { logLevel = in; }
static void SetPrintLevel(LogLevel in) { printLevel = in; }
private:
static void PrintSpaces(int numSpaces);
static void PrintText(const char * buf);
static void NewLine(void);
static void SeekCursor(int position);
static int TabSize(void);
static int RoundToTab(int spaces);
static FILE * logFile; //!< the output file
static char sourceBuf[16]; //!< name of current source, used in prefix
static char headerText[16]; //!< current text to use as line prefix
static char formatBuf[8192]; //!< temp buffer used for formatted messages
static int indentLevel; //!< the current indentation level (in tabs)
static int rightMargin; //!< the column at which text should be wrapped
static int cursorPos; //!< current cursor position
static int inBlock; //!< are we in a block?
static bool autoFlush; //!< automatically flush the file after writing
static LogLevel logLevel; //!< least important log level to write
static LogLevel printLevel; //!< least important log level to print
};
extern IDebugLog gLog;
inline void _FATALERROR(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
gLog.Log(IDebugLog::kLevel_FatalError, fmt, args);
va_end(args);
}
inline void _ERROR(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
gLog.Log(IDebugLog::kLevel_Error, fmt, args);
va_end(args);
}
inline void _WARNING(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
gLog.Log(IDebugLog::kLevel_Warning, fmt, args);
va_end(args);
}
inline void _MESSAGE(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
gLog.Log(IDebugLog::kLevel_Message, fmt, args);
va_end(args);
}
inline void _VMESSAGE(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
gLog.Log(IDebugLog::kLevel_VerboseMessage, fmt, args);
va_end(args);
}
inline void _DMESSAGE(const char * fmt, ...)
{
va_list args;
va_start(args, fmt);
gLog.Log(IDebugLog::kLevel_DebugMessage, fmt, args);
va_end(args);
}