55 void Mission::doImport(
missionNode *node,
int mode )
60 fatalError( node, mode,
"you have to give a name to import" );
64 import_stack.push_back( name );
70 void Mission::doModule(
missionNode *node,
int mode )
76 fatalError( node, mode,
"you have to give a module name" );
80 fatalError( node, mode,
"there can only be one module with name "+name );
83 if (name ==
"director")
90 debug( 10, node, mode,
"created classinst 0" );
94 scope_stack.push_back( node );
96 current_module = node;
98 debug( 5, node, mode,
"added module "+name+
" to list of known modules" );
105 vector< easyDomNode* >::const_iterator siter;
106 for (siter = node->
subnodes.begin(); siter != node->
subnodes.end(); siter++) {
109 varInst *vi = doScript( snode, mode );
112 doDefVar( snode, mode );
114 doGlobals( snode, mode );
116 doImport( snode, mode );
118 fatalError( snode, mode,
"unkown node type for module subnodes" );
123 scope_stack.pop_back();
145 void Mission::removeContextStack()
167 stack->
contexts.push_back( context );
169 debug( 5, node,
SCRIPT_RUN,
"added context for this node" );
177 void Mission::removeContext()
181 int lastelem = stack->
contexts.size()-1;
186 vsUMap< string, varInst* >::const_iterator iter;
203 current_script = node;
207 fatalError( node, mode,
"you have to give a script name" );
209 debug( 5, node, mode,
"added to module "+current_module->
script.
name+
" : script ="+node->
script.
name );
214 if (retvalue.empty() || retvalue ==
"void")
219 scope_stack.push_back( node );
221 debug( 5, node, mode,
"executing script name="+node->
script.
name );
223 addContextStack( node );
226 vector< easyDomNode* >::const_iterator siter;
231 for (siter = node->
subnodes.begin(); siter != node->
subnodes.end() && !have_return( mode ); siter++) {
234 doArguments( snode, mode, varmap );
239 debug( 3, node, mode, buffer );
244 checkStatement( snode, mode );
254 fatalError( node, mode,
"doScript: return type not set correctly" );
259 fatalError( node, mode,
"no return set from doScript" );
266 assignVariable( viret, vi );
268 removeContextStack();
272 scope_stack.pop_back();
281 int nr_arguments = 0;
284 vector< easyDomNode* >::const_iterator siter;
285 for (siter = node->
subnodes.begin(); siter != node->
subnodes.end(); siter++) {
288 doDefVar( snode, mode );
291 fatalError( node, mode,
"only defvars allowed below argument node" );
301 int nr_called = varmap->size();
302 if (nr_arguments != nr_called) {
303 fatalError( node, mode,
"wrong number of args in doScript " );
306 for (
int i = 0;
i < nr_arguments;
i++) {
309 doDefVar( defnode, mode );
310 varInst *vi = doVariable( defnode, mode );
313 if (call_vi == NULL) {
314 fatalError( node, mode,
"argument var "+node->
script.
name+
" no found in varmap" );
317 assignVariable( vi, call_vi );
321 if (nr_arguments != 0) {
322 fatalError( node, mode,
"doScript expected to be called with arguments" );
337 void Mission::doReturn(
missionNode *node,
int mode )
351 fatalError( node, mode,
"script returning void, but return statement with node" );
357 fatalError( node, mode,
"return statement needs only one subnode" );
362 bool res = checkBoolExpr( expr, mode );
365 double res = checkFloatExpr( expr, mode );
368 int res = checkIntExpr( expr, mode );
371 varInst *vi2 = checkObjectExpr( expr, mode );
373 assignVariable( vi, vi2 );
375 fatalError( node, mode,
"unkown variable type" );
390 void Mission::doBlock(
missionNode *node,
int mode )
394 scope_stack.push_back( node );
397 vector< easyDomNode* >::const_iterator siter;
398 for (siter = node->
subnodes.begin(); siter != node->
subnodes.end() && !have_return( mode ); siter++) {
400 checkStatement( snode, mode );
405 scope_stack.pop_back();
415 if ( name.empty() ) {
416 fatalError( node, mode,
"you have to give name to exec" );
421 string use_modstr = node->
attr_value(
"module" );
424 if ( !use_modstr.empty() ) {
427 module = current_module;
429 if (module == NULL) {
430 fatalError( node, mode,
"module "+use_modstr+
" not found" );
434 if (script == NULL) {
435 fatalError( node, mode,
"script "+name+
" not found in module "+use_modstr );
445 if (arg_node == NULL)
449 int nr_exec_args = node->
subnodes.size();
450 if (nr_arguments != nr_exec_args) {
452 sprintf( buffer,
"wrong nr of arguments in doExec=%d doScript=%d", nr_exec_args, nr_arguments );
453 fatalError( node, mode, buffer );
457 if (nr_arguments > 0) {
459 for (
int i = 0;
i < nr_arguments;
i++) {
466 debug( 4, node, mode,
"doExec checking floatExpr" );
467 double res = checkFloatExpr( callnode, mode );
470 debug( 4, node, mode,
"doExec checking intExpr" );
471 int res = checkIntExpr( callnode, mode );
474 debug( 4, node, mode,
"doExec checking boolExpr" );
475 bool ok = checkBoolExpr( callnode, mode );
478 debug( 3, node, mode,
"doExec checking objectExpr" );
479 varInst *ovi = checkObjectExpr( callnode, mode );
482 assignVariable( vi, ovi );
485 fatalError( node, mode,
"unsupported vartype in doExec" );
494 debug( 4, node, mode,
"executing "+node->
script.
name );
500 unsigned int classid = 0;
501 if (old_module == module)
511 deleteVarMap( varmap );
538 debug( 12, NULL, 0,
"reqested to delete global/module vi\n" );
540 debug( 2, NULL, 0,
"reqested to delete vi_error\n" );
544 debug( 12, NULL, 0,
"reqested to delete const vi\n" );
546 debug( 12, NULL, 0,
"reqested to delete local vi\n" );
553 void Mission::deleteVarMap(
varInstMap *vmap )
555 vsUMap< string, varInst* >::const_iterator iter;
556 for (iter = vmap->begin(); iter != vmap->end(); iter++) {
559 debug( 12, NULL, 0,
"NULLVAR "+(*iter).first+
"\n" );
568 if (module_node == NULL) {
569 fatalError( NULL,
SCRIPT_RUN,
"module "+modulename+
" not found" );
575 sprintf( buf,
"class counter for module %s : %d\n", modulename.c_str(), module_node->
script.
classinst_counter );
576 debug( 1, NULL, 0, buf );
584 vsUMap< string, varInst* >::const_iterator iter;
585 for (iter = cvmap0->begin(); iter != cvmap0->end(); iter++) {
587 string vi0_name = (*iter).first;
591 assignVariable( vi, vi0 );
593 (*cvmap)[vi0_name] = vi;
601 if (module == NULL) {
602 fatalError( NULL,
SCRIPT_RUN,
"module "+modulename+
" not found" );
606 fatalError( module,
SCRIPT_RUN,
"illegal classvar nr." );
609 printf(
"destroying class instance %s:%d\n", modulename.c_str(), classid );
612 deleteVarMap( cvmap );