summaryrefslogtreecommitdiff
path: root/lib/boblight.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/boblight.h')
-rw-r--r--lib/boblight.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/lib/boblight.h b/lib/boblight.h
new file mode 100644
index 0000000..c596357
--- /dev/null
+++ b/lib/boblight.h
@@ -0,0 +1,103 @@
+/*
+ * boblight
+ * Copyright (C) Bob 2009
+ *
+ * boblight is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * boblight is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+//if you define BOBLIGHT_DLOPEN, all boblight functions are defined as pointers
+//you can then call boblight_loadlibrary to load libboblight with dlopen and the function pointers with dlsym
+//if you pass NULL to boblight_loadlibrary's first argument, the default filename for libboblight is used
+//if boblight_loadlibrary returns NULL, dlopen and dlsym went ok, if not it returns a char* from dlerror
+
+//if you want to use the boblight functions from multiple files, you can define BOBLIGHT_DLOPEN in one file,
+//and define BOBLIGHT_DLOPEN_EXTERN in the other file, the functionpointers are then defined as extern
+
+#ifndef LIBBOBLIGHT
+#define LIBBOBLIGHT
+
+ #if !defined(BOBLIGHT_DLOPEN) && !defined(BOBLIGHT_DLOPEN_EXTERN)
+
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+
+ //generate normal prototypes
+ #define BOBLIGHT_FUNCTION(returnvalue, name, arguments) returnvalue name arguments
+ #include "boblight-functions.h"
+ #undef BOBLIGHT_FUNCTION
+
+ #ifdef __cplusplus
+ }
+ #endif
+
+ #elif defined(BOBLIGHT_DLOPEN)
+
+ #include <dlfcn.h>
+ #include <stddef.h>
+
+ //generate function pointers
+ #define BOBLIGHT_FUNCTION(returnvalue, name, arguments) returnvalue (* name ) arguments = NULL
+ #include "boblight-functions.h"
+ #undef BOBLIGHT_FUNCTION
+
+ #ifdef __cplusplus
+ #define BOBLIGHT_CAST(value) reinterpret_cast<value>
+ #else
+ #define BOBLIGHT_CAST(value) (value)
+ #endif
+
+ //gets a functionpointer from dlsym, and returns char* from dlerror if it didn't work
+ #define BOBLIGHT_FUNCTION(returnvalue, name, arguments) \
+ name = BOBLIGHT_CAST(returnvalue (*) arguments)(dlsym(p_boblight, #name)); \
+ { char* error = dlerror(); if (error) return error; }
+
+ void* p_boblight = NULL; //where we put the lib
+
+ //load function pointers
+ char* boblight_loadlibrary(const char* filename)
+ {
+ if (filename == NULL)
+ filename = "libboblight.so";
+
+ if (p_boblight != NULL)
+ {
+ dlclose(p_boblight);
+ p_boblight = NULL;
+ }
+
+ p_boblight = dlopen(filename, RTLD_NOW);
+ if (p_boblight == NULL)
+ return dlerror();
+
+ //generate dlsym lines
+ #include "boblight-functions.h"
+
+ return NULL;
+ }
+ #undef BOBLIGHT_FUNCTION
+ #undef BOBLIGHT_CAST
+
+ //you can define BOBLIGHT_DLOPEN_EXTERN when you load the library in another file
+ #elif defined(BOBLIGHT_DLOPEN_EXTERN)
+
+ extern char* boblight_loadlibrary(const char* filename);
+ extern void* p_boblight;
+ #define BOBLIGHT_FUNCTION(returnvalue, name, arguments) extern returnvalue (* name ) arguments
+ #include "boblight-functions.h"
+ #undef BOBLIGHT_FUNCTION
+
+ #endif //BOBLIGHT_DLOPEN_EXTERN
+#endif //LIBBOBLIGHT
+