blitz3d/bbruntime/bbruntime.cpp

267 lines
6.5 KiB
C++

#include "std.h"
#include "bbsys.h"
#include "bbruntime.h"
void bbEnd(){
RTEX( 0 );
}
void bbStop(){
gx_runtime->debugStop();
if( !gx_runtime->idle() ) RTEX( 0 );
}
void bbAppTitle( BBStr *ti,BBStr *cp ){
gx_runtime->setTitle( *ti,*cp );
delete ti;delete cp;
}
void bbRuntimeError( BBStr *str ){
string t=*str;delete str;
if( t.size()>255 ) t[255]=0;
static char err[256];
strcpy( err,t.c_str() );
RTEX( err );
}
int bbExecFile( BBStr *f ){
string t=*f;delete f;
int n=gx_runtime->execute( t );
if( !gx_runtime->idle() ) RTEX( 0 );
return n;
}
void bbDelay( int ms ){
if( !gx_runtime->delay( ms ) ) RTEX( 0 );
}
int bbMilliSecs(){
return gx_runtime->getMilliSecs();
}
BBStr * bbCommandLine(){
return d_new BBStr( gx_runtime->commandLine() );
}
BBStr * bbSystemProperty( BBStr *p ){
string t=gx_runtime->systemProperty( *p );
delete p;return d_new BBStr( t );
}
BBStr * bbGetEnv( BBStr *env_var ){
char *p=getenv( env_var->c_str() );
BBStr *val=d_new BBStr( p ? p : "" );
delete env_var;
return val;
}
void bbSetEnv( BBStr *env_var,BBStr *val ){
string t=*env_var+"="+*val;
putenv( t.c_str() );
delete env_var;
delete val;
}
gxTimer * bbCreateTimer( int hertz ){
gxTimer *t=gx_runtime->createTimer( hertz );
return t;
}
int bbWaitTimer( gxTimer *t ){
int n=t->wait();
if( !gx_runtime->idle() ) RTEX( 0 );
return n;
}
void bbFreeTimer( gxTimer *t ){
gx_runtime->freeTimer( t );
}
void bbDebugLog( BBStr *t ){
gx_runtime->debugLog( t->c_str() );
delete t;
}
void _bbDebugStmt( int pos,const char *file ){
gx_runtime->debugStmt( pos,file );
if( !gx_runtime->idle() ) RTEX( 0 );
}
void _bbDebugEnter( void *frame,void *env,const char *func ){
gx_runtime->debugEnter( frame,env,func );
}
void _bbDebugLeave(){
gx_runtime->debugLeave();
}
bool basic_create();
bool basic_destroy();
void basic_link( void (*rtSym)( const char *sym,void *pc ) );
bool math_create();
bool math_destroy();
void math_link( void (*rtSym)( const char *sym,void *pc ) );
bool string_create();
bool string_destroy();
void string_link( void (*rtSym)( const char *sym,void *pc ) );
bool stream_create();
bool stream_destroy();
void stream_link( void (*rtSym)( const char *sym,void *pc ) );
bool sockets_create();
bool sockets_destroy();
void sockets_link( void (*rtSym)( const char *sym,void *pc ) );
bool filesystem_create();
bool filesystem_destroy();
void filesystem_link( void (*rtSym)( const char *sym,void *pc ) );
bool bank_create();
bool bank_destroy();
void bank_link( void (*rtSym)( const char *sym,void *pc ) );
bool graphics_create();
bool graphics_destroy();
void graphics_link( void (*rtSym)( const char *sym,void *pc ) );
bool input_create();
bool input_destroy();
void input_link( void (*rtSym)( const char *sym,void *pc ) );
bool audio_create();
bool audio_destroy();
void audio_link( void (*rtSym)( const char *sym,void *pc ) );
bool multiplay_create();
bool multiplay_destroy();
void multiplay_link( void (*rtSym)( const char *sym,void *pc ) );
bool userlibs_create();
void userlibs_destroy();
void userlibs_link( void (*rtSym)( const char *sym,void *pc ) );
#ifdef PRO
bool blitz3d_create();
bool blitz3d_destroy();
void blitz3d_link( void (*rtSym)( const char *sym,void *pc ) );
#else
bool blitz3d_create(){ return true; }
bool blitz3d_destroy(){ return true; }
void blitz3d_link( void (*rtSym)( const char *sym,void *pc ) ){}
#endif
void bbruntime_link( void (*rtSym)( const char *sym,void *pc ) ){
rtSym( "End",bbEnd );
rtSym( "Stop",bbStop );
rtSym( "AppTitle$title$close_prompt=\"\"",bbAppTitle );
rtSym( "RuntimeError$message",bbRuntimeError );
rtSym( "ExecFile$command",bbExecFile );
rtSym( "Delay%millisecs",bbDelay );
rtSym( "%MilliSecs",bbMilliSecs );
rtSym( "$CommandLine",bbCommandLine );
rtSym( "$SystemProperty$property",bbSystemProperty );
rtSym( "$GetEnv$env_var",bbGetEnv );
rtSym( "SetEnv$env_var$value",bbSetEnv );
rtSym( "%CreateTimer%hertz",bbCreateTimer );
rtSym( "%WaitTimer%timer",bbWaitTimer );
rtSym( "FreeTimer%timer",bbFreeTimer );
rtSym( "DebugLog$text",bbDebugLog );
rtSym( "_bbDebugStmt",_bbDebugStmt );
rtSym( "_bbDebugEnter",_bbDebugEnter );
rtSym( "_bbDebugLeave",_bbDebugLeave );
basic_link( rtSym );
math_link( rtSym );
string_link( rtSym );
stream_link( rtSym );
sockets_link( rtSym );
filesystem_link( rtSym );
bank_link( rtSym );
graphics_link( rtSym );
input_link( rtSym );
audio_link( rtSym );
multiplay_link( rtSym );
blitz3d_link( rtSym );
userlibs_link( rtSym );
}
//start up error
static void sue( const char *t ){
string p=string( "Startup Error: " )+t;
gx_runtime->debugInfo( p.c_str() );
}
bool bbruntime_create(){
if( basic_create() ){
if( math_create() ){
if( string_create() ){
if( stream_create() ){
if( sockets_create() ){
if( filesystem_create() ){
if( bank_create() ){
if( graphics_create() ){
if( input_create() ){
if( audio_create() ){
if( multiplay_create() ){
if( blitz3d_create() ){
if( userlibs_create() ){
return true;
}
}else sue( "blitz3d_create failed" );
multiplay_destroy();
}else sue( "multiplay_create failed" );
audio_destroy();
}else sue( "audio_create failed" );
input_destroy();
}else sue( "input_create failed" );
graphics_destroy();
}else sue( "graphics_create failed" );
bank_destroy();
}else sue( "bank_create failed" );
filesystem_destroy();
}else sue( "filesystem_create failed" );
sockets_destroy();
}else sue( "sockets_create failed" );
stream_destroy();
}else sue( "stream_create failed" );
string_destroy();
}else sue( "string_create failed" );
math_destroy();
}else sue( "math_create failed" );
basic_destroy();
}else sue( "basic_create failed" );
return false;
}
bool bbruntime_destroy(){
userlibs_destroy();
blitz3d_destroy();
multiplay_destroy();
audio_destroy();
input_destroy();
graphics_destroy();
bank_destroy();
filesystem_destroy();
sockets_destroy();
stream_destroy();
string_destroy();
math_destroy();
basic_destroy();
return true;
}
const char *bbruntime_run( gxRuntime *rt,void (*pc)(),bool dbg ){
debug=dbg;
gx_runtime=rt;
if( !bbruntime_create() ) return "Unable to start program";
const char *t=0;
try{
if( !gx_runtime->idle() ) RTEX( 0 );
pc();
gx_runtime->debugInfo( "Program has ended" );
}catch( bbEx x ){
t=x.err;
}
bbruntime_destroy();
return t;
}
void bbruntime_panic( const char *err ){
RTEX( err );
}