void LaunchDaemon::_AddRunTargets(BMessage& message) { BMessage runMessage; for (int32 index = 0; message.FindMessage("run", index, &runMessage) == B_OK; index++) { BMessage conditions; bool pass = true; if (runMessage.FindMessage("if", &conditions) == B_OK) { Condition* condition = Conditions::FromMessage(conditions); if (condition != NULL) { pass = condition->Test(*this); debug_printf("Test: %s -> %d\n", condition->ToString().String(), pass); delete condition; } else debug_printf("Could not parse condition!\n"); } if (pass) { _AddRunTargets(runMessage, NULL); _AddRunTargets(runMessage, "then"); } else { _AddRunTargets(runMessage, "else"); } } }
int main( ) { PrettyPrint pp; ClassAdParser parser; string buffer = ""; string condString = "( ( MemoryRequirements < 234 ) || ( MemoryRequirements =?= undefined ) )"; cout << "-------------" << endl; cout << "BOOLEXPR TEST" << endl; cout << "-------------" << endl; cout << "condString = " << condString << endl; cout << endl; ExprTree *condTree = NULL; if( !( condTree = parser.ParseExpression( condString ) ) ) { cerr << "error parsing expression" << endl; } Condition *cond = new Condition( ); if( !( BoolExpr::ExprToCondition( condTree, cond ) ) ) { cerr << "error with ExprToCondition" << endl; } cond->ToString( buffer ); cout << "cond.ToString( ) = " << buffer << endl; buffer = ""; cout << endl; string attr; Operation::OpKind op1 = Operation::__NO_OP__; Operation::OpKind op2 = Operation::__NO_OP__; Value val1, val2; Value::ValueType type; cond->GetAttr( attr ); cout << "attr = " << attr << endl; cond->GetOp( op1 ); GetOpName( op1, buffer ); cout << "op1 = " << buffer << endl; cout << "op1 is op number " << (int)op1 << endl; buffer = ""; cond->GetOp2( op2 ); GetOpName( op2, buffer ); cout << "op2 = " << buffer << endl; buffer = ""; cond->GetVal( val1 ); pp.Unparse( buffer, val1 ); cout << "val1 = " << buffer << endl; buffer = ""; cond->GetVal2( val2 ); pp.Unparse( buffer, val2 ); cout << "val2 = " << buffer << endl; buffer = ""; cond->GetType( type ); GetTypeName( type, buffer ); cout << "type = " << buffer << endl; buffer = ""; }