From 450bdf64cc95a8e8b85abb968ce1dd99284f50c4 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 7 Mar 2013 01:57:55 -0500 Subject: [PATCH] sdl12-compat: filled in more functions. Note that this counts on _every_ stdinc API to exist in the SDL2 binary. We'll need to change how SDL2 handles this to always offer those symbols, even if they're just passthroughs to the C runtime or whatever. --- src/SDL12_compat.c | 119 +++++++++++++++++++++++++++++++++++---------- src/SDL20_syms.h | 48 ++++++++++++++++++ 2 files changed, 142 insertions(+), 25 deletions(-) diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c index bb49f4d17..e944688fd 100644 --- a/src/SDL12_compat.c +++ b/src/SDL12_compat.c @@ -29,18 +29,17 @@ #include "SDL_syswm.h" +#include + //#include "video/SDL_sysvideo.h" //#include "video/SDL_pixels_c.h" //#include "render/SDL_yuv_sw_c.h" -// !!! IMPLEMENT_ME SDL_AudioInit -// !!! IMPLEMENT_ME SDL_AudioQuit // !!! IMPLEMENT_ME SDL_ConvertSurface // !!! IMPLEMENT_ME SDL_CreateCursor // !!! IMPLEMENT_ME SDL_CreateRGBSurface // !!! IMPLEMENT_ME SDL_CreateRGBSurfaceFrom // !!! IMPLEMENT_ME SDL_CreateThread -// !!! IMPLEMENT_ME SDL_Error // !!! IMPLEMENT_ME SDL_EventState // !!! IMPLEMENT_ME SDL_FillRect // !!! IMPLEMENT_ME SDL_FreeCursor @@ -62,7 +61,6 @@ // !!! IMPLEMENT_ME SDL_GetRGB // !!! IMPLEMENT_ME SDL_GetRGBA // !!! IMPLEMENT_ME SDL_GetRelativeMouseState -// !!! IMPLEMENT_ME SDL_InitSubSystem // !!! IMPLEMENT_ME SDL_LoadBMP_RW // !!! IMPLEMENT_ME SDL_LoadWAV_RW // !!! IMPLEMENT_ME SDL_LockSurface @@ -73,34 +71,17 @@ // !!! IMPLEMENT_ME SDL_PollEvent // !!! IMPLEMENT_ME SDL_PumpEvents // !!! IMPLEMENT_ME SDL_PushEvent -// !!! IMPLEMENT_ME SDL_QuitSubSystem // !!! IMPLEMENT_ME SDL_SaveBMP_RW // !!! IMPLEMENT_ME SDL_SetClipRect // !!! IMPLEMENT_ME SDL_SetColorKey // !!! IMPLEMENT_ME SDL_SetCursor -// !!! IMPLEMENT_ME SDL_SetError // !!! IMPLEMENT_ME SDL_SetEventFilter // !!! IMPLEMENT_ME SDL_SetModState // !!! IMPLEMENT_ME SDL_ShowCursor // !!! IMPLEMENT_ME SDL_SoftStretch // !!! IMPLEMENT_ME SDL_UnlockSurface // !!! IMPLEMENT_ME SDL_UpperBlit -// !!! IMPLEMENT_ME SDL_VideoInit -// !!! IMPLEMENT_ME SDL_VideoQuit // !!! IMPLEMENT_ME SDL_WaitEvent -// !!! IMPLEMENT_ME SDL_WasInit -// !!! IMPLEMENT_ME SDL_iconv -// !!! IMPLEMENT_ME SDL_iconv_string -// !!! IMPLEMENT_ME SDL_lltoa -// !!! IMPLEMENT_ME SDL_ltoa -// !!! IMPLEMENT_ME SDL_revcpy -// !!! IMPLEMENT_ME SDL_strlcat -// !!! IMPLEMENT_ME SDL_strlcpy -// !!! IMPLEMENT_ME SDL_strlwr -// !!! IMPLEMENT_ME SDL_strrev -// !!! IMPLEMENT_ME SDL_strupr -// !!! IMPLEMENT_ME SDL_ulltoa -// !!! IMPLEMENT_ME SDL_ultoa // !!! IMPLEMENT_ME X11_KeyToUnicode @@ -113,6 +94,8 @@ #undef SDL20_SYM_PASSTHROUGH #undef SDL20_SYM +typedef void (*SDL20_SetError_t)(const char *fmt, ...); +static SDL20_SetError_t SDL20_SetError = NULL; @@ -207,6 +190,7 @@ static char *wm_icon_caption = NULL; static SDL_Surface *SDL_VideoIcon; static int SDL_enabled_UNICODE = 0; static int SDL_VideoDisplayIndex = 0; +static int SDL_CDRomInit = 0; /* Obviously we can't use SDL_LoadObject() to load SDL2. :) */ #if defined(_WINDOWS) @@ -250,6 +234,7 @@ UnloadSDL20(void) #include "SDL20_syms.h" #undef SDL20_SYM_PASSTHROUGH #undef SDL20_SYM + SDL20_SetError = NULL; CloseSDL20Library(); } @@ -265,6 +250,7 @@ LoadSDL20(void) #include "SDL20_syms.h" #undef SDL20_SYM_PASSTHROUGH #undef SDL20_SYM + SDL20_SetError = (SDL20_SetError_t) LoadSDL20Symbol("SDL_SetError", &okay); if (!okay) UnloadSDL20(); } @@ -287,8 +273,8 @@ GetVideoDisplay() } } -int -SDL_Init(Uint32 sdl12flags) +static int +DoSDLInit(const int justsubs, Uint32 sdl12flags) { Uint32 sdl20flags = 0; int rc; @@ -302,17 +288,76 @@ SDL_Init(Uint32 sdl12flags) SETFLAG(VIDEO); SETFLAG(JOYSTICK); SETFLAG(NOPARACHUTE); - // There's no CDROM in 2.0, but we'll just pretend it succeeded. #undef SETFLAG + // There's no CDROM in 2.0, but we'll just pretend it succeeded. + if (sdl12flags & SDL12_INIT_CDROM) + SDL_CDRomInit = 1; + // !!! FIXME: do something about SDL12_INIT_EVENTTHREAD - rc = SDL20_Init(sdl20flags); + rc = justsubs ? SDL20_InitSubSystem(sdl20flags) : SDL20_Init(sdl20flags); if ((rc == 0) && (sdl20flags & SDL_INIT_VIDEO)) SDL_VideoDisplayIndex = GetVideoDisplay(); return rc; } +int +SDL_InitSubSystem(Uint32 sdl12flags) +{ + return DoSDLInit(1, sdl12flags); +} + +int +SDL_Init(Uint32 sdl12flags) +{ + return DoSDLInit(0, sdl12flags); +} + +Uint32 +SDL_WasInit(Uint32 sdl12flags) +{ + // !!! FIXME: this is cut and pasted several places. + Uint32 sdl20flags = 0; + Uint32 extraflags = 0; + + #define SETFLAG(x) if (sdl12flags & SDL12_INIT_##flag) sdl20flags |= SDL_INIT_##flag) + SETFLAG(TIMER); + SETFLAG(AUDIO); + SETFLAG(VIDEO); + SETFLAG(JOYSTICK); + SETFLAG(NOPARACHUTE); + #undef SETFLAG + + if ((sdl12flags & SDL12_INIT_CDROM) && (SDL_CDRomInit)) + extraflags |= SDL12_INIT_CDROM; + + // !!! FIXME: do something about SDL12_INIT_EVENTTHREAD + + // !!! FIXME: convert back to 1.2 + return SDL20_WasInit(sdl20flags) | extraflags; +} + +void +SDL_QuitSubSystem(Uint32 sdl12flags) +{ + Uint32 sdl20flags = 0; + + #define SETFLAG(x) if (sdl12flags & SDL12_INIT_##flag) sdl20flags |= SDL_INIT_##flag) + SETFLAG(TIMER); + SETFLAG(AUDIO); + SETFLAG(VIDEO); + SETFLAG(JOYSTICK); + SETFLAG(NOPARACHUTE); + // There's no CDROM in 2.0, but we'll just pretend it succeeded. + #undef SETFLAG + + // !!! FIXME: do something about SDL12_INIT_EVENTTHREAD + SDL20_QuitSubSystem(sdl20flags); + + // !!! FIXME: UnloadSDL20() ? +} + void SDL_Quit(void) { @@ -320,6 +365,13 @@ SDL_Quit(void) UnloadSDL20(); } +void +SDL_SetError(const char *fmt, ...) +{ + if (!Loaded_SDL20) + return; + +} char * SDL_GetError(void) @@ -2279,4 +2331,21 @@ BYTESWAP_AND_WRITE(BE,64) #undef SDL20_SYM_PASSTHROUGH #undef SDL20_SYM +void +SDL_SetError(const char *fmt, ...) +{ + char *str = NULL; + va_list ap; + va_start(ap, fmt); + vasprintf(&str, fmt, ap); + va_end(ap); + if (!str) + SDL20_OutOfMemory(); + else + { + SDL20_SetError("%s", str); + free(str); + } +} + /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/SDL20_syms.h b/src/SDL20_syms.h index 4d3550d79..159c76309 100644 --- a/src/SDL20_syms.h +++ b/src/SDL20_syms.h @@ -22,10 +22,17 @@ /* don't #pragma once this file, it gets #included multiple times! */ SDL20_SYM(int,Init,(Uint32 a),(a),return) +SDL20_SYM(int,InitSubSystem,(Uint32 a),(a),return) SDL20_SYM(char*,GetError,(void),(),return) +SDL20_SYM_PASSTHROUGH(void,SDL_Error,(SDL_errorcode a),(a),) /*SDL20_SYM_PASSTHROUGH(void,SetError,(const char *fmt, ...);*/ SDL20_SYM_PASSTHROUGH(void,ClearError,(void),(),) SDL20_SYM(void,Quit,(void),(),) +SDL20_SYM(void,QuitSubSystem,(Uint32 a),(a),) +SDL20_SYM_PASSTHROUGH(int,VideoInit,(const char *a),(a),return) +SDL20_SYM_PASSTHROUGH(void,VideoQuit,(void),(),) +SDL20_SYM_PASSTHROUGH(int,AudioInit,(const char *a),(a),return) +SDL20_SYM_PASSTHROUGH(void,AudioQuit,(void),(),) SDL20_SYM_PASSTHROUGH(Uint32,GetThreadID,(SDL_Thread *a),(a),return) SDL20_SYM_PASSTHROUGH(Uint32,ThreadID,(void),(),return) @@ -101,5 +108,46 @@ SDL20_SYM(SDL_RWops *,SDL_RWFromFP,(FILE *a, int b),(a,b),return) SDL20_SYM(SDL_RWops *,SDL_RWFromMem,(void *a, int b),(a,b),return) SDL20_SYM(SDL_RWops *,SDL_RWFromConstMem,(const void *a, int b),(a,b),return) +SDL20_SYM_PASSTHROUGH(void *,SDL_malloc,(size_t a),(a),return) +SDL20_SYM_PASSTHROUGH(void *,SDL_calloc,(size_t a, size_t b),(a,b),return) +SDL20_SYM_PASSTHROUGH(void *,SDL_realloc,(void *a, size_t b),(a,b),return) +SDL20_SYM_PASSTHROUGH(void,SDL_free,(void *a),(a),) +SDL20_SYM_PASSTHROUGH(char *,SDL_getenv,(const char *a),(a),return) +SDL20_SYM_PASSTHROUGH(void,SDL_qsort,(void *a, size_t b, size_t c, int (*d)(const void *, const void *)),(a,b,c,d),) +SDL20_SYM_PASSTHROUGH(void *,SDL_memset,(void *a, int b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(void *,SDL_memcpy,(void *a, const void *b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(void *,SDL_revcpy,(void *a, const void *b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(int,SDL_memcmp,(const void *a, const void *b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(size_t,SDL_strlen,(const char *a),(a),return) +SDL20_SYM_PASSTHROUGH(size_t,SDL_strlcpy,(char *a, const char *b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(size_t,SDL_strlcat,(char *a, const char *b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strdup,(const char *a),(a),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strrev,(char *a),(a),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strupr,(char *a),(a),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strlwr,(char *a),(a),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strchr,(const char *a, int b),(a,b),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strrchr,(const char *a, int b),(a,b),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_strstr,(const char *a, const char *b),(a,b),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_ltoa,(long a, char *b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_ultoa,(unsigned long a, char *b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(long,SDL_strtol,(const char *a, char **b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(unsigned long,SDL_strtoul,(const char *a, char **b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(char*,SDL_lltoa,(Sint64 a, char *b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(char*,SDL_ulltoa,(Uint64 a, char *b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(Sint64,SDL_strtoll,(const char *a, char **b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(Uint64,SDL_strtoull,(const char *a, char **b, int c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(double,SDL_strtod,(const char *a, char **b),(a,b),return) +SDL20_SYM_PASSTHROUGH(int,SDL_strcmp,(const char *a, const char *b),(a,b),return) +SDL20_SYM_PASSTHROUGH(int,SDL_strncmp,(const char *a, const char *b, size_t c),(a,b,c),return) +SDL20_SYM_PASSTHROUGH(int,SDL_strcasecmp,(const char *a, const char *b),(a,b),return) +SDL20_SYM_PASSTHROUGH(int,SDL_strncasecmp,(const char *a, const char *b, size_t c),(a,b,c),return) +//SDL20_SYM_PASSTHROUGH(int,SDL_sscanf,(const char *text, const char *fmt, ...); +//SDL20_SYM_PASSTHROUGH(int,SDL_snprintf,(char *text, size_t maxlen, const char *fmt, ...); +SDL20_SYM_PASSTHROUGH(int,SDL_vsnprintf,(char *a, size_t b, const char *c, va_list d),(a,b,c,d),return) +SDL20_SYM_PASSTHROUGH(SDL_iconv_t,SDL_iconv_open,(const char *a, const char *b),(a,b),return) +SDL20_SYM_PASSTHROUGH(int,SDL_iconv_close,(SDL_iconv_t a),(a),return) +SDL20_SYM_PASSTHROUGH(size_t,SDL_iconv,(SDL_iconv_t a, const char **b, size_t *c, char **d, size_t *e),(a,b,c,d,e),return) +SDL20_SYM_PASSTHROUGH(char *,SDL_iconv_string,(const char *a, const char *b, const char *c, size_t d),(a,b,c,d),return) + /* vi: set ts=4 sw=4 expandtab: */