Skip to content

Commit

Permalink
sdl12-compat: filled in more functions.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
icculus committed Mar 7, 2013
1 parent c0dc6d8 commit 450bdf6
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 25 deletions.
119 changes: 94 additions & 25 deletions src/SDL12_compat.c
Expand Up @@ -29,18 +29,17 @@

#include "SDL_syswm.h"

#include <stdarg.h>

//#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
Expand All @@ -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
Expand All @@ -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


Expand All @@ -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;



Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -250,6 +234,7 @@ UnloadSDL20(void)
#include "SDL20_syms.h"
#undef SDL20_SYM_PASSTHROUGH
#undef SDL20_SYM
SDL20_SetError = NULL;
CloseSDL20Library();
}

Expand All @@ -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();
}
Expand All @@ -287,8 +273,8 @@ GetVideoDisplay()
}
}

int
SDL_Init(Uint32 sdl12flags)
static int
DoSDLInit(const int justsubs, Uint32 sdl12flags)
{
Uint32 sdl20flags = 0;
int rc;
Expand All @@ -302,24 +288,90 @@ 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)
{
SDL20_Quit();
UnloadSDL20();
}

void
SDL_SetError(const char *fmt, ...)
{
if (!Loaded_SDL20)
return;

}

char *
SDL_GetError(void)
Expand Down Expand Up @@ -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: */
48 changes: 48 additions & 0 deletions src/SDL20_syms.h
Expand Up @@ -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)
Expand Down Expand Up @@ -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: */

0 comments on commit 450bdf6

Please sign in to comment.