PostgreSQL Source Code git master
Loading...
Searching...
No Matches
print.h File Reference
#include <signal.h>
#include "libpq-fe.h"
Include dependency graph for print.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  printTextLineFormat
 
struct  printTextFormat
 
struct  separator
 
struct  printTableOpt
 
struct  printTableFooter
 
struct  printTableContent
 
struct  printQueryOpt
 

Macros

#define DEFAULT_PAGER   "more"
 

Typedefs

typedef struct printTextLineFormat printTextLineFormat
 
typedef enum printTextRule printTextRule
 
typedef enum printTextLineWrap printTextLineWrap
 
typedef enum printXheaderWidthType printXheaderWidthType
 
typedef struct printTextFormat printTextFormat
 
typedef enum unicode_linestyle unicode_linestyle
 
typedef struct printTableOpt printTableOpt
 
typedef struct printTableFooter printTableFooter
 
typedef struct printTableContent printTableContent
 
typedef struct printQueryOpt printQueryOpt
 

Enumerations

enum  printFormat {
  PRINT_NOTHING = 0 , PRINT_ALIGNED , PRINT_ASCIIDOC , PRINT_CSV ,
  PRINT_HTML , PRINT_LATEX , PRINT_LATEX_LONGTABLE , PRINT_TROFF_MS ,
  PRINT_UNALIGNED , PRINT_WRAPPED
}
 
enum  printTextRule { PRINT_RULE_TOP , PRINT_RULE_MIDDLE , PRINT_RULE_BOTTOM , PRINT_RULE_DATA }
 
enum  printTextLineWrap { PRINT_LINE_WRAP_NONE , PRINT_LINE_WRAP_WRAP , PRINT_LINE_WRAP_NEWLINE }
 
enum  printXheaderWidthType { PRINT_XHEADER_FULL , PRINT_XHEADER_COLUMN , PRINT_XHEADER_PAGE , PRINT_XHEADER_EXACT_WIDTH }
 
enum  unicode_linestyle { UNICODE_LINESTYLE_SINGLE = 0 , UNICODE_LINESTYLE_DOUBLE }
 

Functions

void disable_sigpipe_trap (void)
 
void restore_sigpipe_trap (void)
 
void set_sigpipe_trap_state (bool ignore)
 
FILEPageOutput (int lines, const printTableOpt *topt)
 
void ClosePager (FILE *pagerpipe)
 
void html_escaped_print (const char *in, FILE *fout)
 
