[PATCH v2 06/11] ref-filter: introduce color_atom_parser()
From: Karthik Nayak <hidden>
Date: 2016-06-15 23:07:29
Subsystem:
the rest · Maintainer:
Linus Torvalds
Introduce color_atom_parser() which will parse a "color" atom and store its color in the "use_atom" structure for further usage in 'populate_value()'. Helped-by: Ramsay Jones [off-list ref] Signed-off-by: Karthik Nayak <redacted> --- ref-filter.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index 7d33b83..3b61c62 100644
--- a/ref-filter.c
+++ b/ref-filter.c@@ -29,6 +29,9 @@ typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type; static struct used_atom { const char *str; cmp_type type; + union { + const char *color; + } u; } *used_atom; static int used_atom_cnt, need_tagged, need_symref; static int need_color_reset_at_eol;
@@ -53,6 +56,13 @@ static int match_atom_name(const char *name, const char *atom_name, const char * return 1; } +static void color_atom_parser(struct used_atom *atom) +{ + match_atom_name(atom->str, "color", &atom->u.color); + if (!atom->u.color) + die(_("expected format: %%(color:<color>)")); +} + static struct { const char *name; cmp_type cmp_type;
@@ -90,7 +100,7 @@ static struct { { "symref" }, { "flag" }, { "HEAD" }, - { "color" }, + { "color", FIELD_STR, color_atom_parser }, { "align" }, { "end" }, };
@@ -175,6 +185,9 @@ int parse_ref_filter_atom(const char *atom, const char *ep) REALLOC_ARRAY(used_atom, used_atom_cnt); used_atom[at].str = xmemdupz(atom, ep - atom); used_atom[at].type = valid_atom[i].cmp_type; + memset(&used_atom[at].u, 0, sizeof(used_atom[at].u)); + if (valid_atom[i].parser) + valid_atom[i].parser(&used_atom[at]); if (*atom == '*') need_tagged = 1; if (!strcmp(used_atom[at].str, "symref"))
@@ -833,12 +846,10 @@ static void populate_value(struct ref_array_item *ref) refname = branch_get_push(branch, NULL); if (!refname) continue; - } else if (match_atom_name(name, "color", &valp)) { + } else if (starts_with(name, "color:")) { char color[COLOR_MAXLEN] = ""; - if (!valp) - die(_("expected format: %%(color:<color>)")); - if (color_parse(valp, color) < 0) + if (color_parse(atom->u.color, color) < 0) die(_("unable to parse format")); v->s = xstrdup(color); continue;
--
2.6.4