]> git.draconx.ca Git - upkg.git/blobdiff - src/upkg.c
libupkg: Split the upkg_export struct into public/private parts.
[upkg.git] / src / upkg.c
index a82ab2c355764e3e683294c44a8c68bbd18ce82a..989bf798f322e10d5d546d8f1e99d63ee3385868 100644 (file)
@@ -181,18 +181,18 @@ void print_guid(unsigned char guid[static 16])
 void print_upkg_exports(struct upkg *pkg)
 {
        for (unsigned i = 0; i < pkg->export_count; i++) {
-               const char *name, *package, *class;
+               const struct upkg_export *export = upkg_get_export(pkg, i);
+               const char *package, *class;
 
-               name  = upkg_export_name(pkg, i);
                class = upkg_export_class(pkg, i, &package);
 
-               if (!name || !class)
+               if (!class)
                        continue;
 
-               printf("%u - %s (%s.%s)\n", i+1, name, package, class);
-               printf("  Flags: %lx\n", upkg_export_flags(pkg, i));
+               printf("%u - %s (%s.%s)\n", i+1, export->name, package, class);
+               printf("  Flags: %lx\n", export->flags);
                if (verbose >= 2) {
-                       print_upkg_object_flags("    ", upkg_export_flags(pkg, i));
+                       print_upkg_object_flags("    ", export->flags);
                }
        }
 }
@@ -225,6 +225,7 @@ int package_info(struct upkg *pkg)
 
 static int export(struct upkg *pkg, GObject *obj, unsigned idx)
 {
+       const struct upkg_export *export = upkg_get_export(pkg, idx);
        char name[256];
        FILE *of;
 
@@ -238,7 +239,7 @@ static int export(struct upkg *pkg, GObject *obj, unsigned idx)
 
        u_object_export_name(obj, name, sizeof name);
 
-       printf("exporting %s to %s\n", upkg_export_name(pkg, idx), name);
+       printf("exporting %s to %s\n", export->name, name);
        of = fopen(name, "wb");
        if (!of) {
                perror(name);
@@ -290,28 +291,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);