Switch compiler to MSVC (#16)

* Initial working cmake version
Code style changes according to CLion suggestions
Changed logging to use template instead of macros
---------
Co-authored-by: asesidaa <1061472754@qq.com>

* Reformat everything, updated readme for MSVC
* Warnings annoy me deeply
* Update artifact export
* Simplifying file hierarchy
Build result will now be in dist
This commit is contained in:
KIT!
2024-11-27 21:07:17 +01:00
committed by GitHub
parent b5d9488df6
commit 91a9f9ad25
47 changed files with 1448 additions and 1341 deletions
+39 -33
View File
@@ -15,50 +15,56 @@
*/
#include "logger.h"
#include "helpers.h"
#include <time.h>
#include <stdlib.h>
#include <string.h>
static Logger *loggerInstance = NULL;
void *consoleHandle = 0;
static Logger *loggerInstance = nullptr;
void *consoleHandle = nullptr;
std::mutex logMutex; // Mutex for thread-safe logging
char timeStr[64];
time_t rawtime;
struct tm *timeinfo;
time_t rawTime;
tm *timeInfo;
SYSTEMTIME systemTime;
/*static std::unique_ptr<plog::RollingFileAppender<plog::TxtFormatter>> fileAppender;
static std::unique_ptr<plog::ConsoleAppender<plog::TxtFormatter>> consoleAppender;*/
void
InitializeLogger (LogLevel level, bool logToFile) {
InitializeLogger (const LogLevel level, const bool logToFile) {
if (loggerInstance == nullptr) {
loggerInstance = (Logger *)malloc (sizeof (Logger));
if (consoleHandle == 0) consoleHandle = GetStdHandle (STD_OUTPUT_HANDLE);
loggerInstance = static_cast<Logger *> (malloc (sizeof (Logger)));
if (consoleHandle == nullptr) consoleHandle = GetStdHandle (STD_OUTPUT_HANDLE);
}
loggerInstance->logLevel = level;
if (logToFile) {
loggerInstance->logFile = fopen ("TaikoArcadeLoader.log", "w"); // Open in write mode
if (!loggerInstance->logFile) LogMessage (LOG_LEVEL_WARN, "Failed to open TaikoArcadeLoader.log for writing.");
if (!loggerInstance->logFile) LogMessage (LogLevel::WARN, std::string ("Failed to open TaikoArcadeLoader.log for writing."));
} else loggerInstance->logFile = nullptr; // No file logging
/*consoleAppender = std::make_unique<plog::ConsoleAppender<plog::TxtFormatter>> ();
auto& init = plog::init (plog::verbose, consoleAppender.get ());
if (logToFile) {
fileAppender = std::make_unique<plog::RollingFileAppender<plog::TxtFormatter>> ("TaikoArcadeLoader.log", 1000000, 3);
init.addAppender (fileAppender.get ());
}*/
}
void
LogMessageHandler (const char *function, const char *codeFile, int codeLine, LogLevel messageLevel, const std::string format, ...) {
LogMessageHandler (const char *function, const char *codeFile, int codeLine, LogLevel messageLevel, const char *format, ...) {
// Return if no logger or log level is too high
if (loggerInstance == nullptr || messageLevel > loggerInstance->logLevel) return;
// Lock for thread safety
std::lock_guard<std::mutex> lock (logMutex);
std::lock_guard lock (logMutex);
// Format the user-provided message
va_list args;
va_start (args, format);
int requiredSize = vsnprintf (nullptr, 0, format.c_str (), args) + 1; // +1 for null terminator
std::unique_ptr<char[]> buffer (new char[requiredSize]); // Allocate buffer dynamically
vsnprintf (buffer.get (), requiredSize, format.c_str (), args); // Format the string
std::string formattedMessage (buffer.get ()); // Convert to std::string
int requiredSize = vsnprintf (nullptr, 0, format, args) + 1; // +1 for null terminator
std::unique_ptr<char[]> buffer (new char[requiredSize]); // Allocate buffer dynamically
vsnprintf (buffer.get (), requiredSize, format, args); // Format the string
std::string formattedMessage (buffer.get ()); // Convert to std::string
va_end (args);
// Determine log type string
@@ -67,10 +73,10 @@ LogMessageHandler (const char *function, const char *codeFile, int codeLine, Log
// Get current time and milliseconds
SYSTEMTIME systemTime;
GetSystemTime (&systemTime);
time_t rawtime = time (nullptr);
struct tm *timeinfo = localtime (&rawtime);
time_t rawTime = time (nullptr);
tm *timeInfo = localtime (&rawTime);
std::ostringstream timeStamp;
timeStamp << std::put_time (timeinfo, "%Y/%m/%d %H:%M:%S") << "." << std::setw (3) << std::setfill ('0') << systemTime.wMilliseconds;
timeStamp << std::put_time (timeInfo, "%Y/%m/%d %H:%M:%S") << "." << std::setw (3) << std::setfill ('0') << systemTime.wMilliseconds;
// Construct the log message
std::ostringstream logStream;
@@ -78,34 +84,34 @@ LogMessageHandler (const char *function, const char *codeFile, int codeLine, Log
std::string logMessage = logStream.str ();
// Print the log message
std::cout << "[" << timeStamp.str () << "] "; // Timestamp
SetConsoleTextAttribute (consoleHandle, GetLogLevelColor (messageLevel)); // Set Level color
std::cout << logType; // Level
SetConsoleTextAttribute (consoleHandle, 4 | 6 | 7 | 9 | 10 | 13); // Reset console color
std::cout << logMessage << std::endl; // Log message
std::cout.flush (); // Flush to ensure immediate writing
std::cout << "[" << timeStamp.str () << "] "; // Timestamp
SetConsoleTextAttribute (consoleHandle, GetLogLevelColor (messageLevel)); // Set Level color
std::cout << logType; // Level
SetConsoleTextAttribute (consoleHandle, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Reset console color
std::cout << logMessage << std::endl; // Log message
std::cout.flush (); // Flush to ensure immediate writing
if (loggerInstance->logFile) {
if (loggerInstance->logFile != nullptr) {
fprintf (loggerInstance->logFile, "[%s] %s%s\n", timeStamp.str ().c_str (), logType.c_str (), logMessage.c_str ());
fflush (loggerInstance->logFile); // Flush to ensure immediate writing
}
}
void
LogMessageHandler (const char *function, const char *codeFile, int codeLine, LogLevel messageLevel, const std::wstring format, ...) {
std::string utf8Message = ConvertWideToUtf8 (format); // Convert wide string to UTF-8
LogMessageHandler (const char *function, const char *codeFile, const int codeLine, const LogLevel messageLevel, const wchar_t *format, ...) {
const std::string utf8Message = ConvertWideToUtf8 (format); // Convert wide string to UTF-8
va_list args;
va_start (args, format);
LogMessageHandler (function, codeFile, codeLine, messageLevel, utf8Message, args); // Delegate to the original handler
LogMessageHandler (function, codeFile, codeLine, messageLevel, utf8Message.c_str (), args); // Delegate to the original handler
va_end (args);
}
void
CleanupLogger () {
if (loggerInstance != NULL) {
if (loggerInstance != nullptr) {
if (loggerInstance->logFile) fclose (loggerInstance->logFile);
free (loggerInstance);
loggerInstance = NULL;
loggerInstance = nullptr;
}
}