attr.c::path_matches(): the basename is part of the pathname
The function takes two strings (pathname and basename) as if they are independent strings, but in reality, the latter is always pointing into a substring in the former. Clarify this relationship by expressing the latter as an offset into the former. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano committed
Mar 26, 2013 at 10:28 UTC
bd2f371d34b495ebbc4689604cfc34a825c47d2b
1 file changed
+10
-9
attr.c
+10
-9
@@ -655,7 +655,7 @@ static void prepare_attr_stack(const char *path, int dirlen)
655
}
656
657
static int path_matches(const char *pathname, int pathlen,
658
- const char *basename,
658
+ int basename_offset,
659
const struct pattern *pat,
660
const char *base, int baselen)
661
{
@@ -667,8 +667,8 @@ static int path_matches(const char *pathname, int pathlen,
667
return 0;
668
669
if (pat->flags & EXC_FLAG_NODIR) {
670
- return match_basename(basename,
671
- pathlen - (basename - pathname),
670
+ return match_basename(pathname + basename_offset,
671
+ pathlen - basename_offset,
672
pattern, prefix,
673
pat->patternlen, pat->flags);
674
}
@@ -701,7 +701,7 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
701
return rem;
702
}
703
704
-static int fill(const char *path, int pathlen, const char *basename,
704
+static int fill(const char *path, int pathlen, int basename_offset,
705
struct attr_stack *stk, int rem)
706
{
707
int i;
@@ -711,7 +711,7 @@ static int fill(const char *path, int pathlen, const char *basename,
711
struct match_attr *a = stk->attrs[i];
712
if (a->is_macro)
713
continue;
714
- if (path_matches(path, pathlen, basename,
714
+ if (path_matches(path, pathlen, basename_offset,
715
&a->u.pat, base, stk->originlen))
716
rem = fill_one("fill", a, rem);
717
}
@@ -750,7 +750,8 @@ static void collect_all_attrs(const char *path)
750
{
751
struct attr_stack *stk;
752
int i, pathlen, rem, dirlen;
753
- const char *basename, *cp, *last_slash = NULL;
753
+ const char *cp, *last_slash = NULL;
754
+ int basename_offset;
755
756
for (cp = path; *cp; cp++) {
757
if (*cp == '/' && cp[1])
@@ -758,10 +759,10 @@ static void collect_all_attrs(const char *path)
759
}
760
pathlen = cp - path;
761
if (last_slash) {
761
- basename = last_slash + 1;
762
+ basename_offset = last_slash + 1 - path;
763
dirlen = last_slash - path;
764
} else {
764
- basename = path;
765
+ basename_offset = 0;
766
dirlen = 0;
767
}
768
@@ -771,7 +772,7 @@ static void collect_all_attrs(const char *path)
772
773
rem = attr_nr;
774
for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
774
- rem = fill(path, pathlen, basename, stk, rem);
775
+ rem = fill(path, pathlen, basename_offset, stk, rem);
776
}
777
778
int git_check_attr(const char *path, int num, struct git_attr_check *check)