summaryrefslogtreecommitdiff
path: root/src/lua-plugin.cc
diff options
context:
space:
mode:
authorpixel <pixel>2008-07-04 12:01:52 +0000
committerpixel <pixel>2008-07-04 12:01:52 +0000
commitcee868801b55aa4302c91a46df8daf38388163e7 (patch)
tree1bd77d5167f0a18ff7beb603b1b359c7b8c459b1 /src/lua-plugin.cc
Adding project files.
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