]> git.draconx.ca Git - upkg.git/commitdiff
Reorganise the upkg structures a bit.
authorNick Bowler <nbowler@draconx.ca>
Fri, 5 Jun 2009 05:17:36 +0000 (01:17 -0400)
committerNick Bowler <nbowler@draconx.ca>
Fri, 5 Jun 2009 05:18:30 +0000 (01:18 -0400)
libupkg.c
upkg.c
upkg.h

index dfc8e0ffacbe68b0074b1d931291f81afa73e551..617aefaab8c91c52a497d68f38a7f097996193f4 100644 (file)
--- a/libupkg.c
+++ b/libupkg.c
@@ -4,15 +4,12 @@
 #include "upkg.h"
 #include "pack.h"
 
-struct upkg_table {
-       size_t offset;
-       size_t count;
-};
 
 struct upkg_private {
        FILE *f;
 
-       struct upkg_table names, exports, imports;
+
+       unsigned long name_offset, export_offset, import_offset;
        unsigned char guid[16];
 };
 
@@ -31,22 +28,16 @@ static struct upkg *init_upkg(unsigned char hdr[static UPKG_HDR_SIZE])
                return NULL;
        }
 
-       pkg->version = unpack_16_le(hdr+4);
-       pkg->license = unpack_16_le(hdr+6);
-       pkg->flags   = unpack_32_le(hdr+8);
+       pkg->version      = unpack_16_le(hdr+4);
+       pkg->license      = unpack_16_le(hdr+6);
+       pkg->flags        = unpack_32_le(hdr+8);
+       pkg->name_count   = unpack_32_le(hdr+12);
+       pkg->export_count = unpack_32_le(hdr+20);
+       pkg->import_count = unpack_32_le(hdr+28);
 
-       pkg->priv->names = (struct upkg_table) {
-               .count  = unpack_32_le(hdr+12),
-               .offset = unpack_32_le(hdr+16),
-       };
-       pkg->priv->exports = (struct upkg_table) {
-               .count  = unpack_32_le(hdr+20),
-               .offset = unpack_32_le(hdr+24),
-       };
-       pkg->priv->imports = (struct upkg_table) {
-               .count  = unpack_32_le(hdr+28),
-               .offset = unpack_32_le(hdr+32),
-       };
+       pkg->priv->name_offset   = unpack_32_le(hdr+16);
+       pkg->priv->export_offset = unpack_32_le(hdr+24);
+       pkg->priv->import_offset = unpack_32_le(hdr+32);
 
        return pkg;
 }
@@ -57,27 +48,32 @@ struct upkg *upkg_fopen(const char *path)
        struct upkg *pkg;
        FILE *f;
        
-       f = fopen(path, "rb");
-       if (!f) {
+       if (!(f = fopen(path, "rb"))) {
                return NULL;
        }
-
        if (fread(hdr_buf, sizeof hdr_buf, 1, f) != 1) {
                goto err;
        }
-
        if (unpack_32_le(hdr_buf) != UPKG_HDR_MAGIC) {
                goto err;
        }
 
+       /* Initialize package structure. */
        pkg = init_upkg(hdr_buf);
        if (!pkg) {
                goto err;
        }
-
        pkg->priv->f = f;
+
        return pkg;
 err:
        fclose(f);
        return NULL;
 }
+
+int upkg_close(struct upkg *pkg)
+{
+       if (pkg->priv->f)
+               return fclose(pkg->priv->f);
+       return 0;
+}
diff --git a/upkg.c b/upkg.c
index d0ba1463228f4fa409ccd44b0d40700c68c7913e..3cfd7279010cb5c7bf969c62b3449d0403afa29a 100644 (file)
--- a/upkg.c
+++ b/upkg.c
@@ -38,6 +38,8 @@ int main(int argc, char **argv)
        printf("License: %u\n",  pkg->license);
        printf("Flags:   %lx\n", pkg->flags);
        print_upkg_flags("\t", pkg->flags);
+       printf("Names:   %zu\n", pkg->name_count);
 
+       upkg_close(pkg);
        return 0;
 }
diff --git a/upkg.h b/upkg.h
index acd176bebb1d92845a40859c6a0fce6732eee85b..c4d582d2bf5c370ba4f2853b9134c8fdf6021766 100644 (file)
--- a/upkg.h
+++ b/upkg.h
@@ -15,6 +15,8 @@ struct upkg {
        unsigned version, license;
        unsigned long flags;
 
+       unsigned long name_count, export_count, import_count;
+
        struct upkg_private *priv;
 };