| /*------------------------------------------------------------------------- |
| * drawElements Utility Library |
| * ---------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Dynamic link library abstraction. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "deDynamicLibrary.h" |
| #include "deMemory.h" |
| |
| #if (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_SYMBIAN) || (DE_OS == DE_OS_IOS) || (DE_OS == DE_OS_QNX) |
| /* Posix implementation. */ |
| |
| #include <dlfcn.h> |
| |
| struct deDynamicLibrary_s |
| { |
| void* libHandle; |
| }; |
| |
| deDynamicLibrary* deDynamicLibrary_open (const char* fileName) |
| { |
| deDynamicLibrary* library = (deDynamicLibrary*)deCalloc(sizeof(deDynamicLibrary)); |
| if (!library) |
| return DE_NULL; |
| |
| library->libHandle = dlopen(fileName, RTLD_LAZY); |
| if (!library->libHandle) |
| { |
| deFree(library); |
| return DE_NULL; |
| } |
| |
| return library; |
| } |
| |
| void deDynamicLibrary_close (deDynamicLibrary* library) |
| { |
| if (library && library->libHandle) |
| dlclose(library->libHandle); |
| deFree(library); |
| } |
| |
| deFunctionPtr deDynamicLibrary_getFunction (const deDynamicLibrary* library, const char* symbolName) |
| { |
| /* C forbids direct cast from object pointer to function pointer */ |
| union |
| { |
| deFunctionPtr funcPtr; |
| void* objPtr; |
| } ptr; |
| |
| DE_ASSERT(library && library->libHandle && symbolName); |
| ptr.objPtr = dlsym(library->libHandle, symbolName); |
| return ptr.funcPtr; |
| } |
| |
| #elif (DE_OS == DE_OS_WIN32) |
| /* Win32 implementation. */ |
| |
| #define WIN32_LEAN_AND_MEAN |
| #define VC_EXTRALEAN |
| #include <windows.h> |
| |
| struct deDynamicLibrary_s |
| { |
| HINSTANCE handle; |
| }; |
| |
| deDynamicLibrary* deDynamicLibrary_open (const char* fileName) |
| { |
| deDynamicLibrary* library = (deDynamicLibrary*)deCalloc(sizeof(deDynamicLibrary)); |
| if (!library) |
| return DE_NULL; |
| |
| library->handle = LoadLibrary(fileName); |
| if (!library->handle) |
| { |
| deFree(library); |
| return DE_NULL; |
| } |
| |
| return library; |
| } |
| |
| void deDynamicLibrary_close (deDynamicLibrary* library) |
| { |
| if (library && library->handle) |
| FreeLibrary(library->handle); |
| deFree(library); |
| } |
| |
| deFunctionPtr deDynamicLibrary_getFunction (const deDynamicLibrary* library, const char* symbolName) |
| { |
| DE_ASSERT(library && library->handle && symbolName); |
| return (deFunctionPtr)GetProcAddress(library->handle, symbolName); |
| } |
| |
| #else |
| # error deDynamicLibrary is not implemented on this OS |
| #endif |