#include "common_util.h"
#include "ignore.h"
IgnoreLists *g_ignore_lists;
vector<string>* g_ignore_obj;
IgnoreLists *g_white_lists;
static void SplitStringIntoLinesAndRemoveBlanksAndComments(
const string &str, vector<string> *lines) {
string cur_line;
bool in_comment = false;
for (size_t pos = 0; pos < str.size(); pos++) {
char ch = str[pos];
if (ch == '\n') {
if (!cur_line.empty()) {
// Printf("++ %s\n", cur_line.c_str());
lines->push_back(cur_line);
}
cur_line.clear();
in_comment = false;
continue;
}
if (ch == ' ' || ch == '\t') continue;
if (ch == '#') {
in_comment = true;
continue;
}
if (!in_comment) {
cur_line += ch;
}
}
}
static bool CutStringPrefixIfPresent(const string &input, const string &prefix,
/* OUT */ string *output) {
if (input.find(prefix) == 0) {
*output = input.substr(prefix.size());
return true;
} else {
return false;
}
}
static bool ReadIgnoreLine(string input_line, IgnoreLists *ignore_lists) {
string tail;
if (CutStringPrefixIfPresent(input_line, "obj:", &tail)) {
ignore_lists->ignores.push_back(IgnoreObj(tail));
} else if (CutStringPrefixIfPresent(input_line, "src:", &tail)) {
ignore_lists->ignores.push_back(IgnoreFile(tail));
} else if (CutStringPrefixIfPresent(input_line, "fun:", &tail)) {
ignore_lists->ignores.push_back(IgnoreFun(tail));
} else if (CutStringPrefixIfPresent(input_line, "fun_r:", &tail)) {
ignore_lists->ignores_r.push_back(IgnoreFun(tail));
} else if (CutStringPrefixIfPresent(input_line, "fun_hist:", &tail)) {
ignore_lists->ignores_hist.push_back(IgnoreFun(tail));
} else {
return false;
}
return true;
}
void ReadIgnoresFromString(const string& ignoreString, IgnoreLists *ignore_lists) {
vector<string> lines;
SplitStringIntoLinesAndRemoveBlanksAndComments(ignoreString, &lines);
for (size_t j = 0; j < lines.size(); j++) {
string &line = lines[j];
bool line_parsed = ReadIgnoreLine(line, ignore_lists);
if (!line_parsed) {
Printf("Error reading ignore file line:\n%s\n", line.c_str());
CHECK(0);
}
}
}
// True iff there exists a triple each of which components is either empty
// or matches the corresponding string.
bool TripleVectorMatchKnown(const vector<IgnoreTriple>& v,
const string& fun,
const string& obj,
const string& file) {
for (size_t i = 0; i < v.size(); i++) {
if ((fun.size() == 0 || StringMatch(v[i].fun, fun)) &&
(obj.size() == 0 || StringMatch(v[i].obj, obj)) &&
(file.size() == 0 || StringMatch(v[i].file, file))) {
if ((fun.size() == 0 || v[i].fun == "*") &&
(obj.size() == 0 || v[i].obj == "*") &&
(file.size() == 0 || v[i].file == "*")) {
// At least one of the matched features should be either non-empty
// or match a non-trivial pattern.
// For example, a <*, *, filename.ext> triple should NOT match
// fun="fun", obj="obj.o", file="".
continue;
} else {
return true;
}
}
}
return false;
}
bool StringVectorMatch(const vector<string>& v, const string& obj) {
for (size_t i = 0; i < v.size(); i++)
if (StringMatch(v[i], obj))
return true;
return false;
}