52 res = doObjectVar( node, mode );
54 varInst *vi = doCall( node, mode );
60 fatalError( node, mode,
"expected a object call, got a different one" );
64 varInst *vi = doExec( node, mode );
66 fatalError( node, mode,
"doExec returned NULL" );
71 fatalError( node, mode,
"expected a object exec, got a different one" );
75 varInst *vi = doConst( node, mode );
79 fatalError( node, mode,
"expected a string const, got a different one: "+vi->
objectname );
83 fatalError( node, mode,
"no such object expression tag" );
97 fatalError( node, mode,
"math needs at least 2 arguments" );
104 printf(
"res1_vi=%d\n", res1_vi->
type );
105 fatalError( node, mode,
"only int or float expr allowed for math" );
109 assignVariable( res_vi, res1_vi );
113 for (
int i = 1;
i < len;
i++) {
120 float res = floatMath( mathname, res_vi->
float_val, res2 );
128 float res = floatMath( mathname, res_vi->
float_val, res2 );
132 if (res_vi->
type != res2_type) {
133 fatalError( node, mode,
"can't do math on such types" );
143 }
else if (res_vi->
type != res2_type) {
144 fatalError( node, mode,
"can't do math on such types" );
155 int Mission::intMath(
string mathname,
int res1,
int res2 )
158 if (mathname ==
"+") {
160 }
else if (mathname ==
"-") {
162 }
else if (mathname ==
"*") {
164 }
else if (mathname ==
"/") {
167 fatalError( NULL,
SCRIPT_RUN,
"no such intmath expression" );
174 double Mission::floatMath(
string mathname,
double res1,
double res2 )
177 if (mathname ==
"+") {
179 }
else if (mathname ==
"-") {
181 }
else if (mathname ==
"*") {
183 }
else if (mathname ==
"/") {
186 fatalError( NULL,
SCRIPT_RUN,
"no such floatmath expression" );
194 double Mission::doFMath(
missionNode *node,
int mode )
196 varInst *math_vi = doMath( node, mode );
198 fatalError( node, mode,
"fmath expected float" );
210 fatalError( node, mode,
"fmath needs at least 2 arguments" );
216 sprintf( buffer,
"fmath: 1st expr returns %f", res );
217 debug( 4, node, mode, buffer );
218 for (
int i = 1;
i < len;
i++) {
221 if (mathname ==
"+") {
223 }
else if (mathname ==
"-") {
225 }
else if (mathname ==
"*") {
227 }
else if (mathname ==
"/") {
230 fatalError( node, mode,
"no such fmath expression" );
242 int Mission::doIMath(
missionNode *node,
int mode )
244 varInst *math_vi = doMath( node, mode );
246 fatalError( node, mode,
"fmath expected int" );
260 fatalError( node, mode,
"imath needs at least 2 arguments" );
266 sprintf( buffer,
"imath: 1st expr returns %d", res );
267 debug( 4, node, mode, buffer );
268 for (
int i = 1;
i < len;
i++) {
271 if (mathname ==
"+") {
273 }
else if (mathname ==
"-") {
275 }
else if (mathname ==
"*") {
277 }
else if (mathname ==
"/") {
280 fatalError( node, mode,
"no such imath expression" );
293 double Mission::checkFloatExpr(
missionNode *node,
int mode )
297 res = doFloatVar( node, mode );
299 res = doFMath( node, mode );
301 varInst *vi = doConst( node, mode );
305 fatalError( node, mode,
"expected a float const, got a different one" );
310 varInst *vi = doCall( node, mode );
316 fatalError( node, mode,
"expected a float call, got a different one" );
321 varInst *vi = doExec( node, mode );
323 fatalError( node, mode,
"doExec returned NULL" );
328 fatalError( node, mode,
"expected a float exec, got a different one" );
333 fatalError( node, mode,
"no such float expression tag" );
340 int Mission::checkIntExpr(
missionNode *node,
int mode )
344 res = doIntVar( node, mode );
346 res = doIMath( node, mode );
348 varInst *vi = doConst( node, mode );
352 fatalError( node, mode,
"expected a float const, got a different one" );
357 varInst *vi = doCall( node, mode );
363 fatalError( node, mode,
"expected a int call, got a different one" );
368 varInst *vi = doExec( node, mode );
370 fatalError( node, mode,
"doExec returned NULL" );
375 fatalError( node, mode,
"expected a int exec, got a different one" );
380 fatalError( node, mode,
"no such int expression tag" );
388 bool Mission::checkBoolExpr(
missionNode *node,
int mode )
393 ok = doAndOr( node, mode );
395 ok = doAndOr( node, mode );
397 ok = doNot( node, mode );
399 ok = doTest( node, mode );
401 ok = doBooleanVar( node, mode );
403 varInst *vi = doConst( node, mode );
407 fatalError( node, mode,
"expected a bool const, got a different one" );
412 varInst *vi = doCall( node, mode );
418 fatalError( node, mode,
"expected a bool call, got a different one" );
423 varInst *vi = doExec( node, mode );
425 fatalError( node, mode,
"doExec returned NULL" );
431 fatalError( node, mode,
"expected a bool exec, got a different one" );
436 fatalError( node, mode,
"no such boolean expression tag" );
444 bool Mission::doAndOr(
missionNode *node,
int mode )
453 vector< easyDomNode* >::const_iterator siter;
456 for (siter = node->
subnodes.begin(); siter != node->
subnodes.end(); siter++, i++) {
458 bool res = checkBoolExpr( snode, mode );
466 warning(
"less than two arguments for and/or" );
480 ok = checkBoolExpr( snode, mode );
484 fatalError( node, mode,
"no subnode in not" );
492 bool Mission::doTest(
missionNode *node,
int mode )
496 if ( teststr.empty() ) {
497 fatalError( node, mode,
"you have to give test an argument what to test" );
500 if (teststr ==
"gt") {
502 }
else if (teststr ==
"lt") {
504 }
else if (teststr ==
"eq") {
506 }
else if (teststr ==
"ne") {
508 }
else if (teststr ==
"ge") {
510 }
else if (teststr ==
"le") {
514 else if (teststr ==
"between") {
520 fatalError( node, mode,
"unknown test argument for test" );
524 vector< easyDomNode* >::const_iterator siter;
527 for (siter = node->
subnodes.begin(); siter != node->
subnodes.end() && i < 2; siter++) {
532 fatalError( node, mode,
"a test-expr needs exact two subnodes" );
539 fatalError( node, mode,
"a test-expr needs exact two subnodes" );
549 if (arg1_vi->
type != arg2_vi->
type) {
550 fatalError( node, mode,
"test is getting not the same types" );
566 res = (arg1 == arg2);
569 res = (arg1 != arg2);
572 res = (arg1 >= arg2);
575 res = (arg1 <= arg2);
578 fatalError( node, mode,
"no valid tester" );
593 res = (arg1 == arg2);
596 res = (arg1 != arg2);
599 res = (arg1 >= arg2);
602 res = (arg1 <= arg2);
605 fatalError( node, mode,
"no valid tester" );
609 fatalError( node, mode,
"no such type allowed for test" );
625 debug( 3, node, mode,
"checking expression" );
633 bool res = checkBoolExpr( node, mode );
640 ret = doConst( node, mode );
643 ret = doVariable( node, mode );
646 ret = doMath( node, mode );
649 ret = doCall( node, mode );
652 ret = doExec( node, mode );
655 fatalError( node, mode,
"no such expression" );