From 327e84a50651ba3a3298a7beda9b66068ec8126c Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Tue, 24 Jul 2012 14:32:01 +0200 Subject: [PATCH] Sorted out confusion between input and output fields (especially in two-pass mode) --- xsv.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/xsv.c b/xsv.c index 4ebe798..df08c57 100644 --- a/xsv.c +++ b/xsv.c @@ -197,8 +197,8 @@ static intarray_t column_widths; static void update_stats(void) { - for (int i = 0; i < fields_count(&in_fields); i++) { - struct field *f = fields_nth(&in_fields, i); + for (int i = 0; i < fields_count(&out_fields); i++) { + struct field *f = fields_nth(&out_fields, i); intarray_t *w = &column_widths; while (i >= intarray_count(w)) @@ -376,10 +376,10 @@ static int regex_read(struct format *fmt) static void table_write(struct format *fmt) { - for (int i = 0; i < fields_count(&in_fields); i++) { + for (int i = 0; i < fields_count(&out_fields); i++) { if (i) printf("%*s", fmt->table_sep, ""); - struct field *f = fields_nth(&in_fields, i); + struct field *f = fields_nth(&out_fields, i); int fw = field_chars(f); int cw = *intarray_nth(&column_widths, i); if (fw > cw) { @@ -435,8 +435,8 @@ static void tmp_write(struct format *fmt) { FILE *tf = fmt->tmp_file; - for (int i = 0; i < fields_count(&in_fields); i++) { - struct field *f = fields_nth(&in_fields, i); + for (int i = 0; i < fields_count(&out_fields); i++) { + struct field *f = fields_nth(&out_fields, i); if (f->len < 0xfe) putc_unlocked(f->len, tf); else { @@ -523,9 +523,15 @@ static void select_fields(void) } } +static void select_all_fields(void) +{ + for (int i = 0; i < fields_count(&in_fields); i++) + *fields_push(&out_fields) = *fields_nth(&in_fields, i); +} + /*** Processing of files ***/ -static void one_pass(void) +static void one_pass(int pass) { line_number = 0; for (;;) { @@ -538,11 +544,14 @@ static void one_pass(void) if (ferror_unlocked(stdin)) die("I/O error when reading standard input"); - if (want_trim) + if (want_trim && (pass & 1)) trim_fields(); fields_reset(&out_fields); - select_fields(); + if (pass & 1) + select_fields(); + else + select_all_fields(); if (out_format->needs_stats) update_stats(); @@ -566,14 +575,14 @@ static void two_pass(void) out_format->write_line = tmp_write; out_format->tmp_file = tmpfile(); out_format->needs_stats = final_format->needs_stats; - one_pass(); + one_pass(1); // Pass 2: Set up reader of intermediate format in_format = out_format; rewind(in_format->tmp_file); out_format = final_format; out_format->needs_stats = 0; - one_pass(); + one_pass(2); fclose(in_format->tmp_file); } @@ -769,6 +778,6 @@ int main(int argc, char **argv) if (out_format->needs_stats) two_pass(); else - one_pass(); + one_pass(3); return 0; } -- 2.39.2