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
Karthik Nayak 2016-02-17 23:36:12 +05:30 committed by Junio C Hamano
parent b072add7fb
commit 4de707ea4f
1 changed files with 10 additions and 4 deletions

View File

@ -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"))