Fix compile problem on OS X Snow Leopard. The Mac code for dynamic
[blender.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 #include <string.h>
32 #include <stdio.h>
33
34 #include "../PIL_dynlib.h"
35
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
39
40 #if !defined(CHAR_MAX)
41 #define CHAR_MAX 255
42 #endif
43
44 /*
45  * XXX, should use mallocN so we can see
46  * handle's not being released. fixme zr
47  */
48  
49 #ifdef WIN32
50
51 #include <windows.h>
52
53 struct PILdynlib {
54         void *handle;
55 };
56
57 PILdynlib *PIL_dynlib_open(char *name) {
58         void *handle= LoadLibrary(name);
59
60         if (handle) {   
61                 PILdynlib *lib= malloc(sizeof(*lib));
62                 lib->handle= handle;
63                 
64                 return lib;
65         } else {
66                 return NULL;
67         }
68 }
69
70 void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) {
71         return GetProcAddress(lib->handle, symname);
72 }
73
74 char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
75         int err;
76
77         /* if lib is NULL reset the last error code */
78         err= GetLastError();
79         if (!lib) SetLastError(ERROR_SUCCESS);
80
81         if (err) {
82                 static char buf[1024];
83
84                 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 
85                                         NULL, 
86                                         err, 
87                                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
88                                         buf, 
89                                         sizeof(buf), 
90                                         NULL))
91                         return buf;
92         }
93         
94         return err;
95 }
96
97 void PIL_dynlib_close(PILdynlib *lib) {
98         FreeLibrary(lib->handle);
99         
100         free(lib);
101 }
102
103 #else   /* Unix */
104
105 #include <dlfcn.h>
106
107 struct PILdynlib {
108         void *handle;
109 };
110
111 PILdynlib *PIL_dynlib_open(char *name) {
112         void *handle= dlopen(name, RTLD_LAZY);
113
114         if (handle) {   
115                 PILdynlib *lib= malloc(sizeof(*lib));
116                 lib->handle= handle;
117                 
118                 return lib;
119         } else {
120                 return NULL;
121         }
122 }
123
124 void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) {
125         return dlsym(lib->handle, symname);
126 }
127
128 char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
129         return dlerror();
130 }
131         
132 void PIL_dynlib_close(PILdynlib *lib) {
133         dlclose(lib->handle);
134         
135         free(lib);
136 }
137
138 #endif
139