diff options
author | Jeff King <peff@peff.net> | 2011-05-19 17:34:33 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-05-19 20:02:10 -0700 |
commit | 902bb3645160cae72fe43b5f7f5289968ac01617 (patch) | |
tree | 4e6d99ceee3eb20c0f6278211c00d040cd46ebd4 /sha1-array.c | |
parent | 114a6a889f5d21c26800c395a97cdd400073a9e8 (diff) | |
download | git-902bb3645160cae72fe43b5f7f5289968ac01617.tar.gz |
bisect: refactor sha1_array into a generic sha1 list
This is a generally useful abstraction, so let's let others
make use of it. The refactoring is more or less a straight
copy; however, functions and struct members have had their
names changed to match string_list, which is the most
similar data structure.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1-array.c')
-rw-r--r-- | sha1-array.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/sha1-array.c b/sha1-array.c new file mode 100644 index 0000000000..5b75a5a35d --- /dev/null +++ b/sha1-array.c @@ -0,0 +1,43 @@ +#include "cache.h" +#include "sha1-array.h" +#include "sha1-lookup.h" + +void sha1_array_append(struct sha1_array *array, const unsigned char *sha1) +{ + ALLOC_GROW(array->sha1, array->nr + 1, array->alloc); + hashcpy(array->sha1[array->nr++], sha1); + array->sorted = 0; +} + +static int void_hashcmp(const void *a, const void *b) +{ + return hashcmp(a, b); +} + +void sha1_array_sort(struct sha1_array *array) +{ + qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp); + array->sorted = 1; +} + +static const unsigned char *sha1_access(size_t index, void *table) +{ + unsigned char (*array)[20] = table; + return array[index]; +} + +int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1) +{ + if (!array->sorted) + sha1_array_sort(array); + return sha1_pos(sha1, array->sha1, array->nr, sha1_access); +} + +void sha1_array_clear(struct sha1_array *array) +{ + free(array->sha1); + array->sha1 = NULL; + array->nr = 0; + array->alloc = 0; + array->sorted = 0; +} |