Continue removing any printing from ref-filter formatting logic,
so that it could be more general.
Change the signature of handlers by adding return value
and strbuf parameter for errors.
Signed-off-by: Olga Telezhnaia
---
ref-filter.c | 71
1 file changed, 48 insertions(+), 23 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index 54fae00bdd410..07bedc636398c 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -387,7 +387,8 @@ struct ref_formatting_state {
struct atom_value {
const char *s;
- void (*handler)(struct atom_value *atomv, struct ref_formatting_state
*state);
+ int (*handler)(struct atom_value *atomv, struct ref_formatting_state
*state,
+ struct strbuf *err);
uintmax_t value; /* used for sorting when not FIELD_STR */
struct used_atom *atom;
};
@@ -481,7 +482,8 @@ static void quote_formatting(struct strbuf *s, const char
*str, int quote_style)
}
}
-static void append_atom(struct atom_value *v, struct ref_formatting_state
*state)
+static int append_atom(struct atom_value *v, struct ref_formatting_state
*state,
+ struct strbuf *err)
{
/*
* Quote formatting is only done when the stack has a single
@@ -493,6 +495,7 @@ static void append_atom(struct atom_value *v, struct
ref_formatting_state *state
quote_formatting(&state->stack->output, v->s,
state->quote_style);
else
strbuf_addstr(&state->stack->output, v->s);
+ return 0;
}
static void push_stack_element(struct ref_formatting_stack **stack)
@@ -527,7 +530,8 @@ static void end_align_handler(struct ref_formatting_stack
**stack)
strbuf_release(&s);
}
-static void align_atom_handler(struct atom_value *atomv, struct
ref_formatting_state *state)
+static int align_atom_handler(struct atom_value *atomv, struct
ref_formatting_state *state,
+ struct strbuf *err)
{
struct ref_formatting_stack *new_stack;
@@ -535,6 +539,7 @@ static void align_atom_handler(struct atom_value *atomv,
struct ref_formatting_s
new_stack = state->stack;
new_stack->at_end = end_align_handler;
new_stack->at_end_data = &atomv->atom->u.align;
+ return 0;
}
static void if_then_else_handler(struct ref_formatting_stack **stack)
@@ -572,7 +577,8 @@ static void if_then_else_handler(struct
ref_formatting_stack **stack)
free(if_then_else);
}
-static void if_atom_handler(struct atom_value *atomv, struct
ref_formatting_state *state)
+static int if_atom_handler(struct atom_value *atomv, struct
ref_formatting_state *state,
+ struct strbuf *err)
{
struct ref_formatting_stack *new_stack;
struct if_then_else *if_then_else = xcalloc(sizeof(struct
if_then_else), 1);
@@ -584,6 +590,7 @@ static void if_atom_handler(struct atom_value *atomv,
struct ref_formatting_stat
new_stack = state->stack;
new_stack->at_end = if_then_else_handler;
new_stack->at_end_data = if_then_else;
+ return 0;
}
static int is_empty(const char *s)
@@ -596,19 +603,24 @@ static int is_empty(const char *s)
return 1;
}
-static void then_atom_handler(struct atom_value *atomv, struct
ref_formatting_state *state)
+static int then_atom_handler(struct atom_value *atomv, struct
ref_formatting_state *state,
+struct strbuf *err)
{
struct ref_formatting_stack *cur = state->stack;
struct if_then_else *if_then_else = NULL;
if (cur->at_end == if_then_else_handler)
if_then_else = (struct if_then_else *)cur->at_end_data;
- if (!if_then_else)
- die(_("format: %%(then) atom used without an %%(if) atom"));
- if (if_then_else->then_atom_seen)
- die(_("format: %%(then) atom used more than once"));
- if (if_then_else->else_atom_seen)
- die(_("format: %%(then) atom used after %%(else)"));
+ if (!if_then_else) {
+ strbuf_addstr(err, _("format: %(then) atom used without an
%(if) atom"));
+ return -1;
+ } else if (if_then_else->then_atom_seen) {
+ strbuf_addstr(err, _("format: %(then) atom used more than
once"));
+ return -1;
+ } else if (if_then_else->else_atom_seen) {
+ strbuf_addstr(err, _("format: %(then) atom used after
%(else)"));
+ return -1;
+ }
if_then_else->then_atom_seen = 1;
/*
* If the 'equals' or 'notequals' attribute is used then
@@ -624,34 +636,44 @@ static void then_atom_handler(struct atom_value *atomv,
struct ref_formatting_st
} else if (cur->output.len && !is_empty(cur->output.buf))
if_then_else->condition_satisfied = 1;
strbuf_reset(&cur->output);
+ return 0;
}
-static void else_atom_handler(struct atom_value *atomv,