X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpathscanner.cc;h=fac2dcfd965258debf26a13a3d65cd4839e76548;hb=6d1ca9ce42de34ebe4d605fe637a68e80292fac2;hp=a9847ad250c046b5836f462ba62d86ada31c7e29;hpb=e0aaed6d65f160c328cb8b56d7c6552ee15d65e2;p=ardour.git diff --git a/libs/pbd/pathscanner.cc b/libs/pbd/pathscanner.cc index a9847ad250..fac2dcfd96 100644 --- a/libs/pbd/pathscanner.cc +++ b/libs/pbd/pathscanner.cc @@ -18,23 +18,28 @@ $Id$ */ -#include #include #include #include #include #include +#include +#include + +#include #include "pbd/error.h" +#include "pbd/pathexpand.h" #include "pbd/pathscanner.h" #include "pbd/stl_delete.h" +using namespace std; using namespace PBD; vector * PathScanner::operator() (const string &dirpath, const string ®exp, bool match_fullpath, bool return_fullpath, - long limit) + long limit, bool recurse) { int err; @@ -59,7 +64,7 @@ PathScanner::operator() (const string &dirpath, const string ®exp, 0, match_fullpath, return_fullpath, - limit); + limit, recurse); } vector * @@ -68,15 +73,27 @@ PathScanner::run_scan (const string &dirpath, bool (*filter)(const string &, void *), void *arg, bool match_fullpath, bool return_fullpath, - long limit) - + long limit, + bool recurse) +{ + return run_scan_internal ((vector*) 0, dirpath, memberfilter, filter, arg, match_fullpath, return_fullpath, limit, recurse); +} + +vector * +PathScanner::run_scan_internal (vector *result, + const string &dirpath, + bool (PathScanner::*memberfilter)(const string &), + bool (*filter)(const string &, void *), + void *arg, + bool match_fullpath, bool return_fullpath, + long limit, + bool recurse) { - vector *result = 0; DIR *dir; struct dirent *finfo; - char *pathcopy = strdup (dirpath.c_str()); + char *pathcopy = strdup (search_path_expand (dirpath).c_str()); char *thisdir; - char fullpath[PATH_MAX+1]; + string fullpath; string search_str; string *newstr; long nfound = 0; @@ -87,7 +104,9 @@ PathScanner::run_scan (const string &dirpath, return 0; } - result = new vector; + if (result == 0) { + result = new vector; + } do { @@ -97,37 +116,50 @@ PathScanner::run_scan (const string &dirpath, while ((finfo = readdir (dir)) != 0) { - snprintf (fullpath, sizeof(fullpath), "%s/%s", - thisdir, finfo->d_name); - - if (match_fullpath) { - search_str = fullpath; - } else { - search_str = finfo->d_name; + if ((finfo->d_name[0] == '.' && finfo->d_name[1] == '\0') || + (finfo->d_name[0] == '.' && finfo->d_name[1] == '.' && finfo->d_name[2] == '\0')) { + continue; } + + fullpath = Glib::build_filename (thisdir, finfo->d_name); - /* handle either type of function ptr */ - - if (memberfilter) { - if (!(this->*memberfilter)(search_str)) { - continue; - } - } else { - if (!filter(search_str, arg)) { - continue; - } + struct stat statbuf; + if (stat (fullpath.c_str(), &statbuf) < 0) { + continue; } - if (return_fullpath) { - newstr = new string (fullpath); + if (statbuf.st_mode & S_IFDIR && recurse) { + run_scan_internal (result, fullpath, memberfilter, filter, arg, match_fullpath, return_fullpath, limit, recurse); } else { - newstr = new string (finfo->d_name); - } + + if (match_fullpath) { + search_str = fullpath; + } else { + search_str = finfo->d_name; + } + + /* handle either type of function ptr */ + + if (memberfilter) { + if (!(this->*memberfilter)(search_str)) { + continue; + } + } else { + if (!filter(search_str, arg)) { + continue; + } + } - result->push_back (newstr); - nfound++; + if (return_fullpath) { + newstr = new string (fullpath); + } else { + newstr = new string (finfo->d_name); + } + + result->push_back (newstr); + nfound++; + } } - closedir (dir); } while ((limit < 0 || (nfound < limit)) && (thisdir = strtok (0, ":"))); @@ -180,7 +212,7 @@ PathScanner::find_first (const string &dirpath, string * PathScanner::find_first (const string &dirpath, bool (*filter)(const string &, void *), - void *arg, + void * /*arg*/, bool match_fullpath, bool return_fullpath) {