aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ExcludeList.cxx30
-rw-r--r--src/ExcludeList.hxx61
-rw-r--r--src/UpdateWalk.cxx17
3 files changed, 61 insertions, 47 deletions
diff --git a/src/ExcludeList.cxx b/src/ExcludeList.cxx
index e71a99203..4beb7afc3 100644
--- a/src/ExcludeList.cxx
+++ b/src/ExcludeList.cxx
@@ -34,8 +34,8 @@ extern "C" {
#include <stdio.h>
#include <errno.h>
-GSList *
-exclude_list_load(const char *path_fs)
+bool
+ExcludeList::LoadFile(const char *path_fs)
{
assert(path_fs != NULL);
@@ -48,10 +48,9 @@ exclude_list_load(const char *path_fs)
g_free(path_utf8);
}
- return NULL;
+ return false;
}
- GSList *list = NULL;
char line[1024];
while (fgets(line, sizeof(line), file) != NULL) {
char *p = strchr(line, '#');
@@ -60,37 +59,24 @@ exclude_list_load(const char *path_fs)
p = g_strstrip(line);
if (*p != 0)
- list = g_slist_prepend(list, g_pattern_spec_new(p));
+ patterns.emplace_front(p);
}
fclose(file);
- return list;
-}
-
-void
-exclude_list_free(GSList *list)
-{
- while (list != NULL) {
- GPatternSpec *pattern = (GPatternSpec *)list->data;
- g_pattern_spec_free(pattern);
- list = g_slist_remove(list, list->data);
- }
+ return true;
}
bool
-exclude_list_check(GSList *list, const char *name_fs)
+ExcludeList::Check(const char *name_fs) const
{
assert(name_fs != NULL);
/* XXX include full path name in check */
- for (; list != NULL; list = list->next) {
- GPatternSpec *pattern = (GPatternSpec *)list->data;
-
- if (g_pattern_match_string(pattern, name_fs))
+ for (const auto &i : patterns)
+ if (i.Check(name_fs))
return true;
- }
return false;
}
diff --git a/src/ExcludeList.hxx b/src/ExcludeList.hxx
index 52ba377b5..4d678b085 100644
--- a/src/ExcludeList.hxx
+++ b/src/ExcludeList.hxx
@@ -25,25 +25,54 @@
#ifndef MPD_EXCLUDE_H
#define MPD_EXCLUDE_H
+#include "gcc.h"
+
+#include <forward_list>
+
#include <glib.h>
-/**
- * Loads and parses a .mpdignore file.
- */
-GSList *
-exclude_list_load(const char *path_fs);
+class ExcludeList {
+ class Pattern {
+ GPatternSpec *pattern;
-/**
- * Frees a list returned by exclude_list_load().
- */
-void
-exclude_list_free(GSList *list);
+ public:
+ Pattern(const char *_pattern)
+ :pattern(g_pattern_spec_new(_pattern)) {}
+
+ Pattern(Pattern &&other)
+ :pattern(other.pattern) {
+ other.pattern = nullptr;
+ }
+
+ ~Pattern() {
+ g_pattern_spec_free(pattern);
+ }
+
+ gcc_pure
+ bool Check(const char *name_fs) const {
+ return g_pattern_match_string(pattern, name_fs);
+ }
+ };
+
+ std::forward_list<Pattern> patterns;
+
+public:
+ gcc_pure
+ bool IsEmpty() const {
+ return patterns.empty();
+ }
+
+ /**
+ * Loads and parses a .mpdignore file.
+ */
+ bool LoadFile(const char *path_fs);
+
+ /**
+ * Checks whether one of the patterns in the .mpdignore file matches
+ * the specified file name.
+ */
+ bool Check(const char *name_fs) const;
+};
-/**
- * Checks whether one of the patterns in the .mpdignore file matches
- * the specified file name.
- */
-bool
-exclude_list_check(GSList *list, const char *name_fs);
#endif
diff --git a/src/UpdateWalk.cxx b/src/UpdateWalk.cxx
index 909687f46..30e2ca989 100644
--- a/src/UpdateWalk.cxx
+++ b/src/UpdateWalk.cxx
@@ -95,7 +95,8 @@ directory_set_stat(Directory *dir, const struct stat *st)
}
static void
-remove_excluded_from_directory(Directory *directory, GSList *exclude_list)
+remove_excluded_from_directory(Directory *directory,
+ const ExcludeList &exclude_list)
{
db_lock();
@@ -103,7 +104,7 @@ remove_excluded_from_directory(Directory *directory, GSList *exclude_list)
directory_for_each_child_safe(child, n, directory) {
char *name_fs = utf8_to_fs_charset(child->GetName());
- if (exclude_list_check(exclude_list, name_fs)) {
+ if (exclude_list.Check(name_fs)) {
delete_directory(child);
modified = true;
}
@@ -116,7 +117,7 @@ remove_excluded_from_directory(Directory *directory, GSList *exclude_list)
assert(song->parent == directory);
char *name_fs = utf8_to_fs_charset(song->uri);
- if (exclude_list_check(exclude_list, name_fs)) {
+ if (exclude_list.Check(name_fs)) {
delete_song(directory, song);
modified = true;
}
@@ -371,12 +372,13 @@ update_directory(Directory *directory, const struct stat *st)
}
char *exclude_path_fs = g_build_filename(path_fs, ".mpdignore", NULL);
- GSList *exclude_list = exclude_list_load(exclude_path_fs);
+ ExcludeList exclude_list;
+ exclude_list.LoadFile(exclude_path_fs);
g_free(exclude_path_fs);
g_free(path_fs);
- if (exclude_list != NULL)
+ if (!exclude_list.IsEmpty())
remove_excluded_from_directory(directory, exclude_list);
purge_deleted_from_directory(directory);
@@ -386,8 +388,7 @@ update_directory(Directory *directory, const struct stat *st)
char *utf8;
struct stat st2;
- if (skip_path(ent->d_name) ||
- exclude_list_check(exclude_list, ent->d_name))
+ if (skip_path(ent->d_name) || exclude_list.Check(ent->d_name))
continue;
utf8 = fs_charset_to_utf8(ent->d_name);
@@ -408,8 +409,6 @@ update_directory(Directory *directory, const struct stat *st)
g_free(utf8);
}
- exclude_list_free(exclude_list);
-
closedir(dir);
directory->mtime = st->st_mtime;