static void loadVisualStudioProperties(const std::string &props, std::map<std::string,std::string,cppcheck::stricmp> *variables, std::string *includePath, const std::string &additionalIncludeDirectories, std::list<ItemDefinitionGroup> &itemDefinitionGroupList) { std::string filename(props); if (!simplifyPathWithVariables(filename, *variables)) return; tinyxml2::XMLDocument doc; if (doc.LoadFile(filename.c_str()) != tinyxml2::XML_SUCCESS) return; const tinyxml2::XMLElement * const rootnode = doc.FirstChildElement(); if (rootnode == nullptr) return; for (const tinyxml2::XMLElement *node = rootnode->FirstChildElement(); node; node = node->NextSiblingElement()) { if (std::strcmp(node->Name(), "ImportGroup") == 0) { const char *labelAttribute = node->Attribute("Label"); if (labelAttribute == nullptr || std::strcmp(labelAttribute, "PropertySheets") != 0) continue; for (const tinyxml2::XMLElement *importGroup = node->FirstChildElement(); importGroup; importGroup = importGroup->NextSiblingElement()) { if (std::strcmp(importGroup->Name(), "Import") == 0) { const char *projectAttribute = importGroup->Attribute("Project"); if (projectAttribute == nullptr) continue; std::string loadprj(projectAttribute); if (loadprj.find('$') == std::string::npos) { loadprj = Path::getPathFromFilename(filename) + loadprj; } loadVisualStudioProperties(loadprj, variables, includePath, additionalIncludeDirectories, itemDefinitionGroupList); } } } else if (std::strcmp(node->Name(),"PropertyGroup")==0) { importPropertyGroup(node, variables, includePath, nullptr); } else if (std::strcmp(node->Name(),"ItemDefinitionGroup")==0) { itemDefinitionGroupList.push_back(ItemDefinitionGroup(node, additionalIncludeDirectories)); } } }
static void loadVisualStudioProperties(const std::string &props, std::map<std::string,std::string> *variables, std::string *includePath, std::string *additionalIncludeDirectories) { std::string filename(props); if (!simplifyPathWithVariables(filename,*variables)) return; tinyxml2::XMLDocument doc; if (doc.LoadFile(filename.c_str()) != tinyxml2::XML_SUCCESS) return; const tinyxml2::XMLElement * const rootnode = doc.FirstChildElement(); if (rootnode == nullptr) return; for (const tinyxml2::XMLElement *node = rootnode->FirstChildElement(); node; node = node->NextSiblingElement()) { if (std::strcmp(node->Name(), "ImportGroup") == 0 && node->Attribute("Label") && std::strcmp(node->Attribute("Label"),"PropertySheets")==0) { for (const tinyxml2::XMLElement *importGroup = node->FirstChildElement(); importGroup; importGroup = importGroup->NextSiblingElement()) { if (std::strcmp(importGroup->Name(), "Import") == 0 && importGroup->Attribute("Project")) { std::string loadprj = importGroup->Attribute("Project"); if (loadprj.find("$") == std::string::npos) { loadprj = Path::getPathFromFilename(filename) + loadprj; } loadVisualStudioProperties(loadprj, variables, includePath, additionalIncludeDirectories); } } } else if (std::strcmp(node->Name(),"PropertyGroup")==0) { if (node->Attribute("Label") && std::strcmp(node->Attribute("Label"),"UserMacros")==0) { for (const tinyxml2::XMLElement *propertyGroup = node->FirstChildElement(); propertyGroup; propertyGroup = propertyGroup->NextSiblingElement()) { const std::string name(propertyGroup->Name()); const char *text = propertyGroup->GetText(); (*variables)[name] = std::string(text ? text : ""); } } else if (!node->Attribute("Label")) { for (const tinyxml2::XMLElement *propertyGroup = node->FirstChildElement(); propertyGroup; propertyGroup = propertyGroup->NextSiblingElement()) { if (std::strcmp(propertyGroup->Name(), "IncludePath") != 0) continue; const char *text = propertyGroup->GetText(); if (!text) continue; std::string s(text); std::string::size_type pos = s.find("$(IncludePath)"); if (pos != std::string::npos) s = s.substr(0,pos) + *includePath + s.substr(pos+14U); *includePath = s; } } } else if (std::strcmp(node->Name(),"ItemDefinitionGroup")==0) { for (const tinyxml2::XMLElement *clcompile = node->FirstChildElement(); clcompile; clcompile = clcompile->NextSiblingElement()) { if (std::strcmp(clcompile->Name(), "ClCompile") != 0) continue; for (const tinyxml2::XMLElement *incdir = clcompile->FirstChildElement(); incdir; incdir = incdir->NextSiblingElement()) { if (std::strcmp(incdir->Name(),"AdditionalIncludeDirectories")!=0) continue; if (!incdir->GetText()) continue; if (!additionalIncludeDirectories->empty()) *additionalIncludeDirectories += '+'; *additionalIncludeDirectories += incdir->GetText(); } } } } }
void ImportProject::FileSettings::setIncludePaths(const std::string &basepath, const std::list<std::string> &in, const std::map<std::string, std::string> &variables) { std::list<std::string> I; for (std::list<std::string>::const_iterator it = in.begin(); it != in.end(); ++it) { if (it->empty()) continue; if (it->compare(0,2,"%(")==0) continue; std::string s(Path::fromNativeSeparators(*it)); if (s[0] == '/' || (s.size() > 1U && s.compare(1,2,":/") == 0)) { if (s[s.size()-1U] != '/') s += '/'; I.push_back(s); continue; } if (s[s.size()-1U] == '/') // this is a temporary hack, simplifyPath can crash if path ends with '/' s.erase(s.size() - 1U); if (s.find("$(")==std::string::npos) { s = Path::simplifyPath(basepath + s); } else { if (!simplifyPathWithVariables(s,variables)) continue; } if (s.empty()) continue; I.push_back(s + '/'); } includePaths.swap(I); }
void ImportProject::FileSettings::setIncludePaths(const std::string &basepath, const std::list<std::string> &in, std::map<std::string, std::string, cppcheck::stricmp> &variables) { std::list<std::string> I; // only parse each includePath once - so remove duplicates std::list<std::string> uniqueIncludePaths = in; uniqueIncludePaths.sort(); uniqueIncludePaths.unique(); for (std::list<std::string>::const_iterator it = uniqueIncludePaths.begin(); it != uniqueIncludePaths.end(); ++it) { if (it->empty()) continue; if (it->compare(0,2,"%(")==0) continue; std::string s(Path::fromNativeSeparators(*it)); if (s[0] == '/' || (s.size() > 1U && s.compare(1,2,":/") == 0)) { if (!endsWith(s,'/')) s += '/'; I.push_back(s); continue; } if (endsWith(s,'/')) // this is a temporary hack, simplifyPath can crash if path ends with '/' s.erase(s.size() - 1U); // TODO: Use std::string::pop_back() as soon as travis supports it if (s.find("$(")==std::string::npos) { s = Path::simplifyPath(basepath + s); } else { if (!simplifyPathWithVariables(s,variables)) continue; } if (s.empty()) continue; I.push_back(s + '/'); } includePaths.swap(I); }