#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "const-c.inc" #include #include #define stdout PerlIO_stdout() #ifndef SDL_PERL_DEFINES_H #define SDL_PERL_DEFINES_H #endif PerlInterpreter *parent_perl = NULL; extern PerlInterpreter *parent_perl; PerlInterpreter *current_perl = NULL; void sdl_perl_atexit (void) { SDL_Quit(); } Uint32 add_timer_cb (Uint32 interval, void* param ) { Uint32 ret_interval; { if(!PERL_GET_CONTEXT) { PERL_SET_CONTEXT(current_perl); } dSP; int count; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(newSViv(interval))); PUTBACK; count = call_pv(param,G_SCALAR); SPAGAIN; if (count != 1 ) croak("callback returned more than 1 value\n"); ret_interval = POPi; PUTBACK; FREETMPS; LEAVE; } return ret_interval; } MODULE = SDLTimer PACKAGE = SDLTimer INCLUDE: const-xs.inc BOOT: PL_perl_destruct_level = 2; int init ( flags ) Uint32 flags CODE: RETVAL = SDL_Init(SDL_INIT_TIMER); atexit(sdl_perl_atexit); OUTPUT: RETVAL MODULE = SDLTimer PACKAGE = SDLTimer::Time SDL_TimerID time_add_timer ( interval, cmd ) Uint32 interval char *cmd CODE: if(!current_perl) { parent_perl = PERL_GET_CONTEXT; current_perl = perl_clone(parent_perl, CLONEf_KEEP_PTR_TABLE); PERL_SET_CONTEXT(parent_perl); } RETVAL = SDL_AddTimer(interval, add_timer_cb, (void *)cmd); OUTPUT: RETVAL