1 // Copyright (2013) Jann Horn <jann@thejh.net>
3 HEADER #include <stdio.h>
4 HEADER #include <sys/types.h>
5 HEADER #include <dirent.h>
9 // nonzero iterator exit code means cancel
10 HEADER typedef int dir_iterator(struct dirent *dent, void *data);
11 PUBLIC_FN int fdir_foreach(DIR *d, dir_iterator *iter, void *data) {
15 int rd_res = readdir_r(d, &de, &res);
16 if (rd_res) return rd_res;
17 if (res == NULL) return 0;
18 int iter_res = iter(&de, data);
19 if (iter_res) return iter_res;
23 PUBLIC_FN int dir_foreach(char *path, dir_iterator *iter, void *data) {
24 DIR *d = opendir(path);
25 if (d == NULL) return 1;
26 int feach_res = fdir_foreach(d, iter, data);
33 HEADER // requires stdio.h
34 HEADER #define FDIR_FOREACH(dir, element_name, code) { \
35 HEADER struct dirent element_name; \
36 HEADER struct dirent *__jh_fdir_foreach_res; \
38 HEADER int __jh_fdir_foreach_rd_res = readdir_r(dir, &element_name, &__jh_fdir_foreach_res); \
39 HEADER if(__jh_fdir_foreach_rd_res) {*(char*)0 = 0; /*crash, boom – EBADF happened (probably)*/} \
40 HEADER if (__jh_fdir_foreach_res == NULL) goto end; \