]> git.tdb.fi Git - builder.git/blobdiff - source/condition.cpp
Eliminate all global typedefs, making misc.h finally unnecessary
[builder.git] / source / condition.cpp
index c4c01b21fbdf692fc92cb4fe147a4ad58b969a86..413870e6cb20ab069374aa8781a5e7738f6cad2e 100644 (file)
@@ -1,11 +1,5 @@
-/* $Id$
-
-This file is part of builder
-Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include <msp/strings/utils.h>
+#include "builder.h"
 #include "condition.h"
 #include "sourcepackage.h"
 
@@ -15,43 +9,49 @@ using namespace Msp;
 Condition::Condition(SourcePackage &p, const string &expr):
        pkg(p)
 {
-       vector<string> parts=split(expr);
+       vector<string> parts = split(expr);
 
        for(vector<string>::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<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((conf.get_option(i->first).value==i->second.substr(start))==neg)
-                       result=false;
+               if(match==neg)
+                       result = false;
        }
 
        return result;
@@ -59,7 +59,7 @@ bool Condition::eval()
 
 
 Condition::Loader::Loader(Condition &c):
-       cond(c)
+       DataFile::ObjectLoader<Condition>(c)
 {
        add("require",    &Loader::require);
        add("build_info", &Loader::build_info);
@@ -67,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);
 }