diff options
Diffstat (limited to 'src/bin/psql/print.c')
-rw-r--r-- | src/bin/psql/print.c | 68 |
1 files changed, 40 insertions, 28 deletions
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c index e127edb1aed..dec440c264e 100644 --- a/src/bin/psql/print.c +++ b/src/bin/psql/print.c @@ -268,6 +268,16 @@ fputnbytes(FILE *f, const char *str, size_t n) } +static void +print_separator(struct separator sep, FILE *fout) +{ + if (sep.separator_zero) + fputc('\000', fout); + else if (sep.separator) + fputs(sep.separator, fout); +} + + /*************************/ /* Unaligned text */ /*************************/ @@ -276,8 +286,6 @@ fputnbytes(FILE *f, const char *str, size_t n) static void print_unaligned_text(const printTableContent *cont, FILE *fout) { - const char *opt_fieldsep = cont->opt->fieldSep; - const char *opt_recordsep = cont->opt->recordSep; bool opt_tuples_only = cont->opt->tuples_only; unsigned int i; const char *const * ptr; @@ -286,16 +294,14 @@ print_unaligned_text(const printTableContent *cont, FILE *fout) if (cancel_pressed) return; - if (!opt_fieldsep) - opt_fieldsep = ""; - if (!opt_recordsep) - opt_recordsep = ""; - if (cont->opt->start_table) { /* print title */ if (!opt_tuples_only && cont->title) - fprintf(fout, "%s%s", cont->title, opt_recordsep); + { + fputs(cont->title, fout); + print_separator(cont->opt->recordSep, fout); + } /* print headers */ if (!opt_tuples_only) @@ -303,7 +309,7 @@ print_unaligned_text(const printTableContent *cont, FILE *fout) for (ptr = cont->headers; *ptr; ptr++) { if (ptr != cont->headers) - fputs(opt_fieldsep, fout); + print_separator(cont->opt->fieldSep, fout); fputs(*ptr, fout); } need_recordsep = true; @@ -318,7 +324,7 @@ print_unaligned_text(const printTableContent *cont, FILE *fout) { if (need_recordsep) { - fputs(opt_recordsep, fout); + print_separator(cont->opt->recordSep, fout); need_recordsep = false; if (cancel_pressed) break; @@ -326,7 +332,7 @@ print_unaligned_text(const printTableContent *cont, FILE *fout) fputs(*ptr, fout); if ((i + 1) % cont->ncolumns) - fputs(opt_fieldsep, fout); + print_separator(cont->opt->fieldSep, fout); else need_recordsep = true; } @@ -342,16 +348,25 @@ print_unaligned_text(const printTableContent *cont, FILE *fout) { if (need_recordsep) { - fputs(opt_recordsep, fout); + print_separator(cont->opt->recordSep, fout); need_recordsep = false; } fputs(f->data, fout); need_recordsep = true; } } - /* the last record needs to be concluded with a newline */ + /* + * The last record is terminated by a newline, independent of the set + * record separator. But when the record separator is a zero byte, we + * use that (compatible with find -print0 and xargs). + */ if (need_recordsep) - fputc('\n', fout); + { + if (cont->opt->recordSep.separator_zero) + print_separator(cont->opt->recordSep, fout); + else + fputc('\n', fout); + } } } @@ -359,8 +374,6 @@ print_unaligned_text(const printTableContent *cont, FILE *fout) static void print_unaligned_vertical(const printTableContent *cont, FILE *fout) { - const char *opt_fieldsep = cont->opt->fieldSep; - const char *opt_recordsep = cont->opt->recordSep; bool opt_tuples_only = cont->opt->tuples_only; unsigned int i; const char *const * ptr; @@ -369,11 +382,6 @@ print_unaligned_vertical(const printTableContent *cont, FILE *fout) if (cancel_pressed) return; - if (!opt_fieldsep) - opt_fieldsep = ""; - if (!opt_recordsep) - opt_recordsep = ""; - if (cont->opt->start_table) { /* print title */ @@ -393,19 +401,19 @@ print_unaligned_vertical(const printTableContent *cont, FILE *fout) if (need_recordsep) { /* record separator is 2 occurrences of recordsep in this mode */ - fputs(opt_recordsep, fout); - fputs(opt_recordsep, fout); + print_separator(cont->opt->recordSep, fout); + print_separator(cont->opt->recordSep, fout); need_recordsep = false; if (cancel_pressed) break; } fputs(cont->headers[i % cont->ncolumns], fout); - fputs(opt_fieldsep, fout); + print_separator(cont->opt->fieldSep, fout); fputs(*ptr, fout); if ((i + 1) % cont->ncolumns) - fputs(opt_recordsep, fout); + print_separator(cont->opt->recordSep, fout); else need_recordsep = true; } @@ -417,15 +425,19 @@ print_unaligned_vertical(const printTableContent *cont, FILE *fout) { printTableFooter *f; - fputs(opt_recordsep, fout); + print_separator(cont->opt->recordSep, fout); for (f = cont->footers; f; f = f->next) { - fputs(opt_recordsep, fout); + print_separator(cont->opt->recordSep, fout); fputs(f->data, fout); } } - fputc('\n', fout); + /* see above in print_unaligned_text() */ + if (cont->opt->recordSep.separator_zero) + print_separator(cont->opt->recordSep, fout); + else + fputc('\n', fout); } } |