From eedd5d24e385f09ec109fffb558797e3c6e2889d Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 2 Mar 2011 20:22:53 -0500 Subject: [PATCH] upkg: Resolve hierarchical object references. This doesn't actually do anything useful yet, but it's a start. --- src/upkg.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/upkg.c b/src/upkg.c index a82ab2c..038eb39 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -290,28 +290,54 @@ int package_export(struct upkg *pkg) static int process_object(int mode, const char *objname) { + char work[strlen(objname)+1], *p = work, *c; GTypeModule *pkg; + long current = -1; int ret = 0; - pkg = u_pkg_open(objname); + strcpy(work, objname); + + /* First, find and open the actual package. */ + c = strchr(p, '.'); + if (c) *c = 0; + + pkg = u_pkg_open(p); if (!pkg || !g_type_module_use(pkg)) { fprintf(stderr, "%s: %s: failed to open package.\n", - progname, objname); + progname, work); goto out; } if (!U_PKG(pkg)->pkg) { if (u_pkg_is_native(pkg)) { fprintf(stderr, "%s: %s: not a UObject package.\n", - progname, objname); + progname, work); } else { fprintf(stderr, "%s: %s: package not found.\n", - progname, objname); + progname, work); } goto out_unuse; } + /* Resolve the hierarchical reference. */ + while (c) { + p = c+1; + c = strchr(p, '.'); + if (c) *c = 0; + + current = upkg_export_find(U_PKG(pkg)->pkg, current, p); + if (current == -1) { + /* We want to print the full name up to this point. */ + strcpy(work, objname); + if (c) *c = 0; + + fprintf(stderr, "%s: %s: object not found.\n", + progname, work); + goto out_unuse; + } + } + switch (mode) { case MODE_INFO: ret = package_info(U_PKG(pkg)->pkg); -- 2.43.0