diff --git a/cbp/ModSample.cbp b/cbp/ModSample.cbp index 1deaad95..1f7ebbde 100644 --- a/cbp/ModSample.cbp +++ b/cbp/ModSample.cbp @@ -414,7 +414,10 @@ - + + + + diff --git a/modules/sample/Common.cpp b/modules/sample/Common.cpp index c3737528..8c99b408 100644 --- a/modules/sample/Common.cpp +++ b/modules/sample/Common.cpp @@ -1,181 +1,13 @@ // ------------------------------------------------------------------------------------------------ #include "Common.hpp" -#include "Module.hpp" - -// ------------------------------------------------------------------------------------------------ -#include -#include -#include - -// ------------------------------------------------------------------------------------------------ -#include // ------------------------------------------------------------------------------------------------ namespace SqMod { -// ------------------------------------------------------------------------------------------------ -static SQChar g_Buffer[4096]; // Common buffer to reduce memory allocations. - -// ------------------------------------------------------------------------------------------------ -SStr GetTempBuff() -{ - return g_Buffer; -} - -// ------------------------------------------------------------------------------------------------ -Uint32 GetTempBuffSize() -{ - return sizeof(g_Buffer); -} - -// ------------------------------------------------------------------------------------------------ -void SqThrowF(CSStr str, ...) -{ - // Initialize the argument list - va_list args; - va_start (args, str); - // Write the requested contents - if (std::vsnprintf(g_Buffer, sizeof(g_Buffer), str, args) < 0) - { - std::strcpy(g_Buffer, "Unknown error has occurred"); - } - // Release the argument list - va_end(args); - // Throw the exception with the resulted message - throw Sqrat::Exception(g_Buffer); -} - -// ------------------------------------------------------------------------------------------------ -CSStr FmtStr(CSStr str, ...) -{ - // Initialize the argument list - va_list args; - va_start (args, str); - // Write the requested contents - if (std::vsnprintf(g_Buffer, sizeof(g_Buffer), str, args) < 0) - { - g_Buffer[0] = '\0'; // Make sure the string is terminated - } - // Release the argument list - va_end(args); - // Return the data from the buffer - return g_Buffer; -} - -// ------------------------------------------------------------------------------------------------ -StackGuard::StackGuard() - : m_VM(_SqVM), m_Top(sq_gettop(m_VM)) -{ - /* ... */ -} - -// ------------------------------------------------------------------------------------------------ -StackGuard::StackGuard(HSQUIRRELVM vm) - : m_VM(vm), m_Top(sq_gettop(vm)) -{ - /* ... */ -} - -// ------------------------------------------------------------------------------------------------ -StackGuard::~StackGuard() -{ - sq_pop(m_VM, sq_gettop(m_VM) - m_Top); -} - -// -------------------------------------------------------------------------------------------- -StackStrF::StackStrF(HSQUIRRELVM vm, SQInteger idx, bool fmt) - : mPtr(nullptr) - , mLen(-1) - , mRes(SQ_OK) - , mObj() - , mVM(vm) -{ - const Int32 top = sq_gettop(vm); - // Reset the converted value object - sq_resetobject(&mObj); - // Was the string or value specified? - if (top <= (idx - 1)) - { - mRes = sq_throwerror(vm, "Missing string or value"); - } - // Do we have enough values to call the format function and are we allowed to? - else if (top > idx && fmt) - { - // Pointer to the generated string - SStr str = nullptr; - // Attempt to generate the specified string format - mRes = sqstd_format(vm, idx, &mLen, &str); - // Did the format succeeded but ended up with a null string pointer? - if (SQ_SUCCEEDED(mRes) && !str) - { - mRes = sq_throwerror(vm, "Unable to generate the string"); - } - else - { - mPtr = const_cast< CSStr >(str); - } - } - // Is the value on the stack an actual string? - else if (sq_gettype(vm, idx) == OT_STRING) - { - // Obtain a reference to the string object - mRes = sq_getstackobj(vm, idx, &mObj); - // Could we retrieve the object from the stack? - if (SQ_SUCCEEDED(mRes)) - { - // Keep a strong reference to the object - sq_addref(vm, &mObj); - // Attempt to retrieve the string value from the stack - mRes = sq_getstring(vm, idx, &mPtr); - } - // Did the retrieval succeeded but ended up with a null string pointer? - if (SQ_SUCCEEDED(mRes) && !mPtr) - { - mRes = sq_throwerror(vm, "Unable to retrieve the string"); - } - } - // We have to try and convert it to string - else - { - // Attempt to convert the value from the stack to a string - mRes = sq_tostring(vm, idx); - // Could we convert the specified value to string? - if (SQ_SUCCEEDED(mRes)) - { - // Obtain a reference to the resulted object - mRes = sq_getstackobj(vm, -1, &mObj); - // Could we retrieve the object from the stack? - if (SQ_SUCCEEDED(mRes)) - { - // Keep a strong reference to the object - sq_addref(vm, &mObj); - // Attempt to obtain the string pointer - mRes = sq_getstring(vm, -1, &mPtr); - } - } - // Pop a value from the stack regardless of the result - sq_pop(vm, 1); - // Did the retrieval succeeded but ended up with a null string pointer? - if (SQ_SUCCEEDED(mRes) && !mPtr) - { - mRes = sq_throwerror(vm, "Unable to retrieve the value"); - } - } -} - -// ------------------------------------------------------------------------------------------------ -StackStrF::~StackStrF() -{ - if (mVM && !sq_isnull(mObj)) - { - sq_release(mVM, &mObj); - } -} - // ------------------------------------------------------------------------------------------------ int SampleFunction() { - OutputMessage("Hello from the sample plugin function!"); + OutputMessage("Hello from the sample plug-in function!"); return rand(); } diff --git a/modules/sample/Common.hpp b/modules/sample/Common.hpp index ac2218e9..cdada032 100644 --- a/modules/sample/Common.hpp +++ b/modules/sample/Common.hpp @@ -2,10 +2,7 @@ #define _SQSAMPLE_COMMON_HPP_ // ------------------------------------------------------------------------------------------------ -#include "ModBase.hpp" - -// ------------------------------------------------------------------------------------------------ -#include +#include "Base/Utility.hpp" // ------------------------------------------------------------------------------------------------ namespace SqMod { @@ -23,120 +20,8 @@ namespace SqMod { #define SQSAMPLE_VERSION_MINOR 0 #define SQSAMPLE_VERSION_PATCH 1 -/* ------------------------------------------------------------------------------------------------ - * Retrieve the temporary buffer. -*/ -SStr GetTempBuff(); - -/* ------------------------------------------------------------------------------------------------ - * Retrieve the size of the temporary buffer. -*/ -Uint32 GetTempBuffSize(); - -/* ------------------------------------------------------------------------------------------------ - * Throw a formatted exception. -*/ -void SqThrowF(CSStr str, ...); - -/* ------------------------------------------------------------------------------------------------ - * Generate a formatted string. -*/ -CSStr FmtStr(CSStr str, ...); - -/* ------------------------------------------------------------------------------------------------ - * Implements RAII to restore the VM stack to it's initial size on function exit. -*/ -struct StackGuard -{ - /* -------------------------------------------------------------------------------------------- - * Default constructor. - */ - StackGuard(); - - /* -------------------------------------------------------------------------------------------- - * Base constructor. - */ - StackGuard(HSQUIRRELVM vm); - - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~StackGuard(); - -private: - - /* -------------------------------------------------------------------------------------------- - * Copy constructor. - */ - StackGuard(const StackGuard &); - - /* -------------------------------------------------------------------------------------------- - * Move constructor. - */ - StackGuard(StackGuard &&); - - /* -------------------------------------------------------------------------------------------- - * Copy assignment operator. - */ - StackGuard & operator = (const StackGuard &); - - /* -------------------------------------------------------------------------------------------- - * Move assignment operator. - */ - StackGuard & operator = (StackGuard &&); - -private: - - // -------------------------------------------------------------------------------------------- - HSQUIRRELVM m_VM; // The VM where the stack should be restored. - Int32 m_Top; // The top of the stack when this instance was created. -}; - -/* ------------------------------------------------------------------------------------------------ - * Helper structure for retrieving a value from the stack as a string or a formatted string. -*/ -struct StackStrF -{ - // -------------------------------------------------------------------------------------------- - CSStr mPtr; // Pointer to the C string that was retrieved. - SQInteger mLen; // The string length if it could be retrieved. - SQRESULT mRes; // The result of the retrieval attempts. - HSQOBJECT mObj; // Strong reference to the string object. - HSQUIRRELVM mVM; // The associated virtual machine. - - /* -------------------------------------------------------------------------------------------- - * Base constructor. - */ - StackStrF(HSQUIRRELVM vm, SQInteger idx, bool fmt = true); - - /* -------------------------------------------------------------------------------------------- - * Copy constructor. (disabled) - */ - StackStrF(const StackStrF & o) = delete; - - /* -------------------------------------------------------------------------------------------- - * Copy constructor. (disabled) - */ - StackStrF(StackStrF && o) = delete; - - /* -------------------------------------------------------------------------------------------- - * Destructor. - */ - ~StackStrF(); - - /* -------------------------------------------------------------------------------------------- - * Copy constructor. (disabled) - */ - StackStrF & operator = (const StackStrF & o) = delete; - - /* -------------------------------------------------------------------------------------------- - * Copy constructor. (disabled) - */ - StackStrF & operator = (StackStrF && o) = delete; -}; - /* -------------------------------------------------------------------------------------------- - * Sample Plugin API + * Sample Plug-in API */ int SampleFunction(); diff --git a/modules/sample/Module.cpp b/modules/sample/Module.cpp index 5e705f12..5767ef04 100644 --- a/modules/sample/Module.cpp +++ b/modules/sample/Module.cpp @@ -1,35 +1,15 @@ -// -------------------------------------------------------------------------------------------- -#include "Module.hpp" +// ------------------------------------------------------------------------------------------------ #include "Common.hpp" -// -------------------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------------------------ #include #include -#include -#include - -// -------------------------------------------------------------------------------------------- -#include - -// -------------------------------------------------------------------------------------------- -#if defined(WIN32) || defined(_WIN32) - #include -#endif +// ------------------------------------------------------------------------------------------------ namespace SqMod { -// -------------------------------------------------------------------------------------------- -PluginFuncs* _Func = nullptr; -PluginCallbacks* _Clbk = nullptr; -PluginInfo* _Info = nullptr; - -// -------------------------------------------------------------------------------------------- -HSQAPI _SqAPI = nullptr; -HSQEXPORTS _SqMod = nullptr; -HSQUIRRELVM _SqVM = nullptr; - /* ------------------------------------------------------------------------------------------------ - * Bind speciffic functions to certain server events. + * Bind specific functions to certain server events. */ void BindCallbacks(); @@ -38,22 +18,22 @@ void BindCallbacks(); */ void UnbindCallbacks(); -/* -------------------------------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------ * Register the module API under the specified virtual machine. */ void RegisterAPI(HSQUIRRELVM vm); -/* -------------------------------------------------------------------------------------------- - * Initialize the plugin by obtaining the API provided by the host plugin. +/* ------------------------------------------------------------------------------------------------ + * Initialize the plug-in by obtaining the API provided by the host plug-in. */ void OnSquirrelInitialize() { - // Attempt to import the plugin API exported by the host plugin + // Attempt to import the plug-in API exported by the host plug-in _SqMod = sq_api_import(_Func); - // Did we failed to obtain the plugin exports? - if(!_SqMod) + // Did we failed to obtain the plug-in exports? + if (!_SqMod) { - OutputError("Failed to attach [%s] on host plugin.", SQSAMPLE_NAME); + OutputError("Failed to attach [%s] on host plug-in.", SQSAMPLE_NAME); } else { @@ -64,12 +44,12 @@ void OnSquirrelInitialize() } } -/* -------------------------------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------ * Load the module on the virtual machine provided by the host module. */ void OnSquirrelLoad() { - // Make sure that we have a valid plugin API + // Make sure that we have a valid plug-in API if (!_SqMod) { return; // Unable to proceed. @@ -89,24 +69,29 @@ void OnSquirrelLoad() OutputMessage("Registered: %s", SQSAMPLE_NAME); } -/* -------------------------------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------ * The virtual machine is about to be terminated and script resources should be released. */ void OnSquirrelTerminate() { OutputMessage("Terminating: %s", SQSAMPLE_NAME); + // Release null objects just in case + NullObject().Release(); + NullTable().Release(); + NullArray().Release(); + NullFunction().ReleaseGently(); // Release the current virtual machine, if any DefaultVM::Set(nullptr); // Release script resources... } -/* -------------------------------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------ * Validate the module API to make sure we don't run into issues. */ bool CheckAPIVer(CCStr ver) { // Obtain the numeric representation of the API version - long vernum = std::strtol(ver, nullptr, 10); + const LongI vernum = std::strtol(ver, nullptr, 10); // Check against version mismatch if (vernum == SQMOD_API_VER) { @@ -119,8 +104,8 @@ bool CheckAPIVer(CCStr ver) return false; } -/* -------------------------------------------------------------------------------------------- - * React to command sent by other plugins. +/* ------------------------------------------------------------------------------------------------ + * React to command sent by other plug-ins. */ static uint8_t OnPluginCommand(uint32_t command_identifier, CCStr message) { @@ -143,8 +128,8 @@ static uint8_t OnPluginCommand(uint32_t command_identifier, CCStr message) return 1; } -/* -------------------------------------------------------------------------------------------- - * The server was initialized and this plugin was loaded successfully. +/* ------------------------------------------------------------------------------------------------ + * The server was initialized and this plug-in was loaded successfully. */ static uint8_t OnServerInitialise() { @@ -173,7 +158,7 @@ void UnbindCallbacks() _Clbk->OnPluginCommand = nullptr; } -// -------------------------------------------------------------------------------------------- +// ------------------------------------------------------------------------------------------------ void RegisterAPI(HSQUIRRELVM vm) { RootTable(vm).Bind(_SC("SampleType"), Class< SampleType >(vm, _SC("SampleType")) @@ -187,119 +172,33 @@ void RegisterAPI(HSQUIRRELVM vm) RootTable(vm).Func(_SC("SampleFunction"), &SampleFunction); } -// -------------------------------------------------------------------------------------------- -void OutputMessageImpl(const char * msg, va_list args) -{ -#if defined(WIN32) || defined(_WIN32) - HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE); - - CONSOLE_SCREEN_BUFFER_INFO csb_before; - GetConsoleScreenBufferInfo( hstdout, &csb_before); - SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN); - std::printf("[SQMOD] "); - - SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); - std::vprintf(msg, args); - std::puts(""); - - SetConsoleTextAttribute(hstdout, csb_before.wAttributes); -#else - std::printf("%c[0;32m[SQMOD]%c[0m", 27, 27); - std::vprintf(msg, args); - std::puts(""); -#endif -} - -// -------------------------------------------------------------------------------------------- -void OutputErrorImpl(const char * msg, va_list args) -{ -#if defined(WIN32) || defined(_WIN32) - HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE); - - CONSOLE_SCREEN_BUFFER_INFO csb_before; - GetConsoleScreenBufferInfo( hstdout, &csb_before); - SetConsoleTextAttribute(hstdout, FOREGROUND_RED | FOREGROUND_INTENSITY); - std::printf("[SQMOD] "); - - SetConsoleTextAttribute(hstdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); - std::vprintf(msg, args); - std::puts(""); - - SetConsoleTextAttribute(hstdout, csb_before.wAttributes); -#else - std::printf("%c[0;91m[SQMOD]%c[0m", 27, 27); - std::vprintf(msg, args); - std::puts(""); -#endif -} - -// -------------------------------------------------------------------------------------------- -void OutputDebug(const char * msg, ...) -{ -#ifdef _DEBUG - // Initialize the arguments list - va_list args; - va_start(args, msg); - // Call the output function - OutputMessageImpl(msg, args); - // Finalize the arguments list - va_end(args); -#else - SQMOD_UNUSED_VAR(msg); -#endif -} - -// -------------------------------------------------------------------------------------------- -void OutputMessage(const char * msg, ...) -{ - // Initialize the arguments list - va_list args; - va_start(args, msg); - // Call the output function - OutputMessageImpl(msg, args); - // Finalize the arguments list - va_end(args); -} - -// -------------------------------------------------------------------------------------------- -void OutputError(const char * msg, ...) -{ - // Initialize the arguments list - va_list args; - va_start(args, msg); - // Call the output function - OutputErrorImpl(msg, args); - // Finalize the arguments list - va_end(args); -} - } // Namespace:: SqMod -// -------------------------------------------------------------------------------------------- -SQMOD_API_EXPORT unsigned int VcmpPluginInit(PluginFuncs* functions, PluginCallbacks* callbacks, PluginInfo* info) +// ------------------------------------------------------------------------------------------------ +SQMOD_API_EXPORT unsigned int VcmpPluginInit(PluginFuncs * functions, PluginCallbacks * callbacks, PluginInfo * info) { using namespace SqMod; - // Output plugin header + // Output plug-in header std::puts(""); OutputMessage("--------------------------------------------------------------------"); - OutputMessage("Plugin: %s", SQSAMPLE_NAME); + OutputMessage("Plug-in: %s", SQSAMPLE_NAME); OutputMessage("Author: %s", SQSAMPLE_AUTHOR); OutputMessage("Legal: %s", SQSAMPLE_COPYRIGHT); OutputMessage("--------------------------------------------------------------------"); std::puts(""); - // Attempt to find the host plugin ID - int host_plugin_id = functions->FindPlugin((char *)(SQMOD_HOST_NAME)); - // See if our plugin was loaded after the host plugin + // Attempt to find the host plug-in ID + const int host_plugin_id = functions->FindPlugin(SQMOD_HOST_NAME); + // See if our plug-in was loaded after the host plug-in if (host_plugin_id < 0) { - OutputError("%s could find the host plugin", SQSAMPLE_NAME); + OutputError("%s could find the host plug-in", SQSAMPLE_NAME); // Don't load! return SQMOD_FAILURE; } // Should never reach this point but just in case else if (static_cast< Uint32 >(host_plugin_id) > info->pluginId) { - OutputError("%s loaded after the host plugin", SQSAMPLE_NAME); + OutputError("%s loaded after the host plug-in", SQSAMPLE_NAME); // Don't load! return SQMOD_FAILURE; } @@ -307,15 +206,15 @@ SQMOD_API_EXPORT unsigned int VcmpPluginInit(PluginFuncs* functions, PluginCallb _Func = functions; _Clbk = callbacks; _Info = info; - // Assign plugin version + // Assign plug-in version _Info->pluginVersion = SQSAMPLE_VERSION; _Info->apiMajorVersion = PLUGIN_API_MAJOR; _Info->apiMinorVersion = PLUGIN_API_MINOR; - // Assign the plugin name + // Assign the plug-in name std::snprintf(_Info->name, sizeof(_Info->name), "%s", SQSAMPLE_HOST_NAME); // Bind callbacks BindCallbacks(); - // Notify that the plugin was successfully loaded + // Notify that the plug-in was successfully loaded OutputMessage("Successfully loaded %s", SQSAMPLE_NAME); // Dummy spacing std::puts(""); diff --git a/modules/sample/Module.hpp b/modules/sample/Module.hpp deleted file mode 100644 index e62288fc..00000000 --- a/modules/sample/Module.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _SQSAMPLE_MODULE_HPP_ -#define _SQSAMPLE_MODULE_HPP_ - -// ------------------------------------------------------------------------------------------------ -#include "SqMod.h" - -// ------------------------------------------------------------------------------------------------ -namespace SqMod { - -/* ------------------------------------------------------------------------------------------------ - * Proxies to comunicate with the server. -*/ -extern PluginFuncs* _Func; -extern PluginCallbacks* _Clbk; -extern PluginInfo* _Info; - -/* ------------------------------------------------------------------------------------------------ - * Proxies to comunicate with the Squirrel plugin. -*/ -extern HSQAPI _SqAPI; -extern HSQEXPORTS _SqMod; -extern HSQUIRRELVM _SqVM; - -/* ------------------------------------------------------------------------------------------------ - * Output a message only if the _DEBUG was defined. -*/ -void OutputDebug(const char * msg, ...); - -/* ------------------------------------------------------------------------------------------------ - * Output a formatted user message to the console. -*/ -void OutputMessage(const char * msg, ...); - -/* ------------------------------------------------------------------------------------------------ - * Output a formatted error message to the console. -*/ -void OutputError(const char * msg, ...); - -} // Namespace:: SqMod - -#endif // _SQSAMPLE_MODULE_HPP_