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