From 9dd570d53e4fa3e50d631f355c99823283f77f6f Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sun, 23 Dec 2007 00:00:08 -0500 Subject: [PATCH] Implement filename globbing on list/extract. --- src/lbxtool.c | 53 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/src/lbxtool.c b/src/lbxtool.c index 5435d5f..687e419 100644 --- a/src/lbxtool.c +++ b/src/lbxtool.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "lbx.h" @@ -17,7 +18,26 @@ enum { MODE_EXTRACT, }; -int list(FILE *f, const char *name, int verbose) { +int filematch(char **argv, const char *name) +{ + int rc, i; + + for (i = 0; argv[i]; i++) { + switch(fnmatch(argv[i], name, 0)) { + case 0: + return 0; + case FNM_NOMATCH: + break; + default: + errmsg("error matching glob: %s.\n", argv[i]); + return 1; + } + } + + return i ? -1: 0; +} + +int list(FILE *f, const char *name, int verbose, char **argv) { LBX *lbx; size_t nfiles; unsigned int i; @@ -37,6 +57,13 @@ int list(FILE *f, const char *name, int verbose) { struct lbx_statbuf stat; lbx_stat(lbx, i, &stat); + + switch (filematch(argv, stat.name)) { + case -1: continue; + case 0: break; + default: goto err; + } + printf("%s", stat.name); if (verbose) { printf(" size=%zu bytes", stat.size); @@ -47,9 +74,12 @@ int list(FILE *f, const char *name, int verbose) { lbx_close(lbx); return EXIT_SUCCESS; +err: + lbx_close(lbx); + return EXIT_FAILURE; } -int extract(FILE *f, const char *name, int verbose) { +int extract(FILE *f, const char *name, int verbose, char **argv) { LBX *lbx; size_t nfiles; unsigned int i; @@ -69,13 +99,21 @@ int extract(FILE *f, const char *name, int verbose) { struct lbx_statbuf stat; size_t rc; FILE *of; + int j; lbx_stat(lbx, i, &stat); + + switch (filematch(argv, stat.name)) { + case -1: continue; + case 0: break; + default: goto err; + } + of = fopen(stat.name, "wbx"); if (!of) { errmsg("failed to create output file %s: %m.\n", stat.name); - break; + goto err; } if (verbose) printf("extracting %s...\n", stat.name); @@ -84,13 +122,16 @@ int extract(FILE *f, const char *name, int verbose) { if (rc == 0) remove(stat.name); errmsg("error extracting %s: %s.\n", stat.name, lbx_strerror()); - break; + goto err; } if (verbose) printf("wrote %zu bytes.\n", rc); } lbx_close(lbx); return EXIT_SUCCESS; +err: + lbx_close(lbx); + return EXIT_FAILURE; } int main(int argc, char **argv) @@ -148,9 +189,9 @@ int main(int argc, char **argv) switch (mode) { case MODE_LIST: - return list(f, name, verbose); + return list(f, name, verbose, &argv[optind]); case MODE_EXTRACT: - return extract(f, name, verbose); + return extract(f, name, verbose, &argv[optind]); } fprintf(stderr, "%s: you must specify a mode.\n", progname); -- 2.43.2