2020-03-22 00:45:04 +01:00
|
|
|
#pragma once
|
2015-09-30 02:56:11 +02:00
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
2016-05-22 05:20:38 +02:00
|
|
|
#include "SqBase.hpp"
|
2016-02-20 23:25:00 +01:00
|
|
|
#include "Base/Buffer.hpp"
|
2015-09-30 02:56:11 +02:00
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
2016-05-22 05:20:38 +02:00
|
|
|
#include <cstdio>
|
|
|
|
#include <string>
|
2015-09-30 02:56:11 +02:00
|
|
|
|
2020-09-08 21:44:04 +02:00
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
|
|
#include <thread>
|
|
|
|
|
2019-05-01 17:00:24 +02:00
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
|
|
#include <sqrat/sqratFunction.h>
|
2020-09-08 21:44:04 +02:00
|
|
|
#include <concurrentqueue.h>
|
2019-05-01 17:00:24 +02:00
|
|
|
|
2016-02-20 23:25:00 +01:00
|
|
|
// ------------------------------------------------------------------------------------------------
|
2016-05-22 05:20:38 +02:00
|
|
|
namespace SqMod {
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
|
|
* Supported levels of logging.
|
|
|
|
*/
|
2016-02-20 23:25:00 +01:00
|
|
|
enum LogLvl
|
2015-09-30 02:56:11 +02:00
|
|
|
{
|
2020-03-22 09:31:43 +01:00
|
|
|
LOGL_NIL = (1u << 0u),
|
|
|
|
LOGL_DBG = (1u << 1u),
|
|
|
|
LOGL_USR = (1u << 2u),
|
|
|
|
LOGL_SCS = (1u << 3u),
|
|
|
|
LOGL_INF = (1u << 4u),
|
|
|
|
LOGL_WRN = (1u << 5u),
|
|
|
|
LOGL_ERR = (1u << 6u),
|
|
|
|
LOGL_FTL = (1u << 7u),
|
|
|
|
LOGL_ANY = 0xFFu
|
2016-02-20 23:25:00 +01:00
|
|
|
};
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
|
|
* Class responsible for logging output.
|
|
|
|
*/
|
2016-02-20 23:25:00 +01:00
|
|
|
class Logger
|
|
|
|
{
|
2020-09-08 21:44:04 +02:00
|
|
|
protected:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Message storage and builder.
|
|
|
|
*/
|
|
|
|
struct Message
|
|
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
static constexpr size_t TMS_LEN = (128-sizeof(String)-6-sizeof(bool));
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
String mStr; // Message string.
|
|
|
|
uint32_t mLen; // Message length.
|
|
|
|
uint8_t mLvl; // Message level.
|
|
|
|
uint8_t mInc; // Message increments.
|
|
|
|
bool mSub; // Message hierarchy.
|
|
|
|
bool mTms; // Message hierarchy.
|
|
|
|
char mBuf[TMS_LEN]; // Message time-stamp.
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Default constructor.
|
|
|
|
*/
|
|
|
|
Message()
|
|
|
|
: mStr(), mLen(0), mLvl(LOGL_NIL)
|
|
|
|
, mInc(std::numeric_limits< uint8_t >::max()), mSub(false), mTms(false), mBuf{'\0'}
|
|
|
|
{
|
|
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Explicit type constructor.
|
|
|
|
*/
|
|
|
|
Message(uint8_t lvl, bool sub)
|
|
|
|
: mStr(), mLen(0), mLvl(lvl)
|
|
|
|
, mInc(std::numeric_limits< uint8_t >::max()), mSub(sub), mTms(false), mBuf{'\0'}
|
|
|
|
{
|
|
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Explicit constructor.
|
|
|
|
*/
|
|
|
|
Message(uint8_t lvl, bool sub, uint32_t len)
|
|
|
|
: Message(lvl, sub, len, std::numeric_limits< uint8_t >::max())
|
|
|
|
{
|
|
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Explicit constructor.
|
|
|
|
*/
|
|
|
|
Message(uint8_t lvl, bool sub, uint32_t len, uint8_t inc)
|
|
|
|
: mStr(), mLen(0), mLvl(lvl), mInc(inc), mSub(sub), mTms(false), mBuf{'\0'}
|
|
|
|
{
|
|
|
|
mStr.resize(len, '\0');
|
|
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Copy constructor (disabled).
|
|
|
|
*/
|
|
|
|
Message(const Message & o) = delete;
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Stamp the log message.
|
|
|
|
*/
|
|
|
|
void Stamp();
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Finished the string message.
|
|
|
|
*/
|
|
|
|
void Finish()
|
|
|
|
{
|
|
|
|
mStr.resize(mLen); // Discard trailing characters
|
|
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Append a C string to the message.
|
|
|
|
*/
|
|
|
|
uint32_t Append(CSStr str);
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Append a fixed width string to the message.
|
|
|
|
*/
|
|
|
|
uint32_t Append(CSStr str, size_t len);
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Append a formatted string to the message.
|
|
|
|
*/
|
|
|
|
uint32_t AppendF(CSStr str, ...);
|
|
|
|
/* ----------------------------------------------------------------------------------------
|
|
|
|
* Append a formatted string to the message.
|
|
|
|
*/
|
|
|
|
uint32_t AppendFv(CSStr str, va_list vl);
|
|
|
|
};
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Smart message pointer.
|
|
|
|
*/
|
|
|
|
using MsgPtr = std::unique_ptr< Message >;
|
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
private:
|
2015-09-30 02:56:11 +02:00
|
|
|
|
2016-02-20 23:25:00 +01:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2016-05-22 05:20:38 +02:00
|
|
|
static Logger s_Inst; // Logger instance.
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Default constructor.
|
|
|
|
*/
|
2020-03-22 09:31:43 +01:00
|
|
|
Logger() noexcept;
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Destructor.
|
|
|
|
*/
|
|
|
|
~Logger();
|
|
|
|
|
2020-09-08 21:44:04 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Queue of messages written from other threads.
|
|
|
|
*/
|
|
|
|
using MsgQueue = moodycamel::ConcurrentQueue< MsgPtr >;
|
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
private:
|
|
|
|
|
2016-02-20 23:25:00 +01:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2020-09-08 21:44:04 +02:00
|
|
|
std::thread::id m_ThreadID; // ID of the thread in which the logger was initialized.
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
|
|
MsgPtr m_Message; // Last and/or currently processed log message.
|
|
|
|
MsgQueue m_Queue; // Queue of messages outside of main thread.
|
2015-09-30 02:56:11 +02:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2020-09-08 21:44:04 +02:00
|
|
|
Uint8 m_ConsoleLevels; // The levels allowed to be outputted to console.
|
|
|
|
Uint8 m_LogFileLevels; // The levels allowed to be outputted to log file.
|
2015-09-30 02:56:11 +02:00
|
|
|
|
2016-02-20 23:25:00 +01:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2020-09-08 21:44:04 +02:00
|
|
|
bool m_ConsoleTime; // Whether console messages should be timestamped.
|
|
|
|
bool m_LogFileTime; // Whether log file messages should be timestamped.
|
|
|
|
bool m_CyclicLock; // Prevent the script callback from entering a loop.
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2019-05-17 21:54:08 +02:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2020-09-08 21:44:04 +02:00
|
|
|
Uint32 m_StringTruncate; // The length at which to truncate strings in debug.
|
2019-05-17 21:54:08 +02:00
|
|
|
|
2016-02-20 23:25:00 +01:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2020-09-08 21:44:04 +02:00
|
|
|
std::FILE* m_File; // Handle to the file where the logs should be saved.
|
|
|
|
std::string m_Filename; // The name of the file where the logs are saved.
|
2016-05-22 05:20:38 +02:00
|
|
|
|
2019-05-01 17:00:24 +02:00
|
|
|
// --------------------------------------------------------------------------------------------
|
2020-09-08 21:44:04 +02:00
|
|
|
Function m_LogCb[7]; //Callback to receive debug information instead of console.
|
2019-05-01 17:00:24 +02:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
protected:
|
|
|
|
|
2020-09-08 21:44:04 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Push the given message either to the screen or queue depending on the calling thread.
|
|
|
|
*/
|
|
|
|
void PushMessage(MsgPtr & msg);
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Push the given messages either to the screen or queue depending on the calling thread.
|
|
|
|
*/
|
|
|
|
void PushMessage(MsgPtr * msg, size_t len);
|
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Process the message in the internal buffer.
|
|
|
|
*/
|
2020-09-08 21:44:04 +02:00
|
|
|
void ProcessMessage();
|
2016-05-22 05:20:38 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Retrieve the logger instance.
|
|
|
|
*/
|
|
|
|
static Logger & Get()
|
|
|
|
{
|
|
|
|
return s_Inst;
|
|
|
|
}
|
|
|
|
|
2020-03-22 09:31:43 +01:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Copy constructor. (disabled)
|
|
|
|
*/
|
|
|
|
Logger(const Logger & o) = delete;
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Move constructor. (disabled)
|
|
|
|
*/
|
|
|
|
Logger(Logger && o) = delete;
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Copy assignment operator. (disabled)
|
|
|
|
*/
|
|
|
|
Logger & operator = (const Logger & o) = delete;
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Move assignment operator. (disabled)
|
|
|
|
*/
|
|
|
|
Logger & operator = (Logger && o) = delete;
|
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Flush buffered data and close the logging file.
|
|
|
|
*/
|
|
|
|
void Close();
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Initialize the logging utility.
|
|
|
|
*/
|
|
|
|
void Initialize(CCStr filename);
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Terminate the logging utility.
|
|
|
|
*/
|
|
|
|
void Terminate();
|
|
|
|
|
2019-05-01 17:00:24 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Release the script associated resources.
|
|
|
|
*/
|
|
|
|
void Release();
|
|
|
|
|
2020-09-08 21:44:04 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Processes the messages that have gathered in the queue.
|
|
|
|
*/
|
|
|
|
void ProcessQueue();
|
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Enable or disable console message time stamping.
|
|
|
|
*/
|
|
|
|
void ToggleConsoleTime(bool enabled)
|
|
|
|
{
|
|
|
|
m_ConsoleTime = enabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* See whether console message time stamping is enabled.
|
|
|
|
*/
|
|
|
|
bool ConsoleHasTime() const
|
2016-02-20 23:25:00 +01:00
|
|
|
{
|
2016-05-22 05:20:38 +02:00
|
|
|
return m_ConsoleTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Enable or disable log file message time stamping.
|
|
|
|
*/
|
|
|
|
void ToggleLogFileTime(bool enabled)
|
|
|
|
{
|
|
|
|
m_LogFileTime = enabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* See whether log file message time stamping is enabled.
|
|
|
|
*/
|
|
|
|
bool LogFileHasTime() const
|
|
|
|
{
|
|
|
|
return m_LogFileTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Set the console level flags.
|
|
|
|
*/
|
|
|
|
void SetConsoleLevels(Uint8 levels)
|
|
|
|
{
|
|
|
|
m_ConsoleLevels = levels;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Retrieve the console level flags.
|
|
|
|
*/
|
|
|
|
Uint8 GetConsoleLevels() const
|
|
|
|
{
|
|
|
|
return m_ConsoleLevels;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Set the log file level flags.
|
|
|
|
*/
|
|
|
|
void SetLogFileLevels(Uint8 levels)
|
|
|
|
{
|
|
|
|
m_LogFileLevels = levels;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Retrieve the log file level flags.
|
|
|
|
*/
|
|
|
|
Uint8 GetLogFileLevels() const
|
|
|
|
{
|
|
|
|
return m_LogFileLevels;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Enable a certain console logging level.
|
|
|
|
*/
|
|
|
|
void EnableConsoleLevel(Uint8 level)
|
|
|
|
{
|
|
|
|
m_ConsoleLevels |= level;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Disable a certain console logging level.
|
|
|
|
*/
|
|
|
|
void DisableConsoleLevel(Uint8 level)
|
|
|
|
{
|
|
|
|
if (m_ConsoleLevels & level)
|
2016-02-20 23:25:00 +01:00
|
|
|
{
|
2016-05-22 05:20:38 +02:00
|
|
|
m_ConsoleLevels ^= level;
|
2016-02-20 23:25:00 +01:00
|
|
|
}
|
2016-05-22 05:20:38 +02:00
|
|
|
}
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Toggle a certain console logging level.
|
|
|
|
*/
|
|
|
|
void ToggleConsoleLevel(Uint8 level, bool toggle)
|
|
|
|
{
|
|
|
|
if (toggle)
|
|
|
|
{
|
|
|
|
EnableConsoleLevel(level);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DisableConsoleLevel(level);
|
|
|
|
}
|
2016-02-20 23:25:00 +01:00
|
|
|
}
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Enable a certain log file logging level.
|
|
|
|
*/
|
|
|
|
void EnableLogFileLevel(Uint8 level)
|
|
|
|
{
|
|
|
|
m_LogFileLevels |= level;
|
|
|
|
}
|
2015-09-30 02:56:11 +02:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Disable a certain log file logging level.
|
|
|
|
*/
|
|
|
|
void DisableLogFileLevel(Uint8 level)
|
|
|
|
{
|
|
|
|
m_LogFileLevels |= level;
|
|
|
|
m_LogFileLevels ^= level;
|
|
|
|
}
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Toggle a certain log file logging level.
|
|
|
|
*/
|
|
|
|
void ToggleLogFileLevel(Uint8 level, bool toggle)
|
|
|
|
{
|
|
|
|
if (toggle)
|
|
|
|
{
|
|
|
|
EnableLogFileLevel(level);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DisableLogFileLevel(level);
|
|
|
|
}
|
|
|
|
}
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
2019-05-17 21:54:08 +02:00
|
|
|
* Retrieve the number of characters that strings will be truncated in debug output.
|
|
|
|
*/
|
|
|
|
Uint32 GetStringTruncate() const
|
|
|
|
{
|
|
|
|
return m_StringTruncate;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Retrieve the number of characters that strings will be truncated in debug output.
|
|
|
|
*/
|
|
|
|
void SetStringTruncate(Uint32 nc)
|
|
|
|
{
|
|
|
|
m_StringTruncate = nc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
2016-05-22 05:20:38 +02:00
|
|
|
* Retrieve the log file name.
|
|
|
|
*/
|
|
|
|
const std::string & GetLogFilename() const
|
|
|
|
{
|
|
|
|
return m_Filename;
|
|
|
|
}
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Modify the log file name.
|
|
|
|
*/
|
|
|
|
void SetLogFilename(CCStr filename);
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2019-05-01 17:00:24 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Bind a script callback to a log level.
|
|
|
|
*/
|
2020-04-27 12:53:16 +02:00
|
|
|
void BindCb(Uint8 level, Function & func);
|
2019-05-01 17:00:24 +02:00
|
|
|
|
2020-09-06 22:54:44 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Send a log message.
|
|
|
|
*/
|
|
|
|
void Send(Uint8 level, bool sub, CCStr msg, size_t len);
|
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Send a log message.
|
|
|
|
*/
|
2020-09-08 21:44:04 +02:00
|
|
|
void SendFv(Uint8 level, bool sub, CCStr fmt, va_list args);
|
2016-05-22 05:20:38 +02:00
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Write a log message.
|
|
|
|
*/
|
2020-09-08 21:44:04 +02:00
|
|
|
void WriteF(Uint8 level, bool sub, CCStr fmt, ...);
|
2016-05-22 05:20:38 +02:00
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Generate a debug message.
|
|
|
|
*/
|
2020-09-08 21:44:04 +02:00
|
|
|
void DebugF(HSQUIRRELVM vm, CCStr fmt, ...);
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Generate a debug message.
|
|
|
|
*/
|
2020-09-08 21:44:04 +02:00
|
|
|
void DebugFv(HSQUIRRELVM vm, CCStr fmt, va_list args);
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2019-05-01 17:00:24 +02:00
|
|
|
private:
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
|
|
* Forward the log message to a callback.
|
|
|
|
*/
|
2020-09-08 21:44:04 +02:00
|
|
|
SQBool ProcessCb();
|
2016-05-22 05:20:38 +02:00
|
|
|
};
|
2015-09-30 02:56:11 +02:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
|
|
* Raw console message output.
|
|
|
|
*/
|
|
|
|
void OutputDebug(CCStr msg, ...);
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
|
|
* Raw console message output.
|
|
|
|
*/
|
|
|
|
void OutputMessage(CCStr msg, ...);
|
2015-11-08 11:34:46 +01:00
|
|
|
|
2016-05-22 05:20:38 +02:00
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
|
|
* Raw console message output.
|
|
|
|
*/
|
|
|
|
void OutputError(CCStr msg, ...);
|
2015-09-30 02:56:11 +02:00
|
|
|
|
|
|
|
} // Namespace:: SqMod
|