From: Nick Bowler Date: Fri, 10 Jul 2009 22:38:28 +0000 (-0400) Subject: upkg: Start implementing proper command line interface. X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/commitdiff_plain/c1029ec6d6b46abf9431e7c226f7d19bc4cb3ca2 upkg: Start implementing proper command line interface. --- diff --git a/src/upkg.c b/src/upkg.c index 61f67a4..6da174c 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -29,10 +29,19 @@ #include "uobject.h" #include "exportable.h" -static const char *progname = "upkg"; +enum { + MODE_INFO, + MODE_EXPORT, + MODE_MAX +}; -static const char *sopts = "VH"; +int verbose = 0; + +static const char *progname = "upkg"; +static const char *sopts = "ivVH"; static const struct option lopts[] = { + { "info", 0, NULL, 'i' }, + { "verbose", 0, NULL, 'v' }, { "version", 0, NULL, 'V' }, { "help", 0, NULL, 'H' }, { 0 } @@ -98,15 +107,46 @@ void print_guid(unsigned char guid[static 16]) } } +int package_info(struct upkg *pkg) +{ + printf("Version: %u\n", pkg->version); + printf("License: %u\n", pkg->license); + printf("GUID: "); + print_guid(pkg->guid); + + printf("Flags: %lx\n", pkg->flags); + if (verbose >= 1) { + print_upkg_flags("\t", pkg->flags); + } + + if (verbose >= 1) { + printf("Names: %lu\n", pkg->name_count); + if (verbose >= 2) { + for (unsigned long i = 0; i < pkg->name_count; i++) { + printf("\t%s\n", upkg_get_name(pkg, i)); + } + } + } + + return EXIT_SUCCESS; +} + int main(int argc, char **argv) { struct upkg *pkg; - int opt; + unsigned mode; + int opt, rc = EXIT_FAILURE; if (argc > 0) progname = argv[0]; while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { switch (opt) { + case 'i': + mode = MODE_INFO; + break; + case 'v': + verbose++; + break; case 'V': print_version(); return EXIT_SUCCESS; @@ -119,52 +159,27 @@ int main(int argc, char **argv) } } - if (argc < 2) { - fprintf(stderr, "usage: upkg file\n"); + if (argv[optind] == NULL) { + print_usage(); return EXIT_FAILURE; } if (module_init() != 0) return EXIT_FAILURE; - pkg = upkg_fopen(argv[1]); + pkg = upkg_fopen(argv[optind]); if (!pkg) { fprintf(stderr, "failed to open package!\n"); return EXIT_FAILURE; } - printf("Version: %u\n", pkg->version); - printf("License: %u\n", pkg->license); - printf("GUID: "); - print_guid(pkg->guid); - - printf("Flags: %lx\n", pkg->flags); - print_upkg_flags("\t", pkg->flags); - - printf("Names: %lu\n", pkg->name_count); - for (unsigned long i = 0; i < pkg->name_count; i++) { - printf("\t%s\n", upkg_get_name(pkg, i)); + switch (mode) { + case MODE_INFO: + rc = package_info(pkg); + break; } - printf("Exports: %lu\n", pkg->export_count); - printf("Imports: %lu\n", pkg->import_count); - - GObject *music = g_object_new(module_get_class("Engine", "Music"), NULL); - if (!music) - return EXIT_FAILURE; - struct upkg_file *f = upkg_export_open(pkg, 0); - u_object_deserialize(music, f); - - char name[256]; - u_object_export_name(music, name, sizeof name); - FILE *fp = fopen(name, "wb"); - if (!fp) return EXIT_FAILURE; - u_object_export(music, fp); - fclose(fp); - printf("Wrote %s\n", name); - upkg_close(pkg); module_exit(); - - return 0; + return rc; }