about summary refs log tree commit diff
path: root/third_party/git/attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/attr.c')
-rw-r--r--third_party/git/attr.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/third_party/git/attr.c b/third_party/git/attr.c
index a826b2ef1f..93dc16b59c 100644
--- a/third_party/git/attr.c
+++ b/third_party/git/attr.c
@@ -1,6 +1,7 @@
 /*
  * Handle git attributes.  See gitattributes(5) for a description of
- * the file syntax, and attr.h for a description of the API.
+ * the file syntax, and Documentation/technical/api-gitattributes.txt
+ * for a description of the API.
  *
  * One basic design decision here is that we are not going to support
  * an insanely large number of attributes.
@@ -61,7 +62,7 @@ static struct attr_hashmap g_attr_hashmap;
 
 /* The container for objects stored in "struct attr_hashmap" */
 struct attr_hash_entry {
-	struct hashmap_entry ent;
+	struct hashmap_entry ent; /* must be the first member! */
 	const char *key; /* the key; memory should be owned by value */
 	size_t keylen; /* length of the key */
 	void *value; /* the stored value */
@@ -69,14 +70,12 @@ struct attr_hash_entry {
 
 /* attr_hashmap comparison function */
 static int attr_hash_entry_cmp(const void *unused_cmp_data,
-			       const struct hashmap_entry *eptr,
-			       const struct hashmap_entry *entry_or_key,
+			       const void *entry,
+			       const void *entry_or_key,
 			       const void *unused_keydata)
 {
-	const struct attr_hash_entry *a, *b;
-
-	a = container_of(eptr, const struct attr_hash_entry, ent);
-	b = container_of(entry_or_key, const struct attr_hash_entry, ent);
+	const struct attr_hash_entry *a = entry;
+	const struct attr_hash_entry *b = entry_or_key;
 	return (a->keylen != b->keylen) || strncmp(a->key, b->key, a->keylen);
 }
 
@@ -99,10 +98,10 @@ static void *attr_hashmap_get(struct attr_hashmap *map,
 	if (!map->map.tablesize)
 		attr_hashmap_init(map);
 
-	hashmap_entry_init(&k.ent, memhash(key, keylen));
+	hashmap_entry_init(&k, memhash(key, keylen));
 	k.key = key;
 	k.keylen = keylen;
-	e = hashmap_get_entry(&map->map, &k, ent, NULL);
+	e = hashmap_get(&map->map, &k, NULL);
 
 	return e ? e->value : NULL;
 }
@@ -118,12 +117,12 @@ static void attr_hashmap_add(struct attr_hashmap *map,
 		attr_hashmap_init(map);
 
 	e = xmalloc(sizeof(struct attr_hash_entry));
-	hashmap_entry_init(&e->ent, memhash(key, keylen));
+	hashmap_entry_init(e, memhash(key, keylen));
 	e->key = key;
 	e->keylen = keylen;
 	e->value = value;
 
-	hashmap_add(&map->map, &e->ent);
+	hashmap_add(&map->map, e);
 }
 
 struct all_attrs_item {
@@ -162,12 +161,12 @@ static void all_attrs_init(struct attr_hashmap *map, struct attr_check *check)
 	if (size != check->all_attrs_nr) {
 		struct attr_hash_entry *e;
 		struct hashmap_iter iter;
+		hashmap_iter_init(&map->map, &iter);
 
 		REALLOC_ARRAY(check->all_attrs, size);
 		check->all_attrs_nr = size;
 
-		hashmap_for_each_entry(&map->map, &iter, e,
-					ent /* member name */) {
+		while ((e = hashmap_iter_next(&iter))) {
 			const struct git_attr *a = e->value;
 			check->all_attrs[a->attr_nr].attr = a;
 		}
@@ -260,7 +259,7 @@ struct pattern {
 	const char *pattern;
 	int patternlen;
 	int nowildcardlen;
-	unsigned flags;		/* PATTERN_FLAG_* */
+	unsigned flags;		/* EXC_FLAG_* */
 };
 
 /*
@@ -401,11 +400,11 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
 		char *p = (char *)&(res->state[num_attr]);
 		memcpy(p, name, namelen);
 		res->u.pat.pattern = p;
-		parse_path_pattern(&res->u.pat.pattern,
+		parse_exclude_pattern(&res->u.pat.pattern,
 				      &res->u.pat.patternlen,
 				      &res->u.pat.flags,
 				      &res->u.pat.nowildcardlen);
-		if (res->u.pat.flags & PATTERN_FLAG_NEGATIVE) {
+		if (res->u.pat.flags & EXC_FLAG_NEGATIVE) {
 			warning(_("Negative patterns are ignored in git attributes\n"
 				  "Use '\\!' for literal leading exclamation."));
 			goto fail_return;
@@ -992,10 +991,10 @@ static int path_matches(const char *pathname, int pathlen,
 	int prefix = pat->nowildcardlen;
 	int isdir = (pathlen && pathname[pathlen - 1] == '/');
 
-	if ((pat->flags & PATTERN_FLAG_MUSTBEDIR) && !isdir)
+	if ((pat->flags & EXC_FLAG_MUSTBEDIR) && !isdir)
 		return 0;
 
-	if (pat->flags & PATTERN_FLAG_NODIR) {
+	if (pat->flags & EXC_FLAG_NODIR) {
 		return match_basename(pathname + basename_offset,
 				      pathlen - basename_offset - isdir,
 				      pattern, prefix,