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

📄 print.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 3 页
字号:
	/* count headers and find longest one */	for (ptr = headers; *ptr; ptr++)		col_count++;	if (col_count > 0)	{		head_w = calloc(col_count, sizeof(*head_w));		if (!head_w)		{			fprintf(stderr, _("out of memory\n"));			exit(EXIT_FAILURE);		}	}	else		head_w = NULL;	for (i = 0; i < col_count; i++)	{		tmp = pg_wcswidth(headers[i], strlen(headers[i]), encoding);		if (tmp > hwidth)			hwidth = tmp;		head_w[i] = tmp;	}	/* Count cells, find their lengths */	for (ptr = cells; *ptr; ptr++)		cell_count++;	if (cell_count > 0)	{		cell_w = calloc(cell_count, sizeof(*cell_w));		if (!cell_w)		{			fprintf(stderr, _("out of memory\n"));			exit(EXIT_FAILURE);		}	}	else		cell_w = NULL;	/* find longest data cell */	for (i = 0, ptr = cells; *ptr; ptr++, i++)	{		int			add_numeric_locale_len;		if (opt_align[i % col_count] == 'r' && opt_numeric_locale)			add_numeric_locale_len = additional_numeric_locale_len(*ptr);		else			add_numeric_locale_len = 0;		tmp = pg_wcswidth(*ptr, strlen(*ptr), encoding) + add_numeric_locale_len;		if (tmp > dwidth)			dwidth = tmp;		cell_w[i] = tmp;	}	/* print title */	if (!opt_tuples_only && title)		fprintf(fout, "%s\n", title);	/* make horizontal border */	divider = pg_local_malloc(hwidth + dwidth + 10);	divider[0] = '\0';	if (opt_border == 2)		strcat(divider, "+-");	for (i = 0; i < hwidth; i++)		strcat(divider, opt_border > 0 ? "-" : " ");	if (opt_border > 0)		strcat(divider, "-+-");	else		strcat(divider, " ");	for (i = 0; i < dwidth; i++)		strcat(divider, opt_border > 0 ? "-" : " ");	if (opt_border == 2)		strcat(divider, "-+");	/* print records */	for (i = 0, ptr = cells; *ptr; i++, ptr++)	{		if (i % col_count == 0)		{			if (!opt_tuples_only)			{				char	   *record_str = pg_local_malloc(32);				size_t		record_str_len;				if (opt_border == 0)					snprintf(record_str, 32, "* Record %d", record++);				else					snprintf(record_str, 32, "[ RECORD %d ]", record++);				record_str_len = strlen(record_str);				if (record_str_len + opt_border > strlen(divider))					fprintf(fout, "%.*s%s\n", opt_border, divider, record_str);				else				{					char	   *div_copy = strdup(divider);					if (!div_copy)					{						fprintf(stderr, _("out of memory\n"));						exit(EXIT_FAILURE);					}					strncpy(div_copy + opt_border, record_str, record_str_len);					fprintf(fout, "%s\n", div_copy);					free(div_copy);				}				free(record_str);			}			else if (i != 0 || opt_border == 2)				fprintf(fout, "%s\n", divider);		}		if (opt_border == 2)			fputs("| ", fout);		fprintf(fout, "%-s%*s", headers[i % col_count],				hwidth - head_w[i % col_count], "");		if (opt_border > 0)			fputs(" | ", fout);		else			fputs(" ", fout);		if (opt_align[i % col_count] == 'r' && opt_numeric_locale)		{			char	   *my_cell = format_numeric_locale(*ptr);			if (opt_border < 2)				fprintf(fout, "%s\n", my_cell);			else				fprintf(fout, "%-s%*s |\n", my_cell, dwidth - cell_w[i], "");			free(my_cell);		}		else		{			if (opt_border < 2)				fprintf(fout, "%s\n", *ptr);			else				fprintf(fout, "%-s%*s |\n", *ptr, dwidth - cell_w[i], "");		}	}	if (opt_border == 2)		fprintf(fout, "%s\n", divider);	/* print footers */	if (!opt_tuples_only && footers && *footers)	{		if (opt_border < 2)			fputc('\n', fout);		for (ptr = footers; *ptr; ptr++)			fprintf(fout, "%s\n", *ptr);	}	fputc('\n', fout);	free(divider);	free(cell_w);	free(head_w);}/**********************//* HTML printing ******//**********************/voidhtml_escaped_print(const char *in, FILE *fout){	const char *p;	bool		leading_space = true;	for (p = in; *p; p++)	{		switch (*p)		{			case '&':				fputs("&amp;", fout);				break;			case '<':				fputs("&lt;", fout);				break;			case '>':				fputs("&gt;", fout);				break;			case '\n':				fputs("<br />\n", fout);				break;			case '"':				fputs("&quot;", fout);				break;			case '\'':				fputs("&apos;", fout);				break;			case ' ':				/* protect leading space, for EXPLAIN output */				if (leading_space)					fputs("&nbsp;", fout);				else					fputs(" ", fout);				break;			default:				fputc(*p, fout);		}		if (*p != ' ')			leading_space = false;	}}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_tuples_only,				bool opt_numeric_locale, 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_tuples_only && title)	{		fputs("  <caption>", fout);		html_escaped_print(title, fout);		fputs("</caption>\n", fout);	}	/* print headers and count columns */	if (!opt_tuples_only)		fputs("  <tr>\n", fout);	for (i = 0, ptr = headers; *ptr; i++, ptr++)	{		col_count++;		if (!opt_tuples_only)		{			fputs("    <th align=\"center\">", fout);			html_escaped_print(*ptr, fout);			fputs("</th>\n", fout);		}	}	if (!opt_tuples_only)		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");		/* is string only whitespace? */		if ((*ptr)[strspn(*ptr, " \t")] == '\0')			fputs("&nbsp; ", fout);		else if (opt_align[i % col_count] == 'r' && opt_numeric_locale)		{			char	   *my_cell = format_numeric_locale(*ptr);			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)			fputs("  </tr>\n", fout);	}	fputs("</table>\n", fout);	/* print footers */	if (!opt_tuples_only && 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_tuples_only,					bool opt_numeric_locale, 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_tuples_only && 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_tuples_only)				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");		/* is string only whitespace? */		if ((*ptr)[strspn(*ptr, " \t")] == '\0')			fputs("&nbsp; ", fout);		else if (opt_align[i % col_count] == 'r' && opt_numeric_locale)		{			char	   *my_cell = format_numeric_locale(*ptr);			html_escaped_print(my_cell, fout);			free(my_cell);		}		else			html_escaped_print(*ptr, fout);		fputs("</td>\n  </tr>\n", fout);	}	fputs("</table>\n", fout);	/* print footers */	if (!opt_tuples_only && 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("\\}", 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_tuples_only,				 bool opt_numeric_locale, unsigned short int opt_border,				 FILE *fout){	unsigned int col_count = 0;	unsigned int i;	const char *const * ptr;	/* print title */	if (!opt_tuples_only && title)	{		fputs("\\begin{center}\n", fout);		latex_escaped_print(title, fout);		fputs("\n\\end{center}\n\n", fout);	}	/* count columns */	for (ptr = headers; *ptr; ptr++)		col_count++;	/* begin environment and set alignments and borders */	fputs("\\begin{tabular}{", fout);	if (opt_border == 2)		fputs("| ", fout);	for (i = 0; i < col_count; i++)	{		fputc(*(opt_align + i), fout);		if (opt_border != 0 && i < col_count - 1)			fputs(" | ", fout);	}	if (opt_border == 2)		fputs(" |", fout);	fputs("}\n", fout);	if (!opt_tuples_only && opt_border == 2)		fputs("\\hline\n", fout);	/* print headers and count columns */	for (i = 0, ptr = headers; i < col_count; i++, ptr++)	{		if (!opt_tuples_only)		{			if (i != 0)				fputs(" & ", fout);			fputs("\\textit{", fout);			latex_escaped_print(*ptr, fout);			fputc('}', fout);		}	}	if (!opt_tuples_only)	{		fputs(" \\\\\n", fout);		fputs("\\hline\n", fout);	}	/* print cells */	for (i = 0, ptr = cells; *ptr; i++, ptr++)	{		if (opt_numeric_locale)		{			char	   *my_cell = format_numeric_locale(*ptr);			latex_escaped_print(my_cell, fout);			free(my_cell);		}		else			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\\noindent ", fout);	/* print footers */	if (footers && !opt_tuples_only)		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_tuples_only,					 bool opt_numeric_locale, 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_tuples_only && 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_tuples_only)			{				if (opt_border == 2)				{					fputs("\\hline\n", fout);					fprintf(fout, "\\multicolumn{2}{|c|}{\\textit{Record %d}} \\\\\n", record++);				}				else

⌨️ 快捷键说明

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