123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- #include "KSGSFunktion.h"
- #include "../Leser/KSGSLeser.h"
- #include "../Main/KSGScriptObj.h"
- #include "../Klassen/KSGSThread.h"
- #include "../Error/Error.h"
- #include "../Klassen/KSGSTyp.h"
- #include <iostream>
- using namespace KSGScript;
- // Inhalt der KSGSFunktionInstanz Klasse aus KSGSFunktion.h
- // Konstruktor
- KSGSFunktionInstanz::KSGSFunktionInstanz( RCArray< KSGSBefehl > *ba, int rt, KSGScriptObj *obj, KSGSVariable *klasse )
- : Thread()
- {
- lokaleVariablen = new RCArray< KSGSVariable >();
- befehle = ba;
- this->klasse = klasse;
- this->obj = obj;
- threadVar = 0;
- returnTyp = rt;
- retVar = 0;
- pausiert = 0;
- beendet = 0;
- breakB = 0;
- continueB = 0;
- scrId = obj->getScriptId();
- ref = 1;
- }
- // Destruktor
- KSGSFunktionInstanz::~KSGSFunktionInstanz()
- {
- lokaleVariablen->release();
- befehle->release();
- if( klasse )
- klasse->release();
- obj->release();
- if( threadVar )
- threadVar->release();
- if( retVar )
- retVar->release();
- }
- // privat
- void KSGSFunktionInstanz::lock()
- {
- cs.lock();
- }
- void KSGSFunktionInstanz::unlock()
- {
- cs.unlock();
- }
- // nicht constant
- void KSGSFunktionInstanz::setParameter( Array< KSGSVariableDef* > *zDef, RCArray< KSGSVariable > *vars )
- {
- int anz = zDef->getEintragAnzahl();
- for( int i = 0; i < anz; i++ )
- {
- int id = zDef->get( i )->id;
- if( vars->z( id ) )
- {
- if( zDef->get( i )->typId != vars->z( id )->getTyp() )
- {
- KSGSVariable *var = vars->z( id )->umwandelnIn( zDef->get( i )->typId );
- if( !var )
- lokaleVariablen->set( KSGSKlasseInstanz::erstellVariable( obj, zDef->get( i ) ), id );
- else
- lokaleVariablen->set( var, id );
- }
- else
- lokaleVariablen->set( vars->get( id ), id );
- }
- else
- lokaleVariablen->set( KSGSKlasseInstanz::erstellVariable( obj, zDef->get( i ) ), id );
- }
- vars->release();
- }
- void KSGSFunktionInstanz::setReturnVariable( KSGSVariable *var )
- {
- if( var->getTyp() != returnTyp )
- {
- error( 15, {}, obj );
- KSGSVariable *tmp = var->umwandelnIn( returnTyp );
- var->release();
- var = tmp;
- }
- lock();
- if( retVar )
- retVar->release();
- retVar = var;
- unlock();
- }
- void KSGSFunktionInstanz::setPause( bool p )
- {
- pausiert = p;
- }
- void KSGSFunktionInstanz::setContinue()
- {
- continueB = 1;
- }
- void KSGSFunktionInstanz::setBreak()
- {
- breakB = 0;
- }
- void KSGSFunktionInstanz::setEnde()
- {
- beendet = 1;
- }
- KSGSVariable *KSGSFunktionInstanz::startFunktion()
- {
- if( run )
- return 0;
- if( threadVar )
- threadVar = (KSGSThreadKlasse*)threadVar->release();
- if( retVar )
- retVar = retVar->release();
- if( returnTyp == KSGS_THREAD )
- {
- threadVar = new KSGSThreadKlasse( obj, getThis() );
- start();
- return threadVar->getThis();
- }
- else
- {
- run = 1;
- thread();
- warteAufFunktion( INFINITE );
- return retVar ? retVar->getThis() : 0;
- }
- }
- void KSGSFunktionInstanz::thread()
- {
- getThis();
- int anz = befehle->getEintragAnzahl();
- for( int i = 0; i < anz; i++ )
- {
- while( pausiert && !beendet && !obj->istBeendet( scrId ) )
- Sleep( 100 );
- if( obj->istBeendet( scrId ) || beendet )
- break;
- KSGSBefehl *b = befehle->z( i );
- if( b )
- {
- KSGSVariable *var = b->ausführen( obj, this, klasse );
- if( var )
- var->release();
- }
- }
- run = 0;
- if( threadVar )
- {
- threadVar->threadEnde();
- threadVar = (KSGSThreadKlasse*)threadVar->release();
- }
- release();
- }
- int KSGSFunktionInstanz::getStatus()
- {
- if( !isRunning() || beendet )
- return 0;
- if( pausiert )
- return 1;
- if( breakB )
- {
- breakB = 0;
- return 2;
- }
- if( continueB )
- {
- continueB = 0;
- return 3;
- }
- return 4;
- }
- void KSGSFunktionInstanz::setVariable( int id, KSGSVariable *var )
- {
- lokaleVariablen->set( var, id );
- }
- // constant
- KSGSVariable *KSGSFunktionInstanz::getVariable( int id ) const
- {
- return lokaleVariablen->get( id );
- }
- int KSGSFunktionInstanz::getReturnTyp() const
- {
- return returnTyp;
- }
- bool KSGSFunktionInstanz::wirdFunktionAusgeführt() const
- {
- return isRunning();
- }
- int KSGSFunktionInstanz::warteAufFunktion( int zeit )
- {
- if( run )
- return warteAufThread( zeit );
- return 0;
- }
- bool KSGSFunktionInstanz::wirdAusgeführt() const
- {
- return isRunning() && !beendet && !pausiert;
- }
- // Reference Counting
- KSGSFunktionInstanz *KSGSFunktionInstanz::getThis()
- {
- ref++;
- return this;
- }
- KSGSFunktionInstanz *KSGSFunktionInstanz::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
- // Inhalt der KSGSFunktion Klasse aus KSGSFunktion.h
- // Konstruktor
- KSGSFunktion::KSGSFunktion( int id, int sichtbar, int typ )
- : typId( typ ),
- sichtbar( sichtbar ),
- id( id ),
- ref( 1 )
- {
- befehle = new RCArray< KSGSBefehl >();
- parameter = new Array< KSGSVariableDef* >();
- name = "";
- }
- // Destruktor
- KSGSFunktion::~KSGSFunktion()
- {
- if( befehle )
- befehle->release();
- int anz = parameter->getEintragAnzahl();
- for( int i = 0; i < anz; i++ )
- delete parameter->get( i );
- if( parameter )
- parameter->release();
- }
- // nicht constant
- void KSGSFunktion::setName( const char *txt )
- {
- name = txt;
- }
- void KSGSFunktion::addParameter( KSGSVariableDef *var )
- {
- parameter->add( var );
- }
- void KSGSFunktion::addBefehl( KSGSBefehl *befehl )
- {
- befehle->add( befehl );
- }
- KSGSFunktionInstanz *KSGSFunktion::erstellInstanz( KSGScriptObj *obj, KSGSVariable *klasse, RCArray< KSGSVariable > *params )
- {
- KSGSFunktionInstanz *inst = new KSGSFunktionInstanz( befehle->getThis(), typId, obj, klasse );
- if( params )
- inst->setParameter( parameter, params );
- return inst;
- }
- // constant
- int KSGSFunktion::getId() const
- {
- return id;
- }
- int KSGSFunktion::getTypId() const
- {
- return typId;
- }
- int KSGSFunktion::getSichtbarkeit() const
- {
- return sichtbar;
- }
- bool KSGSFunktion::hatName( const char *txt ) const
- {
- return name.istGleich( txt );
- }
- // Reference Counting
- KSGSFunktion *KSGSFunktion::getThis()
- {
- ref++;
- return this;
- }
- KSGSFunktion *KSGSFunktion::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|