void printTableInit (printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
 
void printTableAddHeader (printTableContent *const content, char *header, const bool translate, const char align)
 
void printTableAddCell (printTableContent *const content, char *cell, const bool translate, const bool mustfree)
 
void printTableAddFooter (printTableContent *const content, const char *footer)
 
void printTableSetFooter (printTableContent *const content, const char *footer)
 
void printTableCleanup (printTableContent *const content)
 
void printTable (const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
 
void printQuery (const PGresult *result, const printQueryOpt *opt, FILE *fout, bool is_pager, FILE *flog)
 
char column_type_alignment (Oid)
 
void setDecimalLocale (void)
 
const printTextFormatget_line_style (const printTableOpt *opt)
 
void refresh_utf8format (const printTableOpt *opt)
 

Variables

PGDLLIMPORT volatile sig_atomic_t cancel_pressed
 
PGDLLIMPORT const printTextFormat pg_asciiformat
 
PGDLLIMPORT const printTextFormat pg_asciiformat_old
 
PGDLLIMPORT printTextFormat pg_utf8format
 

Macro Definition Documentation

◆ DEFAULT_PAGER

#define DEFAULT_PAGER   "more"

Definition at line 23 of file print.h.

Typedef Documentation

◆ printQueryOpt

◆ printTableContent

◆ printTableFooter

◆ printTableOpt

◆ printTextFormat

◆ printTextLineFormat

◆ printTextLineWrap

◆ printTextRule

◆ printXheaderWidthType

◆ unicode_linestyle

Enumeration Type Documentation

◆ printFormat

Enumerator
PRINT_NOTHING 
PRINT_ALIGNED 
PRINT_ASCIIDOC 
PRINT_CSV 
PRINT_HTML 
PRINT_LATEX 
PRINT_LATEX_LONGTABLE 
PRINT_TROFF_MS 
PRINT_UNALIGNED 
PRINT_WRAPPED 

Definition at line 28 of file print.h.

29{
30 PRINT_NOTHING = 0, /* to make sure someone initializes this */
40 /* add your favourite output format here ... */
41};
@ PRINT_LATEX_LONGTABLE
Definition print.h:36
@ PRINT_CSV
Definition print.h:33
@ PRINT_UNALIGNED
Definition print.h:38
@ PRINT_ALIGNED
Definition print.h:31
@ PRINT_TROFF_MS
Definition print.h:37
@ PRINT_ASCIIDOC
Definition print.h:32
@ PRINT_NOTHING
Definition print.h:30
@ PRINT_LATEX
Definition print.h:35
@ PRINT_HTML
Definition print.h:34
@ PRINT_WRAPPED
Definition print.h:39

◆ printTextLineWrap

Enumerator
PRINT_LINE_WRAP_NONE 
PRINT_LINE_WRAP_WRAP 
PRINT_LINE_WRAP_NEWLINE 

Definition at line 61 of file print.h.

62{
63 /* Line wrapping conditions */
64 PRINT_LINE_WRAP_NONE, /* No wrapping */
65 PRINT_LINE_WRAP_WRAP, /* Wraparound due to overlength line */
66 PRINT_LINE_WRAP_NEWLINE, /* Newline in data */
printTextLineWrap
Definition print.h:62
@ PRINT_LINE_WRAP_WRAP
Definition print.h:65
@ PRINT_LINE_WRAP_NEWLINE
Definition print.h:66
@ PRINT_LINE_WRAP_NONE
Definition print.h:64

◆ printTextRule

Enumerator
PRINT_RULE_TOP 
PRINT_RULE_MIDDLE 
PRINT_RULE_BOTTOM 
PRINT_RULE_DATA 

Definition at line 52 of file print.h.

53{
54 /* Additional context for selecting line drawing characters */
55 PRINT_RULE_TOP, /* top horizontal line */
56 PRINT_RULE_MIDDLE, /* intra-data horizontal line */
57 PRINT_RULE_BOTTOM, /* bottom horizontal line */
58 PRINT_RULE_DATA, /* data line (hrule is unused here) */
printTextRule
Definition print.h:53
@ PRINT_RULE_MIDDLE
Definition print.h:56
@ PRINT_RULE_BOTTOM
Definition print.h:57
@ PRINT_RULE_DATA
Definition print.h:58
@ PRINT_RULE_TOP
Definition print.h:55

◆ printXheaderWidthType

Enumerator
PRINT_XHEADER_FULL 
PRINT_XHEADER_COLUMN 
PRINT_XHEADER_PAGE 
PRINT_XHEADER_EXACT_WIDTH 

Definition at line 69 of file print.h.

70{
71 /* Expanded header line width variants */
72 PRINT_XHEADER_FULL, /* do not truncate header line (this is the
73 * default) */
74 PRINT_XHEADER_COLUMN, /* only print header line above the first
75 * column */
76 PRINT_XHEADER_PAGE, /* header line must not be longer than
77 * terminal width */
78 PRINT_XHEADER_EXACT_WIDTH, /* explicitly specified width */
printXheaderWidthType
Definition print.h:70
@ PRINT_XHEADER_EXACT_WIDTH
Definition print.h:78
@ PRINT_XHEADER_PAGE
Definition print.h:76
@ PRINT_XHEADER_COLUMN
Definition print.h:74
@ PRINT_XHEADER_FULL
Definition print.h:72

◆ unicode_linestyle

Enumerator
UNICODE_LINESTYLE_SINGLE 
UNICODE_LINESTYLE_DOUBLE 

Definition at line 99 of file print.h.

100{
unicode_linestyle
Definition print.h:100
@ UNICODE_LINESTYLE_SINGLE
Definition print.h:101
@ UNICODE_LINESTYLE_DOUBLE
Definition print.h:102

Function Documentation

◆ ClosePager()

void ClosePager ( FILE pagerpipe)
extern

Definition at line 3160 of file print.c.

3161{
3162 if (pagerpipe && pagerpipe != stdout)
3163 {
3164 /*
3165 * If printing was canceled midstream, warn about it.
3166 *
3167 * Some pagers like less use Ctrl-C as part of their command set. Even
3168 * so, we abort our processing and warn the user what we did. If the
3169 * pager quit as a result of the SIGINT, this message won't go
3170 * anywhere ...
3171 */
3172 if (cancel_pressed)
3173 fprintf(pagerpipe, _("Interrupted\n"));
3174
3177 }
3178}
#define fprintf(file, fmt, msg)
Definition cubescan.l:21
#define _(x)
Definition elog.c:91
void restore_sigpipe_trap(void)
Definition print.c:3047
volatile sig_atomic_t cancel_pressed
Definition print.c:48
static int fb(int x)

References _, cancel_pressed, fb(), fprintf, and restore_sigpipe_trap().

Referenced by exec_command_sf_sv(), ExecQueryAndProcessResults(), helpSQL(), helpVariables(), print_aligned_text(), print_aligned_vertical(), printHistory(), printTable(), slashUsage(), and usage().

◆ column_type_alignment()

char column_type_alignment ( Oid  ftype)
extern

Definition at line 3811 of file print.c.

3812{
3813 char align;
3814
3815 switch (ftype)
3816 {
3817 case INT2OID:
3818 case INT4OID:
3819 case INT8OID:
3820 case FLOAT4OID:
3821 case FLOAT8OID:
3822 case NUMERICOID:
3823 case OIDOID:
3824 case OID8OID:
3825 case XIDOID:
3826 case XID8OID:
3827 case CIDOID:
3828 case MONEYOID:
3829 align = 'r';
3830 break;
3831 default:
3832 align = 'l';
3833 break;
3834 }
3835 return align;
3836}

References fb().

Referenced by printCrosstab(), and printQuery().

◆ disable_sigpipe_trap()

void disable_sigpipe_trap ( void  )
extern

Definition at line 3024 of file print.c.

3025{
3026#ifndef WIN32
3028#endif
3029}
#define pqsignal
Definition port.h:547
#define SIGPIPE
Definition win32_port.h:163

References fb(), pqsignal, and SIGPIPE.

Referenced by do_copy(), do_watch(), exec_command_write(), PageOutputInternal(), and SetupGOutput().

◆ get_line_style()

const printTextFormat * get_line_style ( const printTableOpt opt)
extern

Definition at line 3875 of file print.c.

3876{
3877 /*
3878 * Note: this function mainly exists to preserve the convention that a
3879 * printTableOpt struct can be initialized to zeroes to get default
3880 * behavior.
3881 */
3882 if (opt->line_style != NULL)
3883 return opt->line_style;
3884 else
3885 return &pg_asciiformat;
3886}
const printTextFormat pg_asciiformat
Definition print.c:61
const printTextFormat * line_style
Definition print.h:131

References fb(), printTableOpt::line_style, and pg_asciiformat.

Referenced by print_aligned_text(), print_aligned_vertical(), print_aligned_vertical_line(), printPsetInfo(), and pset_value_string().

◆ html_escaped_print()

void html_escaped_print ( const char in,
FILE fout 
)
extern

Definition at line 1937 of file print.c.

1938{
1939 const char *p;
1940 bool leading_space = true;
1941
1942 for (p = in; *p; p++)
1943 {
1944 switch (*p)
1945 {
1946 case '&':
1947 fputs("&amp;", fout);
1948 break;
1949 case '<':
1950 fputs("&lt;", fout);
1951 break;
1952 case '>':
1953 fputs("&gt;", fout);
1954 break;
1955 case '\n':
1956 fputs("<br />\n", fout);
1957 break;
1958 case '"':
1959 fputs("&quot;", fout);
1960 break;
1961 case ' ':
1962 /* protect leading space, for EXPLAIN output */
1963 if (leading_space)
1964 fputs("&nbsp;", fout);
1965 else
1966 fputs(" ", fout);
1967 break;
1968 default:
1969 fputc(*p, fout);
1970 }
1971 if (*p != ' ')
1972 leading_space = false;
1973 }
1974}

References fb().

Referenced by print_html_text(), print_html_vertical(), and PrintQueryStatus().

◆ PageOutput()

FILE * PageOutput ( int  lines,
const printTableOpt topt 
)
extern

Definition at line 3078 of file print.c.

3079{
3080 return PageOutputInternal(lines, topt, NULL, NULL, false);
3081}
static FILE * PageOutputInternal(int lines, const printTableOpt *topt, const printTableContent *cont, const unsigned int *width_wrap, bool vertical)
Definition print.c:3090

References fb(), and PageOutputInternal().

Referenced by exec_command_sf_sv(), ExecQueryAndProcessResults(), helpSQL(), helpVariables(), print_aligned_text(), printHistory(), slashUsage(), and usage().

◆ printQuery()

void printQuery ( const PGresult result,
const printQueryOpt opt,
FILE fout,
bool  is_pager,
FILE flog 
)
extern

Definition at line 3742 of file print.c.

3744{
3746 int i,
3747 r,
3748 c;
3749
3750 if (cancel_pressed)
3751 return;
3752
3753 printTableInit(&cont, &opt->topt, opt->title,
3754 PQnfields(result), PQntuples(result));
3755
3756 /* Assert caller supplied enough translate_columns[] entries */
3757 Assert(opt->translate_columns == NULL ||
3758 opt->n_translate_columns >= cont.ncolumns);
3759
3760 for (i = 0; i < cont.ncolumns; i++)
3761 {
3762 printTableAddHeader(&cont, PQfname(result, i),
3763 opt->translate_header,
3764 column_type_alignment(PQftype(result, i)));
3765 }
3766
3767 /* set cells */
3768 for (r = 0; r < cont.nrows; r++)
3769 {
3770 for (c = 0; c < cont.ncolumns; c++)
3771 {
3772 char *cell;
3773 bool mustfree = false;
3774 bool translate;
3775
3776 if (PQgetisnull(result, r, c))
3777 cell = opt->nullPrint ? opt->nullPrint : "";
3778 else if (PQftype(result, c) == BOOLOID)
3779 cell = (PQgetvalue(result, r, c)[0] == 't' ?
3780 (opt->truePrint ? opt->truePrint : "t") :
3781 (opt->falsePrint ? opt->falsePrint : "f"));
3782 else
3783 {
3784 cell = PQgetvalue(result, r, c);
3785 if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
3786 {
3787 cell = format_numeric_locale(cell);
3788 mustfree = true;
3789 }
3790 }
3791
3794 }
3795 }
3796
3797 /* set footers */
3798 if (opt->footers)
3799 {
3800 char **footer;
3801
3802 for (footer = opt->footers; *footer; footer++)
3803 printTableAddFooter(&cont, *footer);
3804 }
3805
3808}
#define Assert(condition)
Definition c.h:873
Oid PQftype(const PGresult *res, int field_num)
Definition fe-exec.c:3736
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
Definition print.c:3191
void printTableCleanup(printTableContent *const content)
Definition print.c:3372
char column_type_alignment(Oid ftype)
Definition print.c:3811
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition print.c:3279
static char * format_numeric_locale(const char *my_str)
Definition print.c:330
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
Definition print.c:3636
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition print.c:3329
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition print.c:3239
int i
Definition isn.c:77
#define PQgetvalue
#define PQnfields
#define PQgetisnull
#define PQfname
#define PQntuples
Datum translate(PG_FUNCTION_ARGS)
char * c
const bool * translate_columns
Definition print.h:192
printTableOpt topt
Definition print.h:185
char * nullPrint
Definition print.h:186
char * title
Definition print.h:189
char ** footers
Definition print.h:190
bool translate_header
Definition print.h:191
int n_translate_columns
Definition print.h:194
char * truePrint
Definition print.h:187
bool numericLocale
Definition print.h:135

References Assert, cancel_pressed, column_type_alignment(), printQueryOpt::falsePrint, fb(), printQueryOpt::footers, format_numeric_locale(), i, printQueryOpt::n_translate_columns, printQueryOpt::nullPrint, printTableOpt::numericLocale, PQfname, PQftype(), PQgetisnull, PQgetvalue, PQnfields, PQntuples, printTable(), printTableAddCell(), printTableAddFooter(), printTableAddHeader(), printTableCleanup(), printTableInit(), printQueryOpt::title, printQueryOpt::topt, translate(), printQueryOpt::translate_columns, printQueryOpt::translate_header, and printQueryOpt::truePrint.

Referenced by describeAccessMethods(), describeAggregates(), describeConfigurationParameters(), describeFunctions(), describeOneTableDetails(), describeOneTSConfig(), describeOneTSParser(), describeOperators(), describeRoleGrants(), describeSubscriptions(), describeTablespaces(), describeTypes(), ExecQueryAndProcessResults(), listAllDbs(), listCasts(), listCollations(), listConversions(), listDbRoleSettings(), listDefaultACLs(), listDomains(), listEventTriggers(), listExtendedStats(), listExtensions(), listForeignDataWrappers(), listForeignServers(), listForeignTables(), listLanguages(), listLargeObjects(), listOneExtensionContents(), listOperatorClasses(), listOperatorFamilies(), listOpFamilyFunctions(), listOpFamilyOperators(), listPartitionedTables(), listPublications(), listSchemas(), listTables(), listTSConfigs(), listTSDictionaries(), listTSParsers(), listTSTemplates(), listUserMappings(), objectDescription(), permissionsList(), and PrintQueryTuples().

◆ printTable()

void printTable ( const printTableContent cont,
FILE fout,
bool  is_pager,
FILE flog 
)
extern

Definition at line 3636 of file print.c.

3638{
3639 bool is_local_pager = false;
3640
3641 if (cancel_pressed)
3642 return;
3643
3644 if (cont->opt->format == PRINT_NOTHING)
3645 return;
3646
3647 /* print_aligned_*() handle the pager themselves */
3648 if (!is_pager &&
3649 cont->opt->format != PRINT_ALIGNED &&
3650 cont->opt->format != PRINT_WRAPPED)
3651 {
3652 IsPagerNeeded(cont, NULL, (cont->opt->expanded == 1), &fout, &is_pager);
3654 }
3655
3656 /* clear any pre-existing error indication on the output stream */
3657 clearerr(fout);
3658
3659 /* print the stuff */
3660 switch (cont->opt->format)
3661 {
3662 case PRINT_UNALIGNED:
3663 if (cont->opt->expanded == 1)
3665 else
3667 break;
3668 case PRINT_ALIGNED:
3669 case PRINT_WRAPPED:
3670
3671 /*
3672 * In expanded-auto mode, force vertical if a pager is passed in;
3673 * else we may make different decisions for different hunks of the
3674 * query result.
3675 */
3676 if (cont->opt->expanded == 1 ||
3677 (cont->opt->expanded == 2 && is_pager))
3679 else
3681 break;
3682 case PRINT_CSV:
3683 if (cont->opt->expanded == 1)
3685 else
3687 break;
3688 case PRINT_HTML:
3689 if (cont->opt->expanded == 1)
3691 else
3693 break;
3694 case PRINT_ASCIIDOC:
3695 if (cont->opt->expanded == 1)
3697 else
3699 break;
3700 case PRINT_LATEX:
3701 if (cont->opt->expanded == 1)
3703 else
3705 break;
3707 if (cont->opt->expanded == 1)
3709 else
3711 break;
3712 case PRINT_TROFF_MS:
3713 if (cont->opt->expanded == 1)
3715 else
3717 break;
3718 default:
3719 fprintf(stderr, _("invalid output format (internal error): %d"),
3720 cont->opt->format);
3722 }
3723
3724 if (is_local_pager)
3726
3727 /* also produce log output if wanted */
3728 if (flog)
3729 print_aligned_text(cont, flog, false);
3730}
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
Definition print.c:2171
static void print_unaligned_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:529
static void print_latex_text(const printTableContent *cont, FILE *fout)
Definition print.c:2439
static void IsPagerNeeded(const printTableContent *cont, const unsigned int *width_wrap, bool vertical, FILE **fout, bool *is_pager)
Definition print.c:3430
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
Definition print.c:2812
static void print_html_text(const printTableContent *cont, FILE *fout)
Definition print.c:1978
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2904
void ClosePager(FILE *pagerpipe)
Definition print.c:3160
static void print_csv_text(const printTableContent *cont, FILE *fout)
Definition print.c:1865
static void print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
Definition print.c:651
static void print_csv_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:1905
static void print_html_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2067
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2281
static void print_unaligned_text(const printTableContent *cont, FILE *fout)
Definition print.c:438
static void print_latex_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2702
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
Definition print.c:2546
static void print_aligned_vertical(const printTableContent *cont, FILE *fout, bool is_pager)
Definition print.c:1304
#define EXIT_FAILURE
Definition settings.h:197

References _, cancel_pressed, ClosePager(), EXIT_FAILURE, fb(), fprintf, IsPagerNeeded(), PRINT_ALIGNED, print_aligned_text(), print_aligned_vertical(), PRINT_ASCIIDOC, print_asciidoc_text(), print_asciidoc_vertical(), PRINT_CSV, print_csv_text(), print_csv_vertical(), PRINT_HTML, print_html_text(), print_html_vertical(), PRINT_LATEX, PRINT_LATEX_LONGTABLE, print_latex_longtable_text(), print_latex_text(), print_latex_vertical(), PRINT_NOTHING, PRINT_TROFF_MS, print_troff_ms_text(), print_troff_ms_vertical(), PRINT_UNALIGNED, print_unaligned_text(), print_unaligned_vertical(), and PRINT_WRAPPED.

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableAddCell()

void printTableAddCell ( printTableContent *const  content,
char cell,
const bool  translate,
const bool  mustfree 
)
extern

Definition at line 3279 of file print.c.

3281{
3283
3284#ifndef ENABLE_NLS
3285 (void) translate; /* unused parameter */
3286#endif
3287
3288 total_cells = (uint64) content->ncolumns * content->nrows;
3289 if (content->cellsadded >= total_cells)
3290 {
3291 fprintf(stderr, _("Cannot add cell to table content: total cell count of %" PRIu64 " exceeded.\n"),
3292 total_cells);
3294 }
3295
3296 *content->cell = (char *) mbvalidate((unsigned char *) cell,
3297 content->opt->encoding);
3298
3299#ifdef ENABLE_NLS
3300 if (translate)
3301 *content->cell = _(*content->cell);
3302#endif
3303
3304 if (mustfree)
3305 {
3306 if (content->cellmustfree == NULL)
3307 content->cellmustfree =
3308 pg_malloc0((total_cells + 1) * sizeof(bool));
3309
3310 content->cellmustfree[content->cellsadded] = true;
3311 }
3312 content->cell++;
3313 content->cellsadded++;
3314}
uint64_t uint64
Definition c.h:547
void * pg_malloc0(size_t size)
Definition fe_memutils.c:53
unsigned char * mbvalidate(unsigned char *pwcs, int encoding)
Definition mbprint.c:392
const printTableOpt * opt
Definition print.h:165
uint64 cellsadded
Definition print.h:174
bool * cellmustfree
Definition print.h:175
const char ** cell
Definition print.h:173
int encoding
Definition print.h:138

References _, printTableContent::cell, printTableContent::cellmustfree, printTableContent::cellsadded, printTableOpt::encoding, EXIT_FAILURE, fb(), fprintf, mbvalidate(), printTableContent::ncolumns, printTableContent::nrows, printTableContent::opt, pg_malloc0(), and translate().

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), and printQuery().

◆ printTableAddFooter()

void printTableAddFooter ( printTableContent *const  content,
const char footer 
)
extern

Definition at line 3329 of file print.c.

3330{
3332
3333 f = pg_malloc0(sizeof(*f));
3334 f->data = pg_strdup(footer);
3335
3336 if (content->footers == NULL)
3337 content->footers = f;
3338 else
3339 content->footer->next = f;
3340
3341 content->footer = f;
3342}
char * pg_strdup(const char *in)
Definition fe_memutils.c:85
printTableFooter * footers
Definition print.h:176
printTableFooter * footer
Definition print.h:177
char * data
Definition print.h:155
struct printTableFooter * next
Definition print.h:156

References printTableFooter::data, fb(), printTableContent::footer, printTableContent::footers, printTableFooter::next, pg_malloc0(), and pg_strdup().

Referenced by add_tablespace_footer(), addFooterToPublicationDesc(), describeOneTableDetails(), printQuery(), and printTableSetFooter().

◆ printTableAddHeader()

void printTableAddHeader ( printTableContent *const  content,
char header,
const bool  translate,
const char  align 
)
extern

Definition at line 3239 of file print.c.

3241{
3242#ifndef ENABLE_NLS
3243 (void) translate; /* unused parameter */
3244#endif
3245
3246 if (content->header >= content->headers + content->ncolumns)
3247 {
3248 fprintf(stderr, _("Cannot add header to table content: "
3249 "column count of %d exceeded.\n"),
3250 content->ncolumns);
3252 }
3253
3254 *content->header = (char *) mbvalidate((unsigned char *) header,
3255 content->opt->encoding);
3256#ifdef ENABLE_NLS
3257 if (translate)
3258 *content->header = _(*content->header);
3259#endif
3260 content->header++;
3261
3262 *content->align = align;
3263 content->align++;
3264}
const char ** header
Definition print.h:170
const char ** headers
Definition print.h:169

References _, printTableContent::align, printTableOpt::encoding, EXIT_FAILURE, fb(), fprintf, printTableContent::header, printTableContent::headers, mbvalidate(), printTableContent::ncolumns, printTableContent::opt, and translate().

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableCleanup()

void printTableCleanup ( printTableContent *const  content)
extern

Definition at line 3372 of file print.c.

3373{
3374 if (content->cellmustfree)
3375 {
3377
3378 total_cells = (uint64) content->ncolumns * content->nrows;
3379 for (uint64 i = 0; i < total_cells; i++)
3380 {
3381 if (content->cellmustfree[i])
3382 free(unconstify(char *, content->cells[i]));
3383 }
3384 free(content->cellmustfree);
3385 content->cellmustfree = NULL;
3386 }
3387 free(content->headers);
3388 free(content->cells);
3389 free(content->aligns);
3390
3391 content->opt = NULL;
3392 content->title = NULL;
3393 content->headers = NULL;
3394 content->cells = NULL;
3395 content->aligns = NULL;
3396 content->header = NULL;
3397 content->cell = NULL;
3398 content->align = NULL;
3399
3400 if (content->footers)
3401 {
3402 for (content->footer = content->footers; content->footer;)
3403 {
3405
3406 f = content->footer;
3407 content->footer = f->next;
3408 free(f->data);
3409 free(f);
3410 }
3411 }
3412 content->footers = NULL;
3413 content->footer = NULL;
3414}
#define unconstify(underlying_type, expr)
Definition c.h:1240
#define free(a)
char * aligns
Definition print.h:178
const char * title
Definition print.h:166
const char ** cells
Definition print.h:171

References printTableContent::align, printTableContent::aligns, printTableContent::cell, printTableContent::cellmustfree, printTableContent::cells, printTableFooter::data, fb(), printTableContent::footer, printTableContent::footers, free, printTableContent::header, printTableContent::headers, i, printTableContent::ncolumns, printTableFooter::next, printTableContent::nrows, printTableContent::opt, printTableContent::title, and unconstify.

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableInit()

void printTableInit ( printTableContent *const  content,
const printTableOpt opt,
const char title,
const int  ncolumns,
const int  nrows 
)
extern

Definition at line 3191 of file print.c.

3193{
3195
3196 content->opt = opt;
3197 content->title = title;
3198 content->ncolumns = ncolumns;
3199 content->nrows = nrows;
3200
3201 content->headers = pg_malloc0((ncolumns + 1) * sizeof(*content->headers));
3202
3203 total_cells = (uint64) ncolumns * nrows;
3204 /* Catch possible overflow. Using >= here allows adding 1 below */
3205 if (total_cells >= SIZE_MAX / sizeof(*content->cells))
3206 {
3207 fprintf(stderr, _("Cannot print table contents: number of cells %" PRIu64 " is equal to or exceeds maximum %zu.\n"),
3209 SIZE_MAX / sizeof(*content->cells));
3211 }
3212 content->cells = pg_malloc0((total_cells + 1) * sizeof(*content->cells));
3213
3214 content->cellmustfree = NULL;
3215 content->footers = NULL;
3216
3217 content->aligns = pg_malloc0((ncolumns + 1) * sizeof(*content->align));
3218
3219 content->header = content->headers;
3220 content->cell = content->cells;
3221 content->footer = content->footers;
3222 content->align = content->aligns;
3223 content->cellsadded = 0;
3224}

References _, printTableContent::align, printTableContent::aligns, printTableContent::cell, printTableContent::cellmustfree, printTableContent::cells, printTableContent::cellsadded, EXIT_FAILURE, fb(), printTableContent::footer, printTableContent::footers, fprintf, printTableContent::header, printTableContent::headers, printTableContent::ncolumns, printTableContent::nrows, printTableContent::opt, pg_malloc0(), and printTableContent::title.

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableSetFooter()

void printTableSetFooter ( printTableContent *const  content,
const char footer 
)
extern

Definition at line 3354 of file print.c.

3355{
3356 if (content->footers != NULL)
3357 {
3358 free(content->footer->data);
3359 content->footer->data = pg_strdup(footer);
3360 }
3361 else
3362 printTableAddFooter(content, footer);
3363}

References printTableFooter::data, fb(), printTableContent::footer, printTableContent::footers, free, pg_strdup(), and printTableAddFooter().

Referenced by add_tablespace_footer().

◆ refresh_utf8format()

void refresh_utf8format ( const printTableOpt opt)
extern

Definition at line 3889 of file print.c.

3890{
3892
3893 const unicodeStyleBorderFormat *border;
3894 const unicodeStyleRowFormat *header;
3896
3897 popt->name = "unicode";
3898
3902
3903 popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
3905 popt->lrule[PRINT_RULE_TOP].midvrule = column->down_and_horizontal[opt->unicode_border_linestyle];
3907
3908 popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
3910 popt->lrule[PRINT_RULE_MIDDLE].midvrule = column->vertical_and_horizontal[opt->unicode_header_linestyle];
3912
3913 popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
3915 popt->lrule[PRINT_RULE_BOTTOM].midvrule = column->up_and_horizontal[opt->unicode_border_linestyle];
3917
3918 /* N/A */
3919 popt->lrule[PRINT_RULE_DATA].hrule = "";
3920 popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
3921 popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
3922 popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
3923
3924 popt->midvrule_nl = column->vertical;
3925 popt->midvrule_wrap = column->vertical;
3926 popt->midvrule_blank = column->vertical;
3927
3928 /* Same for all unicode today */
3936}
static const unicodeStyleFormat unicode_style
Definition print.c:145
printTextFormat pg_utf8format
Definition print.c:104
unicode_linestyle unicode_border_linestyle
Definition print.h:141
unicode_linestyle unicode_header_linestyle
Definition print.h:143
unicode_linestyle unicode_column_linestyle
Definition print.h:142
bool wrap_right_border
Definition print.h:95
const char * nl_right
Definition print.h:92
const char * wrap_left
Definition print.h:93
const char * midvrule_blank
Definition print.h:88
const char * header_nl_left
Definition print.h:89
const char * nl_left
Definition print.h:91
const char * midvrule_nl
Definition print.h:86
printTextLineFormat lrule[4]
Definition print.h:85
const char * wrap_right
Definition print.h:94
const char * midvrule_wrap
Definition print.h:87
const char * name
Definition print.h:84
const char * header_nl_right
Definition print.h:90
const char * hrule
Definition print.h:46
const char * rightvrule
Definition print.h:49
const char * midvrule
Definition print.h:48
const char * leftvrule
Definition print.h:47
const char * up_and_right
Definition print.c:123
const char * left_and_right
Definition print.c:128
const char * vertical
Definition print.c:124
const char * down_and_left
Definition print.c:127
const char * horizontal
Definition print.c:126
const char * down_and_right
Definition print.c:125
unicodeStyleRowFormat row_style[2]
Definition print.c:133
unicodeStyleColumnFormat column_style[2]
Definition print.c:134
const char * nl_right
Definition print.c:139
const char * wrap_right
Definition print.c:141
const char * header_nl_left
Definition print.c:136
const char * header_nl_right
Definition print.c:137
unicodeStyleBorderFormat border_style[2]
Definition print.c:135
const char * nl_left
Definition print.c:138
const char * wrap_left
Definition print.c:140
bool wrap_right_border
Definition print.c:142
const char * vertical_and_right[2]
Definition print.c:109
const char * vertical_and_left[2]
Definition print.c:110
const char * horizontal
Definition print.c:108

References unicodeStyleFormat::border_style, unicodeStyleFormat::column_style, unicodeStyleBorderFormat::down_and_left, unicodeStyleBorderFormat::down_and_right, fb(), unicodeStyleFormat::header_nl_left, printTextFormat::header_nl_left, unicodeStyleFormat::header_nl_right, printTextFormat::header_nl_right, unicodeStyleRowFormat::horizontal, unicodeStyleBorderFormat::horizontal, printTextLineFormat::hrule, unicodeStyleBorderFormat::left_and_right, printTextLineFormat::leftvrule, printTextFormat::lrule, printTextLineFormat::midvrule, printTextFormat::midvrule_blank, printTextFormat::midvrule_nl, printTextFormat::midvrule_wrap, printTextFormat::name, unicodeStyleFormat::nl_left, printTextFormat::nl_left, unicodeStyleFormat::nl_right, printTextFormat::nl_right, pg_utf8format, PRINT_RULE_BOTTOM, PRINT_RULE_DATA, PRINT_RULE_MIDDLE, PRINT_RULE_TOP, printTextLineFormat::rightvrule, unicodeStyleFormat::row_style, printTableOpt::unicode_border_linestyle, printTableOpt::unicode_column_linestyle, printTableOpt::unicode_header_linestyle, unicode_style, unicodeStyleBorderFormat::up_and_right, unicodeStyleBorderFormat::vertical, unicodeStyleRowFormat::vertical_and_left, unicodeStyleRowFormat::vertical_and_right, unicodeStyleFormat::wrap_left, printTextFormat::wrap_left, unicodeStyleFormat::wrap_right, printTextFormat::wrap_right, unicodeStyleFormat::wrap_right_border, and printTextFormat::wrap_right_border.

Referenced by do_pset(), and main().

◆ restore_sigpipe_trap()

void restore_sigpipe_trap ( void  )
extern

Definition at line 3047 of file print.c.

3048{
3049#ifndef WIN32
3051#endif
3052}
static bool always_ignore_sigpipe
Definition print.c:50

References always_ignore_sigpipe, fb(), pqsignal, and SIGPIPE.

Referenced by CloseGOutput(), ClosePager(), do_copy(), do_watch(), exec_command_write(), PageOutputInternal(), and setQFout().

◆ set_sigpipe_trap_state()

void set_sigpipe_trap_state ( bool  ignore)
extern

Definition at line 3060 of file print.c.

3061{
3062 always_ignore_sigpipe = ignore;
3063}

References always_ignore_sigpipe.

Referenced by setQFout().

◆ setDecimalLocale()

void setDecimalLocale ( void  )
extern

Definition at line 3839 of file print.c.

3840{
3841 struct lconv *extlconv;
3842
3843 extlconv = localeconv();
3844
3845 /* Don't accept an empty decimal_point string */
3846 if (*extlconv->decimal_point)
3847 decimal_point = pg_strdup(extlconv->decimal_point);
3848 else
3849 decimal_point = "."; /* SQL output standard */
3850
3851 /*
3852 * Although the Open Group standard allows locales to supply more than one
3853 * group width, we consider only the first one, and we ignore any attempt
3854 * to suppress grouping by specifying CHAR_MAX. As in the backend's
3855 * cash.c, we must apply a range check to avoid being fooled by variant
3856 * CHAR_MAX values.
3857 */
3858 groupdigits = *extlconv->grouping;
3860 groupdigits = 3; /* most common */
3861
3862 /* Don't accept an empty thousands_sep string, either */
3863 /* similar code exists in formatting.c */
3864 if (*extlconv->thousands_sep)
3865 thousands_sep = pg_strdup(extlconv->thousands_sep);
3866 /* Make sure thousands separator doesn't match decimal point symbol. */
3867 else if (strcmp(decimal_point, ",") != 0)
3868 thousands_sep = ",";
3869 else
3870 thousands_sep = ".";
3871}
static char * thousands_sep
Definition print.c:55
static char * decimal_point
Definition print.c:53
static int groupdigits
Definition print.c:54

References decimal_point, fb(), groupdigits, pg_strdup(), and thousands_sep.

Referenced by main().

Variable Documentation

◆ cancel_pressed

◆ pg_asciiformat

PGDLLIMPORT const printTextFormat pg_asciiformat
extern

Definition at line 61 of file print.c.

62{
63 "ascii",
64 {
65 {"-", "+", "+", "+"},
66 {"-", "+", "+", "+"},
67 {"-", "+", "+", "+"},
68 {"", "|", "|", "|"}
69 },
70 "|",
71 "|",
72 "|",
73 " ",
74 "+",
75 " ",
76 "+",
77 ".",
78 ".",
79 true
80};

Referenced by do_pset(), and get_line_style().

◆ pg_asciiformat_old

PGDLLIMPORT const printTextFormat pg_asciiformat_old
extern

Definition at line 82 of file print.c.

83{
84 "old-ascii",
85 {
86 {"-", "+", "+", "+"},
87 {"-", "+", "+", "+"},
88 {"-", "+", "+", "+"},
89 {"", "|", "|", "|"}
90 },
91 ":",
92 ";",
93 " ",
94 "+",
95 " ",
96 " ",
97 " ",
98 " ",
99 " ",
100 false
101};

Referenced by do_pset(), and print_aligned_vertical().

◆ pg_utf8format

PGDLLIMPORT printTextFormat pg_utf8format
extern

Definition at line 104 of file print.c.

Referenced by do_pset(), and refresh_utf8format().