cleanup: style
[blender-staging.git] / source / blender / blenlib / intern / dynlib.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file, with exception of below:
22  *
23  * Contributor(s): Peter O'Gorman
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/blenlib/intern/dynlib.c
29  *  \ingroup bli
30  */
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35
36 #include "MEM_guardedalloc.h"
37
38 #include "BLI_dynlib.h"
39
40 struct DynamicLibrary {
41         void *handle;
42 };
43
44 #ifdef WIN32
45
46 #include <windows.h>
47 #include "utf_winfunc.h"
48 #include "utfconv.h"
49
50 DynamicLibrary *BLI_dynlib_open(char *name)
51 {
52         DynamicLibrary *lib;
53         void *handle;
54
55         UTF16_ENCODE(name);
56         handle = LoadLibraryW(name_16);
57         UTF16_UN_ENCODE(name);
58
59         if (!handle)
60                 return NULL;
61
62         lib = MEM_callocN(sizeof(*lib), "Dynamic Library");
63         lib->handle = handle;
64                 
65         return lib;
66 }
67
68 void *BLI_dynlib_find_symbol(DynamicLibrary *lib, const char *symname)
69 {
70         return GetProcAddress(lib->handle, symname);
71 }
72
73 char *BLI_dynlib_get_error_as_string(DynamicLibrary *lib)
74 {
75         int err;
76
77         /* if lib is NULL reset the last error code */
78         err = GetLastError();
79         if (!lib)
80                 SetLastError(ERROR_SUCCESS);
81
82         if (err) {
83                 static char buf[1024];
84
85                 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
86                                   NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
87                                   buf, sizeof(buf), NULL))
88                 {
89                         return buf;
90                 }
91         }
92         
93         return NULL;
94 }
95
96 void BLI_dynlib_close(DynamicLibrary *lib)
97 {
98         FreeLibrary(lib->handle);
99         MEM_freeN(lib);
100 }
101
102 #else /* Unix */
103
104 #include <dlfcn.h>
105
106 DynamicLibrary *BLI_dynlib_open(char *name)
107 {
108         DynamicLibrary *lib;
109         void *handle = dlopen(name, RTLD_LAZY);
110
111         if (!handle)
112                 return NULL;
113
114         lib = MEM_callocN(sizeof(*lib), "Dynamic Library");
115         lib->handle = handle;
116                 
117         return lib;
118 }
119
120 void *BLI_dynlib_find_symbol(DynamicLibrary *lib, const char *symname)
121 {
122         return dlsym(lib->handle, symname);
123 }
124
125 char *BLI_dynlib_get_error_as_string(DynamicLibrary *lib)
126 {
127         (void)lib; /* unused */
128         return dlerror();
129 }
130         
131 void BLI_dynlib_close(DynamicLibrary *lib)
132 {
133         dlclose(lib->handle);
134         MEM_freeN(lib);
135 }
136
137 #endif
138