• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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