diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2014-06-19 14:41:59 +1000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-25 12:40:10 -0400 |
commit | 613162df6b1cc1f268c5f74504a28bfa46592f33 (patch) | |
tree | 2157c96f191431a506f1c3d071c23739a426afe5 /libs/pbd/file_utils.cc | |
parent | 56337eade47d62001fe4a9ce85e170ac26f2c1cf (diff) |
Reimplement PBD::find_files_matching_filter using SearchPath and get_directory_contents
Diffstat (limited to 'libs/pbd/file_utils.cc')
-rw-r--r-- | libs/pbd/file_utils.cc | 80 |
1 files changed, 26 insertions, 54 deletions
diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc index 8348049c8f..c159e2718a 100644 --- a/libs/pbd/file_utils.cc +++ b/libs/pbd/file_utils.cc @@ -46,7 +46,6 @@ #include <io.h> // Microsoft's nearest equivalent to <unistd.h> #include <ardourext/misc.h> #else -#include <dirent.h> #include <unistd.h> #include <regex.h> #endif @@ -240,68 +239,41 @@ find_files_matching_filter (vector<string>& result, bool match_fullpath, bool return_fullpath, bool recurse) { - DIR *dir; - struct dirent *finfo; - char *pathcopy = strdup (search_path_expand (dirpath).c_str()); - char *thisdir; - string fullpath; - string search_str; - long nfound = 0; - char *saveptr; - - if ((thisdir = strtok_r (pathcopy, G_SEARCHPATH_SEPARATOR_S, &saveptr)) == 0 || - strlen (thisdir) == 0) { - free (pathcopy); - return; - } + vector<string> all_files; - do { - - if ((dir = opendir (thisdir)) == 0) { - continue; - } + Searchpath spath(dirpath); - while ((finfo = readdir (dir)) != 0) { + for (vector<string>::iterator i = spath.begin(); i != spath.end(); ++i) + { + string expanded_path = path_expand (*i); + get_directory_contents (expanded_path, all_files, true, recurse); + } - if ((finfo->d_name[0] == '.' && finfo->d_name[1] == '\0') || - (finfo->d_name[0] == '.' && finfo->d_name[1] == '.' && finfo->d_name[2] == '\0')) { - continue; - } + for (vector<string>::iterator i = all_files.begin(); i != all_files.end(); ++i) { - fullpath = Glib::build_filename (thisdir, finfo->d_name); + string fullpath = *i; + string filename = Glib::path_get_basename (*i); + string search_str; - struct stat statbuf; - if (stat (fullpath.c_str(), &statbuf) < 0) { - continue; - } + if (match_fullpath) { + search_str = *i; + } else { + search_str = filename; + } - if (statbuf.st_mode & S_IFDIR && recurse) { - find_files_matching_filter (result, fullpath, filter, arg, match_fullpath, return_fullpath, recurse); - } else { - - if (match_fullpath) { - search_str = fullpath; - } else { - search_str = finfo->d_name; - } - - if (!filter(search_str, arg)) { - continue; - } - - if (return_fullpath) { - result.push_back(fullpath); - } else { - result.push_back(finfo->d_name); - } - } + if (!filter(search_str, arg)) { + continue; } - closedir (dir); - } while ((thisdir = strtok_r (0, G_SEARCHPATH_SEPARATOR_S, &saveptr))); + DEBUG_TRACE (DEBUG::FileUtils, + string_compose("Found file %1 matching filter\n", search_str)); - free (pathcopy); - return; + if (return_fullpath) { + result.push_back(fullpath); + } else { + result.push_back(filename); + } + } } bool |