]> git.tdb.fi Git - libs/core.git/commitdiff
Add platform-specific implemenrations of FS::list_filtered
authorMikko Rasa <tdb@tdb.fi>
Sun, 29 Aug 2021 23:38:46 +0000 (02:38 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 30 Aug 2021 00:25:18 +0000 (03:25 +0300)
Microsoft's stdlib does not have opendir and friends.

source/fs/dir.cpp
source/fs/unix/dir.cpp
source/fs/windows/dir.cpp

index 218a7a5cf75e0b8a1a05576bf4d5893423f02ec9..066d88bc1fd2c461bae39b5e3700d756f2aaa5b6 100644 (file)
@@ -1,8 +1,5 @@
-#include <dirent.h>
 #include <msp/core/application.h>
 #include <msp/core/environ.h>
-#include <msp/core/systemerror.h>
-#include <msp/strings/regex.h>
 #include <msp/strings/utils.h>
 #include "dir.h"
 #include "path.h"
@@ -108,28 +105,6 @@ vector<string> list_files(const Path &path)
        return list_filtered(path, string());
 }
 
-vector<string> list_filtered(const Path &path, const string &filter)
-{
-       Regex r_filter(filter);
-
-       vector<string> result;
-       DIR *dir = opendir(path.str().c_str());
-       if(!dir)
-               throw system_error("opendir");
-
-       while(dirent *de = readdir(dir))
-       {
-               const char *fn = de->d_name;
-               if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0))) 
-                       continue;
-               if(r_filter.match(fn))
-                       result.push_back(fn);
-       }
-       closedir(dir);
-
-       return result;
-}
-
 Path get_sys_conf_dir()
 {
        const char *argv0 = Application::get_argv0();
index 0dc950bf00da0b8ff82b5e26e25346be3170be41..a13cbbbffe22b63bbe47efd22f67112fae4f7def 100644 (file)
@@ -1,6 +1,8 @@
 #include <unistd.h>
+#include <dirent.h>
 #include <sys/stat.h>
 #include <msp/core/systemerror.h>
+#include <msp/strings/regex.h>
 #include "dir.h"
 
 using namespace std;
@@ -20,6 +22,28 @@ void rmdir(const Path &path)
                throw system_error("rmdir");
 }
 
+vector<string> list_filtered(const Path &path, const string &filter)
+{
+       Regex r_filter(filter);
+
+       vector<string> result;
+       DIR *dir = opendir(path.str().c_str());
+       if(!dir)
+               throw system_error("opendir");
+
+       while(dirent *de = readdir(dir))
+       {
+               const char *fn = de->d_name;
+               if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0)))
+                       continue;
+               if(r_filter.match(fn))
+                       result.push_back(fn);
+       }
+       closedir(dir);
+
+       return result;
+}
+
 Path getcwd()
 {
        char buf[1024];
index 3d2bf6e65a8f5fd461a48d51d595265c1bad2fec..c6f6b9b6bd29893535ca64dd5b4423b5a39a8ad0 100644 (file)
@@ -1,6 +1,7 @@
 #include <windows.h>
 #include <msp/core/mutex.h>
 #include <msp/core/systemerror.h>
+#include <msp/strings/regex.h>
 #include "dir.h"
 
 using namespace std;
@@ -20,6 +21,40 @@ void rmdir(const Path &path)
                throw system_error("RemoveDirectory");
 }
 
+vector<string> list_filtered(const Path &path, const string &filter)
+{
+       Regex r_filter(filter);
+
+       vector<string> result;
+       WIN32_FIND_DATA entry;
+       string pattern = path.str()+"\\*";
+       HANDLE search_handle = FindFirstFileEx(pattern.c_str(), FindExInfoBasic, &entry, FindExSearchNameMatch, 0, 0);
+       if(search_handle==INVALID_HANDLE_VALUE)
+       {
+               DWORD err = GetLastError();
+               if(err==ERROR_FILE_NOT_FOUND)
+                       return result;
+               throw system_error("FindFirstFileEx");
+       }
+
+       bool more = true;
+       for(; more; more=FindNextFile(search_handle, &entry))
+       {
+               const char *fn = entry.cFileName;
+               if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0)))
+                       continue;
+               if(r_filter.match(fn))
+                       result.push_back(fn);
+       }
+
+       DWORD err = GetLastError();
+       FindClose(search_handle);
+       if(err!=ERROR_NO_MORE_FILES)
+               throw system_error("FindNextFile");
+
+       return result;
+}
+
 /* Windows documentation says Get/SetCurrentDirectory use a global buffer and
 are not thread safe. */
 static Mutex &cwd_mutex()