42 #define SDL_DYNAPI_VERSION 1 54 #define DISABLE_JUMP_MAGIC 1 56 #if DISABLE_JUMP_MAGIC 58 #define SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, logname, prio) \ 59 _static void SDL_Log##logname##name(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 60 va_list ap; initcall; va_start(ap, fmt); \ 61 jump_table.SDL_LogMessageV(category, SDL_LOG_PRIORITY_##prio, fmt, ap); \ 65 #define SDL_DYNAPI_VARARGS(_static, name, initcall) \ 66 _static int SDL_SetError##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 68 va_list ap; initcall; va_start(ap, fmt); \ 69 jump_table.SDL_vsnprintf(buf, sizeof (buf), fmt, ap); \ 71 return jump_table.SDL_SetError("%s", buf); \ 73 _static int SDL_sscanf##name(const char *buf, SDL_SCANF_FORMAT_STRING const char *fmt, ...) { \ 74 int retval; va_list ap; initcall; va_start(ap, fmt); \ 75 retval = jump_table.SDL_vsscanf(buf, fmt, ap); \ 79 _static int SDL_snprintf##name(SDL_OUT_Z_CAP(maxlen) char *buf, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 80 int retval; va_list ap; initcall; va_start(ap, fmt); \ 81 retval = jump_table.SDL_vsnprintf(buf, maxlen, fmt, ap); \ 85 _static void SDL_Log##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 86 va_list ap; initcall; va_start(ap, fmt); \ 87 jump_table.SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, ap); \ 90 _static void SDL_LogMessage##name(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 91 va_list ap; initcall; va_start(ap, fmt); \ 92 jump_table.SDL_LogMessageV(category, priority, fmt, ap); \ 95 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Verbose, VERBOSE) \ 96 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Debug, DEBUG) \ 97 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Info, INFO) \ 98 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Warn, WARN) \ 99 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Error, ERROR) \ 100 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Critical, CRITICAL) 107 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \ 108 typedef rc (*SDL_DYNAPIFN_##fn) params; \ 109 static rc fn##_DEFAULT params; \ 110 extern rc fn##_REAL params; 112 #undef SDL_DYNAPI_PROC 116 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) SDL_DYNAPIFN_##fn fn; 118 #undef SDL_DYNAPI_PROC 122 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) static rc fn##_DEFAULT params; 124 #undef SDL_DYNAPI_PROC 128 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) fn##_DEFAULT, 130 #undef SDL_DYNAPI_PROC 134 #if DISABLE_JUMP_MAGIC 135 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \ 136 static rc fn##_DEFAULT params { \ 137 SDL_InitDynamicAPI(); \ 138 ret jump_table.fn args; \ 140 #define SDL_DYNAPI_PROC_NO_VARARGS 1 142 #undef SDL_DYNAPI_PROC 143 #undef SDL_DYNAPI_PROC_NO_VARARGS 151 #if DISABLE_JUMP_MAGIC 152 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \ 153 rc fn params { ret jump_table.fn args; } 154 #define SDL_DYNAPI_PROC_NO_VARARGS 1 156 #undef SDL_DYNAPI_PROC 157 #undef SDL_DYNAPI_PROC_NO_VARARGS 179 }
else if (tablesize >
sizeof (jump_table)) {
184 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) jump_table.fn = fn##_REAL; 186 #undef SDL_DYNAPI_PROC 189 if (output_jump_table != &jump_table) {
190 jump_table.SDL_memcpy(output_jump_table, &jump_table, tablesize);
201 #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) 202 #ifndef WIN32_LEAN_AND_MEAN 203 #define WIN32_LEAN_AND_MEAN 1 208 HANDLE lib = LoadLibraryA(fname);
211 retval = GetProcAddress(lib, sym);
219 #elif defined(__HAIKU__) 220 #include <os/kernel/image.h> 223 image_id lib = load_add_on(fname);
226 if (get_image_symbol(lib, sym, B_SYMBOL_TYPE_TEXT, &retval) != B_NO_ERROR) {
233 #elif defined(unix) || defined(__unix__) || defined(__APPLE__) 237 void *lib = dlopen(fname, RTLD_NOW | RTLD_LOCAL);
240 retval = dlsym(lib, sym);
241 if (retval ==
NULL) {
248 #error Please define your platform. 255 const char *libname = SDL_getenv_REAL(
"SDL_DYNAMIC_API");
301 #if !SDL_ATOMIC_DISABLED 303 SDL_AtomicLock_REAL(&lock);
306 if (!already_initialized) {
311 #if !SDL_ATOMIC_DISABLED 312 SDL_AtomicUnlock_REAL(&lock);
GLenum GLsizei GLenum GLenum const void * table
static SDL_INLINE void * get_sdlapi_entry(const char *fname, const char *sym)
uint32_t Uint32
An unsigned 32-bit integer type.
Sint32(* SDL_DYNAPI_ENTRYFN)(Uint32 apiver, void *table, Uint32 tablesize)
#define SDL_DYNAPI_VERSION
static void SDL_InitDynamicAPI(void)
static SDL_DYNAPI_jump_table jump_table
static void SDL_InitDynamicAPILocked(void)
int32_t Sint32
A signed 32-bit integer type.
Sint32 SDL_DYNAPI_entry(Uint32, void *, Uint32)
#define SDL_DYNAPI_VARARGS(_static, name, initcall)