32#include "catalog/pg_type_d.h"
38#define NEED_COUNT_TABLE_LINES
156 {
"\342\224\234",
"\342\225\237"},
163 {
"\342\224\244",
"\342\225\242"},
174 {
"\342\225\236",
"\342\225\240"},
181 {
"\342\225\241",
"\342\225\243"},
194 {
"\342\224\274",
"\342\225\252"},
201 {
"\342\224\264",
"\342\225\247"},
208 {
"\342\224\254",
"\342\225\244"},
219 {
"\342\225\253",
"\342\225\254"},
226 {
"\342\225\250",
"\342\225\251"},
233 {
"\342\225\245",
"\342\225\246"},
246 {
"\342\224\224",
"\342\224\202",
"\342\224\214",
"\342\224\200",
"\342\224\220",
"\342\224\230"},
257 {
"\342\225\232",
"\342\225\221",
"\342\225\224",
"\342\225\220",
"\342\225\227",
"\342\225\235"},
282#ifdef NEED_COUNT_TABLE_LINES
397 if (
sep.separator_zero)
399 else if (
sep.separator)
428 return cont->footers;
442 const char *
const *ptr;
448 if (
cont->opt->start_table)
460 for (ptr =
cont->headers; *ptr; ptr++)
462 if (ptr !=
cont->headers)
474 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
485 if ((
i + 1) %
cont->ncolumns)
492 if (
cont->opt->stop_table)
500 for (f = footers; f; f = f->
next)
519 if (
cont->opt->recordSep.separator_zero)
533 const char *
const *ptr;
539 if (
cont->opt->start_table)
553 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
569 if ((
i + 1) %
cont->ncolumns)
575 if (
cont->opt->stop_table)
583 for (f =
cont->footers; f; f = f->
next)
593 if (
cont->opt->recordSep.separator_zero)
620 else if (border == 2)
623 for (
i = 0;
i < ncolumns;
i++)
628 if (
i < ncolumns - 1)
640 else if (border == 1)
676 const char *
const *ptr;
692 if (
cont->ncolumns > 0)
816 if (
cont->opt->columns > 0)
818 else if ((
fout == stdout && isatty(fileno(stdout))) ||
is_pager)
820 if (
cont->opt->env_columns > 0)
913 if (
cont->opt->start_table)
956 for (
i = 0;
i <
cont->ncolumns;
i++)
962 (!
format->wrap_right_border &&
i > 0))
1078 if (
cont->aligns[
j] ==
'r')
1121 if (
cont->aligns[
j] !=
'r')
1159 if (
cont->opt->stop_table)
1172 for (f = footers; f; f = f->
next)
1206 unsigned long record,
1312 unsigned long record =
cont->opt->prior_records + 1;
1313 const char *
const *
ptr;
1339 if (
cont->cells[0] ==
NULL &&
cont->opt->start_table &&
1340 cont->opt->stop_table)
1348 for (f = footers; f; f = f->
next)
1369 for (
i = 0;
i <
cont->ncolumns;
i++)
1396 &
width, &height, &fs);
1418 if (
cont->opt->start_table)
1428 if (
cont->opt->columns > 0)
1430 else if ((
fout == stdout && isatty(fileno(stdout))) ||
is_pager)
1432 if (
cont->opt->env_columns > 0)
1499 if (
cont->nrows > 0)
1572 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
1591 if (
i %
cont->ncolumns == 0)
1700 else if (
dline == 0)
1789 if (
cont->opt->stop_table)
1802 for (f =
cont->footers; f; f = f->
next)
1830 for (p =
str; *p; p++)
1858 sep ==
'\\' ||
sep ==
'.')
1867 const char *
const *ptr;
1881 if (
cont->opt->start_table && !
cont->opt->tuples_only)
1884 for (ptr =
cont->headers; *ptr; ptr++)
1886 if (ptr !=
cont->headers)
1894 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
1897 if ((
i + 1) %
cont->ncolumns)
1907 const char *
const *ptr;
1911 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
1918 cont->opt->csvFieldSep[0]);
1942 for (p = in; *p; p++)
1984 const char *
const *ptr;
1989 if (
cont->opt->start_table)
2008 for (ptr =
cont->headers; *ptr; ptr++)
2019 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2021 if (
i %
cont->ncolumns == 0)
2028 fprintf(
fout,
" <td align=\"%s\">",
cont->aligns[(
i) %
cont->ncolumns] ==
'r' ?
"right" :
"left");
2030 if ((*ptr)[
strspn(*ptr,
" \t")] ==
'\0')
2037 if ((
i + 1) %
cont->ncolumns == 0)
2041 if (
cont->opt->stop_table)
2053 for (f = footers; f; f = f->
next)
2072 unsigned long record =
cont->opt->prior_records + 1;
2074 const char *
const *ptr;
2079 if (
cont->opt->start_table)
2096 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2098 if (
i %
cont->ncolumns == 0)
2104 "\n <tr><td colspan=\"2\" align=\"center\">Record %lu</td></tr>\n",
2107 fputs(
"\n <tr><td colspan=\"2\"> </td></tr>\n",
fout);
2109 fputs(
" <tr valign=\"top\">\n"
2114 fprintf(
fout,
" <td align=\"%s\">",
cont->aligns[
i %
cont->ncolumns] ==
'r' ?
"right" :
"left");
2116 if ((*ptr)[
strspn(*ptr,
" \t")] ==
'\0')
2124 if (
cont->opt->stop_table)
2134 for (f =
cont->footers; f; f = f->
next)
2157 for (p = in; *p; p++)
2176 const char *
const *ptr;
2181 if (
cont->opt->start_table)
2196 for (
i = 0;
i <
cont->ncolumns;
i++)
2206 fputs(
",frame=\"none\",grid=\"none\"",
fout);
2212 fputs(
",frame=\"all\",grid=\"all\"",
fout);
2221 for (ptr =
cont->headers; *ptr; ptr++)
2223 if (ptr !=
cont->headers)
2233 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2235 if (
i %
cont->ncolumns == 0)
2241 if (
i %
cont->ncolumns != 0)
2246 if ((*ptr)[
strspn(*ptr,
" \t")] ==
'\0')
2248 if ((
i + 1) %
cont->ncolumns != 0)
2254 if ((
i + 1) %
cont->ncolumns == 0)
2260 if (
cont->opt->stop_table)
2270 for (f = footers; f; f = f->
next)
2285 unsigned long record =
cont->opt->prior_records + 1;
2287 const char *
const *ptr;
2292 if (
cont->opt->start_table)
2310 fputs(
",frame=\"none\",grid=\"none\"",
fout);
2316 fputs(
",frame=\"all\",grid=\"all\"",
fout);
2324 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2326 if (
i %
cont->ncolumns == 0)
2343 if ((*ptr)[
strspn(*ptr,
" \t")] ==
'\0')
2352 if (
cont->opt->stop_table)
2360 for (f =
cont->footers; f; f = f->
next)
2381 for (p = in; *p; p++)
2444 const char *
const *ptr;
2452 if (
cont->opt->start_table)
2467 for (
i = 0;
i <
cont->ncolumns;
i++)
2484 for (
i = 0, ptr =
cont->headers;
i <
cont->ncolumns;
i++, ptr++)
2498 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2502 if ((
i + 1) %
cont->ncolumns == 0)
2514 if (
cont->opt->stop_table)
2521 fputs(
"\\end{tabular}\n\n\\noindent ",
fout);
2528 for (f = footers; f; f = f->
next)
2554 const char *
const *ptr;
2562 if (
cont->opt->start_table)
2570 for (
i = 0;
i <
cont->ncolumns;
i++)
2576#define LONGTABLE_WHITESPACE " \t\n"
2621 for (
i = 0, ptr =
cont->headers;
i <
cont->ncolumns;
i++, ptr++)
2625 fputs(
"\\small\\textbf{\\textit{",
fout);
2630 fputs(
"\\midrule\n\\endfirsthead\n",
fout);
2635 for (
i = 0, ptr =
cont->headers;
i <
cont->ncolumns;
i++, ptr++)
2639 fputs(
"\\small\\textbf{\\textit{",
fout);
2671 fputs(
"\\bottomrule\n\\endfoot\n",
fout);
2672 fputs(
"\\bottomrule\n\\endlastfoot\n",
fout);
2678 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2681 if (
i != 0 &&
i %
cont->ncolumns != 0)
2686 if ((
i + 1) %
cont->ncolumns == 0)
2696 if (
cont->opt->stop_table)
2706 unsigned long record =
cont->opt->prior_records + 1;
2708 const char *
const *ptr;
2716 if (
cont->opt->start_table)
2738 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2741 if (
i %
cont->ncolumns == 0)
2750 fprintf(
fout,
"\\multicolumn{2}{|c|}{\\textit{Record %lu}} \\\\\n", record++);
2753 fprintf(
fout,
"\\multicolumn{2}{c}{\\textit{Record %lu}} \\\\\n", record++);
2765 if (
cont->opt->stop_table)
2770 fputs(
"\\end{tabular}\n\n\\noindent ",
fout);
2777 for (f =
cont->footers; f; f = f->
next)
2799 for (p = in; *p; p++)
2817 const char *
const *ptr;
2825 if (
cont->opt->start_table)
2842 for (
i = 0;
i <
cont->ncolumns;
i++)
2853 for (
i = 0, ptr =
cont->headers;
i <
cont->ncolumns;
i++, ptr++)
2866 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2870 if ((
i + 1) %
cont->ncolumns == 0)
2880 if (
cont->opt->stop_table)
2891 for (f = footers; f; f = f->
next)
2908 unsigned long record =
cont->opt->prior_records + 1;
2910 const char *
const *ptr;
2919 if (
cont->opt->start_table)
2944 for (
i = 0, ptr =
cont->cells; *ptr;
i++, ptr++)
2947 if (
i %
cont->ncolumns == 0)
2989 if (
cont->opt->stop_table)
2998 for (f =
cont->footers; f; f = f->
next)
3096 if (topt && topt->
pager && isatty(fileno(
stdin)) && isatty(fileno(stdout)))
3100 unsigned short int pager = topt->
pager;
3192 const char *title,
const int ncolumns,
const int nrows)
3197 content->
title = title;
3199 content->
nrows = nrows;
3207 fprintf(
stderr,
_(
"Cannot print table contents: number of cells %" PRIu64 " is equal to or exceeds maximum %zu.\n"),
3249 "column count of %d exceeded.\n"),
3262 *content->
align = align;
3291 fprintf(
stderr,
_(
"Cannot add cell to table content: total cell count of %" PRIu64 " exceeded.\n"),
3434 if (*
fout == stdout)
3461#ifdef NEED_COUNT_TABLE_LINES
3474 const char *
const *cell;
3481 for (
i = 0;
i <
cont->ncolumns;
i++)
3492 switch (
cont->opt->format)
3501 lines = vertical ?
cont->nrows : 1;
3512 lines =
Max(
cont->nrows - 1, 0);
3528 lines = vertical ?
cont->nrows : 1;
3537 for (
i = 0, cell =
cont->cells; *cell; cell++)
3565 if (++
i >=
cont->ncolumns)
3597 for (
i = 0;
i <
cont->ncolumns;
i++)
3660 switch (
cont->opt->format)
3663 if (
cont->opt->expanded == 1)
3676 if (
cont->opt->expanded == 1 ||
3683 if (
cont->opt->expanded == 1)
3689 if (
cont->opt->expanded == 1)
3695 if (
cont->opt->expanded == 1)
3701 if (
cont->opt->expanded == 1)
3707 if (
cont->opt->expanded == 1)
3713 if (
cont->opt->expanded == 1)
3760 for (
i = 0;
i <
cont.ncolumns;
i++)
3768 for (r = 0; r <
cont.nrows; r++)
3770 for (
c = 0;
c <
cont.ncolumns;
c++)
3802 for (footer = opt->
footers; *footer; footer++)
3897 popt->
name =
"unicode";
static void cleanup(void)
#define unconstify(underlying_type, expr)
#define ngettext(s, p, n)
#define Assert(condition)
#define fprintf(file, fmt, msg)
Oid PQftype(const PGresult *res, int field_num)
int PQmblen(const char *s, int encoding)
int PQdsplen(const char *s, int encoding)
void * pg_malloc(size_t size)
char * pg_strdup(const char *in)
void * pg_malloc0(size_t size)
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
static void asciidoc_escaped_print(const char *in, FILE *fout)
static void csv_print_field(const char *str, FILE *fout, char sep)
void printTableCleanup(printTableContent *const content)
void restore_sigpipe_trap(void)
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
static char default_footer[100]
static void print_aligned_vertical_line(const printTableOpt *topt, unsigned long record, unsigned int hwidth, unsigned int dwidth, int output_columns, printTextRule pos, FILE *fout)
void printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, bool is_pager, FILE *flog)
static printTableFooter default_footer_cell
static void print_unaligned_vertical(const printTableContent *cont, FILE *fout)
static int additional_numeric_locale_len(const char *my_str)
const printTextFormat * get_line_style(const printTableOpt *opt)
static printTableFooter * footers_with_default(const printTableContent *cont)
#define LONGTABLE_WHITESPACE
FILE * PageOutput(int lines, const printTableOpt *topt)
void refresh_utf8format(const printTableOpt *opt)
static void print_latex_text(const printTableContent *cont, FILE *fout)
char column_type_alignment(Oid ftype)
static void IsPagerNeeded(const printTableContent *cont, const unsigned int *width_wrap, bool vertical, FILE **fout, bool *is_pager)
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
static void print_separator(struct separator sep, FILE *fout)
const printTextFormat pg_asciiformat
void printTableSetFooter(printTableContent *const content, const char *footer)
static void latex_escaped_print(const char *in, FILE *fout)
static char * thousands_sep
static void print_html_text(const printTableContent *cont, FILE *fout)
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
void ClosePager(FILE *pagerpipe)
static void print_csv_text(const printTableContent *cont, FILE *fout)
static void print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
static void print_csv_vertical(const printTableContent *cont, FILE *fout)
const printTextFormat pg_asciiformat_old
static FILE * PageOutputInternal(int lines, const printTableOpt *topt, const printTableContent *cont, const unsigned int *width_wrap, bool vertical)
static bool always_ignore_sigpipe
static void print_html_vertical(const printTableContent *cont, FILE *fout)
void disable_sigpipe_trap(void)
static void csv_escaped_print(const char *str, FILE *fout)
static char * format_numeric_locale(const char *my_str)
static char * decimal_point
static int strlen_max_width(unsigned char *str, int *target_width, int encoding)
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
static int integer_digits(const char *my_str)
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
static void print_unaligned_text(const printTableContent *cont, FILE *fout)
static void print_latex_vertical(const printTableContent *cont, FILE *fout)
void html_escaped_print(const char *in, FILE *fout)
void printTableAddFooter(printTableContent *const content, const char *footer)
static void troff_ms_escaped_print(const char *in, FILE *fout)
void set_sigpipe_trap_state(bool ignore)
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
static const unicodeStyleFormat unicode_style
printTextFormat pg_utf8format
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
static void print_aligned_vertical(const printTableContent *cont, FILE *fout, bool is_pager)
static void _print_horizontal_line(const unsigned int ncolumns, const unsigned int *widths, unsigned short border, printTextRule pos, const printTextFormat *format, FILE *fout)
volatile sig_atomic_t cancel_pressed
void setDecimalLocale(void)
@ PRINT_XHEADER_EXACT_WIDTH
@ PRINT_LINE_WRAP_NEWLINE
void pg_wcssize(const unsigned char *pwcs, size_t len, int encoding, int *result_width, int *result_height, int *result_format_size)
void pg_wcsformat(const unsigned char *pwcs, size_t len, int encoding, struct lineptr *lines, int count)
unsigned char * mbvalidate(unsigned char *pwcs, int encoding)
Datum translate(PG_FUNCTION_ARGS)
const bool * translate_columns
const printTableOpt * opt
printTableFooter * footers
printTableFooter * footer
unicode_linestyle unicode_border_linestyle
int expanded_header_exact_width
printXheaderWidthType expanded_header_width_type
const printTextFormat * line_style
unsigned short int border
unicode_linestyle unicode_header_linestyle
unicode_linestyle unicode_column_linestyle
const char * midvrule_blank
const char * header_nl_left
printTextLineFormat lrule[4]
const char * midvrule_wrap
const char * header_nl_right