From 30e6a05aa0ae1bdb460c12d4ca8e40ecfafb3ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 24 Sep 2017 22:36:20 +0200 Subject: [PATCH] ImportProject: Macro names in visual studio solutions/projects are case insensitive --- lib/importproject.cpp | 21 +++++++++++---------- lib/importproject.h | 21 +++++++++++++++++++-- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/importproject.cpp b/lib/importproject.cpp index ddad9e734..6a071790b 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -30,6 +30,7 @@ #include #include + void ImportProject::ignorePaths(const std::vector &ipaths) { for (std::list::iterator it = fileSettings.begin(); it != fileSettings.end();) { @@ -96,9 +97,9 @@ void ImportProject::FileSettings::setDefines(std::string defs) defines.swap(defs); } -static bool simplifyPathWithVariables(std::string &s, std::map &variables) +static bool simplifyPathWithVariables(std::string &s, std::map &variables) { - std::set expanded; + std::set expanded; std::string::size_type start = 0; while ((start = s.find("$(")) != std::string::npos) { std::string::size_type end = s.find(')',start); @@ -108,7 +109,7 @@ static bool simplifyPathWithVariables(std::string &s, std::map::const_iterator it1 = variables.find(var); + std::map::const_iterator it1 = variables.find(var); // variable was not found within defined variables if (it1 == variables.end()) { const char *envValue = std::getenv(var.c_str()); @@ -127,7 +128,7 @@ static bool simplifyPathWithVariables(std::string &s, std::map &in, std::map &variables) +void ImportProject::FileSettings::setIncludePaths(const std::string &basepath, const std::list &in, std::map &variables) { std::list I; // only parse each includePath once - so remove duplicates @@ -177,7 +178,7 @@ void ImportProject::import(const std::string &filename) path += '/'; importSln(fin,path); } else if (filename.find(".vcxproj") != std::string::npos) { - std::map variables; + std::map variables; importVcxproj(filename, variables, emptyString); } } @@ -240,7 +241,7 @@ void ImportProject::importCompileCommands(std::istream &istr) fs.systemIncludePaths.push_back(isystem); } } - std::map variables; + std::map variables; fs.setIncludePaths(directory, fs.includePaths, variables); fs.setDefines(fs.defines); fileSettings.push_back(fs); @@ -252,7 +253,7 @@ void ImportProject::importCompileCommands(std::istream &istr) void ImportProject::importSln(std::istream &istr, const std::string &path) { - std::map variables; + std::map variables; variables["SolutionDir"] = path; std::string line; @@ -374,7 +375,7 @@ static std::list toStringList(const std::string &s) return ret; } -static void importPropertyGroup(const tinyxml2::XMLElement *node, std::map *variables, std::string *includePath, bool *useOfMfc) +static void importPropertyGroup(const tinyxml2::XMLElement *node, std::map *variables, std::string *includePath, bool *useOfMfc) { if (useOfMfc) { for (const tinyxml2::XMLElement *e = node->FirstChildElement(); e; e = e->NextSiblingElement()) { @@ -409,7 +410,7 @@ static void importPropertyGroup(const tinyxml2::XMLElement *node, std::map *variables, std::string *includePath, const std::string &additionalIncludeDirectories, std::list &itemDefinitionGroupList) +static void loadVisualStudioProperties(const std::string &props, std::map *variables, std::string *includePath, const std::string &additionalIncludeDirectories, std::list &itemDefinitionGroupList) { std::string filename(props); if (!simplifyPathWithVariables(filename, *variables)) @@ -445,7 +446,7 @@ static void loadVisualStudioProperties(const std::string &props, std::map &variables, const std::string &additionalIncludeDirectories) +void ImportProject::importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories) { variables["ProjectDir"] = Path::simplifyPath(Path::getPathFromFilename(filename)); diff --git a/lib/importproject.h b/lib/importproject.h index ab6cdd36a..a881fb23c 100644 --- a/lib/importproject.h +++ b/lib/importproject.h @@ -29,10 +29,27 @@ #include #include #include +#include /// @addtogroup Core /// @{ +namespace cppcheck { +struct stricmp { + bool operator()(const std::string &lhs, const std::string &rhs) const { + if (lhs.size() != rhs.size()) + return lhs.size() < rhs.size(); + for (unsigned int i = 0; i < lhs.size(); ++i) { + char c1 = std::toupper((unsigned char)lhs[i]); + char c2 = std::toupper((unsigned char)rhs[i]); + if (c1 != c2) + return c1 < c2; + } + return false; + } +}; +} + /** * @brief Importing project settings. */ @@ -56,7 +73,7 @@ public: bool useMfc; void setDefines(std::string defs); - void setIncludePaths(const std::string &basepath, const std::list &in, std::map &variables); + void setIncludePaths(const std::string &basepath, const std::list &in, std::map &variables); }; std::list fileSettings; @@ -68,7 +85,7 @@ public: private: void importCompileCommands(std::istream &istr); void importSln(std::istream &istr, const std::string &path); - void importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories); + void importVcxproj(const std::string &filename, std::map &variables, const std::string &additionalIncludeDirectories); }; /// @}