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))
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) {
{
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 {
}
}
+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 (;;) {
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();
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);
}
if (out_format->needs_stats)
two_pass();
else
- one_pass();
+ one_pass(3);
return 0;
}