From ea8c632272d136f1b985b5405f821b300848f88f Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Tue, 24 Jul 2012 17:11:44 +0200 Subject: [PATCH] Let column selection update the header --- xsv.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/xsv.c b/xsv.c index f980634..971ae58 100644 --- a/xsv.c +++ b/xsv.c @@ -24,6 +24,9 @@ #define UNUSED #endif +static void select_fields(void); +static void select_all_fields(void); + /*** General functions ***/ static void NONRET die(char *msg, ...) @@ -611,20 +614,22 @@ static void write_header(void) return; } + int want_select_fields = 0; if (out_format->set_field_names) { struct field_names *fn = xmalloc_zero(sizeof(*fn)); out_format->field_names = fn; add_field_names(fn, out_format->set_field_names); - } else if (in_format->field_names) + } else if (in_format->field_names) { out_format->field_names = in_format->field_names; - else + want_select_fields = 1; + } else die("Output header requested, but no field names specified"); line_reset(&in_line); - fields_reset(&out_fields); + fields_reset(&in_fields); struct field_names *fn = out_format->field_names; for (int i = 0; i < stringarray_count(&fn->names); i++) { - struct field *f = fields_push(&out_fields); + struct field *f = fields_push(&in_fields); f->start_pos = line_count(&in_line); f->len = 0; char *s = *stringarray_nth(&fn->names, i); @@ -634,6 +639,11 @@ static void write_header(void) } } + if (want_select_fields) + select_fields(); + else + select_all_fields(); + // This is tricky: when we are formatting a table, field names are normally // calculated in pass 1, but the header is written in pass 2, so we have to // update column statistics, because field name can be too wide to fit. -- 2.39.2