From: Nick Bowler Date: Wed, 16 May 2012 23:57:53 +0000 (-0400) Subject: upkg: Add support for listing package imports. X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/commitdiff_plain/fff1391d5182da5a1082eb1a58bfe0811ea1a7bd upkg: Add support for listing package imports. All we need is a way to get the import struct from libupkg and we can list all the package imports pretty easily, so add that, and do so. --- diff --git a/src/libupkg.c b/src/libupkg.c index 6964ee2..f1424e8 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -533,6 +533,15 @@ const struct upkg_export *upkg_get_export(struct upkg *pub, unsigned long idx) return NULL; } +const struct upkg_import *upkg_get_import(struct upkg *pub, unsigned long idx) +{ + struct upkg_priv *pkg = (struct upkg_priv *)pub; + + if (idx < pkg->pub.import_count) + return &pkg->imports[idx]; + return NULL; +} + const char *upkg_export_class(struct upkg *pub, unsigned long idx, const char **package) { diff --git a/src/upkg.c b/src/upkg.c index 9213753..d44422c 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -181,6 +181,31 @@ void print_guid(unsigned char guid[static 16]) } } +static void export_print_name(const struct upkg_export *e) +{ + if (e) { + export_print_name(e->parent); + printf(".%s", e->name); + } +} + +static void +export_print_fullname(GTypeModule *pkg, const struct upkg_export *export) +{ + printf("%s", pkg->name); + export_print_name(export); +} + +static void import_print_fullname(const struct upkg_import *import) +{ + if (import) { + import_print_fullname(import->parent); + if (import->parent) + putchar('.'); + printf("%s", import->name); + } +} + void print_upkg_exports(struct upkg *pkg) { for (unsigned i = 0; i < pkg->export_count; i++) { @@ -200,6 +225,17 @@ void print_upkg_exports(struct upkg *pkg) } } +void print_upkg_imports(struct upkg *pkg) +{ + for (unsigned i = 0; i < pkg->import_count; i++) { + const struct upkg_import *import = upkg_get_import(pkg, i); + + printf("%u - ", i); + import_print_fullname(import); + printf(" (%s.%s)\n", import->class_package, import->class_name); + } +} + int package_info(struct upkg *pkg) { printf("Version: %u\n", pkg->version); @@ -222,25 +258,11 @@ int package_info(struct upkg *pkg) printf("Exports: %lu\n", pkg->export_count); if (verbose >= 1) print_upkg_exports(pkg); printf("Imports: %lu\n", pkg->import_count); + if (verbose >= 1) print_upkg_imports(pkg); return 0; } -static void export_print_name(struct upkg *upkg, const struct upkg_export *e) -{ - if (e) { - export_print_name(upkg, e->parent); - printf(".%s", e->name); - } -} - -static void -export_print_fullname(GTypeModule *pkg, const struct upkg_export *export) -{ - printf("%s", pkg->name); - export_print_name(U_PKG(pkg)->pkg, export); -} - static int package_list(GTypeModule *pkg, long current) { struct upkg *upkg = U_PKG(pkg)->pkg; diff --git a/src/upkg.h b/src/upkg.h index dc73780..e4e5dcd 100644 --- a/src/upkg.h +++ b/src/upkg.h @@ -110,6 +110,7 @@ int upkg_close(struct upkg *pkg); const char *upkg_get_name(struct upkg *pkg, unsigned long idx); const struct upkg_export *upkg_get_export(struct upkg *pkg, unsigned long idx); +const struct upkg_import *upkg_get_import(struct upkg *pkg, unsigned long idx); long upkg_export_find(struct upkg *pkg, long parent, const char *name);