r5sdk/r5dev/tier0/dbg.cpp
Kawe Mazidjatari 4b72afb74f Light refactor for logging
Moved logging functions to dbg.h (tier0) and export them from the dll.
Added additional functions for checking bad pointers (debug only!).
Reduced output code size.
2022-05-25 14:18:29 +02:00

338 lines
8.2 KiB
C++

//==== Copyright (c) 1996-2005, Valve Corporation, All rights reserved. =====//
//
// Purpose:
//
// $NoKeywords: $
//
//===========================================================================//
#include "core/stdafx.h"
#include "core/logdef.h"
#include "tier0/platform.h"
#include "tier0/threadtools.h"
#include "tier0/dbg.h"
#ifndef DEDICATED
#include "vgui/vgui_debugpanel.h"
#include "gameui/IConsole.h"
#else
#include "engine/server/sv_rcon.h"
#endif
#if defined( _X360 )
#include "xbox/xbox_console.h"
#endif
std::mutex s_LogMutex;
//-----------------------------------------------------------------------------
// Templates to assist in validating pointers:
//-----------------------------------------------------------------------------
PLATFORM_INTERFACE void _AssertValidReadPtr(void* ptr, int count/* = 1*/)
{
#if defined( _WIN32 ) && !defined( _X360 )
Assert(!IsBadReadPtr(ptr, count));
#else
Assert(!count || ptr);
#endif
}
PLATFORM_INTERFACE void _AssertValidWritePtr(void* ptr, int count/* = 1*/)
{
#if defined( _WIN32 ) && !defined( _X360 )
Assert(!IsBadWritePtr(ptr, count));
#else
Assert(!count || ptr);
#endif
}
PLATFORM_INTERFACE void _AssertValidReadWritePtr(void* ptr, int count/* = 1*/)
{
#if defined( _WIN32 ) && !defined( _X360 )
Assert(!(IsBadWritePtr(ptr, count) || IsBadReadPtr(ptr, count)));
#else
Assert(!count || ptr);
#endif
}
PLATFORM_INTERFACE void _AssertValidStringPtr(const TCHAR* ptr, int maxchar/* = 0xFFFFFF */)
{
#if defined( _WIN32 ) && !defined( _X360 )
#ifdef TCHAR_IS_CHAR
Assert(!IsBadStringPtr(ptr, maxchar));
#else
Assert(!IsBadStringPtrW(ptr, maxchar));
#endif
#else
Assert(ptr);
#endif
}
PLATFORM_INTERFACE void AssertValidWStringPtr(const wchar_t* ptr, int maxchar/* = 0xFFFFFF */)
{
#if defined( _WIN32 ) && !defined( _X360 )
Assert(!IsBadStringPtrW(ptr, maxchar));
#else
Assert(ptr);
#endif
}
//-----------------------------------------------------------------------------
// Purpose: Show logs to all console interfaces
// Input : idx -
// *fmt - ... -
//-----------------------------------------------------------------------------
void DevMsg(eDLL_T context, const char* fmt, ...)
{
static char szBuf[2048] = {};
static std::string svOut;
static std::string svAnsiOut;
static std::regex rxAnsiExp("\\\033\\[.*?m");
static std::shared_ptr<spdlog::logger> iconsole = spdlog::get("game_console");
static std::shared_ptr<spdlog::logger> wconsole = spdlog::get("win_console");
static std::shared_ptr<spdlog::logger> sqlogger = spdlog::get("sdk_info");
s_LogMutex.lock();
{/////////////////////////////
va_list args{};
va_start(args, fmt);
vsnprintf(szBuf, sizeof(szBuf), fmt, args);
szBuf[sizeof(szBuf) - 1] = 0;
va_end(args);
}/////////////////////////////
svOut = sDLL_T[static_cast<int>(context)].c_str();
svOut.append(szBuf);
svOut = std::regex_replace(svOut, rxAnsiExp, "");
char szNewLine = svOut.back();
if (szNewLine != '\n')
{
svOut.append("\n");
}
if (!g_bSpdLog_UseAnsiClr)
{
wconsole->debug(svOut);
#ifdef DEDICATED
g_pRConServer->Send(svOut.c_str());
#endif // DEDICATED
}
else
{
svAnsiOut = sANSI_DLL_T[static_cast<int>(context)].c_str();
svAnsiOut.append(szBuf);
char szNewLine = svAnsiOut.back();
if (szNewLine != '\n')
{
svAnsiOut.append("\n");
}
wconsole->debug(svAnsiOut);
#ifdef DEDICATED
g_pRConServer->Send(svAnsiOut.c_str());
#endif // DEDICATED
}
sqlogger->debug(svOut);
#ifndef DEDICATED
iconsole->info(svOut);
int nLog = static_cast<int>(context) + 3; // RUI log enum is shifted by 3 for scripts.
LogType_t tLog = static_cast<LogType_t>(nLog);
ImVec4 color;
switch (context)
{
case eDLL_T::SERVER:
color = ImVec4(0.23f, 0.47f, 0.85f, 1.00f);
break;
case eDLL_T::CLIENT:
color = ImVec4(0.46f, 0.46f, 0.46f, 1.00f);
break;
case eDLL_T::UI:
color = ImVec4(0.59f, 0.35f, 0.46f, 1.00f);
break;
case eDLL_T::ENGINE:
color = ImVec4(0.70f, 0.70f, 0.70f, 1.00f);
break;
case eDLL_T::FS:
color = ImVec4(0.32f, 0.64f, 0.72f, 1.00f);
break;
case eDLL_T::RTECH:
color = ImVec4(0.36f, 0.70f, 0.35f, 1.00f);
break;
case eDLL_T::MS:
color = ImVec4(0.75f, 0.41f, 0.67f, 1.00f);
break;
default:
color = ImVec4(0.81f, 0.81f, 0.81f, 1.00f);
break;
}
g_pIConsole->m_ivConLog.push_back(CConLog(PrintPercentageEscape(g_spd_sys_w_oss.str()), color));
g_pLogSystem.AddLog(tLog, g_spd_sys_w_oss.str());
g_spd_sys_w_oss.str("");
g_spd_sys_w_oss.clear();
#endif // !DEDICATED
s_LogMutex.unlock();
}
//-----------------------------------------------------------------------------
// Purpose: Print engine and SDK errors
// Input : idx -
// *fmt - ... -
//-----------------------------------------------------------------------------
void Warning(eDLL_T context, const char* fmt, ...)
{
static char szBuf[2048] = {};
static std::string svOut;
static std::string svAnsiOut;
static std::regex rxAnsiExp("\\\033\\[.*?m");
static std::shared_ptr<spdlog::logger> iconsole = spdlog::get("game_console");
static std::shared_ptr<spdlog::logger> wconsole = spdlog::get("win_console");
static std::shared_ptr<spdlog::logger> sqlogger = spdlog::get("sdk_warn");
s_LogMutex.lock();
{/////////////////////////////
va_list args{};
va_start(args, fmt);
vsnprintf(szBuf, sizeof(szBuf), fmt, args);
szBuf[sizeof(szBuf) - 1] = 0;
va_end(args);
}/////////////////////////////
svOut = sDLL_T[static_cast<int>(context)].c_str();
svOut.append(szBuf);
svOut = std::regex_replace(svOut, rxAnsiExp, "");
char szNewLine = svOut.back();
if (szNewLine != '\n')
{
svOut.append("\n");
}
if (!g_bSpdLog_UseAnsiClr)
{
wconsole->debug(svOut);
#ifdef DEDICATED
g_pRConServer->Send(svOut.c_str());
#endif // DEDICATED
}
else
{
svAnsiOut = sANSI_DLL_T[static_cast<int>(context)].c_str();
svAnsiOut.append(g_svYellowF.c_str());
svAnsiOut.append(szBuf);
char szNewLine = svAnsiOut.back();
if (szNewLine != '\n')
{
svAnsiOut.append("\n");
}
wconsole->debug(svAnsiOut);
#ifdef DEDICATED
g_pRConServer->Send(svAnsiOut.c_str());
#endif // DEDICATED
}
sqlogger->debug(svOut);
#ifndef DEDICATED
iconsole->info(svOut);
g_pIConsole->m_ivConLog.push_back(CConLog(PrintPercentageEscape(g_spd_sys_w_oss.str()), ImVec4(1.00f, 1.00f, 0.00f, 0.80f)));
g_pLogSystem.AddLog(LogType_t::WARNING_C, g_spd_sys_w_oss.str());
g_spd_sys_w_oss.str("");
g_spd_sys_w_oss.clear();
#endif // !DEDICATED
s_LogMutex.unlock();
}
//-----------------------------------------------------------------------------
// Purpose: Print engine and SDK errors
// Input : idx -
// *fmt - ... -
//-----------------------------------------------------------------------------
void Error(eDLL_T context, const char* fmt, ...)
{
static char szBuf[2048] = {};
static std::string svOut;
static std::string svAnsiOut;
static std::regex rxAnsiExp("\\\033\\[.*?m");
static std::shared_ptr<spdlog::logger> iconsole = spdlog::get("game_console");
static std::shared_ptr<spdlog::logger> wconsole = spdlog::get("win_console");
static std::shared_ptr<spdlog::logger> sqlogger = spdlog::get("sdk_error");
s_LogMutex.lock();
{/////////////////////////////
va_list args{};
va_start(args, fmt);
vsnprintf(szBuf, sizeof(szBuf), fmt, args);
szBuf[sizeof(szBuf) - 1] = 0;
va_end(args);
}/////////////////////////////
svOut = sDLL_T[static_cast<int>(context)].c_str();
svOut.append(szBuf);
svOut = std::regex_replace(svOut, rxAnsiExp, "");
char szNewLine = svOut.back();
if (szNewLine != '\n')
{
svOut.append("\n");
}
if (!g_bSpdLog_UseAnsiClr)
{
wconsole->debug(svOut);
#ifdef DEDICATED
g_pRConServer->Send(svOut.c_str());
#endif // DEDICATED
}
else
{
svAnsiOut = sANSI_DLL_T[static_cast<int>(context)].c_str();
svAnsiOut.append(g_svRedF.c_str());
svAnsiOut.append(szBuf);
char szNewLine = svAnsiOut.back();
if (szNewLine != '\n')
{
svAnsiOut.append("\n");
}
wconsole->debug(svAnsiOut);
#ifdef DEDICATED
g_pRConServer->Send(svAnsiOut.c_str());
#endif // DEDICATED
}
sqlogger->debug(svOut);
#ifndef DEDICATED
iconsole->info(svOut);
g_pIConsole->m_ivConLog.push_back(CConLog(PrintPercentageEscape(g_spd_sys_w_oss.str()), ImVec4(1.00f, 0.00f, 0.00f, 1.00f)));
g_pLogSystem.AddLog(LogType_t::ERROR_C, g_spd_sys_w_oss.str());
g_spd_sys_w_oss.str("");
g_spd_sys_w_oss.clear();
#endif // !DEDICATED
s_LogMutex.unlock();
}