2 * decorate.c - decorate a git object with some arbitrary
9 static unsigned int hash_obj(const struct object
*obj
, unsigned int n
)
11 const void *p
= obj
->sha1
;
12 unsigned int hash
= *(const unsigned int *)p
;
16 static void *insert_decoration(struct decoration
*n
, const struct object
*base
, void *decoration
)
19 struct object_decoration
*hash
= n
->hash
;
20 int j
= hash_obj(base
, size
);
22 while (hash
[j
].base
) {
23 if (hash
[j
].base
== base
) {
24 void *old
= hash
[j
].decoration
;
25 hash
[j
].decoration
= decoration
;
32 hash
[j
].decoration
= decoration
;
37 static void grow_decoration(struct decoration
*n
)
40 int old_size
= n
->size
;
41 struct object_decoration
*old_hash
= n
->hash
;
43 n
->size
= (old_size
+ 1000) * 3 / 2;
44 n
->hash
= xcalloc(n
->size
, sizeof(struct object_decoration
));
47 for (i
= 0; i
< old_size
; i
++) {
48 const struct object
*base
= old_hash
[i
].base
;
49 void *decoration
= old_hash
[i
].decoration
;
53 insert_decoration(n
, base
, decoration
);
58 /* Add a decoration pointer, return any old one */
59 void *add_decoration(struct decoration
*n
, const struct object
*obj
,
64 if (nr
> n
->size
* 2 / 3)
66 return insert_decoration(n
, obj
, decoration
);
69 /* Lookup a decoration pointer */
70 void *lookup_decoration(struct decoration
*n
, const struct object
*obj
)
74 /* nothing to lookup */
77 j
= hash_obj(obj
, n
->size
);
79 struct object_decoration
*ref
= n
->hash
+ j
;
81 return ref
->decoration
;