29 #define INCL_DOSERRORS 48 #define SDL_DYNAPI_VERSION 1 60 #define DISABLE_JUMP_MAGIC 1 62 #if DISABLE_JUMP_MAGIC 64 #define SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, logname, prio) \ 65 _static void SDLCALL SDL_Log##logname##name(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 66 va_list ap; initcall; va_start(ap, fmt); \ 67 jump_table.SDL_LogMessageV(category, SDL_LOG_PRIORITY_##prio, fmt, ap); \ 71 #define SDL_DYNAPI_VARARGS(_static, name, initcall) \ 72 _static int SDLCALL SDL_SetError##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 74 va_list ap; initcall; va_start(ap, fmt); \ 75 jump_table.SDL_vsnprintf(buf, sizeof (buf), fmt, ap); \ 77 return jump_table.SDL_SetError("%s", buf); \ 79 _static int SDLCALL SDL_sscanf##name(const char *buf, SDL_SCANF_FORMAT_STRING const char *fmt, ...) { \ 80 int retval; va_list ap; initcall; va_start(ap, fmt); \ 81 retval = jump_table.SDL_vsscanf(buf, fmt, ap); \ 85 _static int SDLCALL SDL_snprintf##name(SDL_OUT_Z_CAP(maxlen) char *buf, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 86 int retval; va_list ap; initcall; va_start(ap, fmt); \ 87 retval = jump_table.SDL_vsnprintf(buf, maxlen, fmt, ap); \ 91 _static void SDLCALL SDL_Log##name(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 92 va_list ap; initcall; va_start(ap, fmt); \ 93 jump_table.SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, ap); \ 96 _static void SDLCALL SDL_LogMessage##name(int category, SDL_LogPriority priority, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) { \ 97 va_list ap; initcall; va_start(ap, fmt); \ 98 jump_table.SDL_LogMessageV(category, priority, fmt, ap); \ 101 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Verbose, VERBOSE) \ 102 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Debug, DEBUG) \ 103 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Info, INFO) \ 104 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Warn, WARN) \ 105 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Error, ERROR) \ 106 SDL_DYNAPI_VARARGS_LOGFN(_static, name, initcall, Critical, CRITICAL) 113 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \ 114 typedef rc (SDLCALL *SDL_DYNAPIFN_##fn) params; \ 115 static rc SDLCALL fn##_DEFAULT params; \ 116 extern rc SDLCALL fn##_REAL params; 118 #undef SDL_DYNAPI_PROC 122 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) SDL_DYNAPIFN_##fn fn; 124 #undef SDL_DYNAPI_PROC 128 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) static rc SDLCALL fn##_DEFAULT params; 130 #undef SDL_DYNAPI_PROC 134 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) fn##_DEFAULT, 136 #undef SDL_DYNAPI_PROC 140 #if DISABLE_JUMP_MAGIC 141 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \ 142 static rc SDLCALL fn##_DEFAULT params { \ 143 SDL_InitDynamicAPI(); \ 144 ret jump_table.fn args; \ 146 #define SDL_DYNAPI_PROC_NO_VARARGS 1 148 #undef SDL_DYNAPI_PROC 149 #undef SDL_DYNAPI_PROC_NO_VARARGS 157 #if DISABLE_JUMP_MAGIC 158 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) \ 159 rc SDLCALL fn params { ret jump_table.fn args; } 160 #define SDL_DYNAPI_PROC_NO_VARARGS 1 162 #undef SDL_DYNAPI_PROC 163 #undef SDL_DYNAPI_PROC_NO_VARARGS 180 }
else if (tablesize >
sizeof (jump_table)) {
185 #define SDL_DYNAPI_PROC(rc,fn,params,args,ret) jump_table.fn = fn##_REAL; 187 #undef SDL_DYNAPI_PROC 190 if (output_jump_table != &jump_table) {
191 jump_table.SDL_memcpy(output_jump_table, &jump_table, tablesize);
214 #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) 215 #ifndef WIN32_LEAN_AND_MEAN 216 #define WIN32_LEAN_AND_MEAN 1 221 HANDLE lib = LoadLibraryA(fname);
224 retval = GetProcAddress(lib, sym);
225 if (retval ==
NULL) {
232 #elif defined(unix) || defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) || defined(__QNX__) 236 void *lib = dlopen(fname, RTLD_NOW | RTLD_LOCAL);
239 retval = dlsym(lib, sym);
247 #elif defined(__OS2__) 253 if (DosLoadModule(&error,
sizeof(error), fname, &hmodule) == NO_ERROR) {
254 if (DosQueryProcAddr(hmodule, 0, sym, &retval) != NO_ERROR) {
255 DosFreeModule(hmodule);
262 #error Please define your platform. 269 const char *libname = SDL_getenv_REAL(
"SDL_DYNAMIC_API");
314 #if !SDL_ATOMIC_DISABLED 316 SDL_AtomicLock_REAL(&lock);
319 if (!already_initialized) {
324 #if !SDL_ATOMIC_DISABLED 325 SDL_AtomicUnlock_REAL(&lock);
GLenum GLsizei GLenum GLenum const void * table
static SDL_INLINE void * get_sdlapi_entry(const char *fname, const char *sym)
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)
Sint32 SDL_DYNAPI_entry(Uint32, void *, Uint32)
#define SDL_DYNAPI_VARARGS(_static, name, initcall)
static Sint32 initialize_jumptable(Uint32 apiver, void *table, Uint32 tablesize)