]> git.draconx.ca Git - upkg.git/commitdiff
upkg: Add support for querying specific objects.
authorNick Bowler <nbowler@draconx.ca>
Sun, 13 Mar 2011 16:43:29 +0000 (12:43 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sun, 13 Mar 2011 21:39:00 +0000 (17:39 -0400)
src/libupkg.c
src/upkg.c
src/upkg.h

index 680faac96f7f4b7aefd39eab0ada0e7c4f4b46d5..94f0d12a2a695bdd1f56c86ab52f066799e7d19b 100644 (file)
@@ -46,7 +46,7 @@ struct upkg_name {
 struct upkg_export_priv {
        struct upkg_export pub;
 
-       long package, class, super;
+       long class, super;
        unsigned long size, offset;
 };
 
@@ -301,7 +301,7 @@ static int pkg_init_exports(struct upkg_priv *pkg)
                len += rc;
 
                if (nbuf-len < 4) goto err;
-               export->package = unpack_s32_le(buf+len);
+               export->pub.package = unpack_s32_le(buf+len);
                len += 4;
 
                rc = upkg_decode_index(&tmp, buf+len, nbuf-len);
@@ -504,8 +504,9 @@ long upkg_export_find(struct upkg *pub, long parent, const char *name)
                struct upkg_export_priv *e = &pkg->exports[i];
 
                /* Assertion: an object's package is an export. */
-               format_assert(e->package >= 0, continue);
-               if (e->package == package && strcmp(e->pub.name, name) == 0) {
+               format_assert(e->pub.package >= 0, continue);
+               if (e->pub.package == package
+                   && strcmp(e->pub.name, name) == 0) {
                        return i;
                }
        }
index 989bf798f322e10d5d546d8f1e99d63ee3385868..93b3c64aeefb9216634aa9e3e61bc17c96c6d175 100644 (file)
@@ -223,6 +223,28 @@ int package_info(struct upkg *pkg)
        return 0;
 }
 
+static void export_print_name(struct upkg *upkg, const struct upkg_export *e)
+{
+       if (e) {
+               export_print_name(upkg, upkg_get_export(upkg, e->package-1));
+               printf(".%s", e->name);
+       }
+}
+
+static int export_info(GTypeModule *pkg, unsigned long idx)
+{
+       struct upkg *upkg = U_PKG(pkg)->pkg;
+       const struct upkg_export *export;
+
+       export = upkg_get_export(upkg, idx);
+
+       printf("%s", pkg->name);
+       export_print_name(upkg, export);
+       putchar('\n');
+
+       return 0;
+}
+
 static int export(struct upkg *pkg, GObject *obj, unsigned idx)
 {
        const struct upkg_export *export = upkg_get_export(pkg, idx);
@@ -341,7 +363,10 @@ static int process_object(int mode, const char *objname)
 
        switch (mode) {
        case MODE_INFO:
-               ret = package_info(U_PKG(pkg)->pkg);
+               if (current < 0)
+                       ret = package_info(U_PKG(pkg)->pkg);
+               else
+                       ret = export_info(pkg, current);
                break;
        case MODE_EXPORT:
                ret = package_export(U_PKG(pkg)->pkg);
index 044b10779a1d58b9013c7e5a76420258a3c7fbdb..4f93f9cec5086e3a960e0cf9342b0bb883c0ad73 100644 (file)
@@ -79,7 +79,9 @@ struct upkg {
 
 struct upkg_export {
        const char *name;
+
        unsigned long flags;
+       long package;
 };
 
 struct upkg_file {