9 #ifdef LOADSO_SDL_VERSION
10 #include "SDL_loadso.h"
11 #elif defined(LOADSO_DLOPEN_VERSION)
15 #ifdef LOADSO_STATIC_VERSION
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 */
33 void xuni_loadso_free_object(loadso_t object
) {
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
) {
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
);
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());
63 else loadso_add_object(loadso
, filename
, 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)
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());
93 void xuni_loadso_free_object(loadso_t object
) {
94 #ifdef LOADSO_SDL_VERSION
95 SDL_UnloadObject(object
);
96 #elif defined(LOADSO_DLOPEN_VERSION)
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
);
113 void init_loadso(struct loadso_array_t
*loadso
) {
118 void free_loadso(struct loadso_array_t
*loadso
) {
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
);