зеркало из https://github.com/microsoft/git.git
attr: avoid calling find_basename() twice per path
find_basename() is only used inside collect_all_attrs(), called once in prepare_attr_stack, then again after prepare_attr_stack() returns. Both calls return exact same value. Reorder the code to do the same task once. Also avoid strlen() because we knows the length after finding basename. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
711536bd4b
Коммит
9db9eecfe5
45
attr.c
45
attr.c
|
@ -564,32 +564,12 @@ static void bootstrap_attr_stack(void)
|
||||||
attr_stack = elem;
|
attr_stack = elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *find_basename(const char *path)
|
static void prepare_attr_stack(const char *path, int dirlen)
|
||||||
{
|
|
||||||
const char *cp, *last_slash = NULL;
|
|
||||||
|
|
||||||
for (cp = path; *cp; cp++) {
|
|
||||||
if (*cp == '/' && cp[1])
|
|
||||||
last_slash = cp;
|
|
||||||
}
|
|
||||||
return last_slash ? last_slash + 1 : path;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void prepare_attr_stack(const char *path)
|
|
||||||
{
|
{
|
||||||
struct attr_stack *elem, *info;
|
struct attr_stack *elem, *info;
|
||||||
int dirlen, len;
|
int len;
|
||||||
const char *cp;
|
const char *cp;
|
||||||
|
|
||||||
dirlen = find_basename(path) - path;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* find_basename() includes the trailing slash, but we do
|
|
||||||
* _not_ want it.
|
|
||||||
*/
|
|
||||||
if (dirlen)
|
|
||||||
dirlen--;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At the bottom of the attribute stack is the built-in
|
* At the bottom of the attribute stack is the built-in
|
||||||
* set of attribute definitions, followed by the contents
|
* set of attribute definitions, followed by the contents
|
||||||
|
@ -769,15 +749,26 @@ static int macroexpand_one(int attr_nr, int rem)
|
||||||
static void collect_all_attrs(const char *path)
|
static void collect_all_attrs(const char *path)
|
||||||
{
|
{
|
||||||
struct attr_stack *stk;
|
struct attr_stack *stk;
|
||||||
int i, pathlen, rem;
|
int i, pathlen, rem, dirlen;
|
||||||
const char *basename;
|
const char *basename, *cp, *last_slash = NULL;
|
||||||
|
|
||||||
prepare_attr_stack(path);
|
for (cp = path; *cp; cp++) {
|
||||||
|
if (*cp == '/' && cp[1])
|
||||||
|
last_slash = cp;
|
||||||
|
}
|
||||||
|
pathlen = cp - path;
|
||||||
|
if (last_slash) {
|
||||||
|
basename = last_slash + 1;
|
||||||
|
dirlen = last_slash - path;
|
||||||
|
} else {
|
||||||
|
basename = path;
|
||||||
|
dirlen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_attr_stack(path, dirlen);
|
||||||
for (i = 0; i < attr_nr; i++)
|
for (i = 0; i < attr_nr; i++)
|
||||||
check_all_attr[i].value = ATTR__UNKNOWN;
|
check_all_attr[i].value = ATTR__UNKNOWN;
|
||||||
|
|
||||||
basename = find_basename(path);
|
|
||||||
pathlen = strlen(path);
|
|
||||||
rem = attr_nr;
|
rem = attr_nr;
|
||||||
for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
|
for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
|
||||||
rem = fill(path, pathlen, basename, stk, rem);
|
rem = fill(path, pathlen, basename, stk, rem);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче