#ifndef GLOAM_LOADER_LIBRARY_C_
#define GLOAM_LOADER_LIBRARY_C_
#if defined(GLOAM_PLATFORM_WINDOWS)
static void *gloam_dlopen(const char *name)
{
return (void *)LoadLibraryA(name);
}
static void gloam_dlclose(void *handle)
{
FreeLibrary((HMODULE)handle);
}
static void *gloam_dlsym(void *handle, const char *name)
{
return (void *)GetProcAddress((HMODULE)handle, name);
}
#else /* POSIX */
static void *gloam_dlopen(const char *name)
{
return dlopen(name, RTLD_LAZY | RTLD_LOCAL);
}
static void gloam_dlclose(void *handle)
{
dlclose(handle);
}
static void *gloam_dlsym(void *handle, const char *name)
{
return dlsym(handle, name);
}
#endif /* GLOAM_PLATFORM_WINDOWS */
/* Try each name in turn; return the first handle that opens successfully. */
static void *gloam_open_library(const char * const *names, int count)
{
int i;
for (i = 0; i < count; ++i) {
void *h = gloam_dlopen(names[i]);
if (h) return h;
}
return NULL;
}
#endif /* GLOAM_LOADER_LIBRARY_C_ */