Mercurial > irccd
diff extern/vera/src/plugins/Profiles.cpp @ 548:a7c0eb100760
CMake: import vera++ 1.3.0, closes #729
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 22 Nov 2017 20:10:03 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extern/vera/src/plugins/Profiles.cpp Wed Nov 22 20:10:03 2017 +0100 @@ -0,0 +1,145 @@ +// +// Copyright (C) 2006-2007 Maciej Sobczak +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#include "Profiles.h" +#include "RootDirectory.h" +#include "tcl/cpptcl-1.1.4/cpptcl.h" +#include <set> +#include <map> +#include <fstream> +#include <sstream> +#include <algorithm> +#include <cstring> +#include <cerrno> + + +namespace Vera +{ +namespace Plugins +{ + + +Profiles::RuleNameCollection Profiles::getListOfScriptNamesTcl( + const Vera::Plugins::Profiles::ProfileName & profile) +{ + RuleNameCollection allRules; + + // name of the profile is also the name of the profile file + + const Vera::Plugins::RootDirectory::DirectoryName veraRoot = + Vera::Plugins::RootDirectory::getRootDirectory(); + + std::string fileName(veraRoot + "/profiles/"); + fileName += profile; + + std::ifstream profileFile(fileName.c_str()); + if (profileFile.is_open() == false) + { + std::ostringstream ss; + ss << "Cannot open profile description for profile '" << profile + << "': "<< strerror(errno); + throw Vera::Plugins::ProfileError(ss.str()); + } + + Tcl::interpreter interp; + interp.eval(profileFile); + if (profileFile.bad()) + { + throw std::runtime_error( + "Cannot read from " + fileName + ": " + strerror(errno)); + } + + const Tcl::object ruleList = interp.eval("set rules"); + + const size_t ruleListLength = ruleList.length(interp); + for (size_t i = 0; i != ruleListLength; ++i) + { + const Vera::Plugins::Rules::RuleName rName = ruleList.at(interp, i).get(); + allRules.push_back(rName); + } + + return allRules; +} + +Profiles::RuleNameCollection Profiles::getListOfScriptNamesKeys( + const Vera::Plugins::Profiles::ProfileName & profile) +{ + RuleNameCollection allRules; + + // name of the profile is also the name of the profile file + + const Vera::Plugins::RootDirectory::DirectoryName veraRoot = + Vera::Plugins::RootDirectory::getRootDirectory(); + + std::string fileName(veraRoot + "/profiles/"); + fileName += profile; + + std::ifstream profileFile(fileName.c_str()); + if (profileFile.is_open() == false) + { + std::ostringstream ss; + ss << "Cannot open profile description for profile '" << profile + << "': "<< strerror(errno); + throw Vera::Plugins::ProfileError(ss.str()); + } + + std::string line; + while (getline(profileFile, line)) + { + if (line.empty() == false && line[0] != '#') + { + std::string::size_type pos = line.find("="); + if (pos != std::string::npos) + { + std::string name = line.substr(0, pos); + std::string value = line.substr(pos + 1); + + if (name == "rule") + { + allRules.push_back(value); + } + } + } + } + + if (profileFile.bad()) + { + throw std::runtime_error( + "Cannot read from " + fileName + ": " + strerror(errno)); + } + profileFile.close(); + + return allRules; +} + +Profiles::RuleNameCollection Profiles::getListOfScriptNames( + const Vera::Plugins::Profiles::ProfileName & profile) +{ + try + { + return getListOfScriptNamesTcl(profile); + } + catch (...) + { + return getListOfScriptNamesKeys(profile); + } +} + +void Profiles::executeProfile(const ProfileName & profile) +{ + const RuleNameCollection scripts = getListOfScriptNames(profile); + + typedef RuleNameCollection::const_iterator iterator; + const iterator end = scripts.end(); + for (iterator it = scripts.begin(); it != end; ++it) + { + Rules::executeRule(*it); + } +} + +} +}