]> git.tdb.fi Git - libs/core.git/commitdiff
Refactor FS::list_files to not use an empty regex
authorMikko Rasa <tdb@tdb.fi>
Fri, 29 Dec 2023 22:23:28 +0000 (00:23 +0200)
committerMikko Rasa <tdb@tdb.fi>
Fri, 29 Dec 2023 22:27:10 +0000 (00:27 +0200)
source/fs/dir.cpp
source/fs/unix/dir.cpp
source/fs/windows/dir.cpp

index 0f617e58717b984db918eb51e714a8534c01a410..e043894bd673b90137f133559d2e09813a087d7a 100644 (file)
@@ -101,11 +101,6 @@ void rmpath(const Path &path)
        rmdir(path);
 }
 
-vector<string> list_files(const Path &path)
-{
-       return list_filtered(path, string());
-}
-
 Path get_sys_conf_dir()
 {
        const char *argv0 = Application::get_argv0();
index a13cbbbffe22b63bbe47efd22f67112fae4f7def..a2ac80e84ee41addb88e8e1558dec6f3331860ec 100644 (file)
@@ -22,10 +22,9 @@ void rmdir(const Path &path)
                throw system_error("rmdir");
 }
 
-vector<string> list_filtered(const Path &path, const string &filter)
+template<typename F>
+vector<string> list_files_internal(const Path &path, const F &filter)
 {
-       Regex r_filter(filter);
-
        vector<string> result;
        DIR *dir = opendir(path.str().c_str());
        if(!dir)
@@ -36,7 +35,7 @@ vector<string> list_filtered(const Path &path, const string &filter)
                const char *fn = de->d_name;
                if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0)))
                        continue;
-               if(r_filter.match(fn))
+               if(filter(fn))
                        result.push_back(fn);
        }
        closedir(dir);
@@ -44,6 +43,17 @@ vector<string> list_filtered(const Path &path, const string &filter)
        return result;
 }
 
+vector<string> list_files(const Path &path)
+{
+       return list_files_internal(path, [](const char *){ return true; });
+}
+
+vector<string> list_filtered(const Path &path, const string &filter)
+{
+       Regex r_filter(filter);
+       return list_files_internal(path, [&r_filter](const char *fn){ return r_filter.match(fn); });
+}
+
 Path getcwd()
 {
        char buf[1024];
index 2ba2f1e110f8e8f3aaf7dcbec38d50f052160578..c69820bf7e1e9ed18f9646142635ecb70a9399a6 100644 (file)
@@ -21,10 +21,9 @@ void rmdir(const Path &path)
                throw system_error("RemoveDirectory");
 }
 
-vector<string> list_filtered(const Path &path, const string &filter)
+template<typename F>
+vector<string> list_files_internal(const Path &path, const F &filter)
 {
-       Regex r_filter(filter);
-
        vector<string> result;
        WIN32_FIND_DATA entry;
        string pattern = path.str()+"\\*";
@@ -43,7 +42,7 @@ vector<string> list_filtered(const Path &path, const string &filter)
                const char *fn = entry.cFileName;
                if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0)))
                        continue;
-               if(r_filter.match(fn))
+               if(filter(fn))
                        result.push_back(fn);
        }
 
@@ -55,6 +54,17 @@ vector<string> list_filtered(const Path &path, const string &filter)
        return result;
 }
 
+vector<string> list_files(const Path &path)
+{
+       return list_files_internal(path, [](const char *){ return true; });
+}
+
+vector<string> list_filtered(const Path &path, const string &filter)
+{
+       Regex r_filter(filter);
+       return list_files_internal(path, [&r_filter](const char *fn){ return r_filter.match(fn); });
+}
+
 /* Windows documentation says Get/SetCurrentDirectory use a global buffer and
 are not thread safe. */
 static Mutex &cwd_mutex()