summaryrefslogtreecommitdiff
path: root/src/plugins.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-21 17:44:03 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-23 11:42:23 -0500
commitfa7fc343a0e444da72938fad58d219cf52228976 (patch)
tree24630be0c54f9768a13f32c5970558768e343543 /src/plugins.cpp
parent6fa3b137c74536d2bab77f3309ca5b4c60953fe0 (diff)
plugin checkpoint - multiple plugins and collision callbacks
Diffstat (limited to 'src/plugins.cpp')
-rw-r--r--src/plugins.cpp74
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;
}