summaryrefslogtreecommitdiff
path: root/xs_glob.h
diff options
context:
space:
mode:
authordefault <nobody@localhost>2022-10-03 11:18:49 +0200
committerdefault <nobody@localhost>2022-10-03 11:18:49 +0200
commite8c421c51dea128a890d62bd091473aa61f3a357 (patch)
treeccb979c924513f39684f7d0c4e0835e6c269cd19 /xs_glob.h
parent7414b000ee273e40a335d868e27dd05b7de5e80e (diff)
Backport from xs.
Diffstat (limited to 'xs_glob.h')
-rw-r--r--xs_glob.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/xs_glob.h b/xs_glob.h
new file mode 100644
index 0000000..c5293dc
--- /dev/null
+++ b/xs_glob.h
@@ -0,0 +1,56 @@
+/* copyright (c) 2022 grunfink - MIT license */
+
+#ifndef _XS_GLOB_H
+
+#define _XS_GLOB_H
+
+d_char *xs_glob_n(const char *spec, int basename, int reverse, int max);
+#define xs_glob(spec, basename, reverse) xs_glob_n(spec, basename, reverse, 0xfffffff)
+
+
+#ifdef XS_IMPLEMENTATION
+
+#include <glob.h>
+
+d_char *xs_glob_n(const char *spec, int basename, int reverse, int max)
+/* does a globbing and returns the found files */
+{
+ glob_t globbuf;
+ d_char *list = xs_list_new();
+
+ if (glob(spec, 0, NULL, &globbuf) == 0) {
+ int n;
+
+ if (max > globbuf.gl_pathc)
+ max = globbuf.gl_pathc;
+
+ for (n = 0; n < max; n++) {
+ char *p;
+
+ if (reverse)
+ p = globbuf.gl_pathv[globbuf.gl_pathc - n - 1];
+ else
+ p = globbuf.gl_pathv[n];
+
+ if (p != NULL) {
+ if (basename) {
+ if ((p = strrchr(p, '/')) == NULL)
+ continue;
+
+ p++;
+ }
+
+ list = xs_list_append(list, p);
+ }
+ }
+ }
+
+ globfree(&globbuf);
+
+ return list;
+}
+
+
+#endif /* XS_IMPLEMENTATION */
+
+#endif /* _XS_GLOB_H */