Re: [PATCH v13 02/12] ref-filter: introduce ref_formatting_state and ref_formatting_stack

2015-08-25 Thread Karthik Nayak
On Tue, Aug 25, 2015 at 3:26 AM, Junio C Hamano  wrote:
> Karthik Nayak  writes:
>
>> +static void push_new_stack_element(struct ref_formatting_stack **stack)
>> +{
>
> Micronit.  Perhaps s/_new//;, as you do not call the other function
> pop_old_stack_element().
>
> The remainder of this step looks pretty straight-forward and was a
> pleasant read.
>
> Thanks.

Will do, thanks for reviewing :)

-- 
Regards,
Karthik Nayak
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v13 02/12] ref-filter: introduce ref_formatting_state and ref_formatting_stack

2015-08-24 Thread Junio C Hamano
Karthik Nayak  writes:

> +static void push_new_stack_element(struct ref_formatting_stack **stack)
> +{

Micronit.  Perhaps s/_new//;, as you do not call the other function
pop_old_stack_element().

The remainder of this step looks pretty straight-forward and was a
pleasant read.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v13 02/12] ref-filter: introduce ref_formatting_state and ref_formatting_stack

2015-08-21 Thread Karthik Nayak
Introduce ref_formatting_state which will hold the formatted output
strbuf instead of directly printing to stdout. This will help us in
creating modifier atoms which modify the format specified before
printing to stdout.

Implement a stack machinery for ref_formatting_state, this allows us
to push and pop elements onto the stack. Whenever we pop an element
from the stack, the strbuf from that element is appended to the strbuf
of the next element on the stack, this will allow us to support
nesting of modifier atoms.

Rename some functions to reflect the changes made:
print_value() -> append_atom()
emit()-> append_literal()

Mentored-by: Christian Couder 
Mentored-by: Matthieu Moy 
Signed-off-by: Karthik Nayak 
---
 ref-filter.c | 78 +---
 1 file changed, 59 insertions(+), 19 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index e53c77e..d0d8df0 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -55,6 +55,18 @@ static struct {
{ "color" },
 };
 
+#define REF_FORMATTING_STATE_INIT  { 0, NULL }
+
+struct ref_formatting_stack {
+   struct ref_formatting_stack *prev;
+   struct strbuf output;
+};
+
+struct ref_formatting_state {
+   int quote_style;
+   struct ref_formatting_stack *stack;
+};
+
 struct atom_value {
const char *s;
unsigned long ul; /* used for sorting when not FIELD_STR */
@@ -129,6 +141,27 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
return at;
 }
 
+static void push_new_stack_element(struct ref_formatting_stack **stack)
+{
+   struct ref_formatting_stack *s = xcalloc(1, sizeof(struct 
ref_formatting_stack));
+
+   strbuf_init(&s->output, 0);
+   s->prev = *stack;
+   *stack = s;
+}
+
+static void pop_stack_element(struct ref_formatting_stack **stack)
+{
+   struct ref_formatting_stack *current = *stack;
+   struct ref_formatting_stack *prev = current->prev;
+
+   if (prev)
+   strbuf_addbuf(&prev->output, ¤t->output);
+   strbuf_release(¤t->output);
+   free(current);
+   *stack = prev;
+}
+
 /*
  * In a format string, find the next occurrence of %(atom).
  */
@@ -1195,30 +1228,27 @@ void ref_array_sort(struct ref_sorting *sorting, struct 
ref_array *array)
qsort(array->items, array->nr, sizeof(struct ref_array_item *), 
compare_refs);
 }
 
-static void print_value(struct atom_value *v, int quote_style)
+static void append_atom(struct atom_value *v, struct ref_formatting_state 
*state)
 {
-   struct strbuf sb = STRBUF_INIT;
-   switch (quote_style) {
+   struct strbuf *s = &state->stack->output;
+
+   switch (state->quote_style) {
case QUOTE_NONE:
-   fputs(v->s, stdout);
+   strbuf_addstr(s, v->s);
break;
case QUOTE_SHELL:
-   sq_quote_buf(&sb, v->s);
+   sq_quote_buf(s, v->s);
break;
case QUOTE_PERL:
-   perl_quote_buf(&sb, v->s);
+   perl_quote_buf(s, v->s);
break;
case QUOTE_PYTHON:
-   python_quote_buf(&sb, v->s);
+   python_quote_buf(s, v->s);
break;
case QUOTE_TCL:
-   tcl_quote_buf(&sb, v->s);
+   tcl_quote_buf(s, v->s);
break;
}
-   if (quote_style != QUOTE_NONE) {
-   fputs(sb.buf, stdout);
-   strbuf_release(&sb);
-   }
 }
 
 static int hex1(char ch)
@@ -1239,8 +1269,10 @@ static int hex2(const char *cp)
return -1;
 }
 
-static void emit(const char *cp, const char *ep)
+static void append_literal(const char *cp, const char *ep, struct 
ref_formatting_state *state)
 {
+   struct strbuf *s = &state->stack->output;
+
while (*cp && (!ep || cp < ep)) {
if (*cp == '%') {
if (cp[1] == '%')
@@ -1248,13 +1280,13 @@ static void emit(const char *cp, const char *ep)
else {
int ch = hex2(cp + 1);
if (0 <= ch) {
-   putchar(ch);
+   strbuf_addch(s, ch);
cp += 3;
continue;
}
}
}
-   putchar(*cp);
+   strbuf_addch(s, *cp);
cp++;
}
 }
@@ -1262,19 +1294,24 @@ static void emit(const char *cp, const char *ep)
 void show_ref_array_item(struct ref_array_item *info, const char *format, int 
quote_style)
 {
const char *cp, *sp, *ep;
+   struct strbuf *final_buf;
+   struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
+
+   state.quote_style = quote_style;
+   push_new_stack_element(&state.stack);
 
for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {