From fa7fc343a0e444da72938fad58d219cf52228976 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Thu, 21 Dec 2023 17:44:03 -0500 Subject: plugin checkpoint - multiple plugins and collision callbacks --- src/plugins.cpp | 74 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 24 deletions(-) (limited to 'src/plugins.cpp') diff --git a/src/plugins.cpp b/src/plugins.cpp index bfd2e9b..5b0b817 100644 --- a/src/plugins.cpp +++ b/src/plugins.cpp @@ -1,22 +1,24 @@ -#include "macros.hpp" #include "plugins.hpp" -#include -#include +#include "array.hpp" +#include "macros.hpp" -PKEPluginInterface pkePlugin{}; +#include +#include +#include -void *loadedPlugin = nullptr; +#ifdef WIN32 + // TODO +#else + #include +#endif -void Pke_UpdatePlugin(const PKEPluginInterface &plugin) { - pkePlugin.OnInit = plugin.OnInit; - pkePlugin.OnTick = plugin.OnTick; - pkePlugin.OnTeardown = plugin.OnTeardown; - pkePlugin.OnImGuiRender = plugin.OnImGuiRender; -} +DynArray LoadedPkePlugins; +PkeArray pkePluginCallbacks; +PkeArray sortedSignatures; -void Pke_LoadPlugin(const char *path) { +void PkePlugin_Load(const char *path) { if (path == nullptr || path == CAFE_BABE(void)) { return; } @@ -33,19 +35,43 @@ void Pke_LoadPlugin(const char *path) { dlclose(extension); return; } - Pke_UpdatePlugin(*interface); - loadedPlugin = interface; + interface->pluginHandle = extension; + LoadedPkePlugins.Push(*interface); +} + +PkeCallback *PkePlugin_FindSignature(const CallbackSignature &sig) { + for (long i = 0; i < pkePluginCallbacks.next; ++i) { + if (strncmp(sig, pkePluginCallbacks.data[i].name, 16) == 0) { + return &pkePluginCallbacks.data[i]; + } + } + return nullptr; } -void Pke_UnloadPlugin() { - pkePlugin = { - .OnInit = nullptr, - .OnTick= nullptr, - .OnTeardown= nullptr, - .OnImGuiRender= nullptr, - }; - if (loadedPlugin != nullptr && loadedPlugin != CAFE_BABE(void)) { - dlclose(loadedPlugin); - loadedPlugin = CAFE_BABE(void); +void PkePlugin_SetSignatureFunc(PkeCallback *sig) { + assert(sig != nullptr); + if (sig->name[0] == '\0') { + return; + } + auto *registeredSig = PkePlugin_FindSignature(sig->name); + if (registeredSig == nullptr) { + fprintf(stdout, "[WARN] [PkePlugin_SetSignatureFunc] Failed to find configured signature: '%s'\n", sig->name); + return; + } + sig->func = registeredSig->func; +} + +int pstrncmp(const void* a, const void* b) +{ + return strncmp(static_cast(a)[0], static_cast(b)[0], 16); +} +CallbackSignature *PkePlugin_GetSortedSignatures(long &count) { + if (sortedSignatures.next != pkePluginCallbacks.next) { + while (sortedSignatures.next != pkePluginCallbacks.next) { + PkeArray_Add(&sortedSignatures, pkePluginCallbacks.data[sortedSignatures.next].name); + } + qsort(sortedSignatures.data, sortedSignatures.next, sizeof(CallbackSignature), pstrncmp); } + count = sortedSignatures.next; + return sortedSignatures.data; } -- cgit v1.2.3