summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bftw.c24
-rw-r--r--src/color.c2
-rw-r--r--src/ctx.c4
-rw-r--r--src/trie.h7
-rw-r--r--src/xspawn.c11
5 files changed, 22 insertions, 26 deletions
diff --git a/src/bftw.c b/src/bftw.c
index e6b8cd5..f3060ce 100644
--- a/src/bftw.c
+++ b/src/bftw.c
@@ -318,8 +318,7 @@ static size_t bftw_child_nameoff(const struct bftw_file *parent) {
/** Destroy a cache. */
static void bftw_cache_destroy(struct bftw_cache *cache) {
- bfs_assert(!cache->head);
- bfs_assert(!cache->tail);
+ bfs_assert(LIST_EMPTY(cache));
bfs_assert(!cache->target);
varena_destroy(&cache->files);
@@ -347,9 +346,9 @@ static struct bftw_file *bftw_file_new(struct bftw_cache *cache, struct bftw_fil
file->nameoff = 0;
}
- file->next = NULL;
- file->to_read.next = NULL;
- file->lru.prev = file->lru.next = NULL;
+ SLIST_ITEM_INIT(file);
+ SLIST_ITEM_INIT(file, to_read);
+ LIST_ITEM_INIT(file, lru);
file->refcount = 1;
file->pincount = 0;
@@ -833,12 +832,11 @@ static void bftw_push_dir(struct bftw_state *state, struct bftw_file *file) {
SLIST_APPEND(&state->to_read, file, to_read);
}
- while (state->to_open.head) {
- if (bftw_ioq_opendir(state, state->to_open.head) == 0) {
- SLIST_POP(&state->to_open);
- } else {
+ for_slist (struct bftw_file, dir, &state->to_open) {
+ if (bftw_ioq_opendir(state, dir) != 0) {
break;
}
+ SLIST_POP(&state->to_open);
}
}
@@ -847,7 +845,7 @@ static bool bftw_pop_dir(struct bftw_state *state) {
bfs_assert(!state->file);
struct bftw_cache *cache = &state->cache;
- bool have_files = state->to_visit.head;
+ bool have_files = !SLIST_EMPTY(&state->to_visit);
if (state->flags & BFTW_SORT) {
// Keep strict breadth-first order when sorting
@@ -855,9 +853,9 @@ static bool bftw_pop_dir(struct bftw_state *state) {
return false;
}
} else {
- while (!state->to_read.head) {
+ while (SLIST_EMPTY(&state->to_read)) {
// Block if we have no other files/dirs to visit, or no room in the cache
- bool have_dirs = state->to_open.head;
+ bool have_dirs = !SLIST_EMPTY(&state->to_open);
bool have_room = cache->capacity > 0 && cache->dirlimit > 0;
bool block = !(have_dirs || have_files) || !have_room;
@@ -1303,7 +1301,7 @@ static void bftw_list_sort(struct bftw_list *list) {
bftw_list_sort(&right);
// Merge
- while (left.head && right.head) {
+ while (!SLIST_EMPTY(&left) && !SLIST_EMPTY(&right)) {
struct bftw_file *lf = left.head;
struct bftw_file *rf = right.head;
diff --git a/src/color.c b/src/color.c
index b9a788b..5e78c6c 100644
--- a/src/color.c
+++ b/src/color.c
@@ -328,7 +328,7 @@ fail:
static int build_iext_trie(struct colors *colors) {
trie_clear(&colors->iext_trie);
- TRIE_FOR_EACH(&colors->ext_trie, leaf) {
+ for_trie (leaf, &colors->ext_trie) {
size_t len = leaf->length - 1;
if (colors->ext_len < len) {
colors->ext_len = len;
diff --git a/src/ctx.c b/src/ctx.c
index a940bed..3a44e68 100644
--- a/src/ctx.c
+++ b/src/ctx.c
@@ -152,7 +152,7 @@ void bfs_ctx_flush(const struct bfs_ctx *ctx) {
// - the user sees everything relevant before an -ok[dir] prompt
// - output from commands is interleaved consistently with bfs
// - executed commands can rely on I/O from other bfs actions
- TRIE_FOR_EACH(&ctx->files, leaf) {
+ for_trie (leaf, &ctx->files) {
struct bfs_ctx_file *ctx_file = leaf->value;
CFILE *cfile = ctx_file->cfile;
if (fflush(cfile->file) == 0) {
@@ -239,7 +239,7 @@ int bfs_ctx_free(struct bfs_ctx *ctx) {
bfs_groups_free(ctx->groups);
bfs_users_free(ctx->users);
- TRIE_FOR_EACH(&ctx->files, leaf) {
+ for_trie (leaf, &ctx->files) {
struct bfs_ctx_file *ctx_file = leaf->value;
if (ctx_file->error) {
diff --git a/src/trie.h b/src/trie.h
index dfaae15..2f51db5 100644
--- a/src/trie.h
+++ b/src/trie.h
@@ -6,6 +6,7 @@
#include "config.h"
#include "alloc.h"
+#include "list.h"
#include <stddef.h>
#include <stdint.h>
@@ -141,9 +142,7 @@ void trie_destroy(struct trie *trie);
/**
* Iterate over the leaves of a trie.
*/
-#define TRIE_FOR_EACH(trie, leaf) \
- for (struct trie_leaf *leaf = (trie)->head, *_next; \
- leaf && (_next = leaf->next, true); \
- leaf = _next)
+#define for_trie(leaf, trie) \
+ for_list(struct trie_leaf, leaf, trie)
#endif // BFS_TRIE_H
diff --git a/src/xspawn.c b/src/xspawn.c
index 2cabdcc..80bafef 100644
--- a/src/xspawn.c
+++ b/src/xspawn.c
@@ -49,8 +49,8 @@ int bfs_spawn_init(struct bfs_spawn *ctx) {
}
int bfs_spawn_destroy(struct bfs_spawn *ctx) {
- while (ctx->head) {
- free(SLIST_POP(ctx));
+ for_slist (struct bfs_spawn_action, action, ctx) {
+ free(action);
}
return 0;
@@ -68,7 +68,7 @@ static struct bfs_spawn_action *bfs_spawn_add(struct bfs_spawn *ctx, enum bfs_sp
return NULL;
}
- action->next = NULL;
+ SLIST_ITEM_INIT(action);
action->op = op;
action->in_fd = -1;
action->out_fd = -1;
@@ -138,7 +138,7 @@ int bfs_spawn_addsetrlimit(struct bfs_spawn *ctx, int resource, const struct rli
static void bfs_spawn_exec(const char *exe, const struct bfs_spawn *ctx, char **argv, char **envp, int pipefd[2]) {
xclose(pipefd[0]);
- for (const struct bfs_spawn_action *action = ctx ? ctx->head : NULL; action; action = action->next) {
+ for_slist (const struct bfs_spawn_action, action, ctx) {
// Move the error-reporting pipe out of the way if necessary...
if (action->out_fd == pipefd[1]) {
int fd = dup_cloexec(pipefd[1]);
@@ -199,9 +199,8 @@ pid_t bfs_spawn(const char *exe, const struct bfs_spawn *ctx, char **argv, char
envp = environ;
}
- enum bfs_spawn_flags flags = ctx ? ctx->flags : 0;
char *resolved = NULL;
- if (flags & BFS_SPAWN_USEPATH) {
+ if (ctx->flags & BFS_SPAWN_USEPATH) {
exe = resolved = bfs_spawn_resolve(exe);
if (!resolved) {
return -1;