summaryrefslogtreecommitdiff
path: root/read-cache.c
diff options
context:
space:
mode:
authorLibravatar Linus Torvalds <torvalds@ppc970.osdl.org>2005-04-09 09:26:55 -0700
committerLibravatar Linus Torvalds <torvalds@ppc970.osdl.org>2005-04-09 09:26:55 -0700
commiteb38c22f535c7c973f27b62845c5136c4be0ae49 (patch)
treedd229923a70e17998038996d66d4562df16f6d28 /read-cache.c
parentFix missing return values and some error tests for empty index files (diff)
downloadtgif-eb38c22f535c7c973f27b62845c5136c4be0ae49.tar.xz
Make "cache_name_pos()" available to others.
It finds the cache entry position for a given name, and is generally useful. Sure, everybody can just scan the active cache array, but since it's sorted, you actually want to search it with a binary search, so let's not duplicate that logic all over the place.
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/read-cache.c b/read-cache.c
index 50d0be35e8..44b4b0fc69 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -222,6 +222,42 @@ static int error(const char * string)
return -1;
}
+static int cache_name_compare(const char *name1, int len1, const char *name2, int len2)
+{
+ int len = len1 < len2 ? len1 : len2;
+ int cmp;
+
+ cmp = memcmp(name1, name2, len);
+ if (cmp)
+ return cmp;
+ if (len1 < len2)
+ return -1;
+ if (len1 > len2)
+ return 1;
+ return 0;
+}
+
+int cache_name_pos(const char *name, int namelen)
+{
+ int first, last;
+
+ first = 0;
+ last = active_nr;
+ while (last > first) {
+ int next = (last + first) >> 1;
+ struct cache_entry *ce = active_cache[next];
+ int cmp = cache_name_compare(name, namelen, ce->name, ce->namelen);
+ if (!cmp)
+ return -next-1;
+ if (cmp < 0) {
+ last = next;
+ continue;
+ }
+ first = next+1;
+ }
+ return first;
+}
+
static int verify_hdr(struct cache_header *hdr, unsigned long size)
{
SHA_CTX c;