Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 88 lines (76 sloc) 1.846 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
/*
* decorate.c - decorate a git object with some arbitrary
* data.
*/
#include "cache.h"
#include "object.h"
#include "decorate.h"

static unsigned int hash_obj(struct object *obj, unsigned int n)
{
unsigned int hash = *(unsigned int *)obj->sha1;
return hash % n;
}

static void *insert_decoration(struct decoration *n, struct object *base, void *decoration)
{
int size = n->size;
struct object_decoration *hash = n->hash;
int j = hash_obj(base, size);

while (hash[j].base) {
if (hash[j].base == base) {
void *old = hash[j].decoration;
hash[j].decoration = decoration;
return old;
}
if (++j >= size)
j = 0;
}
hash[j].base = base;
hash[j].decoration = decoration;
n->nr++;
return NULL;
}

static void grow_decoration(struct decoration *n)
{
int i;
int old_size = n->size;
struct object_decoration *old_hash;

old_size = n->size;
old_hash = n->hash;

n->size = (old_size + 1000) * 3 / 2;
n->hash = xcalloc(n->size, sizeof(struct object_decoration));
n->nr = 0;

for (i = 0; i < old_size; i++) {
struct object *base = old_hash[i].base;
void *decoration = old_hash[i].decoration;

if (!base)
continue;
insert_decoration(n, base, decoration);
}
free(old_hash);
}

/* Add a decoration pointer, return any old one */
void *add_decoration(struct decoration *n, struct object *obj, void *decoration)
{
int nr = n->nr + 1;

if (nr > n->size * 2 / 3)
grow_decoration(n);
return insert_decoration(n, obj, decoration);
}

/* Lookup a decoration pointer */
void *lookup_decoration(struct decoration *n, struct object *obj)
{
int j;

/* nothing to lookup */
if (!n->size)
return NULL;
j = hash_obj(obj, n->size);
for (;;) {
struct object_decoration *ref = n->hash + j;
if (ref->base == obj)
return ref->decoration;
if (!ref->base)
return NULL;
if (++j == n->size)
j = 0;
}
}
Something went wrong with that request. Please try again.