ref-filter: introduce parsing functions for each valid atom
Parsing atoms is done in populate_value(), this is repetitive and hence expensive. Introduce a parsing function which would let us parse atoms beforehand and store the required details into the 'used_atom' structure for further usage. Helped-by: Eric Sunshine <sunshine@sunshineco.com> Helped-by: Ramsay Jones <ramsay@ramsayjones.plus.com> Helped-by: Andreas Schwab <schwab@linux-m68k.org> Signed-off-by: Karthik Nayak <Karthik.188@gmail.com> Reviewed-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
b072add7fb
commit
4de707ea4f
14
ref-filter.c
14
ref-filter.c
|
@ -36,6 +36,7 @@ static int need_color_reset_at_eol;
|
||||||
static struct {
|
static struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
cmp_type cmp_type;
|
cmp_type cmp_type;
|
||||||
|
void (*parser)(struct used_atom *atom, const char *arg);
|
||||||
} valid_atom[] = {
|
} valid_atom[] = {
|
||||||
{ "refname" },
|
{ "refname" },
|
||||||
{ "objecttype" },
|
{ "objecttype" },
|
||||||
|
@ -114,6 +115,7 @@ struct atom_value {
|
||||||
int parse_ref_filter_atom(const char *atom, const char *ep)
|
int parse_ref_filter_atom(const char *atom, const char *ep)
|
||||||
{
|
{
|
||||||
const char *sp;
|
const char *sp;
|
||||||
|
const char *arg;
|
||||||
int i, at;
|
int i, at;
|
||||||
|
|
||||||
sp = atom;
|
sp = atom;
|
||||||
|
@ -132,16 +134,16 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
|
||||||
/* Is the atom a valid one? */
|
/* Is the atom a valid one? */
|
||||||
for (i = 0; i < ARRAY_SIZE(valid_atom); i++) {
|
for (i = 0; i < ARRAY_SIZE(valid_atom); i++) {
|
||||||
int len = strlen(valid_atom[i].name);
|
int len = strlen(valid_atom[i].name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the atom name has a colon, strip it and everything after
|
* If the atom name has a colon, strip it and everything after
|
||||||
* it off - it specifies the format for this entry, and
|
* it off - it specifies the format for this entry, and
|
||||||
* shouldn't be used for checking against the valid_atom
|
* shouldn't be used for checking against the valid_atom
|
||||||
* table.
|
* table.
|
||||||
*/
|
*/
|
||||||
const char *formatp = strchr(sp, ':');
|
arg = memchr(sp, ':', ep - sp);
|
||||||
if (!formatp || ep < formatp)
|
if (len == (arg ? arg : ep) - sp &&
|
||||||
formatp = ep;
|
!memcmp(valid_atom[i].name, sp, len))
|
||||||
if (len == formatp - sp && !memcmp(valid_atom[i].name, sp, len))
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,6 +156,10 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
|
||||||
REALLOC_ARRAY(used_atom, used_atom_cnt);
|
REALLOC_ARRAY(used_atom, used_atom_cnt);
|
||||||
used_atom[at].name = xmemdupz(atom, ep - atom);
|
used_atom[at].name = xmemdupz(atom, ep - atom);
|
||||||
used_atom[at].type = valid_atom[i].cmp_type;
|
used_atom[at].type = valid_atom[i].cmp_type;
|
||||||
|
if (arg)
|
||||||
|
arg = used_atom[at].name + (arg - atom) + 1;
|
||||||
|
if (valid_atom[i].parser)
|
||||||
|
valid_atom[i].parser(&used_atom[at], arg);
|
||||||
if (*atom == '*')
|
if (*atom == '*')
|
||||||
need_tagged = 1;
|
need_tagged = 1;
|
||||||
if (!strcmp(used_atom[at].name, "symref"))
|
if (!strcmp(used_atom[at].name, "symref"))
|
||||||
|
|
Loading…
Reference in New Issue