22#include "SDL_config.h"
49#define SDL_DYNAPI_VERSION 1
61#define DISABLE_JUMP_MAGIC 1
65#define SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, logname, prio) \
66 _static void SDLCALL SDL_Log##logname##name(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \
67 va_list ap; initcall; va_start(ap, fmt); \
68 jump_table.SDL_LogMessageV(category, SDL_LOG_PRIORITY_##prio, fmt, ap); \
72#define SDL_DYNAPI_VARARGS(_static, name, initcall) \
73 _static int SDLCALL SDL_SetError##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \
75 va_list ap; initcall; va_start(ap, fmt); \
76 jump_table.SDL_vsnprintf(buf, sizeof (buf), fmt, ap); \
78 return jump_table.SDL_SetError("%s", buf); \
80 _static int SDLCALL SDL_sscanf##name(const char *buf, SDL_SCANF_FORMAT_STRING const char *fmt, ...) { \
81 int retval; va_list ap; initcall; va_start(ap, fmt); \
82 retval = jump_table.SDL_vsscanf(buf, fmt, ap); \
86 _static int SDLCALL SDL_snprintf##name(SDL_OUT_Z_CAP(maxlen) char *buf, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \
87 int retval; va_list ap; initcall; va_start(ap, fmt); \
88 retval = jump_table.SDL_vsnprintf(buf, maxlen, fmt, ap); \
92 _static void SDLCALL SDL_Log##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \
93 va_list ap; initcall; va_start(ap, fmt); \
94 jump_table.SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, ap); \
97 _static void SDLCALL SDL_LogMessage##name(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \
98 va_list ap; initcall; va_start(ap, fmt); \
99 jump_table.SDL_LogMessageV(category, priority, fmt, ap); \
102 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Verbose, VERBOSE) \
103 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Debug, DEBUG) \
104 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Info, INFO) \
105 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Warn, WARN) \
106 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Error, ERROR) \
107 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Critical, CRITICAL)
114#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \
115 typedef rc (SDLCALL *SDL_DYNAPIFN_##fn) params; \
116 static rc SDLCALL fn##_DEFAULT params; \
117 extern rc SDLCALL fn##_REAL params;
119#undef SDL_DYNAPI_PROC
123 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) SDL_DYNAPIFN_##fn fn;
125 #undef SDL_DYNAPI_PROC
129#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) static rc SDLCALL fn##_DEFAULT params;
131#undef SDL_DYNAPI_PROC
135 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) fn##_DEFAULT,
137 #undef SDL_DYNAPI_PROC
141#if DISABLE_JUMP_MAGIC
142#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \
143 static rc SDLCALL fn##_DEFAULT params { \
144 SDL_InitDynamicAPI(); \
145 ret jump_table.fn args; \
147#define SDL_DYNAPI_PROC_NO_VARARGS 1
149#undef SDL_DYNAPI_PROC
150#undef SDL_DYNAPI_PROC_NO_VARARGS
158#if DISABLE_JUMP_MAGIC
159#define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \
160 rc SDLCALL fn params { ret jump_table.fn args; }
161#define SDL_DYNAPI_PROC_NO_VARARGS 1
163#undef SDL_DYNAPI_PROC
164#undef SDL_DYNAPI_PROC_NO_VARARGS
186 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) jump_table.fn = fn##_REAL;
188 #undef SDL_DYNAPI_PROC
215#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)
216#ifndef WIN32_LEAN_AND_MEAN
217#define WIN32_LEAN_AND_MEAN 1
222 HANDLE lib = LoadLibraryA(fname);
225 retval = GetProcAddress(lib, sym);
233#elif defined(unix) || defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) || defined(__QNX__)
237 void *lib = dlopen(fname, RTLD_NOW | RTLD_LOCAL);
248#elif defined(__OS2__)
254 if (DosLoadModule(&error,
sizeof(error), fname, &hmodule) == NO_ERROR) {
255 if (DosQueryProcAddr(hmodule, 0, sym, &
retval) != NO_ERROR) {
256 DosFreeModule(hmodule);
263#error Please define your platform.
270 const char *libname = SDL_getenv_REAL(
"SDL_DYNAMIC_API");
315 #if !SDL_ATOMIC_DISABLED
317 SDL_AtomicLock_REAL(&
lock);
320 if (!already_initialized) {
325 #if !SDL_ATOMIC_DISABLED
326 SDL_AtomicUnlock_REAL(&
lock);
static Sint32 initialize_jumptable(Uint32 apiver, void *table, Uint32 tablesize)
static SDL_INLINE void * get_sdlapi_entry(const char *fname, const char *sym)
#define SDL_DYNAPI_VERSION
#define SDL_DYNAPI_VARARGS(_static, name, initcall)
static SDL_DYNAPI_jump_table jump_table
Sint32(* SDL_DYNAPI_ENTRYFN)(Uint32 apiver, void *table, Uint32 tablesize)
Sint32 SDL_DYNAPI_entry(Uint32, void *, Uint32)
static void SDL_InitDynamicAPILocked(void)
static void SDL_InitDynamicAPI(void)
GLenum GLsizei GLenum GLenum const void * table