C++ conformance fixes (MSVC /permissive-)
[blender.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 #ifndef _WIN32_WINNT
46 #define _WIN32_WINNT 0x501 /* Windows XP or newer */
47 #endif
48 #define WIN32_LEAN_AND_MEAN
49 #include <windows.h>
50 #include "utf_winfunc.h"
51 #include "utfconv.h"
52
53 DynamicLibrary *BLI_dynlib_open(const char *name)
54 {
55         DynamicLibrary *lib;
56         void *handle;
57
58         UTF16_ENCODE(name);
59         handle = LoadLibraryW(name_16);
60         UTF16_UN_ENCODE(name);
61
62         if (!handle)
63                 return NULL;
64
65         lib = MEM_callocN(sizeof(*lib), "Dynamic Library");
66         lib->handle = handle;
67                 
68         return lib;
69 }
70
71 void *BLI_dynlib_find_symbol(DynamicLibrary *lib, const char *symname)
72 {
73         return GetProcAddress(lib->handle, symname);
74 }
75
76 char *BLI_dynlib_get_error_as_string(DynamicLibrary *lib)
77 {
78         int err;
79
80         /* if lib is NULL reset the last error code */
81         err = GetLastError();
82         if (!lib)
83                 SetLastError(ERROR_SUCCESS);
84
85         if (err) {
86                 static char buf[1024];
87
88                 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
89                                   NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
90                                   buf, sizeof(buf), NULL))
91                 {
92                         return buf;
93                 }
94         }
95         
96         return NULL;
97 }
98
99 void BLI_dynlib_close(DynamicLibrary *lib)
100 {
101         FreeLibrary(lib->handle);
102         MEM_freeN(lib);
103 }
104
105 #else /* Unix */
106
107 #include <dlfcn.h>
108
109 DynamicLibrary *BLI_dynlib_open(const char *name)
110 {
111         DynamicLibrary *lib;
112         void *handle = dlopen(name, RTLD_LAZY);
113
114         if (!handle)
115                 return NULL;
116
117         lib = MEM_callocN(sizeof(*lib), "Dynamic Library");
118         lib->handle = handle;
119                 
120         return lib;
121 }
122
123 void *BLI_dynlib_find_symbol(DynamicLibrary *lib, const char *symname)
124 {
125         return dlsym(lib->handle, symname);
126 }
127
128 char *BLI_dynlib_get_error_as_string(DynamicLibrary *lib)
129 {
130         (void)lib; /* unused */
131         return dlerror();
132 }
133         
134 void BLI_dynlib_close(DynamicLibrary *lib)
135 {
136         dlclose(lib->handle);
137         MEM_freeN(lib);
138 }
139
140 #endif
141