diff options
Diffstat (limited to 'src/rule.cpp')
| -rw-r--r-- | src/rule.cpp | 112 |
1 files changed, 111 insertions, 1 deletions
diff --git a/src/rule.cpp b/src/rule.cpp index 4919eef..c5ed1c2 100644 --- a/src/rule.cpp +++ b/src/rule.cpp | |||
| @@ -1,6 +1,10 @@ | |||
| 1 | #include "rule.h" | 1 | #include "rule.h" |
| 2 | #include "build.h" | ||
| 3 | #include "function.h" | ||
| 4 | #include "perform.h" | ||
| 2 | 5 | ||
| 3 | Rule::Rule() | 6 | Rule::Rule() : |
| 7 | pAggregate( NULL ) | ||
| 4 | { | 8 | { |
| 5 | } | 9 | } |
| 6 | 10 | ||
| @@ -12,6 +16,112 @@ StringList Rule::execute( Build &bld, StringList &lInput, PerformList &lPerf ) | |||
| 12 | { | 16 | { |
| 13 | StringList lOutput; | 17 | StringList lOutput; |
| 14 | 18 | ||
| 19 | RuleList rl = bld.findChainRules( this ); | ||
| 20 | |||
| 21 | for( RuleList::iterator i = rl.begin(); i != rl.end(); i++ ) | ||
| 22 | { | ||
| 23 | StringList tmp = (*i)->execute( bld, lInput, lPerf ); | ||
| 24 | lOutput.insert( lOutput.end(), tmp.begin(), tmp.end() ); | ||
| 25 | } | ||
| 26 | |||
| 27 | StringList lMine; | ||
| 28 | for( FunctionList::iterator i = lMatches.begin(); i != lMatches.end(); i++ ) | ||
| 29 | { | ||
| 30 | (*i)->execute( &bld, lInput, lMine ); | ||
| 31 | } | ||
| 32 | |||
| 33 | StringList lTmp; | ||
| 34 | for( FunctionList::iterator i = lFilter.begin(); i != lFilter.end(); i++ ) | ||
| 35 | { | ||
| 36 | (*i)->execute( &bld, lMine, lTmp ); | ||
| 37 | lMine.swap( lTmp ); | ||
| 38 | lTmp.clear(); | ||
| 39 | } | ||
| 40 | |||
| 41 | bool bHasProduces = true; | ||
| 42 | if( lProduces.empty() ) | ||
| 43 | { | ||
| 44 | bHasProduces = false; | ||
| 45 | lProduces.push_back( sTarget ); | ||
| 46 | } | ||
| 47 | |||
| 48 | StringList lNewOut; | ||
| 49 | if( pAggregate ) | ||
| 50 | { | ||
| 51 | VarMap mTmp; | ||
| 52 | std::string target = lProduces.front();//, lProduces.front(), NULL ).c_str(); | ||
| 53 | mTmp["target"] = target; | ||
| 54 | lNewOut.push_back( target ); | ||
| 55 | |||
| 56 | for( StringList::iterator i = lMine.begin(); i != lMine.end(); i++ ) | ||
| 57 | { | ||
| 58 | bld.addRequires( target, (*i) ); | ||
| 59 | } | ||
| 60 | for( StringList::iterator i = lReqStrs.begin(); | ||
| 61 | i != lReqStrs.end(); i++ ) | ||
| 62 | { | ||
| 63 | bld.addRequires( target, (*i) ); | ||
| 64 | } | ||
| 65 | |||
| 66 | StringList lTmp; | ||
| 67 | pAggregate->execute( &bld, lMine, lTmp ); | ||
| 68 | mTmp["match"] = lTmp.front(); | ||
| 69 | |||
| 70 | for( PerformList::iterator k = lPerform.begin(); | ||
| 71 | k != lPerform.end(); k++ ) | ||
| 72 | { | ||
| 73 | Perform *p = (*k)->duplicate( bld, target, &mTmp ); | ||
| 74 | p->setTarget( target ); | ||
| 75 | p->setRule( sName ); | ||
| 76 | //p->setReqFuncs( &lReqFuncs ); | ||
| 77 | lPerf.push_back( p ); | ||
| 78 | } | ||
| 79 | } | ||
| 80 | else | ||
| 81 | { | ||
| 82 | for( StringList::iterator i = lMine.begin(); i != lMine.end(); i++ ) | ||
| 83 | { | ||
| 84 | for( StringList::iterator j = lProduces.begin(); | ||
| 85 | j != lProduces.end(); j++ ) | ||
| 86 | { | ||
| 87 | VarMap mTmp; | ||
| 88 | std::string target = bld.replVars( (*j), (*i), NULL ); | ||
| 89 | mTmp["target"] = target; | ||
| 90 | lNewOut.push_back( target ); | ||
| 91 | mTmp["match"] = (*i); | ||
| 92 | bld.addRequires( target, (*i) ); | ||
| 93 | for( StringList::iterator k = lReqStrs.begin(); | ||
| 94 | k != lReqStrs.end(); k++ ) | ||
| 95 | { | ||
| 96 | bld.addRequires( target, (*k) ); | ||
| 97 | } | ||
| 98 | for( PerformList::iterator k = lPerform.begin(); | ||
| 99 | k != lPerform.end(); k++ ) | ||
| 100 | { | ||
| 101 | Perform *p = (*k)->duplicate( bld, (*i), &mTmp ); | ||
| 102 | p->setTarget( target ); | ||
| 103 | p->setRule( sName ); | ||
| 104 | for( FunctionList::iterator f = lReqFuncs.begin(); | ||
| 105 | f != lReqFuncs.end(); f++ ) | ||
| 106 | { | ||
| 107 | p->getReqFuncs().push_back( | ||
| 108 | (*f)->duplicate( bld, (*i), &mTmp ) | ||
| 109 | ); | ||
| 110 | } | ||
| 111 | lPerf.push_back( p ); | ||
| 112 | } | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
| 116 | |||
| 117 | lInput.insert( lInput.end(), lNewOut.begin(), lNewOut.end() ); | ||
| 118 | lOutput.insert( lOutput.end(), lNewOut.begin(), lNewOut.end() ); | ||
| 119 | |||
| 120 | if( bHasProduces == false ) | ||
| 121 | { | ||
| 122 | lProduces.clear(); | ||
| 123 | } | ||
| 124 | |||
| 15 | return lOutput; | 125 | return lOutput; |
| 16 | } | 126 | } |
| 17 | 127 | ||
