📄 print.c
字号:
/* 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("&", fout); break; case '<': fputs("<", fout); break; case '>': fputs(">", fout); break; case '\n': fputs("<br />\n", fout); break; case '"': fputs(""", fout); break; case '\'': fputs("'", fout); break; case ' ': /* protect leading space, for EXPLAIN output */ if (leading_space) fputs(" ", 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(" ", 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\"> </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(" ", 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 + -