]> mj.ucw.cz Git - xsv.git/commitdiff
Sorted out confusion between input and output fields
authorMartin Mares <mj@ucw.cz>
Tue, 24 Jul 2012 12:32:01 +0000 (14:32 +0200)
committerMartin Mares <mj@ucw.cz>
Tue, 24 Jul 2012 12:32:01 +0000 (14:32 +0200)
(especially in two-pass mode)

xsv.c

diff --git a/xsv.c b/xsv.c
index 4ebe79844cf98cd2820dece4f54007b859fcda9e..df08c570486ff7a775ba7a2e4a2c31ebb8acb150 100644 (file)
--- 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;
 }