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 3178 of file print.c.

3179{
3180 if (pagerpipe && pagerpipe != stdout)
3181 {
3182 /*
3183 * If printing was canceled midstream, warn about it.
3184 *
3185 * Some pagers like less use Ctrl-C as part of their command set. Even
3186 * so, we abort our processing and warn the user what we did. If the
3187 * pager quit as a result of the SIGINT, this message won't go
3188 * anywhere ...
3189 */
3190 if (cancel_pressed)
3191 fprintf(pagerpipe, _("Interrupted\n"));
3192
3195 }
3196}
#define fprintf(file, fmt, msg)
Definition cubescan.l:21
#define _(x)
Definition elog.c:96
void restore_sigpipe_trap(void)
Definition print.c:3065
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 3829 of file print.c.

3830{
3831 char align;
3832
3833 switch (ftype)
3834 {
3835 case INT2OID:
3836 case INT4OID:
3837 case INT8OID:
3838 case FLOAT4OID:
3839 case FLOAT8OID:
3840 case NUMERICOID:
3841 case OIDOID:
3842 case OID8OID:
3843 case XIDOID:
3844 case XID8OID:
3845 case CIDOID:
3846 case MONEYOID:
3847 align = 'r';
3848 break;
3849 default:
3850 align = 'l';
3851 break;
3852 }
3853 return align;
3854}

References fb().

Referenced by printCrosstab(), and printQuery().

◆ disable_sigpipe_trap()

void disable_sigpipe_trap ( void  )
extern

Definition at line 3042 of file print.c.

3043{
3044#ifndef WIN32
3046#endif
3047}
#define pqsignal
Definition port.h:548
#define PG_SIG_IGN
Definition port.h:552
#define SIGPIPE
Definition win32_port.h:163

References PG_SIG_IGN, 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 3893 of file print.c.

3894{
3895 /*
3896 * Note: this function mainly exists to preserve the convention that a
3897 * printTableOpt struct can be initialized to zeroes to get default
3898 * behavior.
3899 */
3900 if (opt->line_style != NULL)
3901 return opt->line_style;
3902 else
3903 return &pg_asciiformat;
3904}
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 1955 of file print.c.

1956{
1957 const char *p;
1958 bool leading_space = true;
1959
1960 for (p = in; *p; p++)
1961 {
1962 switch (*p)
1963 {
1964 case '&':
1965 fputs("&amp;", fout);
1966 break;
1967 case '<':
1968 fputs("&lt;", fout);
1969 break;
1970 case '>':
1971 fputs("&gt;", fout);
1972 break;
1973 case '\n':
1974 fputs("<br />\n", fout);
1975 break;
1976 case '"':
1977 fputs("&quot;", fout);
1978 break;
1979 case ' ':
1980 /* protect leading space, for EXPLAIN output */
1981 if (leading_space)
1982 fputs("&nbsp;", fout);
1983 else
1984 fputs(" ", fout);
1985 break;
1986 default:
1987 fputc(*p, fout);
1988 }
1989 if (*p != ' ')
1990 leading_space = false;
1991 }
1992}

References fb().

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

◆ PageOutput()

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

Definition at line 3096 of file print.c.

3097{
3098 return PageOutputInternal(lines, topt, NULL, NULL, false);
3099}
static FILE * PageOutputInternal(int lines, const printTableOpt *topt, const printTableContent *cont, const unsigned int *width_wrap, bool vertical)
Definition print.c:3108

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 3760 of file print.c.

