summaryrefslogtreecommitdiff
path: root/sha1-array.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2011-05-19 17:34:33 -0400
committerJunio C Hamano <gitster@pobox.com>2011-05-19 20:02:10 -0700
commit902bb3645160cae72fe43b5f7f5289968ac01617 (patch)
tree4e6d99ceee3eb20c0f6278211c00d040cd46ebd4 /sha1-array.c
parent114a6a889f5d21c26800c395a97cdd400073a9e8 (diff)
downloadgit-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.c43
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;
+}