コード例 #1
0
ファイル: filelister.cpp プロジェクト: JIghtuse/cppcheck
static void addFiles2(std::map<std::string, std::size_t> &files,
                      const std::string &path,
                      const std::set<std::string> &extra,
                      bool recursive,
                      const PathMatch& ignored
                     )
{
    struct stat file_stat;
    if (stat(path.c_str(), &file_stat) != -1) {
        if ((file_stat.st_mode & S_IFMT) == S_IFDIR) {
            DIR * dir = opendir(path.c_str());

            if (!dir)
                return;

            dirent entry;
            dirent * dir_result;

            std::string new_path;
            new_path.reserve(path.length() + 100);// prealloc some memory to avoid constant new/deletes in loop

            while ((readdir_r(dir, &entry, &dir_result) == 0) && (dir_result != NULL)) {

                if ((std::strcmp(dir_result->d_name, ".") == 0) ||
                    (std::strcmp(dir_result->d_name, "..") == 0))
                    continue;

                new_path = path + '/' + dir_result->d_name;

                if (dir_result->d_type == DT_DIR || (dir_result->d_type == DT_UNKNOWN && FileLister::isDirectory(new_path))) {
                    if (recursive && !ignored.Match(new_path)) {
                        addFiles2(files, new_path, extra, recursive, ignored);
                    }
                } else {
                    if (Path::acceptFile(new_path, extra) && !ignored.Match(new_path)) {
                        files[new_path] = file_stat.st_size;
                    }
                }
            }
            closedir(dir);
        } else
            files[path] = file_stat.st_size;
    }
}
コード例 #2
0
 void emptymaskpath1() const {
     ASSERT(!emptyMatcher.Match("src/"));
 }
コード例 #3
0
 // Test empty PathMatch
 void emptymaskemptyfile() const {
     ASSERT(!emptyMatcher.Match(""));
 }
コード例 #4
0
 void filemaskpath4() const {
     ASSERT(!srcFooCppMatcher.Match("bar/foo.cpp"));
 }
コード例 #5
0
 void filemaskpath2() const {
     ASSERT(srcFooCppMatcher.Match("proj/src/foo.cpp"));
 }
コード例 #6
0
ファイル: testpathmatch.cpp プロジェクト: imasaaki/cppcheck
 // Test PathMatch containing "src/foo.cpp"
 void filemaskpath1() const {
     ASSERT(srcFooCppMatcher.match("src/foo.cpp"));
 }
コード例 #7
0
 // Test PathMatch containing "src/"
 void onemaskemptypath() const {
     ASSERT(!srcMatcher.Match(""));
 }
コード例 #8
0
 void onemasklongerpath2() const {
     ASSERT(srcMatcher.Match("src/module/"));
 }
コード例 #9
0
 void onemasklongerpath3() const {
     ASSERT(srcMatcher.Match("project/src/module/"));
 }
コード例 #10
0
 void onemaskdifferentdir4() const {
     ASSERT(!srcMatcher.Match("proj/mysrcfiles/file.txt"));
 }
コード例 #11
0
 void onemasklongerpath1() const {
     ASSERT(srcMatcher.Match("/tmp/src/"));
 }
コード例 #12
0
 void onemaskdifferentdir1() const {
     ASSERT(!srcMatcher.Match("srcfiles/file.txt"));
 }
コード例 #13
0
 void onemasksamepathwithfile() const {
     ASSERT(srcMatcher.Match("src/file.txt"));
 }
コード例 #14
0
ファイル: testpathmatch.cpp プロジェクト: imasaaki/cppcheck
 void filemaskpath3() const {
     ASSERT(!srcFooCppMatcher.match("foo.cpp"));
 }
コード例 #15
0
 void emptymaskpath2() const {
     ASSERT(!emptyMatcher.Match("../src/"));
 }
コード例 #16
0
 // Test PathMatch containing "foo.cpp"
 void filemask1() const {
     ASSERT(fooCppMatcher.Match("foo.cpp"));
 }
コード例 #17
0
 void emptymaskpath3() const {
     ASSERT(!emptyMatcher.Match("/home/user/code/src/"));
 }
コード例 #18
0
 void filemask2() const {
     ASSERT(fooCppMatcher.Match("../foo.cpp"));
 }
コード例 #19
0
 void onemasksamepath() const {
     ASSERT(srcMatcher.Match("src/"));
 }
コード例 #20
0
 void filemask3() const {
     ASSERT(fooCppMatcher.Match("src/foo.cpp"));
 }
コード例 #21
0
ファイル: filelister.cpp プロジェクト: JIghtuse/cppcheck
void FileLister::recursiveAddFiles(std::map<std::string, std::size_t> &files, const std::string &path, const std::set<std::string> &extra, const PathMatch& ignored)
{
    const std::string cleanedPath = Path::toNativeSeparators(path);

    // basedir is the base directory which is used to form pathnames.
    // It always has a trailing backslash available for concatenation.
    std::string basedir;

    // searchPattern is the search string passed into FindFirst and FindNext.
    std::string searchPattern = cleanedPath;

    // The user wants to check all files in a dir
    const bool checkAllFilesInDir = (MyIsDirectory(cleanedPath) != FALSE);

    if (checkAllFilesInDir) {
        char c = cleanedPath.back();
        switch (c) {
        case '\\':
            searchPattern += '*';
            basedir = cleanedPath;
            break;
        case '*':
            basedir = cleanedPath.substr(0, cleanedPath.length() - 1);
            break;
        default:
            searchPattern += "\\*";
            if (cleanedPath != ".")
                basedir = cleanedPath + '\\';
        }
    } else {
        std::string::size_type pos = cleanedPath.find_last_of('\\');
        if (std::string::npos != pos) {
            basedir = cleanedPath.substr(0, pos + 1);
        }
    }

    WIN32_FIND_DATAA ffd;
    HANDLE hFind = MyFindFirstFile(searchPattern, &ffd);
    if (INVALID_HANDLE_VALUE == hFind)
        return;

    do {
        if (ffd.cFileName[0] == '.' || ffd.cFileName[0] == '\0')
            continue;

        const char* ansiFfd = ffd.cFileName;
        if (std::strchr(ansiFfd,'?')) {
            ansiFfd = ffd.cAlternateFileName;
        }

        const std::string fname(basedir + ansiFfd);

        if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
            // File
            if ((!checkAllFilesInDir || Path::acceptFile(fname, extra)) && !ignored.Match(fname)) {
                const std::string nativename = Path::fromNativeSeparators(fname);

                // Limitation: file sizes are assumed to fit in a 'size_t'
#ifdef _WIN64
                files[nativename] = (static_cast<std::size_t>(ffd.nFileSizeHigh) << 32) | ffd.nFileSizeLow;
#else
                files[nativename] = ffd.nFileSizeLow;
#endif
            }
        } else {
            // Directory
            if (!ignored.Match(fname))
                FileLister::recursiveAddFiles(files, fname, extra, ignored);
        }
    } while (FindNextFileA(hFind, &ffd) != FALSE);

    FindClose(hFind);
}
コード例 #22
0
ファイル: testpathmatch.cpp プロジェクト: imasaaki/cppcheck
 void onemaskdifferentdir3() const {
     ASSERT(!srcMatcher.match("proj/mysrc/file.txt"));
 }