PostgreSQL Source Code  git master
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)
 
FILE * PageOutput (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

typedef struct printQueryOpt printQueryOpt

◆ printTableContent

◆ printTableFooter

◆ printTableOpt

typedef struct printTableOpt 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 */
33  PRINT_CSV,
34  PRINT_HTML,
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)

Definition at line 3141 of file print.c.

3142 {
3143  if (pagerpipe && pagerpipe != stdout)
3144  {
3145  /*
3146  * If printing was canceled midstream, warn about it.
3147  *
3148  * Some pagers like less use Ctrl-C as part of their command set. Even
3149  * so, we abort our processing and warn the user what we did. If the
3150  * pager quit as a result of the SIGINT, this message won't go
3151  * anywhere ...
3152  */
3153  if (cancel_pressed)
3154  fprintf(pagerpipe, _("Interrupted\n"));
3155 
3156  pclose(pagerpipe);
3158  }
3159 }
#define _(x)
Definition: elog.c:91
void restore_sigpipe_trap(void)
Definition: print.c:3062
volatile sig_atomic_t cancel_pressed
Definition: print.c:43
#define fprintf
Definition: port.h:242

References _, cancel_pressed, fprintf, restore_sigpipe_trap(), and generate_unaccent_rules::stdout.

Referenced by exec_command_sf_sv(), ExecQueryUsingCursor(), print_aligned_text(), print_aligned_vertical(), printHistory(), printTable(), slashUsage(), and usage().

◆ column_type_alignment()

char column_type_alignment ( Oid  ftype)

Definition at line 3600 of file print.c.

3601 {
3602  char align;
3603 
3604  switch (ftype)
3605  {
3606  case INT2OID:
3607  case INT4OID:
3608  case INT8OID:
3609  case FLOAT4OID:
3610  case FLOAT8OID:
3611  case NUMERICOID:
3612  case OIDOID:
3613  case XIDOID:
3614  case XID8OID:
3615  case CIDOID:
3616  case MONEYOID:
3617  align = 'r';
3618  break;
3619  default:
3620  align = 'l';
3621  break;
3622  }
3623  return align;
3624 }

Referenced by printCrosstab(), and printQuery().

◆ disable_sigpipe_trap()

void disable_sigpipe_trap ( void  )

Definition at line 3039 of file print.c.

3040 {
3041 #ifndef WIN32
3043 #endif
3044 }
pqsigfunc pqsignal(int signo, pqsigfunc func)
#define SIGPIPE
Definition: win32_port.h:181
#define SIG_IGN
Definition: win32_port.h:173

References pqsignal(), SIG_IGN, and SIGPIPE.

Referenced by do_copy(), do_watch(), exec_command_write(), ExecQueryAndProcessResults(), ExecQueryUsingCursor(), and PageOutput().

◆ get_line_style()

const printTextFormat* get_line_style ( const printTableOpt opt)

Definition at line 3663 of file print.c.

3664 {
3665  /*
3666  * Note: this function mainly exists to preserve the convention that a
3667  * printTableOpt struct can be initialized to zeroes to get default
3668  * behavior.
3669  */
3670  if (opt->line_style != NULL)
3671  return opt->line_style;
3672  else
3673  return &pg_asciiformat;
3674 }
const printTextFormat pg_asciiformat
Definition: print.c:56
const printTextFormat * line_style
Definition: print.h:131

References 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 
)

Definition at line 1952 of file print.c.

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

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

◆ PageOutput()

FILE* PageOutput ( int  lines,
const printTableOpt topt 
)

Definition at line 3089 of file print.c.

