summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-05-18 13:21:42 -0700
committerJunio C Hamano <gitster@pobox.com>2016-05-25 14:17:21 -0700
commit648544312a27733d81cd8f73d37443b04a1b9126 (patch)
treeb2da5bf45170d8ced99df6b82364fd4abeb3ce9e
parent079186123adae0107bdc528ba2e3213c051bc2e2 (diff)
downloadgit-648544312a27733d81cd8f73d37443b04a1b9126.tar.gz
attr: add counted string version of git_check_attr()
Often a potential caller has <path, pathlen> pair that represents the path it wants to ask attributes for; when path[pathlen] is not NUL, the caller has to xmemdupz() only to call git_check_attr(). Add git_check_attr_counted() that takes such a counted string instead of "const char *path". Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--attr.c23
-rw-r--r--attr.h1
2 files changed, 15 insertions, 9 deletions
diff --git a/attr.c b/attr.c
index 2eb40dff1d..a5aae9acca 100644
--- a/attr.c
+++ b/attr.c
@@ -729,20 +729,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;
@@ -773,12 +772,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;
@@ -795,7 +794,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;
@@ -820,10 +819,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 51ca36d8d9..4a4ac76379 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 *);