summaryrefslogtreecommitdiff
path: root/src/lua-plugin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua-plugin.cc')
-rw-r--r--src/lua-plugin.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/lua-plugin.cc b/src/lua-plugin.cc
new file mode 100644
index 0000000..79968a6
--- /dev/null
+++ b/src/lua-plugin.cc
@@ -0,0 +1,43 @@
+#include <lua-plugin.h>
+
+typedef void(*init_ptr_t)(Lua *);
+
+#ifdef _WIN32
+#include <windows.h>
+
+void LuaLoadPlugin(const String & _fname, Lua * L) throw (GeneralException) {
+ HMODULE handle;
+ String fname = _fname + ".dll";
+
+ if (!(handle = LoadLibraryEx(fname.to_charp(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH)) &&
+ !(handle = LoadLibraryEx(fname.to_charp(), NULL, NULL))) {
+ throw GeneralException("File not found or error loading shared object file: " + fname + "; Error #" + String((int) GetLastError()));
+ }
+
+ init_ptr_t init_ptr = (init_ptr_t) GetProcAddress(handle, "init_plugin");
+
+ if (!init_ptr) {
+ throw GeneralException("No init pointer on plugin " + fname);
+ }
+
+ init_ptr(L);
+}
+#else
+#include <dlfcn.h>
+
+void LuaLoadPlugin(const String & fname, Lua * L) throw (GeneralException) {
+ void * handle = dlopen(("./" + fname + ".so").to_charp(), RTLD_NOW | RTLD_GLOBAL);
+
+ if (!handle) {
+ throw GeneralException("File not found or error loading shared object file: " + fname + "; " + dlerror());
+ }
+
+ init_ptr_t init_ptr = (init_ptr_t) dlsym(handle, "init_plugin");
+
+ if (!init_ptr) {
+ throw GeneralException("No init pointer on plugin " + fname);
+ }
+
+ init_ptr(L);
+}
+#endif