git-tar-tree: no more void pointer arithmetic
[git.git] / object.c
index 3259862..0f70890 100644 (file)
--- a/object.c
+++ b/object.c
@@ -9,21 +9,27 @@ struct object **objs;
 static int nr_objs;
 int obj_allocs;
 
-int track_object_refs = 1;
+const char *type_names[] = {
+       "none", "blob", "tree", "commit", "bad"
+};
+
+int track_object_refs = 0;
 
 static int hashtable_index(const unsigned char *sha1)
 {
-       unsigned int i = *(unsigned int *)sha1;
+       unsigned int i;
+       memcpy(&i, sha1, sizeof(unsigned int));
        return (int)(i % obj_allocs);
 }
 
 static int find_object(const unsigned char *sha1)
 {
-       int i = hashtable_index(sha1);
+       int i;
 
        if (!objs)
                return -1;
 
+       i = hashtable_index(sha1);
        while (objs[i]) {
                if (memcmp(sha1, objs[i]->sha1, 20) == 0)
                        return i;
@@ -48,7 +54,7 @@ void created_object(const unsigned char *sha1, struct object *obj)
 
        obj->parsed = 0;
        memcpy(obj->sha1, sha1, 20);
-       obj->type = NULL;
+       obj->type = TYPE_NONE;
        obj->refs = NULL;
        obj->used = 0;
 
@@ -58,7 +64,7 @@ void created_object(const unsigned char *sha1, struct object *obj)
                objs = xrealloc(objs, obj_allocs * sizeof(struct object *));
                memset(objs + count, 0, (obj_allocs - count)
                                * sizeof(struct object *));
-               for (i = 0; i < count; i++)
+               for (i = 0; i < obj_allocs; i++)
                        if (objs[i]) {
                                int j = find_object(objs[i]->sha1);
                                if (j != i) {
@@ -83,8 +89,7 @@ struct object_refs *alloc_object_refs(unsigned count)
        struct object_refs *refs;
        size_t size = sizeof(*refs) + count*sizeof(struct object *);
 
-       refs = xmalloc(size);
-       memset(refs, 0, size);
+       refs = xcalloc(1, size);
        refs->count = count;
        return refs;
 }
@@ -176,10 +181,9 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
 {
        struct object *obj = lookup_object(sha1);
        if (!obj) {
-               union any_object *ret = xmalloc(sizeof(*ret));
-               memset(ret, 0, sizeof(*ret));
+               union any_object *ret = xcalloc(1, sizeof(*ret));
                created_object(sha1, &ret->object);
-               ret->object.type = NULL;
+               ret->object.type = TYPE_NONE;
                return &ret->object;
        }
        return obj;
@@ -194,15 +198,18 @@ struct object *parse_object(const unsigned char *sha1)
                struct object *obj;
                if (check_sha1_signature(sha1, buffer, size, type) < 0)
                        printf("sha1 mismatch %s\n", sha1_to_hex(sha1));
-               if (!strcmp(type, "blob")) {
+               if (!strcmp(type, blob_type)) {
                        struct blob *blob = lookup_blob(sha1);
                        parse_blob_buffer(blob, buffer, size);
                        obj = &blob->object;
-               } else if (!strcmp(type, "tree")) {
+               } else if (!strcmp(type, tree_type)) {
                        struct tree *tree = lookup_tree(sha1);
-                       parse_tree_buffer(tree, buffer, size);
                        obj = &tree->object;
-               } else if (!strcmp(type, "commit")) {
+                       if (!tree->object.parsed) {
+                               parse_tree_buffer(tree, buffer, size);
+                               buffer = NULL;
+                       }
+               } else if (!strcmp(type, commit_type)) {
                        struct commit *commit = lookup_commit(sha1);
                        parse_commit_buffer(commit, buffer, size);
                        if (!commit->buffer) {
@@ -210,7 +217,7 @@ struct object *parse_object(const unsigned char *sha1)
                                buffer = NULL;
                        }
                        obj = &commit->object;
-               } else if (!strcmp(type, "tag")) {
+               } else if (!strcmp(type, tag_type)) {
                        struct tag *tag = lookup_tag(sha1);
                        parse_tag_buffer(tag, buffer, size);
                        obj = &tag->object;