annotate extern/vera/src/plugins/Profiles.cpp @ 725:0dbe1842a7d8

Irccd: rework loggers, closes #793 @3h Logger now supports category/component metadata.
author David Demelier <markand@malikania.fr>
date Tue, 17 Jul 2018 22:30:00 +0200
parents a7c0eb100760
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
548
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 //
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 // Copyright (C) 2006-2007 Maciej Sobczak
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 // Distributed under the Boost Software License, Version 1.0.
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 // (See accompanying file LICENSE_1_0.txt or copy at
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 // http://www.boost.org/LICENSE_1_0.txt)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 //
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 #include "Profiles.h"
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 #include "RootDirectory.h"
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 #include "tcl/cpptcl-1.1.4/cpptcl.h"
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 #include <set>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 #include <map>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 #include <fstream>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 #include <sstream>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 #include <algorithm>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 #include <cstring>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 #include <cerrno>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
19
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 namespace Vera
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 namespace Plugins
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 Profiles::RuleNameCollection Profiles::getListOfScriptNamesTcl(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 const Vera::Plugins::Profiles::ProfileName & profile)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 RuleNameCollection allRules;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 // name of the profile is also the name of the profile file
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 const Vera::Plugins::RootDirectory::DirectoryName veraRoot =
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 Vera::Plugins::RootDirectory::getRootDirectory();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 std::string fileName(veraRoot + "/profiles/");
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 fileName += profile;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 std::ifstream profileFile(fileName.c_str());
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 if (profileFile.is_open() == false)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 std::ostringstream ss;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 ss << "Cannot open profile description for profile '" << profile
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 << "': "<< strerror(errno);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 throw Vera::Plugins::ProfileError(ss.str());
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 Tcl::interpreter interp;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 interp.eval(profileFile);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 if (profileFile.bad())
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 throw std::runtime_error(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 "Cannot read from " + fileName + ": " + strerror(errno));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 const Tcl::object ruleList = interp.eval("set rules");
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 const size_t ruleListLength = ruleList.length(interp);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 for (size_t i = 0; i != ruleListLength; ++i)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 const Vera::Plugins::Rules::RuleName rName = ruleList.at(interp, i).get();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 allRules.push_back(rName);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 return allRules;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 Profiles::RuleNameCollection Profiles::getListOfScriptNamesKeys(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 const Vera::Plugins::Profiles::ProfileName & profile)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 RuleNameCollection allRules;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 // name of the profile is also the name of the profile file
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 const Vera::Plugins::RootDirectory::DirectoryName veraRoot =
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 Vera::Plugins::RootDirectory::getRootDirectory();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 std::string fileName(veraRoot + "/profiles/");
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 fileName += profile;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 std::ifstream profileFile(fileName.c_str());
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 if (profileFile.is_open() == false)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 std::ostringstream ss;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 ss << "Cannot open profile description for profile '" << profile
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 << "': "<< strerror(errno);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 throw Vera::Plugins::ProfileError(ss.str());
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 std::string line;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 while (getline(profileFile, line))
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 if (line.empty() == false && line[0] != '#')
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 std::string::size_type pos = line.find("=");
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 if (pos != std::string::npos)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 std::string name = line.substr(0, pos);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 std::string value = line.substr(pos + 1);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 if (name == "rule")
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 allRules.push_back(value);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 if (profileFile.bad())
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 throw std::runtime_error(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 "Cannot read from " + fileName + ": " + strerror(errno));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 profileFile.close();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 return allRules;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 Profiles::RuleNameCollection Profiles::getListOfScriptNames(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 const Vera::Plugins::Profiles::ProfileName & profile)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 try
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 return getListOfScriptNamesTcl(profile);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 catch (...)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 return getListOfScriptNamesKeys(profile);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 void Profiles::executeProfile(const ProfileName & profile)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 const RuleNameCollection scripts = getListOfScriptNames(profile);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 typedef RuleNameCollection::const_iterator iterator;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 const iterator end = scripts.end();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 for (iterator it = scripts.begin(); it != end; ++it)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 Rules::executeRule(*it);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 }