Browse Source

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.
maint
Linus Torvalds 20 years ago
parent
commit
eb38c22f53
  1. 1
      cache.h
  2. 36
      read-cache.c
  3. 36
      update-cache.c

1
cache.h

@ -73,6 +73,7 @@ unsigned int active_nr, active_alloc; @@ -73,6 +73,7 @@ unsigned int active_nr, active_alloc;

/* Initialize the cache information */
extern int read_cache(void);
extern int cache_name_pos(const char *name, int namelen);

/* Return a statically allocated filename matching the sha1 signature */
extern char *sha1_file_name(unsigned char *sha1);

36
read-cache.c

@ -222,6 +222,42 @@ static int error(const char * string) @@ -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;

36
update-cache.c

@ -5,42 +5,6 @@ @@ -5,42 +5,6 @@
*/
#include "cache.h"

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;
}

static 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 remove_file_from_cache(char *path)
{
int pos = cache_name_pos(path, strlen(path));
Loading…
Cancel
Save