attr.c: refactoring

This splits out a common routine that parses a single line of
attribute file and adds it to the attr_stack.  It should not
change any behaviour, other than attrs array in the attr_stack
structure is now grown with alloc_nr() macro, instead of one by
one, which relied on xrealloc() to give enough slack to be
efficient enough.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano
2007-08-14 01:40:45 -07:00
parent 6b06d518ca
commit a44131181a

69
attr.c
View File

@ -257,6 +257,7 @@ static struct attr_stack {
struct attr_stack *prev; struct attr_stack *prev;
char *origin; char *origin;
unsigned num_matches; unsigned num_matches;
unsigned alloc;
struct match_attr **attrs; struct match_attr **attrs;
} *attr_stack; } *attr_stack;
@ -287,6 +288,26 @@ static const char *builtin_attr[] = {
NULL, NULL,
}; };
static void handle_attr_line(struct attr_stack *res,
const char *line,
const char *src,
int lineno,
int macro_ok)
{
struct match_attr *a;
a = parse_attr_line(line, src, lineno, macro_ok);
if (!a)
return;
if (res->alloc <= res->num_matches) {
res->alloc = alloc_nr(res->num_matches);
res->attrs = xrealloc(res->attrs,
sizeof(struct match_attr *) *
res->alloc);
}
res->attrs[res->num_matches++] = a;
}
static struct attr_stack *read_attr_from_array(const char **list) static struct attr_stack *read_attr_from_array(const char **list)
{ {
struct attr_stack *res; struct attr_stack *res;
@ -294,45 +315,37 @@ static struct attr_stack *read_attr_from_array(const char **list)
int lineno = 0; int lineno = 0;
res = xcalloc(1, sizeof(*res)); res = xcalloc(1, sizeof(*res));
while ((line = *(list++)) != NULL) { while ((line = *(list++)) != NULL)
struct match_attr *a; handle_attr_line(res, line, "[builtin]", ++lineno, 1);
a = parse_attr_line(line, "[builtin]", ++lineno, 1);
if (!a)
continue;
res->attrs = xrealloc(res->attrs,
sizeof(struct match_attr *) * (res->num_matches + 1));
res->attrs[res->num_matches++] = a;
}
return res; return res;
} }
static struct attr_stack *read_attr_from_file(const char *path, int macro_ok) static struct attr_stack *read_attr_from_file(const char *path, int macro_ok)
{ {
FILE *fp; FILE *fp = fopen(path, "r");
struct attr_stack *res; struct attr_stack *res;
char buf[2048]; char buf[2048];
int lineno = 0; int lineno = 0;
res = xcalloc(1, sizeof(*res));
fp = fopen(path, "r");
if (!fp) if (!fp)
return res; return NULL;
res = xcalloc(1, sizeof(*res));
while (fgets(buf, sizeof(buf), fp)) { while (fgets(buf, sizeof(buf), fp))
struct match_attr *a; handle_attr_line(res, buf, path, ++lineno, macro_ok);
a = parse_attr_line(buf, path, ++lineno, macro_ok);
if (!a)
continue;
res->attrs = xrealloc(res->attrs,
sizeof(struct match_attr *) * (res->num_matches + 1));
res->attrs[res->num_matches++] = a;
}
fclose(fp); fclose(fp);
return res; return res;
} }
static struct attr_stack *read_attr(const char *path, int macro_ok)
{
struct attr_stack *res;
res = read_attr_from_file(path, macro_ok);
if (!res)
res = xcalloc(1, sizeof(*res));
return res;
}
#if DEBUG_ATTR #if DEBUG_ATTR
static void debug_info(const char *what, struct attr_stack *elem) static void debug_info(const char *what, struct attr_stack *elem)
{ {
@ -370,13 +383,15 @@ static void bootstrap_attr_stack(void)
elem->prev = attr_stack; elem->prev = attr_stack;
attr_stack = elem; attr_stack = elem;
elem = read_attr_from_file(GITATTRIBUTES_FILE, 1); elem = read_attr(GITATTRIBUTES_FILE, 1);
elem->origin = strdup(""); elem->origin = strdup("");
elem->prev = attr_stack; elem->prev = attr_stack;
attr_stack = elem; attr_stack = elem;
debug_push(elem); debug_push(elem);
elem = read_attr_from_file(git_path(INFOATTRIBUTES_FILE), 1); elem = read_attr_from_file(git_path(INFOATTRIBUTES_FILE), 1);
if (!elem)
elem = xcalloc(1, sizeof(*elem));
elem->origin = NULL; elem->origin = NULL;
elem->prev = attr_stack; elem->prev = attr_stack;
attr_stack = elem; attr_stack = elem;
@ -441,7 +456,7 @@ static void prepare_attr_stack(const char *path, int dirlen)
memcpy(pathbuf + dirlen, "/", 2); memcpy(pathbuf + dirlen, "/", 2);
cp = strchr(pathbuf + len + 1, '/'); cp = strchr(pathbuf + len + 1, '/');
strcpy(cp + 1, GITATTRIBUTES_FILE); strcpy(cp + 1, GITATTRIBUTES_FILE);
elem = read_attr_from_file(pathbuf, 0); elem = read_attr(pathbuf, 0);
*cp = '\0'; *cp = '\0';
elem->origin = strdup(pathbuf); elem->origin = strdup(pathbuf);
elem->prev = attr_stack; elem->prev = attr_stack;