diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-21 17:44:03 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-23 11:42:23 -0500 |
| commit | fa7fc343a0e444da72938fad58d219cf52228976 (patch) | |
| tree | 24630be0c54f9768a13f32c5970558768e343543 /src/plugins.cpp | |
| parent | 6fa3b137c74536d2bab77f3309ca5b4c60953fe0 (diff) | |
plugin checkpoint - multiple plugins and collision callbacks
Diffstat (limited to 'src/plugins.cpp')
| -rw-r--r-- | src/plugins.cpp | 74 |
1 files changed, 50 insertions, 24 deletions
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 <cstdio> -#include <dlfcn.h> +#include "array.hpp" +#include "macros.hpp" -PKEPluginInterface pkePlugin{}; +#include <cassert> +#include <cstdio> +#include <cstring> -void *loadedPlugin = nullptr; +#ifdef WIN32 + // TODO +#else + #include <dlfcn.h> +#endif -void Pke_UpdatePlugin(const PKEPluginInterface &plugin) { - pkePlugin.OnInit = plugin.OnInit; - pkePlugin.OnTick = plugin.OnTick; - pkePlugin.OnTeardown = plugin.OnTeardown; - pkePlugin.OnImGuiRender = plugin.OnImGuiRender; -} +DynArray<PKEPluginInterface> LoadedPkePlugins; +PkeArray<PkeCallback> pkePluginCallbacks; +PkeArray<CallbackSignature> 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<const CallbackSignature *>(a)[0], static_cast<const CallbackSignature *>(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; } |