3090 {
3091  /* check whether we need / can / are supposed to use pager */
3092  if (topt && topt->pager && isatty(fileno(stdin)) && isatty(fileno(stdout)))
3093  {
3094 #ifdef TIOCGWINSZ
3095  unsigned short int pager = topt->pager;
3096  int min_lines = topt->pager_min_lines;
3097  int result;
3098  struct winsize screen_size;
3099 
3100  result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
3101 
3102  /* >= accounts for a one-line prompt */
3103  if (result == -1
3104  || (lines >= screen_size.ws_row && lines >= min_lines)
3105  || pager > 1)
3106 #endif
3107  {
3108  const char *pagerprog;
3109  FILE *pagerpipe;
3110 
3111  pagerprog = getenv("PSQL_PAGER");
3112  if (!pagerprog)
3113  pagerprog = getenv("PAGER");
3114  if (!pagerprog)
3115  pagerprog = DEFAULT_PAGER;
3116  else
3117  {
3118  /* if PAGER is empty or all-white-space, don't use pager */
3119  if (strspn(pagerprog, " \t\r\n") == strlen(pagerprog))
3120  return stdout;
3121  }
3122  fflush(NULL);
3124  pagerpipe = popen(pagerprog, "w");
3125  if (pagerpipe)
3126  return pagerpipe;
3127  /* if popen fails, silently proceed without pager */
3129  }
3130  }
3131 
3132  return stdout;
3133 }
void disable_sigpipe_trap(void)
Definition: print.c:3039
#define DEFAULT_PAGER
Definition: print.h:23
static void const char fflush(stdout)
int pager_min_lines
Definition: print.h:124
unsigned short int pager
Definition: print.h:122

References DEFAULT_PAGER, disable_sigpipe_trap(), fflush(), printTableOpt::pager, printTableOpt::pager_min_lines, restore_sigpipe_trap(), and generate_unaccent_rules::stdout.

Referenced by exec_command_sf_sv(), ExecQueryUsingCursor(), IsPagerNeeded(), print_aligned_text(), printHistory(), slashUsage(), and usage().

◆ printQuery()

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

Definition at line 3535 of file print.c.

3537 {
3538  printTableContent cont;
3539  int i,
3540  r,
3541  c;
3542 
3543  if (cancel_pressed)
3544  return;
3545 
3546  printTableInit(&cont, &opt->topt, opt->title,
3547  PQnfields(result), PQntuples(result));
3548 
3549  /* Assert caller supplied enough translate_columns[] entries */
3550  Assert(opt->translate_columns == NULL ||
3551  opt->n_translate_columns >= cont.ncolumns);
3552 
3553  for (i = 0; i < cont.ncolumns; i++)
3554  {
3555  printTableAddHeader(&cont, PQfname(result, i),
3556  opt->translate_header,
3557  column_type_alignment(PQftype(result, i)));
3558  }
3559 
3560  /* set cells */
3561  for (r = 0; r < cont.nrows; r++)
3562  {
3563  for (c = 0; c < cont.ncolumns; c++)
3564  {
3565  char *cell;
3566  bool mustfree = false;
3567  bool translate;
3568 
3569  if (PQgetisnull(result, r, c))
3570  cell = opt->nullPrint ? opt->nullPrint : "";
3571  else
3572  {
3573  cell = PQgetvalue(result, r, c);
3574  if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
3575  {
3576  cell = format_numeric_locale(cell);
3577  mustfree = true;
3578  }
3579  }
3580 
3581  translate = (opt->translate_columns && opt->translate_columns[c]);
3582  printTableAddCell(&cont, cell, translate, mustfree);
3583  }
3584  }
3585 
3586  /* set footers */
3587  if (opt->footers)
3588  {
3589  char **footer;
3590 
3591  for (footer = opt->footers; *footer; footer++)
3592  printTableAddFooter(&cont, *footer);
3593  }
3594 
3595  printTable(&cont, fout, is_pager, flog);
3596  printTableCleanup(&cont);
3597 }
Oid PQftype(const PGresult *res, int field_num)
Definition: fe-exec.c:3552
int PQntuples(const PGresult *res)
Definition: fe-exec.c:3314
char * PQfname(const PGresult *res, int field_num)
Definition: fe-exec.c:3400
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3709
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3734
int PQnfields(const PGresult *res)
Definition: fe-exec.c:3322
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
Definition: print.c:3172
void printTableCleanup(printTableContent *const content)
Definition: print.c:3340
char column_type_alignment(Oid ftype)
Definition: print.c:3600
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition: print.c:3249
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
Definition: print.c:3429
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition: print.c:3297
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition: print.c:3209
static char * format_numeric_locale(const char *my_str)
Definition: print.c:314
int i
Definition: isn.c:73
Assert(fmt[strlen(fmt) - 1] !='\n')
Datum translate(PG_FUNCTION_ARGS)
char * c
const bool * translate_columns
Definition: print.h:190
printTableOpt topt
Definition: print.h:185
char * nullPrint
Definition: print.h:186
char * title
Definition: print.h:187
char ** footers
Definition: print.h:188
bool translate_header
Definition: print.h:189
int n_translate_columns
Definition: print.h:192
char * aligns
Definition: print.h:178
bool numericLocale
Definition: print.h:135

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

Referenced by describeAccessMethods(), describeAggregates(), describeConfigurationParameters(), describeFunctions(), describeOneTableDetails(), describeOneTSConfig(), describeOneTSParser(), describeOperators(), describeSubscriptions(), describeTablespaces(), describeTypes(), ExecQueryUsingCursor(), 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 
)

Definition at line 3429 of file print.c.

3431 {
3432  bool is_local_pager = false;
3433 
3434  if (cancel_pressed)
3435  return;
3436 
3437  if (cont->opt->format == PRINT_NOTHING)
3438  return;
3439 
3440  /* print_aligned_*() handle the pager themselves */
3441  if (!is_pager &&
3442  cont->opt->format != PRINT_ALIGNED &&
3443  cont->opt->format != PRINT_WRAPPED)
3444  {
3445  IsPagerNeeded(cont, 0, (cont->opt->expanded == 1), &fout, &is_pager);
3446  is_local_pager = is_pager;
3447  }
3448 
3449  /* clear any pre-existing error indication on the output stream */
3450  clearerr(fout);
3451 
3452  /* print the stuff */
3453 
3454  if (flog)
3455  print_aligned_text(cont, flog, false);
3456 
3457  switch (cont->opt->format)
3458  {
3459  case PRINT_UNALIGNED:
3460  if (cont->opt->expanded == 1)
3461  print_unaligned_vertical(cont, fout);
3462  else
3463  print_unaligned_text(cont, fout);
3464  break;
3465  case PRINT_ALIGNED:
3466  case PRINT_WRAPPED:
3467 
3468  /*
3469  * In expanded-auto mode, force vertical if a pager is passed in;
3470  * else we may make different decisions for different hunks of the
3471  * query result.
3472  */
3473  if (cont->opt->expanded == 1 ||
3474  (cont->opt->expanded == 2 && is_pager))
3475  print_aligned_vertical(cont, fout, is_pager);
3476  else
3477  print_aligned_text(cont, fout, is_pager);
3478  break;
3479  case PRINT_CSV:
3480  if (cont->opt->expanded == 1)
3481  print_csv_vertical(cont, fout);
3482  else
3483  print_csv_text(cont, fout);
3484  break;
3485  case PRINT_HTML:
3486  if (cont->opt->expanded == 1)
3487  print_html_vertical(cont, fout);
3488  else
3489  print_html_text(cont, fout);
3490  break;
3491  case PRINT_ASCIIDOC:
3492  if (cont->opt->expanded == 1)
3493  print_asciidoc_vertical(cont, fout);
3494  else
3495  print_asciidoc_text(cont, fout);
3496  break;
3497  case PRINT_LATEX:
3498  if (cont->opt->expanded == 1)
3499  print_latex_vertical(cont, fout);
3500  else
3501  print_latex_text(cont, fout);
3502  break;
3503  case PRINT_LATEX_LONGTABLE:
3504  if (cont->opt->expanded == 1)
3505  print_latex_vertical(cont, fout);
3506  else
3507  print_latex_longtable_text(cont, fout);
3508  break;
3509  case PRINT_TROFF_MS:
3510  if (cont->opt->expanded == 1)
3511  print_troff_ms_vertical(cont, fout);
3512  else
3513  print_troff_ms_text(cont, fout);
3514  break;
3515  default:
3516  fprintf(stderr, _("invalid output format (internal error): %d"),
3517  cont->opt->format);
3518  exit(EXIT_FAILURE);
3519  }
3520 
3521  if (is_local_pager)
3522  ClosePager(fout);
3523 }
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2186
static void print_unaligned_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:513
static void print_latex_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2454
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2827
static void print_html_text(const printTableContent *cont, FILE *fout)
Definition: print.c:1993
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2919
void ClosePager(FILE *pagerpipe)
Definition: print.c:3141
static void print_csv_text(const printTableContent *cont, FILE *fout)
Definition: print.c:1880
static void print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
Definition: print.c:635
static void print_csv_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:1920
static void print_html_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2082
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2296
static void print_unaligned_text(const printTableContent *cont, FILE *fout)
Definition: print.c:422
static void print_latex_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2717
static void IsPagerNeeded(const printTableContent *cont, int extra_lines, bool expanded, FILE **fout, bool *is_pager)
Definition: print.c:3389
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2561
static void print_aligned_vertical(const printTableContent *cont, FILE *fout, bool is_pager)
Definition: print.c:1324
exit(1)
#define EXIT_FAILURE
Definition: settings.h:167
const printTableOpt * opt
Definition: print.h:165
unsigned short int expanded
Definition: print.h:114
enum printFormat format
Definition: print.h:113

References _, cancel_pressed, ClosePager(), exit(), EXIT_FAILURE, printTableOpt::expanded, printTableOpt::format, fprintf, IsPagerNeeded(), printTableContent::opt, 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(), printCrosstab(), and printQuery().

◆ printTableAddCell()

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

Definition at line 3249 of file print.c.

3251 {
3252 #ifndef ENABLE_NLS
3253  (void) translate; /* unused parameter */
3254 #endif
3255 
3256  if (content->cellsadded >= content->ncolumns * content->nrows)
3257  {
3258  fprintf(stderr, _("Cannot add cell to table content: "
3259  "total cell count of %d exceeded.\n"),
3260  content->ncolumns * content->nrows);
3261  exit(EXIT_FAILURE);
3262  }
3263 
3264  *content->cell = (char *) mbvalidate((unsigned char *) cell,
3265  content->opt->encoding);
3266 
3267 #ifdef ENABLE_NLS
3268  if (translate)
3269  *content->cell = _(*content->cell);
3270 #endif
3271 
3272  if (mustfree)
3273  {
3274  if (content->cellmustfree == NULL)
3275  content->cellmustfree =
3276  pg_malloc0((content->ncolumns * content->nrows + 1) * sizeof(bool));
3277 
3278  content->cellmustfree[content->cellsadded] = true;
3279  }
3280  content->cell++;
3281  content->cellsadded++;
3282 }
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
unsigned char * mbvalidate(unsigned char *pwcs, int encoding)
Definition: mbprint.c:392
bool * cellmustfree
Definition: print.h:175
const char ** cell
Definition: print.h:173
long cellsadded
Definition: print.h:174
int encoding
Definition: print.h:138

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

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

◆ printTableAddFooter()

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

Definition at line 3297 of file print.c.

3298 {
3299  printTableFooter *f;
3300 
3301  f = pg_malloc0(sizeof(*f));
3302  f->data = pg_strdup(footer);
3303 
3304  if (content->footers == NULL)
3305  content->footers = f;
3306  else
3307  content->footer->next = f;
3308 
3309  content->footer = f;
3310 }
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, 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 
)

Definition at line 3209 of file print.c.

3211 {
3212 #ifndef ENABLE_NLS
3213  (void) translate; /* unused parameter */
3214 #endif
3215 
3216  if (content->header >= content->headers + content->ncolumns)
3217  {
3218  fprintf(stderr, _("Cannot add header to table content: "
3219  "column count of %d exceeded.\n"),
3220  content->ncolumns);
3221  exit(EXIT_FAILURE);
3222  }
3223 
3224  *content->header = (char *) mbvalidate((unsigned char *) header,
3225  content->opt->encoding);
3226 #ifdef ENABLE_NLS
3227  if (translate)
3228  *content->header = _(*content->header);
3229 #endif
3230  content->header++;
3231 
3232  *content->align = align;
3233  content->align++;
3234 }
char * align
Definition: print.h:180
const char ** header
Definition: print.h:170
const char ** headers
Definition: print.h:169

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

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

◆ printTableCleanup()

void printTableCleanup ( printTableContent *const  content)

Definition at line 3340 of file print.c.

3341 {
3342  if (content->cellmustfree)
3343  {
3344  int i;
3345 
3346  for (i = 0; i < content->nrows * content->ncolumns; i++)
3347  {
3348  if (content->cellmustfree[i])
3349  free(unconstify(char *, content->cells[i]));
3350  }
3351  free(content->cellmustfree);
3352  content->cellmustfree = NULL;
3353  }
3354  free(content->headers);
3355  free(content->cells);
3356  free(content->aligns);
3357 
3358  content->opt = NULL;
3359  content->title = NULL;
3360  content->headers = NULL;
3361  content->cells = NULL;
3362  content->aligns = NULL;
3363  content->header = NULL;
3364  content->cell = NULL;
3365  content->align = NULL;
3366 
3367  if (content->footers)
3368  {
3369  for (content->footer = content->footers; content->footer;)
3370  {
3371  printTableFooter *f;
3372 
3373  f = content->footer;
3374  content->footer = f->next;
3375  free(f->data);
3376  free(f);
3377  }
3378  }
3379  content->footers = NULL;
3380  content->footer = NULL;
3381 }
#define unconstify(underlying_type, expr)
Definition: c.h:1250
#define free(a)
Definition: header.h:65
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, 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(), printCrosstab(), and printQuery().

◆ printTableInit()

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

Definition at line 3172 of file print.c.

3174 {
3175  content->opt = opt;
3176  content->title = title;
3177  content->ncolumns = ncolumns;
3178  content->nrows = nrows;
3179 
3180  content->headers = pg_malloc0((ncolumns + 1) * sizeof(*content->headers));
3181 
3182  content->cells = pg_malloc0((ncolumns * nrows + 1) * sizeof(*content->cells));
3183 
3184  content->cellmustfree = NULL;
3185  content->footers = NULL;
3186 
3187  content->aligns = pg_malloc0((ncolumns + 1) * sizeof(*content->align));
3188 
3189  content->header = content->headers;
3190  content->cell = content->cells;
3191  content->footer = content->footers;
3192  content->align = content->aligns;
3193  content->cellsadded = 0;
3194 }

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

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

◆ printTableSetFooter()

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

Definition at line 3322 of file print.c.

3323 {
3324  if (content->footers != NULL)
3325  {
3326  free(content->footer->data);
3327  content->footer->data = pg_strdup(footer);
3328  }
3329  else
3330  printTableAddFooter(content, footer);
3331 }

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

Referenced by add_tablespace_footer().

◆ refresh_utf8format()

void refresh_utf8format ( const printTableOpt opt)

Definition at line 3677 of file print.c.

3678 {
3679  printTextFormat *popt = &pg_utf8format;
3680 
3681  const unicodeStyleBorderFormat *border;
3682  const unicodeStyleRowFormat *header;
3683  const unicodeStyleColumnFormat *column;
3684 
3685  popt->name = "unicode";
3686 
3690 
3691  popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
3692  popt->lrule[PRINT_RULE_TOP].leftvrule = border->down_and_right;
3694  popt->lrule[PRINT_RULE_TOP].rightvrule = border->down_and_left;
3695 
3696  popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
3700 
3701  popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
3702  popt->lrule[PRINT_RULE_BOTTOM].leftvrule = border->up_and_right;
3705 
3706  /* N/A */
3707  popt->lrule[PRINT_RULE_DATA].hrule = "";
3708  popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
3709  popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
3710  popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
3711 
3712  popt->midvrule_nl = column->vertical;
3713  popt->midvrule_wrap = column->vertical;
3714  popt->midvrule_blank = column->vertical;
3715 
3716  /* Same for all unicode today */
3719  popt->nl_left = unicode_style.nl_left;
3724 }
static const unicodeStyleFormat unicode_style
Definition: print.c:140
printTextFormat pg_utf8format
Definition: print.c:99
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:118
const char * left_and_right
Definition: print.c:123
const char * vertical
Definition: print.c:119
const char * down_and_left
Definition: print.c:122
const char * horizontal
Definition: print.c:121
const char * down_and_right
Definition: print.c:120
const char * vertical_and_horizontal[2]
Definition: print.c:111
const char * up_and_horizontal[2]
Definition: print.c:112
const char * vertical
Definition: print.c:110
const char * down_and_horizontal[2]
Definition: print.c:113
unicodeStyleRowFormat row_style[2]
Definition: print.c:128
unicodeStyleColumnFormat column_style[2]
Definition: print.c:129
const char * nl_right
Definition: print.c:134
const char * wrap_right
Definition: print.c:136
const char * header_nl_left
Definition: print.c:131
const char * header_nl_right
Definition: print.c:132
unicodeStyleBorderFormat border_style[2]
Definition: print.c:130
const char * nl_left
Definition: print.c:133
const char * wrap_left
Definition: print.c:135
bool wrap_right_border
Definition: print.c:137
const char * vertical_and_right[2]
Definition: print.c:104
const char * vertical_and_left[2]
Definition: print.c:105
const char * horizontal
Definition: print.c:103

References unicodeStyleFormat::border_style, unicodeStyleFormat::column_style, unicodeStyleColumnFormat::down_and_horizontal, unicodeStyleBorderFormat::down_and_left, unicodeStyleBorderFormat::down_and_right, 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, unicodeStyleColumnFormat::up_and_horizontal, unicodeStyleBorderFormat::up_and_right, unicodeStyleColumnFormat::vertical, unicodeStyleBorderFormat::vertical, unicodeStyleColumnFormat::vertical_and_horizontal, 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  )

Definition at line 3062 of file print.c.

3063 {
3064 #ifndef WIN32
3066 #endif
3067 }
static bool always_ignore_sigpipe
Definition: print.c:45
#define SIG_DFL
Definition: win32_port.h:171

References always_ignore_sigpipe, pqsignal(), SIG_DFL, SIG_IGN, and SIGPIPE.

Referenced by ClosePager(), do_copy(), do_watch(), exec_command_write(), ExecQueryAndProcessResults(), ExecQueryUsingCursor(), PageOutput(), and setQFout().

◆ set_sigpipe_trap_state()

void set_sigpipe_trap_state ( bool  ignore)

Definition at line 3075 of file print.c.

3076 {
3077  always_ignore_sigpipe = ignore;
3078 }

References always_ignore_sigpipe.

Referenced by setQFout().

◆ setDecimalLocale()

void setDecimalLocale ( void  )

Definition at line 3627 of file print.c.

3628 {
3629  struct lconv *extlconv;
3630 
3631  extlconv = localeconv();
3632 
3633  /* Don't accept an empty decimal_point string */
3634  if (*extlconv->decimal_point)
3635  decimal_point = pg_strdup(extlconv->decimal_point);
3636  else
3637  decimal_point = "."; /* SQL output standard */
3638 
3639  /*
3640  * Although the Open Group standard allows locales to supply more than one
3641  * group width, we consider only the first one, and we ignore any attempt
3642  * to suppress grouping by specifying CHAR_MAX. As in the backend's
3643  * cash.c, we must apply a range check to avoid being fooled by variant
3644  * CHAR_MAX values.
3645  */
3646  groupdigits = *extlconv->grouping;
3647  if (groupdigits <= 0 || groupdigits > 6)
3648  groupdigits = 3; /* most common */
3649 
3650  /* Don't accept an empty thousands_sep string, either */
3651  /* similar code exists in formatting.c */
3652  if (*extlconv->thousands_sep)
3653  thousands_sep = pg_strdup(extlconv->thousands_sep);
3654  /* Make sure thousands separator doesn't match decimal point symbol. */
3655  else if (strcmp(decimal_point, ",") != 0)
3656  thousands_sep = ",";
3657  else
3658  thousands_sep = ".";
3659 }
static char * thousands_sep
Definition: print.c:50
static char * decimal_point
Definition: print.c:48
static int groupdigits
Definition: print.c:49

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

Referenced by main().

Variable Documentation

◆ cancel_pressed

◆ pg_asciiformat

PGDLLIMPORT const printTextFormat pg_asciiformat
extern

Definition at line 56 of file print.c.

Referenced by do_pset(), and get_line_style().

◆ pg_asciiformat_old

PGDLLIMPORT const printTextFormat pg_asciiformat_old
extern

Definition at line 77 of file print.c.

Referenced by do_pset(), and print_aligned_vertical().

◆ pg_utf8format

PGDLLIMPORT printTextFormat pg_utf8format
extern

Definition at line 99 of file print.c.

Referenced by do_pset(), and refresh_utf8format().