Example #1
0
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));
        }
    }
}
Example #2
0
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();
                }
            }
        }
    }
}
Example #3
0
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);
}
Example #4
0
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);
}