diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-07-11 13:08:06 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-07-11 13:27:49 +0200 |
| commit | 59e17afe291f9df52d2334b92e88a889c2fe8f6a (patch) | |
| tree | add5674ebd1b8441cacab11afdd1a6fabb6fe79a /cftw.c | |
| parent | 48b171335c213091cdf682c98ad784dc5c8456da (diff) | |
| download | slcl-59e17afe291f9df52d2334b92e88a889c2fe8f6a.tar.gz | |
cftw: Allow user callback to stop recursive search
So far, cftw would search through all directories and files recursively,
until all objects are processed. However, it is interesting for the user
callback to be able to stop this process under specific circumstances.
Now, cftw will pass a pointer to a bool, initialised to false by
default, that can be optionally assigned to true by the user
callback.
Future commits will make use of this feature. For example, this will be
used to limit the number of search results when a user enters a search
term that is too generic and would otherwise generate a large amount of
search results.
Diffstat (limited to 'cftw.c')
| -rw-r--r-- | cftw.c | 20 |
1 files changed, 14 insertions, 6 deletions
@@ -9,8 +9,8 @@ #include <stdint.h> #include <string.h> -int cftw(const char *const dirpath, int (*const fn)(const char *, - const struct stat *, void *), void *const user) +static int do_cftw(const char *const dirpath, int (*const fn)(const char *, + const struct stat *, bool *, void *), bool *const done, void *const user) { int ret = -1; DIR *const d = opendir(dirpath); @@ -58,20 +58,20 @@ int cftw(const char *const dirpath, int (*const fn)(const char *, __func__, path, strerror(errno)); else if (S_ISDIR(sb.st_mode)) { - if ((ret = cftw(d.str, fn, user))) + if ((ret = do_cftw(d.str, fn, done, user))) ; - else if ((ret = fn(d.str, &sb, user))) + else if ((ret = fn(d.str, &sb, done, user))) ; } else if (S_ISREG(sb.st_mode)) - ret = fn(d.str, &sb, user); + ret = fn(d.str, &sb, done, user); else fprintf(stderr, "%s: unexpected st_mode %ju\n", __func__, (uintmax_t)sb.st_mode); dynstr_free(&d); - if (ret) + if (ret || *done) goto end; } @@ -87,3 +87,11 @@ end: return ret; } + +int cftw(const char *const dirpath, int (*const fn)(const char *, + const struct stat *, bool *, void *), void *const user) +{ + bool done = false; + + return do_cftw(dirpath, fn, &done, user); +} |
