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

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

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

References fb().

Referenced by printCrosstab(), and printQuery().

◆ disable_sigpipe_trap()

void disable_sigpipe_trap ( void  )
extern

Definition at line 3025 of file print.c.

3026{
3027#ifndef WIN32
3029#endif
3030}
#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 3876 of file print.c.

3877{
3878 /*
3879 * Note: this function mainly exists to preserve the convention that a
3880 * printTableOpt struct can be initialized to zeroes to get default
3881 * behavior.
3882 */
3883 if (opt->line_style != NULL)
3884 return opt->line_style;
3885 else
3886 return &pg_asciiformat;
3887}
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 1938 of file print.c.

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

References fb().

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

◆ PageOutput()

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

Definition at line 3079 of file print.c.

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

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

3745{
3747 int i,
3748 r,
3749 c;
3750
3751 if (cancel_pressed)
3752 return;
3753
3754 printTableInit(&cont, &opt->topt, opt->title,
3756
3757 /* Assert caller supplied enough translate_columns[] entries */
3758 Assert(opt->translate_columns == NULL ||
3759 opt->n_translate_columns >= cont.ncolumns);
3760
3761 for (i = 0; i < cont.ncolumns; i++)
3762 {
3764 opt->translate_header,
3766 }
3767
3768 /* set cells */
3769 for (r = 0; r < cont.nrows; r++)
3770 {
3771 for (c = 0; c < cont.ncolumns; c++)
3772 {
3773 char *cell;
3774 bool mustfree = false;
3775 bool translate;
3776
3777 if (PQgetisnull(result, r, c))
3778 cell = opt->nullPrint ? opt->nullPrint : "";
3779 else if (PQftype(result, c) == BOOLOID)
3780 cell = (PQgetvalue(result, r, c)[0] == 't' ?
3781 (opt->truePrint ? opt->truePrint : "t") :
3782 (opt->falsePrint ? opt->falsePrint : "f"));
3783 else
3784 {
3785 cell = PQgetvalue(result, r, c);
3786 if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
3787 {
3788 cell = format_numeric_locale(cell);
3789 mustfree = true;
3790 }
3791 }
3792
3795 }
3796 }
3797
3798 /* set footers */
3799 if (opt->footers)
3800 {
3801 char **footer;
3802
3803 for (footer = opt->footers; *footer; footer++)
3804 printTableAddFooter(&cont, *footer);
3805 }
3806
3809}
#define Assert(condition)
Definition c.h:943
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:3192
void printTableCleanup(printTableContent *const content)
Definition print.c:3373
char column_type_alignment(Oid ftype)
Definition print.c:3812
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition print.c:3280
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:3637
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition print.c:3330
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition print.c:3240
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 3637 of file print.c.

3639{
3640 bool is_local_pager = false;
3641
3642 if (cancel_pressed)
3643 return;
3644
3645 if (cont->opt->format == PRINT_NOTHING)
3646 return;
3647
3648 /* print_aligned_*() handle the pager themselves */
3649 if (!is_pager &&
3650 cont->opt->format != PRINT_ALIGNED &&
3651 cont->opt->format != PRINT_WRAPPED)
3652 {
3653 IsPagerNeeded(cont, NULL, (cont->opt->expanded == 1), &fout, &is_pager);
3655 }
3656
3657 /* clear any pre-existing error indication on the output stream */
3658 clearerr(fout);
3659
3660 /* print the stuff */
3661 switch (cont->opt->format)
3662 {
3663 case PRINT_UNALIGNED:
3664 if (cont->opt->expanded == 1)
3666 else
3668 break;
3669 case PRINT_ALIGNED:
3670 case PRINT_WRAPPED:
3671
3672 /*
3673 * In expanded-auto mode, force vertical if a pager is passed in;
3674 * else we may make different decisions for different hunks of the
3675 * query result.
3676 */
3677 if (cont->opt->expanded == 1 ||
3678 (cont->opt->expanded == 2 && is_pager))
3680 else
3682 break;
3683 case PRINT_CSV:
3684 if (cont->opt->expanded == 1)
3686 else
3688 break;
3689 case PRINT_HTML:
3690 if (cont->opt->expanded == 1)
3692 else
3694 break;
3695 case PRINT_ASCIIDOC:
3696 if (cont->opt->expanded == 1)
3698 else
3700 break;
3701 case PRINT_LATEX:
3702 if (cont->opt->expanded == 1)
3704 else
3706 break;
3708 if (cont->opt->expanded == 1)
3710 else
3712 break;
3713 case PRINT_TROFF_MS:
3714 if (cont->opt->expanded == 1)
3716 else
3718 break;
3719 default:
3720 fprintf(stderr, _("invalid output format (internal error): %d"),
3721 cont->opt->format);
3723 }
3724
3725 if (is_local_pager)
3727
3728 /* also produce log output if wanted */
3729 if (flog)
3730 print_aligned_text(cont, flog, false);
3731}
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
Definition print.c:2172
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:2440
static void IsPagerNeeded(const printTableContent *cont, const unsigned int *width_wrap, bool vertical, FILE **fout, bool *is_pager)
Definition print.c:3431
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
Definition print.c:2813
static void print_html_text(const printTableContent *cont, FILE *fout)
Definition print.c:1979
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2905
void ClosePager(FILE *pagerpipe)
Definition print.c:3161
static void print_csv_text(const printTableContent *cont, FILE *fout)
Definition print.c:1866
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:1906
static void print_html_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2068
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
Definition print.c:2282
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:2703
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
Definition print.c:2547
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 3280 of file print.c.

3282{
3284
3285#ifndef ENABLE_NLS
3286 (void) translate; /* unused parameter */
3287#endif
3288
3289 total_cells = (uint64) content->ncolumns * content->nrows;
3290 if (content->cellsadded >= total_cells)
3291 {
3292 fprintf(stderr, _("Cannot add cell to table content: total cell count of %" PRIu64 " exceeded.\n"),
3293 total_cells);
3295 }
3296
3297 *content->cell = (char *) mbvalidate((unsigned char *) cell,
3298 content->opt->encoding);
3299
3300#ifdef ENABLE_NLS
3301 if (translate)
3302 *content->cell = _(*content->cell);
3303#endif
3304
3305 if (mustfree)
3306 {
3307 if (content->cellmustfree == NULL)
3308 content->cellmustfree =
3309 pg_malloc0_array(bool, (total_cells + 1));
3310
3311 content->cellmustfree[content->cellsadded] = true;
3312 }
3313 content->cell++;
3314 content->cellsadded++;
3315}
uint64_t uint64
Definition c.h:625
#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 3330 of file print.c.

3331{
3333
3335 f->data = pg_strdup(footer);
3336
3337 if (content->footers == NULL)
3338 content->footers = f;
3339 else
3340 content->footer->next = f;
3341
3342 content->footer = f;
3343}
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 3240 of file print.c.

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

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

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

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

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

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

3891{
3893
3894 const unicodeStyleBorderFormat *border;
3895 const unicodeStyleRowFormat *header;
3897
3898 popt->name = "unicode";
3899
3903
3904 popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
3906 popt->lrule[PRINT_RULE_TOP].midvrule = column->down_and_horizontal[opt->unicode_border_linestyle];
3908
3909 popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
3911 popt->lrule[PRINT_RULE_MIDDLE].midvrule = column->vertical_and_horizontal[opt->unicode_header_linestyle];
3913
3914 popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
3916 popt->lrule[PRINT_RULE_BOTTOM].midvrule = column->up_and_horizontal[opt->unicode_border_linestyle];
3918
3919 /* N/A */
3920 popt->lrule[PRINT_RULE_DATA].hrule = "";
3921 popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
3922 popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
3923 popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
3924
3925 popt->midvrule_nl = column->vertical;
3926 popt->midvrule_wrap = column->vertical;
3927 popt->midvrule_blank = column->vertical;
3928
3929 /* Same for all unicode today */
3937}
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 3048 of file print.c.

3049{
3050#ifndef WIN32
3052#endif
3053}
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 3061 of file print.c.

3062{
3063 always_ignore_sigpipe = ignore;
3064}

References always_ignore_sigpipe.

Referenced by setQFout().

◆ setDecimalLocale()

void setDecimalLocale ( void  )
extern

Definition at line 3840 of file print.c.

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