ref-filter: introduce parsing functions for each valid atom
authorKarthik Nayak <karthik.188@gmail.com>
Wed, 17 Feb 2016 18:06:12 +0000 (23:36 +0530)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Feb 2016 22:06:45 +0000 (14:06 -0800)
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>
ref-filter.c
index 81397095e49cb4978fcd64f77083f5ae1e762474..8a34ba11c77feb01f44ae699501314a9538cfd1d 100644 (file)
@@ -36,6 +36,7 @@ static int need_color_reset_at_eol;
 static struct {
        const char *name;
        cmp_type cmp_type;
+       void (*parser)(struct used_atom *atom, const char *arg);
 } valid_atom[] = {
        { "refname" },
        { "objecttype" },
@@ -114,6 +115,7 @@ struct atom_value {
 int parse_ref_filter_atom(const char *atom, const char *ep)
 {
        const char *sp;
+       const char *arg;
        int i, at;
 
        sp = atom;
@@ -132,16 +134,16 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
        /* Is the atom a valid one? */
        for (i = 0; i < ARRAY_SIZE(valid_atom); i++) {
                int len = strlen(valid_atom[i].name);
+
                /*
                 * If the atom name has a colon, strip it and everything after
                 * it off - it specifies the format for this entry, and
                 * shouldn't be used for checking against the valid_atom
                 * table.
                 */
-               const char *formatp = strchr(sp, ':');
-               if (!formatp || ep < formatp)
-                       formatp = ep;
-               if (len == formatp - sp && !memcmp(valid_atom[i].name, sp, len))
+               arg = memchr(sp, ':', ep - sp);
+               if (len == (arg ? arg : ep) - sp &&
+                   !memcmp(valid_atom[i].name, sp, len))
                        break;
        }
 
@@ -154,6 +156,10 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
        REALLOC_ARRAY(used_atom, used_atom_cnt);
        used_atom[at].name = xmemdupz(atom, ep - atom);
        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 == '*')
                need_tagged = 1;
        if (!strcmp(used_atom[at].name, "symref"))