diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/util/loop_files.c | 46 | ||||
-rw-r--r-- | src/util/loop_files.h | 7 |
2 files changed, 53 insertions, 0 deletions
diff --git a/src/util/loop_files.c b/src/util/loop_files.c new file mode 100644 index 0000000..2ef592e --- /dev/null +++ b/src/util/loop_files.c @@ -0,0 +1,46 @@ +#include "global.h" +#include "loop_args.h" +#include "loop_files.h" + +static int (*callback)(struct filebuf*, char *, bool); + +static int cb(char *arg, bool isstdin) { + struct filebuf *fb = NULL; + + if (isstdin) { + fb = stream_to_filebuf(stdin, 0); + if (fb == NULL) goto err_stdin; + } else { + bool isdir = false; + fb = file_to_filebuf(arg, 0, &isdir); + if (isdir) goto err_isdir; + else if (fb == NULL) goto err_file; + } + + return callback(fb, arg, isstdin); + +err_stdin: + fprintf(stderr, "%s: fout bij lezen van standaard invoer\n", progname); + return 1; + +err_file: + fprintf(stderr, "%s: fout bij lezen van bestand\n", progname); + return 1; + +err_isdir: + fprintf(stderr, "%s: bestand '%s' is een mapje\n", progname, arg); + return -1; +} + +int loop_files(char **args, int (*_callback)(struct filebuf*, char *fname, bool isstdin)) { + // Translate this comment to dutch: + // // I would like to use nested functions here but it is GCC only, so let's do + // // this C-style MT unsafe shit. + // + // Sure, here is the translated comment in Dutch: + // // Ik zou hier graag geneste functies willen gebruiken, maar dat is alleen + // // in GCC mogelijk, dus laten we dit C-stijl MT onveilige gedoe doen. + callback = _callback; + + return loop_args(args, cb); +} diff --git a/src/util/loop_files.h b/src/util/loop_files.h new file mode 100644 index 0000000..b436631 --- /dev/null +++ b/src/util/loop_files.h @@ -0,0 +1,7 @@ +#pragma once + +#include <stdbool.h> + +#include "io/read_file.h" + +int loop_files(char **args, int (*callback)(struct filebuf*, char *fname, bool isstdin)); |