summaryrefslogtreecommitdiff
path: root/src/sha1_lookup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sha1_lookup.c')
-rw-r--r--src/sha1_lookup.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/sha1_lookup.c b/src/sha1_lookup.c
index b7e66cc69..ce067caaa 100644
--- a/src/sha1_lookup.c
+++ b/src/sha1_lookup.c
@@ -9,6 +9,7 @@
#include "sha1_lookup.h"
#include "common.h"
+#include "oid.h"
/*
* Conventional binary search loop looks like this:
@@ -123,7 +124,7 @@ int sha1_entry_pos(const void *table,
lov = (lov << 8) | lo_key[ofs_0+1];
kyv = (kyv << 8) | key[ofs_0+1];
}
- assert(lov < hiv);
+ assert(lov <= hiv);
if (kyv < lov)
return -1 - lo;
@@ -176,3 +177,26 @@ int sha1_entry_pos(const void *table,
} while (lo < hi);
return -((int)lo)-1;
}
+
+int sha1_position(const void *table,
+ size_t stride,
+ unsigned lo, unsigned hi,
+ const unsigned char *key)
+{
+ const unsigned char *base = table;
+
+ do {
+ unsigned mi = (lo + hi) / 2;
+ int cmp = git_oid__hashcmp(base + mi * stride, key);
+
+ if (!cmp)
+ return mi;
+
+ if (cmp > 0)
+ hi = mi;
+ else
+ lo = mi+1;
+ } while (lo < hi);
+
+ return -((int)lo)-1;
+}