mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Jeff King](/assets/img/avatar_default.png)
The callbacks for iterating a sha1_array must have a void return. This is unlike our usual for_each semantics, where a callback may interrupt iteration and have its value propagated. Let's switch it to the usual form, which will enable its use in more places (e.g., where we are replacing an existing iteration with a different data structure). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
64 lines
1.3 KiB
C
64 lines
1.3 KiB
C
#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);
|
|
}
|
|
|
|
static 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;
|
|
}
|
|
|
|
int sha1_array_for_each_unique(struct sha1_array *array,
|
|
for_each_sha1_fn fn,
|
|
void *data)
|
|
{
|
|
int i;
|
|
|
|
if (!array->sorted)
|
|
sha1_array_sort(array);
|
|
|
|
for (i = 0; i < array->nr; i++) {
|
|
int ret;
|
|
if (i > 0 && !hashcmp(array->sha1[i], array->sha1[i-1]))
|
|
continue;
|
|
ret = fn(array->sha1[i], data);
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
return 0;
|
|
}
|