From dc81ab8640107086c71b910c0a5d9c12f873d27d Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Tue, 17 Jun 2014 12:16:37 +1000 Subject: [PATCH] Move member functions from PathScanner to functions in pbd/file_utils.h This allows us to remove PathScanner source file and keep PathScanner class as header only until it is removed --- libs/pbd/file_utils.cc | 128 ++++++++++++++++++++++++++++- libs/pbd/pathscanner.cc | 162 ------------------------------------- libs/pbd/pbd/file_utils.h | 26 ++++++ libs/pbd/pbd/pathscanner.h | 41 +++------- libs/pbd/wscript | 1 - 5 files changed, 165 insertions(+), 193 deletions(-) delete mode 100644 libs/pbd/pathscanner.cc diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc index 552012d227..7e58f0fed5 100644 --- a/libs/pbd/file_utils.cc +++ b/libs/pbd/file_utils.cc @@ -1,5 +1,6 @@ /* - Copyright (C) 2007 Tim Mayberry + Copyright (C) 2007-2014 Tim Mayberry + Copyright (C) 1998-2014 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,8 +43,15 @@ /* close(), read(), write() */ #ifdef COMPILER_MSVC #include // Microsoft's nearest equivalent to +#include #else +#include #include +#include +#endif + +#ifdef PLATFORM_WINDOWS +#define strtok_r strtok_s #endif #include "pbd/compose.h" @@ -51,6 +59,7 @@ #include "pbd/debug.h" #include "pbd/error.h" #include "pbd/pathscanner.h" +#include "pbd/pathexpand.h" #include "pbd/stl_delete.h" #include "i18n.h" @@ -161,6 +170,123 @@ find_file_in_search_path(const Searchpath& search_path, return true; } +static +bool +regexp_filter (const string& str, void *arg) +{ + regex_t* pattern = (regex_t*)arg; + return regexec (pattern, str.c_str(), 0, 0, 0) == 0; +} + +void +find_files_matching_regex (vector& result, + const std::string& dirpath, + const std::string& regexp, + bool match_fullpath, bool return_fullpath, + long limit, + bool recurse) +{ + int err; + char msg[256]; + regex_t compiled_pattern; + + if ((err = regcomp (&compiled_pattern, regexp.c_str(), + REG_EXTENDED|REG_NOSUB))) { + + regerror (err, &compiled_pattern, + msg, sizeof (msg)); + + error << "Cannot compile soundfile regexp for use (" + << msg + << ")" + << endmsg; + + return; + } + + find_files_matching_filter (result, dirpath, + regexp_filter, &compiled_pattern, + match_fullpath, return_fullpath, + limit, recurse); + + regfree (&compiled_pattern); +} + +void +find_files_matching_filter (vector& result, + const string &dirpath, + bool (*filter)(const string &, void *), + void *arg, + bool match_fullpath, bool return_fullpath, + long limit, + 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; + } + + do { + + if ((dir = opendir (thisdir)) == 0) { + continue; + } + + while ((finfo = readdir (dir)) != 0) { + + 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); + + struct stat statbuf; + if (stat (fullpath.c_str(), &statbuf) < 0) { + continue; + } + + if (statbuf.st_mode & S_IFDIR && recurse) { + find_files_matching_filter (result, fullpath, filter, arg, match_fullpath, return_fullpath, limit, 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); + } + + nfound++; + } + } + closedir (dir); + + } while ((limit < 0 || (nfound < limit)) && (thisdir = strtok_r (0, G_SEARCHPATH_SEPARATOR_S, &saveptr))); + + free (pathcopy); + return; +} + bool copy_file(const std::string & from_path, const std::string & to_path) { diff --git a/libs/pbd/pathscanner.cc b/libs/pbd/pathscanner.cc deleted file mode 100644 index a320ec8d54..0000000000 --- a/libs/pbd/pathscanner.cc +++ /dev/null @@ -1,162 +0,0 @@ -/* - Copyright (C) 1998-99 Paul Barton-Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id$ -*/ - -#ifdef COMPILER_MSVC -#include -#include -using PBD::readdir; -using PBD::opendir; -using PBD::closedir; -#define strtok_r strtok_s // @john: this should probably go to msvc_extra_headers/ardourext/misc.h.input instead of the current define there -#else -#include -#include -#include -#endif -#include -#include -#include -#include - -#include - -#include "pbd/error.h" -#include "pbd/pathexpand.h" -#include "pbd/pathscanner.h" - -using namespace std; -using namespace PBD; - -static -bool -regexp_filter (const string& str, void *arg) -{ - regex_t* pattern = (regex_t*)arg; - return regexec (pattern, str.c_str(), 0, 0, 0) == 0; -} - -void -PathScanner::find_files_matching_regex (vector& result, - const std::string& dirpath, - const std::string& regexp, - bool match_fullpath, bool return_fullpath, - long limit, - bool recurse) -{ - int err; - char msg[256]; - regex_t compiled_pattern; - - if ((err = regcomp (&compiled_pattern, regexp.c_str(), - REG_EXTENDED|REG_NOSUB))) { - - regerror (err, &compiled_pattern, - msg, sizeof (msg)); - - error << "Cannot compile soundfile regexp for use (" - << msg - << ")" - << endmsg; - - return; - } - - find_files_matching_filter (result, dirpath, - regexp_filter, &compiled_pattern, - match_fullpath, return_fullpath, - limit, recurse); - - regfree (&compiled_pattern); -} - -void -PathScanner::find_files_matching_filter (vector& result, - const string &dirpath, - bool (*filter)(const string &, void *), - void *arg, - bool match_fullpath, bool return_fullpath, - long limit, - 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; - } - - do { - - if ((dir = opendir (thisdir)) == 0) { - continue; - } - - while ((finfo = readdir (dir)) != 0) { - - 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); - - struct stat statbuf; - if (stat (fullpath.c_str(), &statbuf) < 0) { - continue; - } - - if (statbuf.st_mode & S_IFDIR && recurse) { - find_files_matching_filter (result, fullpath, filter, arg, match_fullpath, return_fullpath, limit, 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); - } - - nfound++; - } - } - closedir (dir); - - } while ((limit < 0 || (nfound < limit)) && (thisdir = strtok_r (0, G_SEARCHPATH_SEPARATOR_S, &saveptr))); - - free (pathcopy); - return; -} diff --git a/libs/pbd/pbd/file_utils.h b/libs/pbd/pbd/file_utils.h index 01ff8606a7..51fb2c1ad1 100644 --- a/libs/pbd/pbd/file_utils.h +++ b/libs/pbd/pbd/file_utils.h @@ -92,6 +92,32 @@ find_file_in_search_path (const Searchpath& search_path, const std::string& filename, std::string& result); + +/** + * @return files in dirpath that match a regular expression + */ +LIBPBD_API void +find_files_matching_regex (std::vector& results, + const std::string& dirpath, + const std::string& regexp, + bool match_fullpath, + bool return_fullpath, + long limit, + bool recurse = false); + +/** + * @return files in dirpath that match a supplied filter(functor) + */ +LIBPBD_API void +find_files_matching_filter (std::vector&, + const std::string &dirpath, + bool (*filter)(const std::string &, void *), + void *arg, + bool match_fullpath, + bool return_fullpath, + long limit, + bool recurse = false); + /** * Attempt to copy the contents of the file from_path to a new file * at path to_path. If to_path exists it is overwritten. diff --git a/libs/pbd/pbd/pathscanner.h b/libs/pbd/pbd/pathscanner.h index d9522affe3..e4d2f6aa0e 100644 --- a/libs/pbd/pbd/pathscanner.h +++ b/libs/pbd/pbd/pathscanner.h @@ -30,6 +30,8 @@ #include "pbd/libpbd_visibility.h" +#include "pbd/file_utils.h" + class LIBPBD_API PathScanner { @@ -42,10 +44,10 @@ class LIBPBD_API PathScanner long limit = -1, bool recurse = false) { std::vector result; - find_files_matching_filter (result, dirpath, - filter, arg, - match_fullpath, return_fullpath, - limit, recurse); + PBD::find_files_matching_filter (result, dirpath, + filter, arg, + match_fullpath, return_fullpath, + limit, recurse); return result; } @@ -58,34 +60,15 @@ class LIBPBD_API PathScanner { std::vector result; - find_files_matching_regex (result, - dirpath, - regexp, - match_fullpath, - return_fullpath, - limit, recurse); + PBD::find_files_matching_regex (result, + dirpath, + regexp, + match_fullpath, + return_fullpath, + limit, recurse); return result; } - - private: - - void find_files_matching_regex (std::vector& results, - const std::string& dirpath, - const std::string& regexp, - bool match_fullpath, - bool return_fullpath, - long limit, - bool recurse = false); - - void find_files_matching_filter (std::vector&, - const std::string &dirpath, - bool (*filter)(const std::string &, void *), - void *arg, - bool match_fullpath, - bool return_fullpath, - long limit, - bool recurse = false); }; #endif // __libmisc_pathscanner_h__ diff --git a/libs/pbd/wscript b/libs/pbd/wscript index 2ba79d0c34..35f4b4c5c7 100644 --- a/libs/pbd/wscript +++ b/libs/pbd/wscript @@ -57,7 +57,6 @@ libpbd_sources = [ 'mountpoint.cc', 'openuri.cc', 'pathexpand.cc', - 'pathscanner.cc', 'pbd.cc', 'pool.cc', 'property_list.cc',