Fixed listbox scrolling, added some Doxygen comments.
[xuni.git] / src / loadso.c
blobe6742ec9dbe3941ea29840f75310ce8660b22899
1 /*! \file loadso.c
3 */
5 #include "loadso.h"
6 #include "error.h"
7 #include "memory.h"
9 #ifdef LOADSO_SDL_VERSION
10 #include "SDL_loadso.h"
11 #elif defined(LOADSO_DLOPEN_VERSION)
12 #include <dlfcn.h>
13 #endif
15 #ifdef LOADSO_STATIC_VERSION
16 #include "utility.h"
18 #include "test/game.h"
19 #include "test/menu.h"
20 #include "test/options.h"
22 typedef void (*init_menu_type)(void *vdata, struct xuni_t *xuni,
23 struct widget_t *panel, struct resource_t *settings);
25 loadso_t xuni_loadso_load_object(struct loadso_array_t *loadso,
26 const char *filename) {
28 /* could validate filename here */
30 return 0;
33 void xuni_loadso_free_object(loadso_t object) {
34 /* do nothing */
36 #else
38 static void loadso_add_object(struct loadso_array_t *loadso,
39 const char *name, loadso_t object);
41 loadso_t xuni_loadso_load_object(struct loadso_array_t *loadso,
42 const char *filename) {
44 loadso_t object;
46 if(!filename || !*filename) return 0;
48 #ifdef LOADSO_SDL_VERSION
49 object = SDL_LoadObject(filename);
50 #elif defined(LOADSO_DLOPEN_VERSION)
51 object = dlopen(filename, RTLD_LAZY);
52 #endif
54 if(!object) {
55 #ifdef LOADSO_SDL_VERSION
56 log_message(ERROR_TYPE_WARNING, ERROR_FLAG_SDL, __FILE__, __LINE__,
57 "Can't load object \"%s\"", filename);
58 #elif defined(LOADSO_DLOPEN_VERSION)
59 log_message(ERROR_TYPE_WARNING, 0, __FILE__, __LINE__,
60 "Can't load object \"%s\": %s", filename, dlerror());
61 #endif
63 else loadso_add_object(loadso, filename, object);
65 return object;
68 func_point_t xuni_loadso_load_function(loadso_t object, const char *func) {
69 /* This generates an unavoidable warning, because function pointers
70 cannot be stored in void pointers and vise versa, and dlsym() etc
71 chose to use void pointers for some reason.
73 func_point_t sofunc = (func_point_t)
74 #ifdef LOADSO_SDL_VERSION
75 SDL_LoadFunction(object, func);
76 #elif defined(LOADSO_DLOPEN_VERSION)
77 dlsym(object, func);
78 #endif
80 if(!sofunc) {
81 #ifdef LOADSO_SDL_VERSION
82 log_message(ERROR_TYPE_WARNING, ERROR_FLAG_SDL, __FILE__, __LINE__,
83 "Can't load function \"%s\"", func);
84 #elif defined(LOADSO_DLOPEN_VERSION)
85 log_message(ERROR_TYPE_WARNING, 0, __FILE__, __LINE__,
86 "Can't load function \"%s\": %s", func, dlerror());
87 #endif
90 return sofunc;
93 void xuni_loadso_free_object(loadso_t object) {
94 #ifdef LOADSO_SDL_VERSION
95 SDL_UnloadObject(object);
96 #elif defined(LOADSO_DLOPEN_VERSION)
97 dlclose(object);
98 #endif
101 static void loadso_add_object(struct loadso_array_t *loadso,
102 const char *name, loadso_t object) {
104 loadso->object = xuni_memory_resize(loadso->object, (loadso->objects + 1)
105 * sizeof(*loadso->object));
106 loadso->object[loadso->objects].object = object;
107 loadso->object[loadso->objects].name = xuni_memory_duplicate_string(name);
109 loadso->objects ++;
111 #endif
113 void init_loadso(struct loadso_array_t *loadso) {
114 loadso->object = 0;
115 loadso->objects = 0;
118 void free_loadso(struct loadso_array_t *loadso) {
119 size_t x;
121 for(x = 0; x < loadso->objects; x ++) {
122 xuni_loadso_free_object(loadso->object[x].object);
123 xuni_memory_free((void *)loadso->object[x].name);
126 xuni_memory_free(loadso->object);
127 xuni_memory_free(loadso);