Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cli/cmdlineparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])

// use a file filter
else if (std::strncmp(argv[i], "--file-filter=", 14) == 0)
mSettings->fileFilter = argv[i] + 14;
mSettings->fileFilters.push_back(argv[i] + 14);

// file list specified
else if (std::strncmp(argv[i], "--file-list=", 12) == 0)
Expand Down Expand Up @@ -1055,6 +1055,7 @@ void CmdLineParser::printHelp()
" Used when certain messages should be displayed but\n"
" should not cause a non-zero exitcode.\n"
" --file-filter=<str> Analyze only those files matching the given filter str\n"
" Can be used multiple times\n"
" Example: --file-filter=*bar.cpp analyzes only files\n"
" that end with bar.cpp.\n"
" --file-list=<file> Specify the files to check in a text file. Add one\n"
Expand Down
8 changes: 4 additions & 4 deletions cli/cppcheckexecutor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,12 @@ bool CppCheckExecutor::parseFromArgs(CppCheck *cppcheck, int argc, const char* c
#else
const bool caseSensitive = true;
#endif
if (!mSettings->project.fileSettings.empty() && !mSettings->fileFilter.empty()) {
if (!mSettings->project.fileSettings.empty() && !mSettings->fileFilters.empty()) {
// filter only for the selected filenames from all project files
std::list<ImportProject::FileSettings> newList;

for (const ImportProject::FileSettings &fsetting : settings.project.fileSettings) {
if (matchglob(mSettings->fileFilter, fsetting.filename)) {
if (matchglobs(mSettings->fileFilters, fsetting.filename)) {
newList.emplace_back(fsetting);
}
}
Expand All @@ -192,10 +192,10 @@ bool CppCheckExecutor::parseFromArgs(CppCheck *cppcheck, int argc, const char* c
if (!ignored.empty())
std::cout << "cppcheck: Maybe all paths were ignored?" << std::endl;
return false;
} else if (!mSettings->fileFilter.empty() && settings.project.fileSettings.empty()) {
} else if (!mSettings->fileFilters.empty() && settings.project.fileSettings.empty()) {
std::map<std::string, std::size_t> newMap;
for (std::map<std::string, std::size_t>::const_iterator i = mFiles.begin(); i != mFiles.end(); ++i)
if (matchglob(mSettings->fileFilter, i->first)) {
if (matchglobs(mSettings->fileFilters, i->first)) {
newMap[i->first] = i->second;
}
mFiles = newMap;
Expand Down
15 changes: 8 additions & 7 deletions lib/importproject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,19 +195,20 @@ ImportProject::Type ImportProject::import(const std::string &filename, Settings
if (!mPath.empty() && !endsWith(mPath,'/'))
mPath += '/';

const std::string fileFilter = settings ? settings->fileFilter : std::string();
const std::vector<std::string> fileFilters =
settings ? settings->fileFilters : std::vector<std::string>();

if (endsWith(filename, ".json")) {
importCompileCommands(fin);
setRelativePaths(filename);
return ImportProject::Type::COMPILE_DB;
} else if (endsWith(filename, ".sln")) {
importSln(fin, mPath, fileFilter);
importSln(fin, mPath, fileFilters);
setRelativePaths(filename);
return ImportProject::Type::VS_SLN;
} else if (endsWith(filename, ".vcxproj")) {
std::map<std::string, std::string, cppcheck::stricmp> variables;
importVcxproj(filename, variables, emptyString, fileFilter);
importVcxproj(filename, variables, emptyString, fileFilters);
setRelativePaths(filename);
return ImportProject::Type::VS_VCXPROJ;
} else if (endsWith(filename, ".bpr")) {
Expand Down Expand Up @@ -447,7 +448,7 @@ void ImportProject::importCompileCommands(std::istream &istr)
}
}

void ImportProject::importSln(std::istream &istr, const std::string &path, const std::string &fileFilter)
void ImportProject::importSln(std::istream &istr, const std::string &path, const std::vector<std::string> &fileFilters)
{
std::map<std::string,std::string,cppcheck::stricmp> variables;
variables["SolutionDir"] = path;
Expand All @@ -465,7 +466,7 @@ void ImportProject::importSln(std::istream &istr, const std::string &path, const
std::string vcxproj(line.substr(pos1+1, pos-pos1+7));
if (!Path::isAbsolute(vcxproj))
vcxproj = path + vcxproj;
importVcxproj(Path::fromNativeSeparators(vcxproj), variables, emptyString, fileFilter);
importVcxproj(Path::fromNativeSeparators(vcxproj), variables, emptyString, fileFilters);
}
}

Expand Down Expand Up @@ -658,7 +659,7 @@ static void loadVisualStudioProperties(const std::string &props, std::map<std::s
}
}

void ImportProject::importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::string &fileFilter)
void ImportProject::importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::vector<std::string> &fileFilters)
{
variables["ProjectDir"] = Path::simplifyPath(Path::getPathFromFilename(filename));

Expand Down Expand Up @@ -718,7 +719,7 @@ void ImportProject::importVcxproj(const std::string &filename, std::map<std::str

for (const std::string &c : compileList) {
const std::string cfilename = Path::simplifyPath(Path::isAbsolute(c) ? c : Path::getPathFromFilename(filename) + c);
if (!fileFilter.empty() && !matchglob(fileFilter, cfilename))
if (!fileFilters.empty() && !matchglobs(fileFilters, cfilename))
continue;

for (const ProjectConfiguration &p : projectConfigurationList) {
Expand Down
4 changes: 2 additions & 2 deletions lib/importproject.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ class CPPCHECKLIB ImportProject {
void importCompileCommands(std::istream &istr);
bool importCppcheckGuiProject(std::istream &istr, Settings *settings);
private:
void importSln(std::istream &istr, const std::string &path, const std::string &fileFilter);
void importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::string &fileFilter);
void importSln(std::istream &istr, const std::string &path, const std::vector<std::string> &fileFilters);
void importVcxproj(const std::string &filename, std::map<std::string, std::string, cppcheck::stricmp> &variables, const std::string &additionalIncludeDirectories, const std::vector<std::string> &fileFilters);
void importBcb6Prj(const std::string &projectFilename);

void setRelativePaths(const std::string &filename);
Expand Down
4 changes: 2 additions & 2 deletions lib/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,8 @@ class CPPCHECKLIB Settings : public cppcheck::Platform {
Default value is 0. */
int exitCode;

/** @brief --file-filter for analyzing special files */
std::string fileFilter;
/** @brief List of --file-filter for analyzing special files */
std::vector<std::string> fileFilters;

/** @brief Force checking the files with "too many" configurations (--force). */
bool force;
Expand Down
6 changes: 6 additions & 0 deletions lib/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,9 @@ bool matchglob(const std::string& pattern, const std::string& name)
n++;
}
}

bool matchglobs(const std::vector<std::string> &patterns, const std::string &name) {
return std::any_of(begin(patterns), end(patterns), [&name](const std::string &pattern) {
return matchglob(pattern, name);
});
}
2 changes: 2 additions & 0 deletions lib/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ CPPCHECKLIB bool isValidGlobPattern(const std::string& pattern);

CPPCHECKLIB bool matchglob(const std::string& pattern, const std::string& name);

CPPCHECKLIB bool matchglobs(const std::vector<std::string> &patterns, const std::string &name);

#define UNUSED(x) (void)(x)

// Use the nonneg macro when you want to assert that a variable/argument is not negative
Expand Down