/* Copyright (C) 2010 Red Hat, Inc. This file is part of elfutils. This file is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. elfutils is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "checkrule.hh" #include "checkdescriptor.hh" #include "dwarflint.hh" #include checkrule::checkrule (std::string const &a_name, action_t an_action) : _m_name (a_name) , _m_action (an_action) , _m_used (false) { } checkrule_internal::checkrule_internal (std::string const &a_name, action_t an_action) : checkrule (a_name, an_action) { mark_used (); } namespace { bool rule_matches (std::string const &name, checkdescriptor const &cd) { if (name == "@all") return true; if (name == "@none") return false; if (name == cd.name ()) return true; return cd.in_group (name); } } bool checkrules::should_check (checkstack const &stack) const { // We always allow scheduling hidden checks. Those are service // routines that the user doesn't even see it the list of checks. assert (!stack.empty ()); if (stack.back ()->hidden ()) return true; bool should = false; for (const_iterator it = begin (); it != end (); ++it) { std::string const &rule_name = it->name (); bool nflag = it->action () == checkrule::request; if (nflag == should && it->used ()) continue; for (checkstack::const_iterator jt = stack.begin (); jt != stack.end (); ++jt) if (rule_matches (rule_name, **jt)) { it->mark_used (); //std::cout << " rule: " << rule_name << " " << nflag << std::endl; should = nflag; break; } } return should; }