From 5d73d79eb8df6da32b14aca7e2b42149aee0700c Mon Sep 17 00:00:00 2001 From: rtw1x1 Date: Fri, 26 Dec 2025 16:02:34 +0000 Subject: [PATCH] Full unicode hotfix Debug mode --- src/EterBase/Debug.cpp | 398 ++++++++++++++++++++------------------ src/EterImageLib/StdAfx.h | 21 +- 2 files changed, 228 insertions(+), 191 deletions(-) diff --git a/src/EterBase/Debug.cpp b/src/EterBase/Debug.cpp index 82c258a..d9f77fd 100644 --- a/src/EterBase/Debug.cpp +++ b/src/EterBase/Debug.cpp @@ -2,6 +2,9 @@ #include #include +#include +#include + #include "Debug.h" #include "Singleton.h" #include "Timer.h" @@ -13,228 +16,252 @@ const DWORD DEBUG_STRING_MAX_LEN = 1024; static int isLogFile = false; HWND g_PopupHwnd = NULL; +// Convert UTF-8 char* -> wide and send to debugger (NO helper function, just a macro) +#ifdef _DEBUG +#define DBG_OUT_W_UTF8(psz) \ + do { \ + const char* __s = (psz) ? (psz) : ""; \ + std::wstring __w = Utf8ToWide(__s); \ + OutputDebugStringW(__w.c_str()); \ + } while (0) +#else +#define DBG_OUT_W_UTF8(psz) do { (void)(psz); } while (0) +#endif + class CLogFile : public CSingleton { - public: - CLogFile() : m_fp(NULL) - { - } + public: + CLogFile() : m_fp(NULL) {} - virtual ~CLogFile() - { - if (m_fp) - fclose(m_fp); + virtual ~CLogFile() + { + if (m_fp) + fclose(m_fp); - m_fp = NULL; - } + m_fp = NULL; + } - void Initialize() - { - m_fp = fopen("log/log.txt", "w"); - } + void Initialize() + { + m_fp = fopen("log/log.txt", "w"); + } - void Write(const char * c_pszMsg) - { - if (!m_fp) - return; + void Write(const char* c_pszMsg) + { + if (!m_fp) + return; - time_t ct = time(0); - struct tm ctm = *localtime(&ct); + time_t ct = time(0); + struct tm ctm = *localtime(&ct); - fprintf(m_fp, "%02d%02d %02d:%02d:%05d :: %s", - ctm.tm_mon + 1, - ctm.tm_mday, - ctm.tm_hour, - ctm.tm_min, - ELTimer_GetMSec() % 60000, - c_pszMsg); + fprintf(m_fp, "%02d%02d %02d:%02d:%05d :: %s", + ctm.tm_mon + 1, + ctm.tm_mday, + ctm.tm_hour, + ctm.tm_min, + ELTimer_GetMSec() % 60000, + c_pszMsg); - fflush(m_fp); - } + fflush(m_fp); + } - protected: - FILE * m_fp; + protected: + FILE* m_fp; }; static CLogFile gs_logfile; -static UINT gs_uLevel=0; +static UINT gs_uLevel = 0; void SetLogLevel(UINT uLevel) { - gs_uLevel=uLevel; + gs_uLevel = uLevel; } void Log(UINT uLevel, const char* c_szMsg) { - if (uLevel>=gs_uLevel) - Trace(c_szMsg); + if (uLevel >= gs_uLevel) + Trace(c_szMsg); } void Logn(UINT uLevel, const char* c_szMsg) { - if (uLevel>=gs_uLevel) - Tracen(c_szMsg); + if (uLevel >= gs_uLevel) + Tracen(c_szMsg); } void Logf(UINT uLevel, const char* c_szFormat, ...) { - if (uLevel 0) - { - szBuf[len] = '\n'; - szBuf[len + 1] = '\0'; - } - va_end(args); #ifdef _DEBUG - OutputDebugString(szBuf); - puts(szBuf); + DBG_OUT_W_UTF8(szBuf); + fputs(szBuf, stdout); #endif - if (isLogFile) - LogFile(szBuf); + if (isLogFile) + LogFile(szBuf); } - -void Trace(const char * c_szMsg) +void Trace(const char* c_szMsg) { #ifdef _DEBUG - OutputDebugString(c_szMsg); - printf("%s", c_szMsg); + DBG_OUT_W_UTF8(c_szMsg); + printf("%s", c_szMsg ? c_szMsg : ""); #endif - if (isLogFile) - LogFile(c_szMsg); + if (isLogFile) + LogFile(c_szMsg ? c_szMsg : ""); } void Tracen(const char* c_szMsg) { #ifdef _DEBUG - char szBuf[DEBUG_STRING_MAX_LEN+1]; - _snprintf(szBuf, sizeof(szBuf), "%s\n", c_szMsg); - OutputDebugString(szBuf); - puts(c_szMsg); + char szBuf[DEBUG_STRING_MAX_LEN + 2]; + _snprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, "%s\n", c_szMsg ? c_szMsg : ""); - if (isLogFile) - LogFile(szBuf); + DBG_OUT_W_UTF8(szBuf); - puts(c_szMsg); - putc('\n', stdout); + fputs(szBuf, stdout); + + if (isLogFile) + LogFile(szBuf); #else - if (isLogFile) - { - LogFile(c_szMsg); - LogFile("\n"); - } + if (isLogFile) + { + LogFile(c_szMsg ? c_szMsg : ""); + LogFile("\n"); + } #endif } void Tracenf(const char* c_szFormat, ...) { - va_list args; - va_start(args, c_szFormat); + char szBuf[DEBUG_STRING_MAX_LEN + 2]; - char szBuf[DEBUG_STRING_MAX_LEN+2]; - int len = _vsnprintf(szBuf, sizeof(szBuf)-1, c_szFormat, args); + va_list args; + va_start(args, c_szFormat); + _vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args); + va_end(args); + + size_t cur = strnlen(szBuf, sizeof(szBuf)); + if (cur + 1 < sizeof(szBuf)) { + szBuf[cur] = '\n'; + szBuf[cur + 1] = '\0'; + } + else { + szBuf[sizeof(szBuf) - 2] = '\n'; + szBuf[sizeof(szBuf) - 1] = '\0'; + } - if (len > 0) - { - szBuf[len] = '\n'; - szBuf[len + 1] = '\0'; - } - va_end(args); #ifdef _DEBUG - OutputDebugString(szBuf); - printf("%s", szBuf); + DBG_OUT_W_UTF8(szBuf); + fputs(szBuf, stdout); #endif - if (isLogFile) - LogFile(szBuf); + if (isLogFile) + LogFile(szBuf); } void Tracef(const char* c_szFormat, ...) { - char szBuf[DEBUG_STRING_MAX_LEN+1]; + char szBuf[DEBUG_STRING_MAX_LEN + 1]; - va_list args; - va_start(args, c_szFormat); - _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args); - va_end(args); + va_list args; + va_start(args, c_szFormat); + _vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args); + va_end(args); #ifdef _DEBUG - OutputDebugString(szBuf); - fputs(szBuf, stdout); + DBG_OUT_W_UTF8(szBuf); + fputs(szBuf, stdout); #endif - if (isLogFile) - LogFile(szBuf); + if (isLogFile) + LogFile(szBuf); } void TraceError(const char* c_szFormat, ...) { #ifndef _DISTRIBUTE + char szBuf[DEBUG_STRING_MAX_LEN + 2]; - char szBuf[DEBUG_STRING_MAX_LEN+2]; + strncpy_s(szBuf, sizeof(szBuf), "SYSERR: ", _TRUNCATE); + int prefixLen = (int)strlen(szBuf); - strncpy(szBuf, "SYSERR: ", DEBUG_STRING_MAX_LEN); - int len = strlen(szBuf); + va_list args; + va_start(args, c_szFormat); + _vsnprintf_s(szBuf + prefixLen, sizeof(szBuf) - prefixLen, _TRUNCATE, c_szFormat, args); + va_end(args); - va_list args; - va_start(args, c_szFormat); - len = _vsnprintf(szBuf + len, sizeof(szBuf) - (len + 1), c_szFormat, args) + len; - va_end(args); + size_t cur = strnlen(szBuf, sizeof(szBuf)); + if (cur + 1 < sizeof(szBuf)) { + szBuf[cur] = '\n'; + szBuf[cur + 1] = '\0'; + } + else { + szBuf[sizeof(szBuf) - 2] = '\n'; + szBuf[sizeof(szBuf) - 1] = '\0'; + } - szBuf[len] = '\n'; - szBuf[len + 1] = '\0'; + time_t ct = time(0); + struct tm ctm = *localtime(&ct); - time_t ct = time(0); - struct tm ctm = *localtime(&ct); + fprintf(stderr, "%02d%02d %02d:%02d:%05d :: %s", + ctm.tm_mon + 1, + ctm.tm_mday, + ctm.tm_hour, + ctm.tm_min, + ELTimer_GetMSec() % 60000, + szBuf + 8); + fflush(stderr); - fprintf(stderr, "%02d%02d %02d:%02d:%05d :: %s", - ctm.tm_mon + 1, - ctm.tm_mday, - ctm.tm_hour, - ctm.tm_min, - ELTimer_GetMSec() % 60000, - szBuf + 8); - fflush(stderr); - #ifdef _DEBUG - OutputDebugString(szBuf); - fputs(szBuf, stdout); + DBG_OUT_W_UTF8(szBuf); + fputs(szBuf, stdout); #endif - if (isLogFile) - LogFile(szBuf); - + if (isLogFile) + LogFile(szBuf); #endif } @@ -242,96 +269,101 @@ void TraceErrorWithoutEnter(const char* c_szFormat, ...) { #ifndef _DISTRIBUTE - char szBuf[DEBUG_STRING_MAX_LEN]; + char szBuf[DEBUG_STRING_MAX_LEN]; - va_list args; - va_start(args, c_szFormat); - _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args); - va_end(args); + va_list args; + va_start(args, c_szFormat); + _vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args); + va_end(args); - time_t ct = time(0); - struct tm ctm = *localtime(&ct); + time_t ct = time(0); + struct tm ctm = *localtime(&ct); - fprintf(stderr, "%02d%02d %02d:%02d:%05d :: %s", - ctm.tm_mon + 1, - ctm.tm_mday, - ctm.tm_hour, - ctm.tm_min, - ELTimer_GetMSec() % 60000, - szBuf + 8); - fflush(stderr); + fprintf(stderr, "%02d%02d %02d:%02d:%05d :: %s", + ctm.tm_mon + 1, + ctm.tm_mday, + ctm.tm_hour, + ctm.tm_min, + ELTimer_GetMSec() % 60000, + szBuf + 8); + fflush(stderr); #ifdef _DEBUG - OutputDebugString(szBuf); - fputs(szBuf, stdout); + DBG_OUT_W_UTF8(szBuf); + fputs(szBuf, stdout); #endif - if (isLogFile) - LogFile(szBuf); + if (isLogFile) + LogFile(szBuf); #endif } void LogBoxf(const char* c_szFormat, ...) { - va_list args; - va_start(args, c_szFormat); + va_list args; + va_start(args, c_szFormat); - char szBuf[2048]; - _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args); + char szBuf[2048]; + _vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args); - LogBox(szBuf); + va_end(args); + + LogBox(szBuf); } void LogBox(const char* c_szMsg, const char* c_szCaption, HWND hWnd) { - if (!hWnd) - hWnd = g_PopupHwnd; + if (!hWnd) + hWnd = g_PopupHwnd; - std::wstring wMsg = Utf8ToWide(c_szMsg ? c_szMsg : ""); - std::wstring wCaption = Utf8ToWide(c_szCaption ? c_szCaption : "LOG"); + std::wstring wMsg = Utf8ToWide(c_szMsg ? c_szMsg : ""); + std::wstring wCaption = Utf8ToWide(c_szCaption ? c_szCaption : "LOG"); - MessageBoxW(hWnd, wMsg.c_str(), wCaption.c_str(), MB_OK); + MessageBoxW(hWnd, wMsg.c_str(), wCaption.c_str(), MB_OK); - // Logging stays UTF-8 - Tracen(c_szMsg ? c_szMsg : ""); + // Logging stays UTF-8 + Tracen(c_szMsg ? c_szMsg : ""); } -void LogFile(const char * c_szMsg) +void LogFile(const char* c_szMsg) { - CLogFile::Instance().Write(c_szMsg); + CLogFile::Instance().Write(c_szMsg); } -void LogFilef(const char * c_szMessage, ...) +void LogFilef(const char* c_szMessage, ...) { - va_list args; - va_start(args, c_szMessage); - char szBuf[DEBUG_STRING_MAX_LEN+1]; - _vsnprintf(szBuf, sizeof(szBuf), c_szMessage, args); + va_list args; + va_start(args, c_szMessage); - CLogFile::Instance().Write(szBuf); + char szBuf[DEBUG_STRING_MAX_LEN + 1]; + _vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szMessage, args); + + va_end(args); + + CLogFile::Instance().Write(szBuf); } void OpenLogFile(bool bUseLogFIle) { - if (!std::filesystem::exists("log")) { - std::filesystem::create_directory("log"); - } + if (!std::filesystem::exists("log")) { + std::filesystem::create_directory("log"); + } #ifndef _DISTRIBUTE - _wfreopen(L"log/syserr.txt", L"w", stderr); + _wfreopen(L"log/syserr.txt", L"w", stderr); - if (bUseLogFIle) - { - isLogFile = true; - CLogFile::Instance().Initialize(); - } + if (bUseLogFIle) + { + isLogFile = true; + CLogFile::Instance().Initialize(); + } #endif } void OpenConsoleWindow() { - AllocConsole(); + AllocConsole(); - _wfreopen(L"CONOUT$", L"a", stdout); - _wfreopen(L"CONIN$", L"r", stdin); + _wfreopen(L"CONOUT$", L"a", stdout); + _wfreopen(L"CONIN$", L"r", stdin); } diff --git a/src/EterImageLib/StdAfx.h b/src/EterImageLib/StdAfx.h index 128c8ea..b32fad2 100644 --- a/src/EterImageLib/StdAfx.h +++ b/src/EterImageLib/StdAfx.h @@ -24,16 +24,21 @@ inline void _TraceForImage(const char* c_szFormat, ...) { - va_list args; - va_start(args, c_szFormat); - - static char szBuf[1024]; - _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args); + va_list args; + va_start(args, c_szFormat); + + static char szBuf[1024]; + _vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args); + #ifdef _DEBUG - OutputDebugString(szBuf); + wchar_t wBuf[1024]; + MultiByteToWideChar(CP_UTF8, 0, szBuf, -1, wBuf, _countof(wBuf)); + OutputDebugStringW(wBuf); #endif - va_end(args); - printf(szBuf); + + va_end(args); + + fputs(szBuf, stdout); } #pragma warning(default:4018)