3762{
3764 int i,
3765 r,
3766 c;
3767
3768 if (cancel_pressed)
3769 return;
3770
3771 printTableInit(&cont, &opt->topt, opt->title,
3773
3774 /* Assert caller supplied enough translate_columns[] entries */
3775 Assert(opt->translate_columns == NULL ||
3776 opt->n_translate_columns >= cont.ncolumns);
3777
3778 for (i = 0; i < cont.ncolumns; i++)
3779 {
3781 opt->translate_header,
3783 }
3784
3785 /* set cells */
3786 for (r = 0; r < cont.nrows; r++)
3787 {
3788 for (c = 0; c < cont.ncolumns; c++)
3789 {
3790 char *cell;
3791 bool mustfree = false;
3792 bool translate;
3793
3794 if (PQgetisnull(result, r, c))
3795 cell = opt->nullPrint ? opt->nullPrint : "";
3796 else if (PQftype(result, c) == BOOLOID)
3797 cell = (PQgetvalue(result, r, c)[0] == 't' ?
3798 (opt->truePrint ? opt->truePrint : "t") :
3799 (opt->falsePrint ? opt->falsePrint : "f"));
3800 else
3801 {
3802 cell = PQgetvalue(result, r, c);
3803 if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
3804 {
3805 cell = format_numeric_locale(cell);
3806 mustfree = true;
3807 }
3808 }
3809
3812 }
3813 }
3814
3815 /* set footers */
3816 if (opt->footers)
3817 {
3818 char **footer;
3819
3820 for (footer = opt->footers; *footer; footer++)
3821 printTableAddFooter(&cont, *footer);
3822 }
3823
3826}
#define Assert(condition)
Definition c.h:1002
uint32 result
Oid PQftype(const PGresult *res, int field_num)
Definition fe-exec.c:3750
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
Definition print.c:3209
void printTableCleanup(printTableContent *const content)
Definition print.c:3390
char column_type_alignment(Oid ftype)
Definition print.c:3829
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition print.c:3297
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:3654
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition print.c:3347
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition print.c:3257
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(), result, 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 3654 of file print.c.

3656{
3657 bool is_local_pager = false;
3658
3659 if (cancel_pressed)
3660 return;
3661
3662 if (cont->opt->format == PRINT_NOTHING)
3663 return;
3664
3665 /* print_aligned_*() handle the pager themselves */
3666 if (!is_pager &&
3667 cont->opt->format != PRINT_ALIGNED &&
3668 cont->opt->format != PRINT_WRAPPED)
3669 {
3670 IsPagerNeeded(cont, NULL, (cont->opt->expanded == 1), &fout, &is_pager);
3672 }
3673
3674 /* clear any pre-existing error indication on the output stream */
3675 clearerr(fout);
3676
3677 /* print the stuff */
3678 switch (cont->opt->format)
3679 {
3680 case PRINT_UNALIGNED:
3681 if (cont->opt->expanded == 1)
3683 else
3685 break;
3686 case PRINT_ALIGNED:
3687 case PRINT_WRAPPED:
3688
3689 /*
3690 * In expanded-auto mode, force vertical if a pager is passed in;
3691 * else we may make different decisions for different hunks of the
3692 * query result.
3693 */
3694 if (cont->opt->expanded == 1 ||
3695 (cont->opt->expanded == 2 && is_pager))
3697 else
3699 break;
3700 case PRINT_CSV:
3701 if (cont->opt->expanded == 1)
3703 else
3705 break;
3706 case PRINT_HTML:
3707 if (cont->opt->expanded == 1)
3709 else
3711 break;
3712 case PRINT_ASCIIDOC:
3713 if (cont->opt->expanded == 1)
3715 else
3717 break;
3718 case PRINT_LATEX:
3719 if (cont->opt->expanded == 1)
3721 else
3723 break;
3725 if (cont->opt->expanded == 1)
3727 else
3729 break;
3730 case PRINT_TROFF_MS:
3731 if (cont->opt->expanded == 1)
3733 else
3735 break;
3736 default:
3737 fprintf(stderr, _("invalid output format (internal error): %d"),
3738 cont->opt->format);
3740 }
3741
3742 if (is_local_pager)
3744
3745 /* also produce log output if wanted */
3746 if (flog)
3747 print_aligned_text(cont, flog, false);
3748}
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
Definition print.c:2189
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:2457
static void IsPagerNeeded(const printTableContent *cont, const unsigned int *width_wrap, bool vertical, FILE **fout, bool *is_pager)
Definition print.c:3448
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
Definition print.c:2830
static void print_html_text(const printTableContent *cont, FILE *fout)
Definition print.c:1996
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2922
void ClosePager(FILE *pagerpipe)
Definition print.c:3178
static void print_csv_text(const printTableContent *cont, FILE *fout)
Definition print.c:1883
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:1923
static void print_html_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2085
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2299
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:2720
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
Definition print.c:2564
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 3297 of file print.c.

3299{
3301
3302#ifndef ENABLE_NLS
3303 (void) translate; /* unused parameter */
3304#endif
3305
3306 total_cells = (uint64) content->ncolumns * content->nrows;
3307 if (content->cellsadded >= total_cells)
3308 {
3309 fprintf(stderr, _("Cannot add cell to table content: total cell count of %" PRIu64 " exceeded.\n"),
3310 total_cells);
3312 }
3313
3314 *content->cell = (char *) mbvalidate((unsigned char *) cell,
3315 content->opt->encoding);
3316
3317#ifdef ENABLE_NLS
3318 if (translate)
3319 *content->cell = _(*content->cell);
3320#endif
3321
3322 if (mustfree)
3323 {
3324 if (content->cellmustfree == NULL)
3325 content->cellmustfree =
3326 pg_malloc0_array(bool, (total_cells + 1));
3327
3328 content->cellmustfree[content->cellsadded] = true;
3329 }
3330 content->cell++;
3331 content->cellsadded++;
3332}
uint64_t uint64
Definition c.h:684
#define pg_malloc0_array(type, count)
Definition fe_memutils.h:67
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_array, 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 3347 of file print.c.

3348{
3350
3352 f->data = pg_strdup(footer);
3353
3354 if (content->footers == NULL)
3355 content->footers = f;
3356 else
3357 content->footer->next = f;
3358
3359 content->footer = f;
3360}
char * pg_strdup(const char *in)
Definition fe_memutils.c:91
#define pg_malloc0_object(type)
Definition fe_memutils.h:61
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_object, 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 3257 of file print.c.

3259{
3260#ifndef ENABLE_NLS
3261 (void) translate; /* unused parameter */
3262#endif
3263
3264 if (content->header >= content->headers + content->ncolumns)
3265 {
3266 fprintf(stderr, _("Cannot add header to table content: "
3267 "column count of %d exceeded.\n"),
3268 content->ncolumns);
3270 }
3271
3272 *content->header = (char *) mbvalidate((unsigned char *) header,
3273 content->opt->encoding);
3274#ifdef ENABLE_NLS
3275 if (translate)
3276 *content->header = _(*content->header);
3277#endif
3278 content->header++;
3279
3280 *content->align = align;
3281 content->align++;
3282}
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 3390 of file print.c.

3391{
3392 if (content->cellmustfree)
3393 {
3395
3396 total_cells = (uint64) content->ncolumns * content->nrows;
3397 for (uint64 i = 0; i < total_cells; i++)
3398 {
3399 if (content->cellmustfree[i])
3400 free(unconstify(char *, content->cells[i]));
3401 }
3402 free(content->cellmustfree);
3403 content->cellmustfree = NULL;
3404 }
3405 free(content->headers);
3406 free(content->cells);
3407 free(content->aligns);
3408
3409 content->opt = NULL;
3410 content->title = NULL;
3411 content->headers = NULL;
3412 content->cells = NULL;
3413 content->aligns = NULL;
3414 content->header = NULL;
3415 content->cell = NULL;
3416 content->align = NULL;
3417
3418 if (content->footers)
3419 {
3420 for (content->footer = content->footers; content->footer;)
3421 {
3423
3424 f = content->footer;
3425 content->footer = f->next;
3426 free(f->data);
3427 free(f);
3428 }
3429 }
3430 content->footers = NULL;
3431 content->footer = NULL;
3432}
#define unconstify(underlying_type, expr)
Definition c.h:1370
#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 3209 of file print.c.

3211{
3213
3214 content->opt = opt;
3215 content->title = title;
3216 content->ncolumns = ncolumns;
3217 content->nrows = nrows;
3218
3219 content->headers = pg_malloc0_array(const char *, (ncolumns + 1));
3220
3221 total_cells = (uint64) ncolumns * nrows;
3222 /* Catch possible overflow. Using >= here allows adding 1 below */
3223 if (total_cells >= SIZE_MAX / sizeof(*content->cells))
3224 {
3225 fprintf(stderr, _("Cannot print table contents: number of cells %" PRIu64 " is equal to or exceeds maximum %zu.\n"),
3227 SIZE_MAX / sizeof(*content->cells));
3229 }
3230 content->cells = pg_malloc0_array(const char *, (total_cells + 1));
3231
3232 content->cellmustfree = NULL;
3233 content->footers = NULL;
3234
3235 content->aligns = pg_malloc0_array(char, (ncolumns + 1));
3236
3237 content->header = content->headers;
3238 content->cell = content->cells;
3239 content->footer = content->footers;
3240 content->align = content->aligns;
3241 content->cellsadded = 0;
3242}

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_array, 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 3372 of file print.c.

3373{
3374 if (content->footers != NULL)
3375 {
3376 free(content->footer->data);
3377 content->footer->data = pg_strdup(footer);
3378 }
3379 else
3380 printTableAddFooter(content, footer);
3381}

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 3907 of file print.c.

3908{
3910
3911 const unicodeStyleBorderFormat *border;
3912 const unicodeStyleRowFormat *header;
3914
3915 popt->name = "unicode";
3916
3920
3921 popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
3923 popt->lrule[PRINT_RULE_TOP].midvrule = column->down_and_horizontal[opt->unicode_border_linestyle];
3925
3926 popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
3928 popt->lrule[PRINT_RULE_MIDDLE].midvrule = column->vertical_and_horizontal[opt->unicode_header_linestyle];
3930
3931 popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
3933 popt->lrule[PRINT_RULE_BOTTOM].midvrule = column->up_and_horizontal[opt->unicode_border_linestyle];
3935
3936 /* N/A */
3937 popt->lrule[PRINT_RULE_DATA].hrule = "";
3938 popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
3939 popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
3940 popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
3941
3942 popt->midvrule_nl = column->vertical;
3943 popt->midvrule_wrap = column->vertical;
3944 popt->midvrule_blank = column->vertical;
3945
3946 /* Same for all unicode today */
3954}
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 3065 of file print.c.

3066{
3067#ifndef WIN32
3069#endif
3070}
static bool always_ignore_sigpipe
Definition print.c:50
#define PG_SIG_DFL
Definition port.h:551

References always_ignore_sigpipe, PG_SIG_DFL, PG_SIG_IGN, 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 3078 of file print.c.

3079{
3080 always_ignore_sigpipe = ignore;
3081}

References always_ignore_sigpipe.

Referenced by setQFout().

◆ setDecimalLocale()

void setDecimalLocale ( void  )
extern

Definition at line 3857 of file print.c.

3858{
3859 struct lconv *extlconv;
3860
3861 extlconv = localeconv();
3862
3863 /* Don't accept an empty decimal_point string */
3864 if (*extlconv->decimal_point)
3865 decimal_point = pg_strdup(extlconv->decimal_point);
3866 else
3867 decimal_point = "."; /* SQL output standard */
3868
3869 /*
3870 * Although the Open Group standard allows locales to supply more than one
3871 * group width, we consider only the first one, and we ignore any attempt
3872 * to suppress grouping by specifying CHAR_MAX. As in the backend's
3873 * cash.c, we must apply a range check to avoid being fooled by variant
3874 * CHAR_MAX values.
3875 */
3876 groupdigits = *extlconv->grouping;
3878 groupdigits = 3; /* most common */
3879
3880 /* Don't accept an empty thousands_sep string, either */
3881 /* similar code exists in formatting.c */
3882 if (*extlconv->thousands_sep)
3883 thousands_sep = pg_strdup(extlconv->thousands_sep);
3884 /* Make sure thousands separator doesn't match decimal point symbol. */
3885 else if (strcmp(decimal_point, ",") != 0)
3886 thousands_sep = ",";
3887 else
3888 thousands_sep = ".";
3889}
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().