Introduce "base_name_compare()" helper function

This one compares two pathnames that may be partial basenames, not
full paths. We need to get the path sorting right, since a directory
name will sort as if it had the final '/' at the end.
This commit is contained in:
Linus Torvalds 2005-05-20 09:09:18 -07:00
parent e59363822f
commit 958ba6c96e
2 changed files with 20 additions and 0 deletions

View file

@ -173,6 +173,7 @@ extern void usage(const char *err);
extern void die(const char *err, ...);
extern int error(const char *err, ...);
extern int base_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);
extern int cache_name_compare(const char *name1, int len1, const char *name2, int len2);
extern void *read_object_with_reference(const unsigned char *sha1,

View file

@ -74,6 +74,25 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st)
return changed;
}
int base_name_compare(const char *name1, int len1, int mode1,
const char *name2, int len2, int mode2)
{
unsigned char c1, c2;
int len = len1 < len2 ? len1 : len2;
int cmp;
cmp = memcmp(name1, name2, len);
if (cmp)
return cmp;
c1 = name1[len];
c2 = name2[len];
if (!c1 && S_ISDIR(mode1))
c1 = '/';
if (!c2 && S_ISDIR(mode2))
c2 = '/';
return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;
}
int cache_name_compare(const char *name1, int flags1, const char *name2, int flags2)
{
int len1 = flags1 & CE_NAMEMASK;