]> git.draconx.ca Git - liblbx.git/commitdiff
Implement filename globbing on list/extract.
authorNick Bowler <draconx@gmail.com>
Sun, 23 Dec 2007 05:00:08 +0000 (00:00 -0500)
committerNick Bowler <draconx@gmail.com>
Sun, 23 Dec 2007 05:00:08 +0000 (00:00 -0500)
src/lbxtool.c

index 5435d5f423e7c928814c36104211ed7eb6c3f4f3..687e419bdf297e4f51b333aa98ac5bc194a0bb0f 100644 (file)
@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <getopt.h>
+#include <fnmatch.h>
 
 #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);