rodecomp/Source/Utility/Text/FormatString.cpp
ragnarok-clanker bf6a44c117 Group Utility units into subsystem folders and require OFFSET provenance
Move Lexicon*, Text (TextTokens, TextEscapes, Base64), Math/RadialGrid, Hash (MD5, XxHash32) and Cipher (Rijndael, XorBytes) into Source/Utility subfolders; update includes, guards, compile.json and CMakeLists.txt. Backfill // OFFSET: above every standalone // FUNCTION: block (89 IDs, addresses from the symbol database) and make it mandatory in CODING_RULES.md and AGENTS.md. Remove the MatchLexicon cast chain.
2026-10-26 23:41:07 +01:00

74 lines
1.6 KiB
C++

#include "Utility/Text/FormatString.h"
#include "Utility/Threading/NSyncObject.h"
#include <array>
#include <cstdarg>
#include <cstdio>
#include <cstring>
#include <map>
#include <windows.h>
// OFFSET: 0x005BAEF0
// FUNCTION: fn_03451
int StringFormat(char* buffer, std::size_t sizeInBytes, std::size_t count, const char* format, ...) {
va_list args;
va_start(args, format);
const int result = _vsnprintf_s(buffer, sizeInBytes, count, format, args);
va_end(args);
if (result < 0) {
return -1;
}
return result;
}
namespace {
class ThreadSafeBuffer {
public:
// OFFSET: 0x00733F00
// FUNCTION: fn_07592
ThreadSafeBuffer() {
InitializeCriticalSection(&this->m_criticalSection);
}
// INLINED
virtual ~ThreadSafeBuffer() {
DeleteCriticalSection(&this->m_criticalSection);
}
char* GetBuffer();
private:
/* 0004 */ CRITICAL_SECTION m_criticalSection;
/* 001C */ std::map<HANDLE, std::array<char, 2048>> m_buffers;
};
// OFFSET: 0x00734390
// FUNCTION: fn_07595
char* ThreadSafeBuffer::GetBuffer() {
NSyncObject lock(&this->m_criticalSection);
HANDLE thread = GetCurrentThread();
auto it = this->m_buffers.find(thread);
if (it == this->m_buffers.end()) {
it = this->m_buffers.emplace(thread, std::array<char, 2048>{}).first;
}
return it->second.data();
}
}
// OFFSET: 0x00734470
// FUNCTION: fn_07596
const char* FormatString(const char* format, ...) {
static ThreadSafeBuffer s_buffer;
char* buffer = s_buffer.GetBuffer();
va_list args;
va_start(args, format);
std::vsnprintf(buffer, 2048, format, args);
va_end(args);
return s_buffer.GetBuffer();
}