+++ /dev/null
-#include <msp/strings/utils.h>
-#include "builder.h"
-#include "condition.h"
-#include "sourcepackage.h"
-
-using namespace std;
-using namespace Msp;
-
-Condition::Condition(SourcePackage &p, const string &expr):
- pkg(p)
-{
- vector<string> parts = split(expr);
-
- for(vector<string>::iterator i=parts.begin(); i!=parts.end(); ++i)
- {
- if(*i=="and")
- continue;
-
- string::size_type token = i->find_first_of("=!");
- if(token==string::npos)
- expression.insert(Expression::value_type(*i, "="));
- else if(token==0 && (*i)[0]=='!')
- expression.insert(Expression::value_type(i->substr(1), "!"));
- else
- expression.insert(Expression::value_type(i->substr(0, token), i->substr(token)));
- }
-}
-
-bool Condition::eval()
-{
- const Config &conf = pkg.get_config();
-
- bool result = true;
- for(Expression::iterator i=expression.begin(); i!=expression.end(); ++i)
- {
- 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<bool>(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(match==neg)
- result = false;
- }
-
- return result;
-}
-
-
-Condition::Loader::Loader(Condition &c):
- DataFile::ObjectLoader<Condition>(c)
-{
- add("require", &Loader::require);
- add("build_info", &Loader::build_info);
-}
-
-void Condition::Loader::require(const string &pkg)
-{
- obj.requires.push_back(pkg);
-}
-
-void Condition::Loader::build_info()
-{
- load_sub(obj.build_info);
-}