Merge branch 'lt/dirmatch-optim'
* lt/dirmatch-optim: Optimize match_pathspec() to avoid fnmatch()
This commit is contained in:
22
dir.c
22
dir.c
@ -52,6 +52,11 @@ int common_prefix(const char **pathspec)
|
|||||||
return prefix;
|
return prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int special_char(unsigned char c1)
|
||||||
|
{
|
||||||
|
return !c1 || c1 == '*' || c1 == '[' || c1 == '?';
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Does 'match' matches the given name?
|
* Does 'match' matches the given name?
|
||||||
* A match is found if
|
* A match is found if
|
||||||
@ -69,14 +74,27 @@ static int match_one(const char *match, const char *name, int namelen)
|
|||||||
int matchlen;
|
int matchlen;
|
||||||
|
|
||||||
/* If the match was just the prefix, we matched */
|
/* If the match was just the prefix, we matched */
|
||||||
matchlen = strlen(match);
|
if (!*match)
|
||||||
if (!matchlen)
|
|
||||||
return MATCHED_RECURSIVELY;
|
return MATCHED_RECURSIVELY;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
unsigned char c1 = *match;
|
||||||
|
unsigned char c2 = *name;
|
||||||
|
if (special_char(c1))
|
||||||
|
break;
|
||||||
|
if (c1 != c2)
|
||||||
|
return 0;
|
||||||
|
match++;
|
||||||
|
name++;
|
||||||
|
namelen--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't match the matchstring exactly,
|
* If we don't match the matchstring exactly,
|
||||||
* we need to match by fnmatch
|
* we need to match by fnmatch
|
||||||
*/
|
*/
|
||||||
|
matchlen = strlen(match);
|
||||||
if (strncmp(match, name, matchlen))
|
if (strncmp(match, name, matchlen))
|
||||||
return !fnmatch(match, name, 0) ? MATCHED_FNMATCH : 0;
|
return !fnmatch(match, name, 0) ? MATCHED_FNMATCH : 0;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user