attr: change validity check for attribute names to use positive logic

Convert 'invalid_attr_name()' to 'attr_name_valid()' and use positive
logic for the return value.  In addition create a helper function that
prints out an error message when an invalid attribute name is used.

We could later update the message to exactly spell out what the
rules for a good attribute name are, etc.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano
2017-01-27 18:02:00 -08:00
parent 6bc2e3f709
commit 428103c7f1

34
attr.c
View File

@ -74,23 +74,33 @@ static unsigned hash_name(const char *name, int namelen)
return val; return val;
} }
static int invalid_attr_name(const char *name, int namelen) static int attr_name_valid(const char *name, size_t namelen)
{ {
/* /*
* Attribute name cannot begin with '-' and must consist of * Attribute name cannot begin with '-' and must consist of
* characters from [-A-Za-z0-9_.]. * characters from [-A-Za-z0-9_.].
*/ */
if (namelen <= 0 || *name == '-') if (namelen <= 0 || *name == '-')
return -1; return 0;
while (namelen--) { while (namelen--) {
char ch = *name++; char ch = *name++;
if (! (ch == '-' || ch == '.' || ch == '_' || if (! (ch == '-' || ch == '.' || ch == '_' ||
('0' <= ch && ch <= '9') || ('0' <= ch && ch <= '9') ||
('a' <= ch && ch <= 'z') || ('a' <= ch && ch <= 'z') ||
('A' <= ch && ch <= 'Z')) ) ('A' <= ch && ch <= 'Z')) )
return -1; return 0;
} }
return 0; return 1;
}
static void report_invalid_attr(const char *name, size_t len,
const char *src, int lineno)
{
struct strbuf err = STRBUF_INIT;
strbuf_addf(&err, _("%.*s is not a valid attribute name"),
(int) len, name);
fprintf(stderr, "%s: %s:%d\n", err.buf, src, lineno);
strbuf_release(&err);
} }
static struct git_attr *git_attr_internal(const char *name, int len) static struct git_attr *git_attr_internal(const char *name, int len)
@ -105,7 +115,7 @@ static struct git_attr *git_attr_internal(const char *name, int len)
return a; return a;
} }
if (invalid_attr_name(name, len)) if (!attr_name_valid(name, len))
return NULL; return NULL;
FLEX_ALLOC_MEM(a, name, name, len); FLEX_ALLOC_MEM(a, name, name, len);
@ -196,17 +206,15 @@ static const char *parse_attr(const char *src, int lineno, const char *cp,
cp++; cp++;
len--; len--;
} }
if (invalid_attr_name(cp, len)) { if (!attr_name_valid(cp, len)) {
fprintf(stderr, report_invalid_attr(cp, len, src, lineno);
"%.*s is not a valid attribute name: %s:%d\n",
len, cp, src, lineno);
return NULL; return NULL;
} }
} else { } else {
/* /*
* As this function is always called twice, once with * As this function is always called twice, once with
* e == NULL in the first pass and then e != NULL in * e == NULL in the first pass and then e != NULL in
* the second pass, no need for invalid_attr_name() * the second pass, no need for attr_name_valid()
* check here. * check here.
*/ */
if (*cp == '-' || *cp == '!') { if (*cp == '-' || *cp == '!') {
@ -258,10 +266,8 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
name += strlen(ATTRIBUTE_MACRO_PREFIX); name += strlen(ATTRIBUTE_MACRO_PREFIX);
name += strspn(name, blank); name += strspn(name, blank);
namelen = strcspn(name, blank); namelen = strcspn(name, blank);
if (invalid_attr_name(name, namelen)) { if (!attr_name_valid(name, namelen)) {
fprintf(stderr, report_invalid_attr(name, namelen, src, lineno);
"%.*s is not a valid attribute name: %s:%d\n",
namelen, name, src, lineno);
goto fail_return; goto fail_return;
} }
} }