1 #include "common_util.h"
2
3 #include "ignore.h"
4
5 IgnoreLists *g_ignore_lists;
6 vector<string>* g_ignore_obj;
7 IgnoreLists *g_white_lists;
8
SplitStringIntoLinesAndRemoveBlanksAndComments(const string & str,vector<string> * lines)9 static void SplitStringIntoLinesAndRemoveBlanksAndComments(
10 const string &str, vector<string> *lines) {
11 string cur_line;
12 bool in_comment = false;
13 for (size_t pos = 0; pos < str.size(); pos++) {
14 char ch = str[pos];
15 if (ch == '\n') {
16 if (!cur_line.empty()) {
17 // Printf("++ %s\n", cur_line.c_str());
18 lines->push_back(cur_line);
19 }
20 cur_line.clear();
21 in_comment = false;
22 continue;
23 }
24 if (ch == ' ' || ch == '\t') continue;
25 if (ch == '#') {
26 in_comment = true;
27 continue;
28 }
29 if (!in_comment) {
30 cur_line += ch;
31 }
32 }
33 }
34
CutStringPrefixIfPresent(const string & input,const string & prefix,string * output)35 static bool CutStringPrefixIfPresent(const string &input, const string &prefix,
36 /* OUT */ string *output) {
37 if (input.find(prefix) == 0) {
38 *output = input.substr(prefix.size());
39 return true;
40 } else {
41 return false;
42 }
43 }
44
ReadIgnoreLine(string input_line,IgnoreLists * ignore_lists)45 static bool ReadIgnoreLine(string input_line, IgnoreLists *ignore_lists) {
46 string tail;
47 if (CutStringPrefixIfPresent(input_line, "obj:", &tail)) {
48 ignore_lists->ignores.push_back(IgnoreObj(tail));
49 } else if (CutStringPrefixIfPresent(input_line, "src:", &tail)) {
50 ignore_lists->ignores.push_back(IgnoreFile(tail));
51 } else if (CutStringPrefixIfPresent(input_line, "fun:", &tail)) {
52 ignore_lists->ignores.push_back(IgnoreFun(tail));
53 } else if (CutStringPrefixIfPresent(input_line, "fun_r:", &tail)) {
54 ignore_lists->ignores_r.push_back(IgnoreFun(tail));
55 } else if (CutStringPrefixIfPresent(input_line, "fun_hist:", &tail)) {
56 ignore_lists->ignores_hist.push_back(IgnoreFun(tail));
57 } else {
58 return false;
59 }
60 return true;
61 }
62
ReadIgnoresFromString(const string & ignoreString,IgnoreLists * ignore_lists)63 void ReadIgnoresFromString(const string& ignoreString, IgnoreLists *ignore_lists) {
64 vector<string> lines;
65 SplitStringIntoLinesAndRemoveBlanksAndComments(ignoreString, &lines);
66 for (size_t j = 0; j < lines.size(); j++) {
67 string &line = lines[j];
68 bool line_parsed = ReadIgnoreLine(line, ignore_lists);
69 if (!line_parsed) {
70 Printf("Error reading ignore file line:\n%s\n", line.c_str());
71 CHECK(0);
72 }
73 }
74 }
75
76 // True iff there exists a triple each of which components is either empty
77 // or matches the corresponding string.
TripleVectorMatchKnown(const vector<IgnoreTriple> & v,const string & fun,const string & obj,const string & file)78 bool TripleVectorMatchKnown(const vector<IgnoreTriple>& v,
79 const string& fun,
80 const string& obj,
81 const string& file) {
82 for (size_t i = 0; i < v.size(); i++) {
83 if ((fun.size() == 0 || StringMatch(v[i].fun, fun)) &&
84 (obj.size() == 0 || StringMatch(v[i].obj, obj)) &&
85 (file.size() == 0 || StringMatch(v[i].file, file))) {
86 if ((fun.size() == 0 || v[i].fun == "*") &&
87 (obj.size() == 0 || v[i].obj == "*") &&
88 (file.size() == 0 || v[i].file == "*")) {
89 // At least one of the matched features should be either non-empty
90 // or match a non-trivial pattern.
91 // For example, a <*, *, filename.ext> triple should NOT match
92 // fun="fun", obj="obj.o", file="".
93 continue;
94 } else {
95 return true;
96 }
97 }
98 }
99 return false;
100 }
101
StringVectorMatch(const vector<string> & v,const string & obj)102 bool StringVectorMatch(const vector<string>& v, const string& obj) {
103 for (size_t i = 0; i < v.size(); i++)
104 if (StringMatch(v[i], obj))
105 return true;
106 return false;
107 }
108