diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c index 79fc43e..659d197 100644 --- a/src/bin/psql/print.c +++ b/src/bin/psql/print.c @@ -1234,6 +1234,46 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout) fprintf(fout, "%s\n", cont->title); } + if (cont->opt->format == PRINT_WRAPPED) + { + int output_columns = 0; + + /* + * Choose target output width: \pset columns, or $COLUMNS, or ioctl + */ + if (cont->opt->columns > 0) + output_columns = cont->opt->columns; + else + { + if (cont->opt->env_columns > 0) + output_columns = cont->opt->env_columns; +#ifdef TIOCGWINSZ + else + { + struct winsize screen_size; + + if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1) + output_columns = screen_size.ws_col; + } +#endif + } + + output_columns -= hwidth; + + if (opt_border == 0) + output_columns -= 1; + else + { + output_columns -= 3; /* -+- */ + + if (opt_border > 1) + output_columns -= 4; /* +--+ */ + } + + if (output_columns > 0 && dwidth > output_columns) + dwidth = output_columns; + } + /* print records */ for (i = 0, ptr = cont->cells; *ptr; i++, ptr++) { @@ -1292,20 +1332,52 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout) else fputc(' ', fout); - if (!dcomplete) + if (!dcomplete && dlineptr[line_count].width > 0) { - if (opt_border < 2) - fprintf(fout, "%s\n", dlineptr[line_count].ptr); - else - fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr, - dwidth - dlineptr[line_count].width, "", - dformat->rightvrule); + int offset = 0, + chars_to_output = dlineptr[line_count].width; + + while (chars_to_output > 0) + { + int target_width, + bytes_to_output; + + if (offset > 0) + { + if (opt_border == 2) + fprintf(fout, "%s ", dformat->leftvrule); + + fprintf(fout, "%*s", hwidth, " "); + + if (opt_border > 0) + fprintf(fout, " %s ", dformat->midvrule); + else + fputc(' ', fout); + } + + target_width = dwidth; + bytes_to_output = strlen_max_width(dlineptr[line_count].ptr + offset, + &target_width, encoding); + fputnbytes(fout, (char *)(dlineptr[line_count].ptr + offset), + bytes_to_output); + + chars_to_output -= target_width; + offset += bytes_to_output; + + if (opt_border < 2) + fputc('\n', fout); + else + fprintf(fout, "%*s %s\n", dwidth - target_width, "", + dformat->rightvrule); + } if (!dlineptr[line_count + 1].ptr) dcomplete = 1; } else { + dcomplete = 1; + if (opt_border < 2) fputc('\n', fout); else