---
 src/db/update/ExcludeList.cxx | 18 +++++-------------
 src/db/update/ExcludeList.hxx | 39 +++++++++++++++++++++++++++++++--------
 2 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/src/db/update/ExcludeList.cxx b/src/db/update/ExcludeList.cxx
index 631d452..832828b 100644
--- a/src/db/update/ExcludeList.cxx
+++ b/src/db/update/ExcludeList.cxx
@@ -35,26 +35,27 @@
 #include <string.h>
 #include <errno.h>
 
-#ifdef HAVE_GLIB
-
 gcc_pure
 static bool
 IsFileNotFound(const Error &error)
 {
+#ifdef HAVE_GLIB
 #ifdef WIN32
        return error.IsDomain(win32_domain) &&
                error.GetCode() == ERROR_FILE_NOT_FOUND;
 #else
        return error.IsDomain(errno_domain) && error.GetCode() == ENOENT;
 #endif
+#else
+       (void) error;
+       return true;
+#endif
 }
 
-#endif
 
 bool
 ExcludeList::LoadFile(Path path_fs)
 {
-#ifdef HAVE_GLIB
        Error error;
        TextFile file(path_fs, error);
        if (file.HasFailed()) {
@@ -73,10 +74,6 @@ ExcludeList::LoadFile(Path path_fs)
                if (*p != 0)
                        patterns.emplace_front(p);
        }
-#else
-       // TODO: implement
-       (void)path_fs;
-#endif
 
        return true;
 }
@@ -88,14 +85,9 @@ ExcludeList::Check(Path name_fs) const
 
        /* XXX include full path name in check */
 
-#ifdef HAVE_GLIB
        for (const auto &i : patterns)
                if (i.Check(NarrowPath(name_fs).c_str()))
                        return true;
-#else
-       // TODO: implement
-       (void)name_fs;
-#endif
 
        return false;
 }
diff --git a/src/db/update/ExcludeList.hxx b/src/db/update/ExcludeList.hxx
index ae196a7..03d45f6 100644
--- a/src/db/update/ExcludeList.hxx
+++ b/src/db/update/ExcludeList.hxx
@@ -32,6 +32,9 @@
 
 #ifdef HAVE_GLIB
 #include <glib.h>
+#else
+#include <sys/types.h>
+#include <regex.h>
 #endif
 
 class Path;
@@ -59,21 +62,41 @@ class ExcludeList {
                        return g_pattern_match_string(pattern, name_fs);
                }
        };
-
-       std::forward_list<Pattern> patterns;
 #else
-       // TODO: implement
+       class Pattern {
+               int ret;
+               regex_t preg;
+
+       public:
+               Pattern(const char *_pattern)
+               {
+                       ret = regcomp(&preg, _pattern, REG_EXTENDED|REG_NOSUB);
+               }
+
+               Pattern(Pattern &&other)
+                       :ret(other.ret), preg(other.preg) {
+                       other.ret = -1;
+               }
+
+               ~Pattern() {
+                       if (ret == 0)
+                               regfree(&preg);
+               }
+
+               gcc_pure
+               bool Check(const char *name_fs) const {
+                       return ret == 0 &&
+                               regexec(&preg, name_fs, 0, nullptr, 0) == 0;
+               }
+       };
 #endif
 
+       std::forward_list<Pattern> patterns;
+
 public:
        gcc_pure
        bool IsEmpty() const {
-#ifdef HAVE_GLIB
                return patterns.empty();
-#else
-               // TODO: implement
-               return true;
-#endif
        }
 
        /**
-- 
2.1.4

_______________________________________________
mpd-devel mailing list
mpd-devel@musicpd.org
http://mailman.blarg.de/listinfo/mpd-devel

Reply via email to