6
#include "oidtree.h"
7
#include "hash.h"
8
9
-struct oidtree_iter_data {
10
- oidtree_iter fn;
11
- void *arg;
12
- size_t *last_nibble_at;
13
- uint32_t algo;
14
- uint8_t last_byte;
15
-};
16
-
9
void oidtree_init(struct oidtree *ot)
10
{
11
cb_init(&ot->tree);
46
cb_insert(&ot->tree, on, sizeof(*oid));
47
}
48
57
-
58
-int oidtree_contains(struct oidtree *ot, const struct object_id *oid)
49
+bool oidtree_contains(struct oidtree *ot, const struct object_id *oid)
50
{
51
struct object_id k;
52
size_t klen = sizeof(k);
60
klen += BUILD_ASSERT_OR_ZERO(offsetof(struct object_id, hash) <
61
offsetof(struct object_id, algo));
62
72
- return cb_lookup(&ot->tree, (const uint8_t *)&k, klen) ? 1 : 0;
63
+ return !!cb_lookup(&ot->tree, (const uint8_t *)&k, klen);
64
}
65
75
-static enum cb_next iter(struct cb_node *n, void *arg)
66
+struct oidtree_each_data {
67
+ oidtree_each_cb cb;
68
+ void *cb_data;
69
+ size_t *last_nibble_at;
70
+ uint32_t algo;
71
+ uint8_t last_byte;
72
+};
73
+
74
+static enum cb_next iter(struct cb_node *n, void *cb_data)
75
{
77
- struct oidtree_iter_data *x = arg;
76
+ struct oidtree_each_data *data = cb_data;
77
struct object_id k;
78
79
/* Copy to provide 4-byte alignment needed by struct object_id. */
80
memcpy(&k, n->k, sizeof(k));
81
83
- if (x->algo != GIT_HASH_UNKNOWN && x->algo != k.algo)
82
+ if (data->algo != GIT_HASH_UNKNOWN && data->algo != k.algo)
83
return CB_CONTINUE;
84
86
- if (x->last_nibble_at) {
87
- if ((k.hash[*x->last_nibble_at] ^ x->last_byte) & 0xf0)
85
+ if (data->last_nibble_at) {
86
+ if ((k.hash[*data->last_nibble_at] ^ data->last_byte) & 0xf0)
87
return CB_CONTINUE;
88
}
89
91
- return x->fn(&k, x->arg);
90
+ return data->cb(&k, data->cb_data);
91
}
92
94
-void oidtree_each(struct oidtree *ot, const struct object_id *oid,
95
- size_t oidhexsz, oidtree_iter fn, void *arg)
93
+void oidtree_each(struct oidtree *ot, const struct object_id *prefix,
94
+ size_t prefix_hex_len, oidtree_each_cb cb, void *cb_data)
95
{
97
- size_t klen = oidhexsz / 2;
98
- struct oidtree_iter_data x = { 0 };
99
- assert(oidhexsz <= GIT_MAX_HEXSZ);
100
-
101
- x.fn = fn;
102
- x.arg = arg;
103
- x.algo = oid->algo;
104
- if (oidhexsz & 1) {
105
- x.last_byte = oid->hash[klen];
106
- x.last_nibble_at = &klen;
96
+ struct oidtree_each_data data = {
97
+ .cb = cb,
98
+ .cb_data = cb_data,
99
+ .algo = prefix->algo,
100
+ };
101
+ size_t klen = prefix_hex_len / 2;
102
+ assert(prefix_hex_len <= GIT_MAX_HEXSZ);
103
+
104
+ if (prefix_hex_len & 1) {
105
+ data.last_byte = prefix->hash[klen];
106
+ data.last_nibble_at = &klen;
107
}
108
- cb_each(&ot->tree, (const uint8_t *)oid, klen, iter, &x);
108
+
109
+ cb_each(&ot->tree, prefix->hash, klen, iter, &data);
110
}