]> git.draconx.ca Git - upkg.git/commitdiff
Allocate upkg and private structs in one go.
authorNick Bowler <nbowler@draconx.ca>
Mon, 8 Jun 2009 05:35:00 +0000 (01:35 -0400)
committerNick Bowler <nbowler@draconx.ca>
Mon, 8 Jun 2009 19:27:50 +0000 (15:27 -0400)
src/libupkg.c

index 850c0c725d00f2b4f110a6a11b9ab3df912463f3..66546fd3dd80f3f1858f80d579a5f7ca7cd4b192 100644 (file)
@@ -93,31 +93,33 @@ static size_t decode_index(long *val, unsigned char *bytes, size_t n)
 
 static struct upkg *init_upkg(unsigned char hdr[static UPKG_HDR_SIZE])
 {
-       struct upkg *pkg;
-
-       pkg = malloc(sizeof *pkg);
-       if (!pkg) {
-               return NULL;
-       }
+       struct {
+               struct upkg pkg;
+               struct upkg_private priv;
+       } *alloc;
 
-       pkg->priv = malloc(sizeof *pkg->priv);
-       if (!pkg->priv) {
-               free(pkg);
+       alloc = malloc(sizeof *alloc);
+       if (!alloc) {
                return NULL;
        }
 
-       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->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;
+       alloc->pkg = (struct upkg) {
+               .version      = unpack_16_le(hdr+4),
+               .license      = unpack_16_le(hdr+6),
+               .flags        = unpack_32_le(hdr+8),
+               .name_count   = unpack_32_le(hdr+12),
+               .export_count = unpack_32_le(hdr+20),
+               .import_count = unpack_32_le(hdr+28),
+               .priv         = &alloc->priv,
+       };
+
+       alloc->priv = (struct upkg_private) {
+               .name_offset   = unpack_32_le(hdr+16),
+               .export_offset = unpack_32_le(hdr+24),
+               .import_offset = unpack_32_le(hdr+32),
+       };
+
+       return &alloc->pkg;
 }
 
 static int pkg_init_names(struct upkg *pkg)
@@ -351,7 +353,6 @@ err3:
                free(pkg->priv->names[i].name);
        free(pkg->priv->names);
 err2:
-       free(pkg->priv);
        free(pkg);
 err1:
        fclose(f);
@@ -373,7 +374,6 @@ int upkg_close(struct upkg *pkg)
        free(pkg->priv->imports);
        free(pkg->priv->exports);
        free(pkg->priv->names);
-       free(pkg->priv);
        free(pkg);
 
        return rc;