зеркало из https://github.com/microsoft/git.git
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.
This commit is contained in:
Родитель
59c1e24980
Коммит
eb38c22f53
1
cache.h
1
cache.h
|
@ -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
36
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;
|
|
@ -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));
|
Загрузка…
Ссылка в новой задаче