]>
Commit | Line | Data |
---|---|---|
902bb364 JK |
1 | #include "cache.h" |
2 | #include "sha1-array.h" | |
3 | #include "sha1-lookup.h" | |
4 | ||
910650d2 | 5 | void oid_array_append(struct oid_array *array, const struct object_id *oid) |
902bb364 | 6 | { |
ee3051bd | 7 | ALLOC_GROW(array->oid, array->nr + 1, array->alloc); |
98a72ddc | 8 | oidcpy(&array->oid[array->nr++], oid); |
902bb364 JK |
9 | array->sorted = 0; |
10 | } | |
11 | ||
12 | static int void_hashcmp(const void *a, const void *b) | |
13 | { | |
ee3051bd | 14 | return oidcmp(a, b); |
902bb364 JK |
15 | } |
16 | ||
910650d2 | 17 | static void oid_array_sort(struct oid_array *array) |
902bb364 | 18 | { |
ee3051bd | 19 | QSORT(array->oid, array->nr, void_hashcmp); |
902bb364 JK |
20 | array->sorted = 1; |
21 | } | |
22 | ||
23 | static const unsigned char *sha1_access(size_t index, void *table) | |
24 | { | |
ee3051bd | 25 | struct object_id *array = table; |
26 | return array[index].hash; | |
902bb364 JK |
27 | } |
28 | ||
910650d2 | 29 | int oid_array_lookup(struct oid_array *array, const struct object_id *oid) |
902bb364 JK |
30 | { |
31 | if (!array->sorted) | |
910650d2 | 32 | oid_array_sort(array); |
5d3206d5 | 33 | return sha1_pos(oid->hash, array->oid, array->nr, sha1_access); |
902bb364 JK |
34 | } |
35 | ||
910650d2 | 36 | void oid_array_clear(struct oid_array *array) |
902bb364 | 37 | { |
6a83d902 | 38 | FREE_AND_NULL(array->oid); |
902bb364 JK |
39 | array->nr = 0; |
40 | array->alloc = 0; | |
41 | array->sorted = 0; | |
42 | } | |
cff38a5e | 43 | |
910650d2 | 44 | int oid_array_for_each_unique(struct oid_array *array, |
1b7ba794 | 45 | for_each_oid_fn fn, |
cff38a5e JK |
46 | void *data) |
47 | { | |
48 | int i; | |
49 | ||
50 | if (!array->sorted) | |
910650d2 | 51 | oid_array_sort(array); |
cff38a5e JK |
52 | |
53 | for (i = 0; i < array->nr; i++) { | |
16ddcd40 | 54 | int ret; |
ee3051bd | 55 | if (i > 0 && !oidcmp(array->oid + i, array->oid + i - 1)) |
cff38a5e | 56 | continue; |
1b7ba794 | 57 | ret = fn(array->oid + i, data); |
16ddcd40 JK |
58 | if (ret) |
59 | return ret; | |
cff38a5e | 60 | } |
16ddcd40 | 61 | return 0; |
cff38a5e | 62 | } |