⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 print.c

📁 PostgreSQL7.4.6 for Linux
💻 C
📖 第 1 页 / 共 2 页
字号:
static voidprint_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){	unsigned int col_count = 0;	unsigned int i;	const char *const * ptr;	fprintf(fout, "<table border=\"%d\"", opt_border);	if (opt_table_attr)		fprintf(fout, " %s", opt_table_attr);	fputs(">\n", fout);	/* print title */	if (!opt_barebones && title)	{		fputs("  <caption>", fout);		html_escaped_print(title, fout);		fputs("</caption>\n", fout);	}	/* print headers and count columns */	if (!opt_barebones)		fputs("  <tr>\n", fout);	for (i = 0, ptr = headers; *ptr; i++, ptr++)	{		col_count++;		if (!opt_barebones)		{			fputs("    <th align=\"center\">", fout);			html_escaped_print(*ptr, fout);			fputs("</th>\n", fout);		}	}	if (!opt_barebones)		fputs("  </tr>\n", fout);	/* print cells */	for (i = 0, ptr = cells; *ptr; i++, ptr++)	{		if (i % col_count == 0)			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? */			fputs("&nbsp; ", fout);		else			html_escaped_print(*ptr, fout);		fputs("</td>\n", fout);		if ((i + 1) % col_count == 0)			fputs("  </tr>\n", fout);	}	fputs("</table>\n", fout);	/* print footers */	if (!opt_barebones && footers && *footers)	{		fputs("<p>", fout);		for (ptr = footers; *ptr; ptr++)		{			html_escaped_print(*ptr, fout);			fputs("<br />\n", fout);		}		fputs("</p>", fout);	}	fputc('\n', fout);}static voidprint_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){	unsigned int col_count = 0;	unsigned int i;	unsigned int record = 1;	const char *const * ptr;	fprintf(fout, "<table border=\"%d\"", opt_border);	if (opt_table_attr)		fprintf(fout, " %s", opt_table_attr);	fputs(">\n", fout);	/* print title */	if (!opt_barebones && title)	{		fputs("  <caption>", fout);		html_escaped_print(title, fout);		fputs("</caption>\n", fout);	}	/* count columns */	for (ptr = headers; *ptr; ptr++)		col_count++;	/* print records */	for (i = 0, ptr = cells; *ptr; i++, ptr++)	{		if (i % col_count == 0)		{			if (!opt_barebones)				fprintf(fout, "\n  <tr><td colspan=\"2\" align=\"center\">Record %d</td></tr>\n", record++);			else				fputs("\n  <tr><td colspan=\"2\">&nbsp;</td></tr>\n", fout);		}		fputs("  <tr valign=\"top\">\n"			  "    <th>", fout);		html_escaped_print(headers[i % col_count], fout);		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? */			fputs("&nbsp; ", fout);		else			html_escaped_print(*ptr, fout);		fputs("</td>\n  </tr>\n", fout);	}	fputs("</table>\n", fout);	/* print footers */	if (!opt_barebones && footers && *footers)	{		fputs("<p>", fout);		for (ptr = footers; *ptr; ptr++)		{			html_escaped_print(*ptr, fout);			fputs("<br />\n", fout);		}		fputs("</p>", fout);	}	fputc('\n', fout);}/*************************//* LaTeX				 *//*************************/static voidlatex_escaped_print(const char *in, FILE *fout){	const char *p;	for (p = in; *p; p++)		switch (*p)		{			case '&':				fputs("\\&", fout);				break;			case '%':				fputs("\\%", fout);				break;			case '$':				fputs("\\$", fout);				break;			case '{':				fputs("\\{", fout);				break;			case '}':				fputs("\\}", fout);				break;			case '\\':				fputs("\\backslash", fout);				break;			case '\n':				fputs("\\\\", fout);				break;			default:				fputc(*p, fout);		}}static voidprint_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 *cp;	const char *const * ptr;	/* print title */	if (!opt_barebones && title)	{		fputs("\\begin{center}\n", fout);		latex_escaped_print(title, fout);		fputs("\n\\end{center}\n\n", fout);	}	/* begin environment and set alignments and borders */	fputs("\\begin{tabular}{", fout);	if (opt_border == 0)		fputs(opt_align, fout);	else if (opt_border == 1)	{		for (cp = opt_align; *cp; cp++)		{			if (cp != opt_align)				fputc('|', fout);			fputc(*cp, fout);		}	}	else if (opt_border == 2)	{		for (cp = opt_align; *cp; cp++)		{			fputc('|', fout);			fputc(*cp, fout);		}		fputc('|', fout);	}	fputs("}\n", fout);	if (!opt_barebones && opt_border == 2)		fputs("\\hline\n", fout);	/* print headers and count columns */	for (i = 0, ptr = headers; *ptr; i++, ptr++)	{		col_count++;		if (!opt_barebones)		{			if (i != 0)				fputs(" & ", fout);			latex_escaped_print(*ptr, fout);		}	}	if (!opt_barebones)	{		fputs(" \\\\\n", fout);		fputs("\\hline\n", fout);	}	/* print cells */	for (i = 0, ptr = cells; *ptr; i++, ptr++)	{		latex_escaped_print(*ptr, fout);		if ((i + 1) % col_count == 0)			fputs(" \\\\\n", fout);		else			fputs(" & ", fout);	}	if (opt_border == 2)		fputs("\\hline\n", fout);	fputs("\\end{tabular}\n\n", fout);	/* print footers */	if (footers && !opt_barebones)		for (ptr = footers; *ptr; ptr++)		{			latex_escaped_print(*ptr, fout);			fputs(" \\\\\n", fout);		}	fputc('\n', fout);}static voidprint_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;	unsigned int record = 1;	(void) opt_align;			/* currently unused parameter */	/* print title */	if (!opt_barebones && title)	{		fputs("\\begin{center}\n", fout);		latex_escaped_print(title, fout);		fputs("\n\\end{center}\n\n", fout);	}	/* begin environment and set alignments and borders */	fputs("\\begin{tabular}{", fout);	if (opt_border == 0)		fputs("cl", fout);	else if (opt_border == 1)		fputs("c|l", fout);	else if (opt_border == 2)		fputs("|c|l|", fout);	fputs("}\n", fout);	/* count columns */	for (ptr = headers; *ptr; ptr++)		col_count++;	/* print records */	for (i = 0, ptr = cells; *ptr; i++, ptr++)	{		/* new record */		if (i % col_count == 0)		{			if (!opt_barebones)			{				if (opt_border == 2)					fputs("\\hline\n", fout);				fprintf(fout, "\\multicolumn{2}{c}{Record %d} \\\\\n", record++);			}			if (opt_border >= 1)				fputs("\\hline\n", fout);		}		latex_escaped_print(headers[i % col_count], fout);		fputs(" & ", fout);		latex_escaped_print(*ptr, fout);		fputs(" \\\\\n", fout);	}	if (opt_border == 2)		fputs("\\hline\n", fout);	fputs("\\end{tabular}\n\n", fout);	/* print footers */	if (footers && !opt_barebones)		for (ptr = footers; *ptr; ptr++)		{			latex_escaped_print(*ptr, fout);			fputs(" \\\\\n", fout);		}	fputc('\n', fout);}/********************************//* Public functions		*//********************************//* * PageOutput * * Tests if pager is needed and returns appropriate FILE pointer. */FILE *PageOutput(int lines, unsigned short int pager){	/* check whether we need / can / are supposed to use pager */	if (pager#ifndef WIN32		&&		isatty(fileno(stdin)) &&		isatty(fileno(stdout))#endif		)	{		const char *pagerprog;#ifdef TIOCGWINSZ		int			result;		struct winsize screen_size;		result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);		/* >= accounts for a one-line prompt */		if (result == -1 || lines >= screen_size.ws_row || pager > 1)		{#endif			pagerprog = getenv("PAGER");			if (!pagerprog)				pagerprog = DEFAULT_PAGER;#ifndef WIN32			pqsignal(SIGPIPE, SIG_IGN);#endif			return popen(pagerprog, "w");#ifdef TIOCGWINSZ		}#endif	}	return stdout;}voidprintTable(const char *title,		   const char *const * headers,		   const char *const * cells,		   const char *const * footers,		   const char *align,		   const printTableOpt *opt, FILE *fout){	const char *default_footer[] = {NULL};	unsigned short int border = opt->border;	FILE	   *output;	if (opt->format == PRINT_NOTHING)		return;	if (!footers)		footers = default_footer;	if (opt->format != PRINT_HTML && border > 2)		border = 2;	if (fout == stdout)	{		int			col_count = 0,					row_count = 0,					lines;		const char *const * ptr;		/* rough estimate of columns and rows */		if (headers)			for (ptr = headers; *ptr; ptr++)				col_count++;		if (cells)			for (ptr = cells; *ptr; ptr++)				row_count++;		if (col_count > 0)			row_count /= col_count;		if (opt->expanded)			lines = (col_count + 1) * row_count;		else			lines = row_count + 1;		if (footers && !opt->tuples_only)			for (ptr = footers; *ptr; ptr++)				lines++;		output = PageOutput(lines, opt->pager);	}	else		output = fout;	/* print the stuff */	switch (opt->format)	{		case PRINT_UNALIGNED:			if (opt->expanded)				print_unaligned_vertical(title, headers, cells, footers, opt->fieldSep, opt->recordSep, opt->tuples_only, output);			else				print_unaligned_text(title, headers, cells, footers, opt->fieldSep, opt->recordSep, opt->tuples_only, output);			break;		case PRINT_ALIGNED:			if (opt->expanded)				print_aligned_vertical(title, headers, cells, footers, opt->tuples_only, border, opt->encoding, output);			else				print_aligned_text(title, headers, cells, footers, align, opt->tuples_only, border, opt->encoding, output);			break;		case PRINT_HTML:			if (opt->expanded)				print_html_vertical(title, headers, cells, footers, align, opt->tuples_only, border, opt->tableAttr, output);			else				print_html_text(title, headers, cells, footers, align, opt->tuples_only, border, opt->tableAttr, output);			break;		case PRINT_LATEX:			if (opt->expanded)				print_latex_vertical(title, headers, cells, footers, align, opt->tuples_only, border, output);			else				print_latex_text(title, headers, cells, footers, align, opt->tuples_only, border, output);			break;		default:			fprintf(stderr, "+ Oops, you shouldn't see this!\n");	}	/* Only close if we used the pager */	if (fout == stdout && output != stdout)	{		pclose(output);#ifndef WIN32		pqsignal(SIGPIPE, SIG_DFL);#endif	}}voidprintQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout){	int			nfields;	const char **headers;	const char **cells;	char	  **footers;	char	   *align;	int			i;	/* extract headers */	nfields = PQnfields(result);	headers = calloc(nfields + 1, sizeof(*headers));	if (!headers)	{		perror("calloc");		exit(EXIT_FAILURE);	}	for (i = 0; i < nfields; i++)		headers[i] = mbvalidate(PQfname(result, i), opt->topt.encoding);	/* set cells */	cells = calloc(nfields * PQntuples(result) + 1, sizeof(*cells));	if (!cells)	{		perror("calloc");		exit(EXIT_FAILURE);	}	for (i = 0; i < nfields * PQntuples(result); i++)	{		if (PQgetisnull(result, i / nfields, i % nfields))			cells[i] = opt->nullPrint ? opt->nullPrint : "";		else			cells[i] = mbvalidate(PQgetvalue(result, i / nfields, i % nfields), opt->topt.encoding);	}	/* set footers */	if (opt->footers)		footers = opt->footers;	else if (!opt->topt.expanded && opt->default_footer)	{		footers = calloc(2, sizeof(*footers));		if (!footers)		{			perror("calloc");			exit(EXIT_FAILURE);		}		footers[0] = malloc(100);		if (PQntuples(result) == 1)			snprintf(footers[0], 100, gettext("(1 row)"));		else			snprintf(footers[0], 100, gettext("(%d rows)"), PQntuples(result));	}	else		footers = NULL;	/* set alignment */	align = calloc(nfields + 1, sizeof(*align));	if (!align)	{		perror("calloc");		exit(EXIT_FAILURE);	}	for (i = 0; i < nfields; i++)	{		Oid			ftype = PQftype(result, i);		if (ftype == 20 ||		/* int8 */			ftype == 21 ||		/* int2 */			ftype == 23 ||		/* int4 */			(ftype >= 26 && ftype <= 30) ||		/* ?id */			ftype == 700 ||		/* float4 */			ftype == 701 ||		/* float8 */			ftype == 790 ||		/* money */			ftype == 1700		/* numeric */			)			align[i] = 'r';		else			align[i] = 'l';	}	/* call table printer */	printTable(opt->title, headers, cells,			   footers ? (const char *const *) footers : (const char *const *) (opt->footers),			   align, &opt->topt, fout);	free((void *) headers);	free((void *) cells);	if (footers)	{		free(footers[0]);		free(footers);	}	free(align);}/* the end */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -