|
|
|
@ -3,7 +3,7 @@
|
|
|
|
|
*
|
|
|
|
|
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
|
|
|
|
|
*
|
|
|
|
|
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.60 2005/06/14 22:15:57 momjian Exp $
|
|
|
|
|
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.61 2005/07/10 03:46:13 momjian Exp $
|
|
|
|
|
*/
|
|
|
|
|
#include "postgres_fe.h"
|
|
|
|
|
#include "common.h"
|
|
|
|
@ -29,20 +29,107 @@
|
|
|
|
|
|
|
|
|
|
#include "mbprint.h"
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
num_numericseps(const char *my_str)
|
|
|
|
|
{
|
|
|
|
|
int old_len, dec_len, int_len;
|
|
|
|
|
|
|
|
|
|
if (my_str[0] == '-')
|
|
|
|
|
my_str++;
|
|
|
|
|
|
|
|
|
|
old_len = strlen(my_str);
|
|
|
|
|
dec_len = strchr(my_str, '.') ? strlen(strchr(my_str, '.')) : 0;
|
|
|
|
|
|
|
|
|
|
int_len = old_len - dec_len;
|
|
|
|
|
if (int_len % 3 != 0)
|
|
|
|
|
return int_len / 3;
|
|
|
|
|
else
|
|
|
|
|
return int_len / 3 - 1; /* no leading separator */
|
|
|
|
|
}
|
|
|
|
|
static int
|
|
|
|
|
len_with_numericsep(const char *my_str)
|
|
|
|
|
{
|
|
|
|
|
return strlen(my_str) + num_numericseps(my_str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
format_numericsep(char *my_str, char *numericsep)
|
|
|
|
|
{
|
|
|
|
|
int i, j, digits_before_sep, old_len, new_len, dec_len, int_len;
|
|
|
|
|
char *dec_point;
|
|
|
|
|
char *new_str;
|
|
|
|
|
char *dec_value;
|
|
|
|
|
|
|
|
|
|
if (strcmp(numericsep, ".") != 0)
|
|
|
|
|
dec_point = ".";
|
|
|
|
|
else
|
|
|
|
|
dec_point = ",";
|
|
|
|
|
|
|
|
|
|
if (my_str[0] == '-')
|
|
|
|
|
my_str++;
|
|
|
|
|
|
|
|
|
|
old_len = strlen(my_str);
|
|
|
|
|
dec_len = strchr(my_str, '.') ? strlen(strchr(my_str, '.')) : 0;
|
|
|
|
|
int_len = old_len - dec_len;
|
|
|
|
|
digits_before_sep = int_len % 3;
|
|
|
|
|
|
|
|
|
|
new_len = int_len + int_len / 3 + dec_len;
|
|
|
|
|
if (digits_before_sep == 0)
|
|
|
|
|
new_len--; /* no leading separator */
|
|
|
|
|
|
|
|
|
|
new_str = malloc(new_len);
|
|
|
|
|
if (!new_str)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i=0, j=0; ; i++, j++)
|
|
|
|
|
{
|
|
|
|
|
/* hit decimal point */
|
|
|
|
|
if (my_str[i] == '.')
|
|
|
|
|
{
|
|
|
|
|
new_str[j] = *dec_point;
|
|
|
|
|
new_str[j+1] = '\0';
|
|
|
|
|
dec_value = strchr(my_str, '.');
|
|
|
|
|
strcat(new_str, ++dec_value);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* end of string */
|
|
|
|
|
if (my_str[i] == '\0')
|
|
|
|
|
{
|
|
|
|
|
new_str[j] = '\0';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* add separator? */
|
|
|
|
|
if (i != 0 &&
|
|
|
|
|
(i - (digits_before_sep ? digits_before_sep : 3)) % 3 == 0)
|
|
|
|
|
new_str[j++] = *numericsep;
|
|
|
|
|
|
|
|
|
|
new_str[j] = my_str[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy(my_str, new_str);
|
|
|
|
|
free(new_str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************/
|
|
|
|
|
/* Unaligned text */
|
|
|
|
|
/*************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_unaligned_text(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_fieldsep, const char *opt_recordsep, bool opt_barebones,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_unaligned_text(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, const char *opt_fieldsep,
|
|
|
|
|
const char *opt_recordsep, bool opt_barebones,
|
|
|
|
|
char *opt_numericsep, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
bool need_recordsep = false;
|
|
|
|
|
|
|
|
|
|
if (!opt_fieldsep)
|
|
|
|
@ -77,7 +164,24 @@ print_unaligned_text(const char *title, const char *const * headers,
|
|
|
|
|
fputs(opt_recordsep, fout);
|
|
|
|
|
need_recordsep = false;
|
|
|
|
|
}
|
|
|
|
|
if ((opt_align[i % col_count] == 'r') && strlen(*ptr) > 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
{
|
|
|
|
|
char *my_cell = malloc(len_with_numericsep(*ptr));
|
|
|
|
|
|
|
|
|
|
if (!my_cell)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
strcpy(my_cell, *ptr);
|
|
|
|
|
format_numericsep(my_cell, opt_numericsep);
|
|
|
|
|
fputs(my_cell, fout);
|
|
|
|
|
free(my_cell);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
fputs(*ptr, fout);
|
|
|
|
|
|
|
|
|
|
if ((i + 1) % col_count)
|
|
|
|
|
fputs(opt_fieldsep, fout);
|
|
|
|
|
else
|
|
|
|
@ -107,14 +211,15 @@ print_unaligned_text(const char *title, const char *const * headers,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_unaligned_vertical(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_fieldsep, const char *opt_recordsep, bool opt_barebones,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_unaligned_vertical(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells,
|
|
|
|
|
const char *const *footers, const char *opt_align,
|
|
|
|
|
const char *opt_fieldsep, const char *opt_recordsep,
|
|
|
|
|
bool opt_barebones, char *opt_numericsep, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
if (!opt_fieldsep)
|
|
|
|
|
opt_fieldsep = "";
|
|
|
|
@ -141,6 +246,22 @@ print_unaligned_vertical(const char *title, const char *const * headers,
|
|
|
|
|
|
|
|
|
|
fputs(headers[i % col_count], fout);
|
|
|
|
|
fputs(opt_fieldsep, fout);
|
|
|
|
|
if ((opt_align[i % col_count] == 'r') && strlen(*ptr) != 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
{
|
|
|
|
|
char *my_cell = malloc(len_with_numericsep(*ptr));
|
|
|
|
|
|
|
|
|
|
if (!my_cell)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
strcpy(my_cell, *ptr);
|
|
|
|
|
format_numericsep(my_cell, opt_numericsep);
|
|
|
|
|
fputs(my_cell, fout);
|
|
|
|
|
free(my_cell);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
fputs(*ptr, fout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -202,9 +323,9 @@ _print_horizontal_line(const unsigned int col_count, const unsigned int *widths,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_aligned_text(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
print_aligned_text(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, char *opt_numericsep,
|
|
|
|
|
unsigned short int opt_border, int encoding,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
{
|
|
|
|
@ -216,7 +337,7 @@ print_aligned_text(const char *title, const char *const * headers,
|
|
|
|
|
tmp;
|
|
|
|
|
unsigned int *widths,
|
|
|
|
|
total_w;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
/* count columns */
|
|
|
|
|
for (ptr = headers; *ptr; ptr++)
|
|
|
|
@ -271,7 +392,15 @@ print_aligned_text(const char *title, const char *const * headers,
|
|
|
|
|
|
|
|
|
|
for (i = 0, ptr = cells; *ptr; ptr++, i++)
|
|
|
|
|
{
|
|
|
|
|
tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding);
|
|
|
|
|
int numericseps;
|
|
|
|
|
|
|
|
|
|
if ((opt_align[i % col_count] == 'r') && strlen(*ptr) != 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
numericseps = num_numericseps(*ptr);
|
|
|
|
|
else
|
|
|
|
|
numericseps = 0;
|
|
|
|
|
|
|
|
|
|
tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding) + numericseps;
|
|
|
|
|
if (tmp > widths[i % col_count])
|
|
|
|
|
widths[i % col_count] = tmp;
|
|
|
|
|
cell_w[i] = tmp;
|
|
|
|
@ -351,8 +480,22 @@ print_aligned_text(const char *title, const char *const * headers,
|
|
|
|
|
/* content */
|
|
|
|
|
if (opt_align[i % col_count] == 'r')
|
|
|
|
|
{
|
|
|
|
|
fprintf(fout, "%*s%s",
|
|
|
|
|
widths[i % col_count] - cell_w[i], "", cells[i]);
|
|
|
|
|
if (strlen(*ptr) > 0 && opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
{
|
|
|
|
|
char *my_cell = malloc(cell_w[i]);
|
|
|
|
|
|
|
|
|
|
if (!my_cell)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
strcpy(my_cell, *ptr);
|
|
|
|
|
format_numericsep(my_cell, opt_numericsep);
|
|
|
|
|
fprintf(fout, "%*s%s", widths[i % col_count] - cell_w[i], "", my_cell);
|
|
|
|
|
free(my_cell);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
fprintf(fout, "%*s%s", widths[i % col_count] - cell_w[i], "", *ptr);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -406,14 +549,15 @@ print_aligned_text(const char *title, const char *const * headers,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_aligned_vertical(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
print_aligned_vertical(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
char *opt_numericsep, unsigned short int opt_border,
|
|
|
|
|
int encoding, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int record = 1;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
unsigned int i,
|
|
|
|
|
tmp = 0,
|
|
|
|
|
hwidth = 0,
|
|
|
|
@ -471,7 +615,15 @@ print_aligned_vertical(const char *title, const char *const * headers,
|
|
|
|
|
/* find longest data cell */
|
|
|
|
|
for (i = 0, ptr = cells; *ptr; ptr++, i++)
|
|
|
|
|
{
|
|
|
|
|
tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding);
|
|
|
|
|
int numericseps;
|
|
|
|
|
|
|
|
|
|
if ((opt_align[i % col_count] == 'r') && strlen(*ptr) != 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
numericseps = num_numericseps(*ptr);
|
|
|
|
|
else
|
|
|
|
|
numericseps = 0;
|
|
|
|
|
|
|
|
|
|
tmp = pg_wcswidth((unsigned char *) *ptr, strlen(*ptr), encoding) + numericseps;
|
|
|
|
|
if (tmp > dwidth)
|
|
|
|
|
dwidth = tmp;
|
|
|
|
|
cell_w[i] = tmp;
|
|
|
|
@ -556,10 +708,24 @@ print_aligned_vertical(const char *title, const char *const * headers,
|
|
|
|
|
else
|
|
|
|
|
fputs(" ", fout);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
char *my_cell = malloc(cell_w[i]);
|
|
|
|
|
|
|
|
|
|
if (!my_cell)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
strcpy(my_cell, *ptr);
|
|
|
|
|
if ((opt_align[i % col_count] == 'r') && strlen(*ptr) != 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
format_numericsep(my_cell, opt_numericsep);
|
|
|
|
|
if (opt_border < 2)
|
|
|
|
|
fprintf(fout, "%s\n", *ptr);
|
|
|
|
|
puts(my_cell);
|
|
|
|
|
else
|
|
|
|
|
fprintf(fout, "%-s%*s |\n", *ptr, dwidth - cell_w[i], "");
|
|
|
|
|
fprintf(fout, "%-s%*s |\n", my_cell, dwidth - cell_w[i], "");
|
|
|
|
|
free(my_cell);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (opt_border == 2)
|
|
|
|
@ -637,15 +803,15 @@ html_escaped_print(const char *in, FILE *fout)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_html_text(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
const char *opt_table_attr,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_html_text(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
char *opt_numericsep, unsigned short int opt_border,
|
|
|
|
|
const char *opt_table_attr, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
fprintf(fout, "<table border=\"%d\"", opt_border);
|
|
|
|
|
if (opt_table_attr)
|
|
|
|
@ -683,11 +849,27 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
fputs(" <tr valign=\"top\">\n", fout);
|
|
|
|
|
|
|
|
|
|
fprintf(fout, " <td align=\"%s\">", opt_align[(i) % col_count] == 'r' ? "right" : "left");
|
|
|
|
|
if ((*ptr)[strspn(*ptr, " \t")] == '\0') /* is string only
|
|
|
|
|
* whitespace? */
|
|
|
|
|
/* is string only whitespace? */
|
|
|
|
|
if ((*ptr)[strspn(*ptr, " \t")] == '\0')
|
|
|
|
|
fputs(" ", fout);
|
|
|
|
|
else if ((opt_align[i % col_count] == 'r') && strlen(*ptr) != 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
{
|
|
|
|
|
char *my_cell = malloc(len_with_numericsep(*ptr));
|
|
|
|
|
|
|
|
|
|
if (!my_cell)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
strcpy(my_cell, *ptr);
|
|
|
|
|
format_numericsep(my_cell, opt_numericsep);
|
|
|
|
|
html_escaped_print(my_cell, fout);
|
|
|
|
|
free(my_cell);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
html_escaped_print(*ptr, fout);
|
|
|
|
|
|
|
|
|
|
fputs("</td>\n", fout);
|
|
|
|
|
|
|
|
|
|
if ((i + 1) % col_count == 0)
|
|
|
|
@ -714,16 +896,16 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_html_vertical(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
const char *opt_table_attr,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_html_vertical(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
char *opt_numericsep, unsigned short int opt_border,
|
|
|
|
|
const char *opt_table_attr, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
unsigned int record = 1;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
fprintf(fout, "<table border=\"%d\"", opt_border);
|
|
|
|
|
if (opt_table_attr)
|
|
|
|
@ -758,11 +940,27 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
fputs("</th>\n", fout);
|
|
|
|
|
|
|
|
|
|
fprintf(fout, " <td align=\"%s\">", opt_align[i % col_count] == 'r' ? "right" : "left");
|
|
|
|
|
if ((*ptr)[strspn(*ptr, " \t")] == '\0') /* is string only
|
|
|
|
|
* whitespace? */
|
|
|
|
|
/* is string only whitespace? */
|
|
|
|
|
if ((*ptr)[strspn(*ptr, " \t")] == '\0')
|
|
|
|
|
fputs(" ", fout);
|
|
|
|
|
else if ((opt_align[i % col_count] == 'r') && strlen(*ptr) != 0 &&
|
|
|
|
|
opt_numericsep != NULL && strlen(opt_numericsep) > 0)
|
|
|
|
|
{
|
|
|
|
|
char *my_cell = malloc(len_with_numericsep(*ptr));
|
|
|
|
|
|
|
|
|
|
if (!my_cell)
|
|
|
|
|
{
|
|
|
|
|
fprintf(stderr, _("out of memory\n"));
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
strcpy(my_cell, *ptr);
|
|
|
|
|
format_numericsep(my_cell, opt_numericsep);
|
|
|
|
|
html_escaped_print(my_cell, fout);
|
|
|
|
|
free(my_cell);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
html_escaped_print(*ptr, fout);
|
|
|
|
|
|
|
|
|
|
fputs("</td>\n </tr>\n", fout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -829,14 +1027,14 @@ latex_escaped_print(const char *in, FILE *fout)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_latex_text(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_latex_text(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
unsigned short int opt_border, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* print title */
|
|
|
|
@ -921,14 +1119,14 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_latex_vertical(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_latex_vertical(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
unsigned short int opt_border, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
unsigned int record = 1;
|
|
|
|
|
|
|
|
|
|
(void) opt_align; /* currently unused parameter */
|
|
|
|
@ -1027,14 +1225,14 @@ troff_ms_escaped_print(const char *in, FILE *fout)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_troff_ms_text(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_troff_ms_text(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
unsigned short int opt_border, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* print title */
|
|
|
|
@ -1111,14 +1309,14 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
print_troff_ms_vertical(const char *title, const char *const * headers,
|
|
|
|
|
const char *const * cells, const char *const * footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones, unsigned short int opt_border,
|
|
|
|
|
FILE *fout)
|
|
|
|
|
print_troff_ms_vertical(const char *title, const char *const *headers,
|
|
|
|
|
const char *const *cells, const char *const *footers,
|
|
|
|
|
const char *opt_align, bool opt_barebones,
|
|
|
|
|
unsigned short int opt_border, FILE *fout)
|
|
|
|
|
{
|
|
|
|
|
unsigned int col_count = 0;
|
|
|
|
|
unsigned int i;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
unsigned int record = 1;
|
|
|
|
|
unsigned short current_format = 0; /* 0=none, 1=header, 2=body */
|
|
|
|
|
|
|
|
|
@ -1263,9 +1461,9 @@ PageOutput(int lines, unsigned short int pager)
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
printTable(const char *title,
|
|
|
|
|
const char *const * headers,
|
|
|
|
|
const char *const * cells,
|
|
|
|
|
const char *const * footers,
|
|
|
|
|
const char *const *headers,
|
|
|
|
|
const char *const *cells,
|
|
|
|
|
const char *const *footers,
|
|
|
|
|
const char *align,
|
|
|
|
|
const printTableOpt *opt, FILE *fout, FILE *flog)
|
|
|
|
|
{
|
|
|
|
@ -1298,7 +1496,7 @@ printTable(const char *title,
|
|
|
|
|
int col_count = 0,
|
|
|
|
|
row_count = 0,
|
|
|
|
|
lines;
|
|
|
|
|
const char *const * ptr;
|
|
|
|
|
const char *const *ptr;
|
|
|
|
|
|
|
|
|
|
/* rough estimate of columns and rows */
|
|
|
|
|
if (headers)
|
|
|
|
@ -1325,38 +1523,38 @@ printTable(const char *title,
|
|
|
|
|
/* print the stuff */
|
|
|
|
|
|
|
|
|
|
if (flog)
|
|
|
|
|
print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, border, opt->encoding, flog);
|
|
|
|
|
print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, opt->numericSep, border, opt->encoding, flog);
|
|
|
|
|
|
|
|
|
|
switch (opt->format)
|
|
|
|
|
{
|
|
|
|
|
case PRINT_UNALIGNED:
|
|
|
|
|
if (use_expanded)
|
|
|
|
|
print_unaligned_vertical(title, headers, cells, footers,
|
|
|
|
|
print_unaligned_vertical(title, headers, cells, footers, align,
|
|
|
|
|
opt->fieldSep, opt->recordSep,
|
|
|
|
|
opt->tuples_only, output);
|
|
|
|
|
opt->tuples_only, opt->numericSep, output);
|
|
|
|
|
else
|
|
|
|
|
print_unaligned_text(title, headers, cells, footers,
|
|
|
|
|
print_unaligned_text(title, headers, cells, footers, align,
|
|
|
|
|
opt->fieldSep, opt->recordSep,
|
|
|
|
|
opt->tuples_only, output);
|
|
|
|
|
opt->tuples_only, opt->numericSep, output);
|
|
|
|
|
break;
|
|
|
|
|
case PRINT_ALIGNED:
|
|
|
|
|
if (use_expanded)
|
|
|
|
|
print_aligned_vertical(title, headers, cells, footers,
|
|
|
|
|
opt->tuples_only, border,
|
|
|
|
|
print_aligned_vertical(title, headers, cells, footers, align,
|
|
|
|
|
opt->tuples_only, opt->numericSep, border,
|
|
|
|
|
opt->encoding, output);
|
|
|
|
|
else
|
|
|
|
|
print_aligned_text(title, headers, cells, footers,
|
|
|
|
|
align, opt->tuples_only,
|
|
|
|
|
print_aligned_text(title, headers, cells, footers, align,
|
|
|
|
|
opt->tuples_only, opt->numericSep,
|
|
|
|
|
border, opt->encoding, output);
|
|
|
|
|
break;
|
|
|
|
|
case PRINT_HTML:
|
|
|
|
|
if (use_expanded)
|
|
|
|
|
print_html_vertical(title, headers, cells, footers,
|
|
|
|
|
align, opt->tuples_only,
|
|
|
|
|
print_html_vertical(title, headers, cells, footers, align,
|
|
|
|
|
opt->tuples_only, opt->numericSep,
|
|
|
|
|
border, opt->tableAttr, output);
|
|
|
|
|
else
|
|
|
|
|
print_html_text(title, headers, cells, footers,
|
|
|
|
|
align, opt->tuples_only, border,
|
|
|
|
|
align, opt->tuples_only, opt->numericSep, border,
|
|
|
|
|
opt->tableAttr, output);
|
|
|
|
|
break;
|
|
|
|
|
case PRINT_LATEX:
|
|
|
|
|