Junio C Hamano <gitster@xxxxxxxxx> writes: >> +static int match_attrs(const char *name, int namelen, >> + const struct pathspec_item *item) >> +{ >> + char *path; >> + int i; >> + >> + path = xmemdupz(name, namelen); >> + git_check_attr(path, item->attr_check); > ... >> + } >> + >> + free(path); > > Let me see how involved a change would be to allow passing a counted > string to git_check_attr(). Perhaps the attached is sufficient, and you can avoid copying the paths in this codepath. attr.c | 23 ++++++++++++++--------- attr.h | 1 + 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/attr.c b/attr.c index e0f7965..eeb29e6 100644 --- a/attr.c +++ b/attr.c @@ -725,20 +725,19 @@ static int macroexpand_one(int nr, int rem) * check_all_attr. If num is non-zero, only attributes in check[] are * collected. Otherwise all attributes are collected. */ -static void collect_some_attrs(const char *path, int num, +static void collect_some_attrs(const char *path, int pathlen, int num, struct git_attr_check_elem *check) { struct attr_stack *stk; - int i, pathlen, rem, dirlen; + int i, rem, dirlen; const char *cp, *last_slash = NULL; int basename_offset; - for (cp = path; *cp; cp++) { + for (cp = path; cp < path + pathlen; cp++) { if (*cp == '/' && cp[1]) last_slash = cp; } - pathlen = cp - path; if (last_slash) { basename_offset = last_slash + 1 - path; dirlen = last_slash - path; @@ -769,12 +768,12 @@ static void collect_some_attrs(const char *path, int num, rem = fill(path, pathlen, basename_offset, stk, rem); } -static int git_check_attrs(const char *path, int num, +static int git_check_attrs(const char *path, int pathlen, int num, struct git_attr_check_elem *check) { int i; - collect_some_attrs(path, num, check); + collect_some_attrs(path, pathlen, num, check); for (i = 0; i < num; i++) { const char *value = check_all_attr[check[i].attr->attr_nr].value; @@ -791,7 +790,7 @@ void git_all_attrs(const char *path, struct git_attr_check *check) int i; git_attr_check_clear(check); - collect_some_attrs(path, 0, NULL); + collect_some_attrs(path, strlen(path), 0, NULL); for (i = 0; i < attr_nr; i++) { const char *name = check_all_attr[i].attr->name; @@ -816,10 +815,16 @@ void git_attr_set_direction(enum git_attr_direction new, struct index_state *ist use_index = istate; } -int git_check_attr(const char *path, struct git_attr_check *check) +int git_check_attr_counted(const char *path, int pathlen, + struct git_attr_check *check) { check->finalized = 1; - return git_check_attrs(path, check->check_nr, check->check); + return git_check_attrs(path, pathlen, check->check_nr, check->check); +} + +int git_check_attr(const char *path, struct git_attr_check *check) +{ + return git_check_attr_counted(path, strlen(path), check); } struct git_attr_check *git_attr_check_initl(const char *one, ...) diff --git a/attr.h b/attr.h index 51ca36d..4a4ac76 100644 --- a/attr.h +++ b/attr.h @@ -38,6 +38,7 @@ struct git_attr_check { extern struct git_attr_check *git_attr_check_initl(const char *, ...); extern int git_check_attr(const char *path, struct git_attr_check *); +extern int git_check_attr_counted(const char *, int, struct git_attr_check *); extern struct git_attr_check *git_attr_check_alloc(void); extern void git_attr_check_append(struct git_attr_check *, const struct git_attr *); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html