X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcondition.cpp;h=413870e6cb20ab069374aa8781a5e7738f6cad2e;hb=1dad660f7bbda5ef3239fd6374e0f8a77e19eaaa;hp=97e93f1b1c6d5d3780df328a0dfc3925e1e44923;hpb=445edbc3c42bbd7880cc414cf153ddfd196bfc1c;p=builder.git diff --git a/source/condition.cpp b/source/condition.cpp index 97e93f1..413870e 100644 --- a/source/condition.cpp +++ b/source/condition.cpp @@ -1,52 +1,57 @@ #include +#include "builder.h" #include "condition.h" -#include "package.h" +#include "sourcepackage.h" using namespace std; using namespace Msp; -#include - -Condition::Condition(Package &p, const string &expr): +Condition::Condition(SourcePackage &p, const string &expr): pkg(p) { - vector parts=split(expr); + vector parts = split(expr); for(vector::iterator i=parts.begin(); i!=parts.end(); ++i) { if(*i=="and") continue; - - unsigned token=i->find_first_of("=!"); + + string::size_type token = i->find_first_of("=!"); if(token==string::npos) - expression.insert(StringMap::value_type(*i, "!0")); + expression.insert(Expression::value_type(*i, "=")); else if(token==0 && (*i)[0]=='!') - expression.insert(StringMap::value_type(*i, "=0")); + expression.insert(Expression::value_type(i->substr(1), "!")); else - expression.insert(StringMap::value_type(i->substr(0, token), i->substr(token))); + expression.insert(Expression::value_type(i->substr(0, token), i->substr(token))); } } -void Condition::resolve_refs() -{ - for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i) - i->resolve(); -} - bool Condition::eval() { - const Config &conf=pkg.get_config(); + const Config &conf = pkg.get_config(); - bool result=true; - for(StringMap::iterator i=expression.begin(); i!=expression.end(); ++i) + bool result = true; + for(Expression::iterator i=expression.begin(); i!=expression.end(); ++i) { - bool neg=(i->second[0]=='!'); - unsigned start=1; + bool neg = (i->second[0]=='!'); + unsigned start = 1; if(i->second[1]=='=') ++start; + string value = i->second.substr(start); + + bool match = false; + if(conf.is_option(i->first)) + { + if(value.empty()) + match = lexical_cast(conf.get_option(i->first).value); + else + match = (conf.get_option(i->first).value==value); + } + else if(i->first=="arch") + match = pkg.get_builder().get_current_arch().match_name(value); - if((conf.get_option(i->first).value==i->second.substr(start))==neg) - result=false; + if(match==neg) + result = false; } return result; @@ -54,7 +59,7 @@ bool Condition::eval() Condition::Loader::Loader(Condition &c): - cond(c) + DataFile::ObjectLoader(c) { add("require", &Loader::require); add("build_info", &Loader::build_info); @@ -62,10 +67,10 @@ Condition::Loader::Loader(Condition &c): void Condition::Loader::require(const string &pkg) { - cond.requires.push_back(PackageRef(cond.pkg.get_builder(), pkg)); + obj.requires.push_back(pkg); } void Condition::Loader::build_info() { - load_sub(cond.build_info); + load_sub(obj.build_info); }