diff --git a/ref-filter.c b/ref-filter.c
index 7561727..d6510a6 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -10,6 +10,8 @@
#include "quote.h"
#include "ref-filter.h"
#include "revision.h"
+#include "utf8.h"
+#include "git-compat-util.h"
typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
@@ -1190,30 +1192,41 @@ 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 apply_formatting_state(struct ref_formatting_state *state,
+ const char *buf, struct strbuf *value)
{
- struct strbuf sb = STRBUF_INIT;
- switch (quote_style) {
+ /* Eventually we'll format based on the ref_formatting_state */
+ strbuf_addstr(value, buf);
+}
+
+static void print_value(struct atom_value *v, struct ref_formatting_state *state)
+{
+ struct strbuf value = STRBUF_INIT;
+ struct strbuf formatted = STRBUF_INIT;
+
+ apply_formatting_state(state, v->s, &value);
+
+ switch (state->quote_style) {
case QUOTE_NONE:
- fputs(v->s, stdout);
+ fputs(value.buf, stdout);
break;
case QUOTE_SHELL:
- sq_quote_buf(&sb, v->s);
+ sq_quote_buf(&formatted, value.buf);
break;
case QUOTE_PERL:
- perl_quote_buf(&sb, v->s);
+ perl_quote_buf(&formatted, value.buf);
break;
case QUOTE_PYTHON:
- python_quote_buf(&sb, v->s);
+ python_quote_buf(&formatted, value.buf);
break;
case QUOTE_TCL:
- tcl_quote_buf(&sb, v->s);
+ tcl_quote_buf(&formatted, value.buf);
break;
}
- if (quote_style != QUOTE_NONE) {
- fputs(sb.buf, stdout);
- strbuf_release(&sb);
- }
+ if (state->quote_style != QUOTE_NONE)
+ fputs(formatted.buf, stdout);
+ strbuf_release(&value);
+ strbuf_release(&formatted);
}
static int hex1(char ch)@@ -1234,8 +1247,12 @@ static int hex2(const char *cp)
return -1;
}
-static void emit(const char *cp, const char *ep)
+static void emit(const char *cp, const char *ep,
+ struct ref_formatting_state *state)
{
+ struct strbuf value = STRBUF_INIT;
+ struct strbuf format = STRBUF_INIT;
+
while (*cp && (!ep || cp < ep)) {
if (*cp == '%') {
if (cp[1] == '%')@@ -1249,27 +1266,44 @@ static void emit(const char *cp, const char *ep)
}
}
}
- putchar(*cp);
+ strbuf_addch(&value, *cp);
cp++;
}
+ apply_formatting_state(state, value.buf, &format);
+ fputs(format.buf, stdout);
+ strbuf_release(&format);
+ strbuf_release(&value);
+}
+
+static void store_formatting_state(struct ref_formatting_state *state,
+ struct atom_value *atomv)
+{
+ /* Here the 'ref_formatting_state' variable will be filled */
}
void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style)
{
const char *cp, *sp, *ep;
+ struct ref_formatting_state state;
+
+ memset(&state, 0, sizeof(state));
+ state.quote_style = quote_style;
for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {
struct atom_value *atomv;
ep = strchr(sp, ')');
if (cp < sp)
- emit(cp, sp);
+ emit(cp, sp, &state);
get_ref_atom_value(info, parse_ref_filter_atom(sp + 2, ep), &atomv);
- print_value(atomv, quote_style);
+ if (atomv->modifier_atom)
+ store_formatting_state(&state, atomv);
+ else
+ print_value(atomv, &state);
}
if (*cp) {
sp = cp + strlen(cp);
- emit(cp, sp);
+ emit(cp, sp, &state);
}
if (need_color_reset_at_eol) {
struct atom_value resetv;@@ -1278,7 +1312,7 @@ void show_ref_array_item(struct ref_array_item *info, const char *format, int qu
if (color_parse("reset", color) < 0)
die("BUG: couldn't parse 'reset' as a color");
resetv.s = color;
- print_value(&resetv, quote_style);
+ print_value(&resetv, &state);
}
putchar('\n');
}diff --git a/ref-filter.h b/ref-filter.h
index 6bf27d8..12e6a6b 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -19,6 +19,11 @@
struct atom_value {
const char *s;
unsigned long ul; /* used for sorting when not FIELD_STR */
+ unsigned int modifier_atom : 1; /* atoms which act as modifiers for the next atom */
+};
+
+struct ref_formatting_state {
+ int quote_style;
};
struct ref_sorting {--
2.4.6