📄 main.cc
字号:
entry_modifier::~entry_modifier(){}entry_format::entry_format() : type(FORMAT_LEFT){}entry_format::entry_format(format_type t) : type(t){}void entry_format::debug_print() const{ switch (type) { case FORMAT_LEFT: putc('l', stderr); break; case FORMAT_CENTER: putc('c', stderr); break; case FORMAT_RIGHT: putc('r', stderr); break; case FORMAT_NUMERIC: putc('n', stderr); break; case FORMAT_ALPHABETIC: putc('a', stderr); break; case FORMAT_SPAN: putc('s', stderr); break; case FORMAT_VSPAN: putc('^', stderr); break; case FORMAT_HLINE: putc('_', stderr); break; case FORMAT_DOUBLE_HLINE: putc('=', stderr); break; default: assert(0); break; } if (point_size.val != 0) { putc('p', stderr); if (point_size.inc > 0) putc('+', stderr); else if (point_size.inc < 0) putc('-', stderr); fprintf(stderr, "%d ", point_size.val); } if (vertical_spacing.val != 0) { putc('v', stderr); if (vertical_spacing.inc > 0) putc('+', stderr); else if (vertical_spacing.inc < 0) putc('-', stderr); fprintf(stderr, "%d ", vertical_spacing.val); } if (!font.empty()) { putc('f', stderr); put_string(font, stderr); putc(' ', stderr); } switch (vertical_alignment) { case entry_modifier::CENTER: break; case entry_modifier::TOP: putc('t', stderr); break; case entry_modifier::BOTTOM: putc('d', stderr); break; } if (zero_width) putc('z', stderr); if (stagger) putc('u', stderr);}struct format { int nrows; int ncolumns; int *separation; string *width; char *equal; entry_format **entry; char **vline; format(int nr, int nc); ~format(); void add_rows(int n);};format::format(int nr, int nc) : nrows(nr), ncolumns(nc){ int i; separation = ncolumns > 1 ? new int[ncolumns - 1] : 0; for (i = 0; i < ncolumns-1; i++) separation[i] = -1; width = new string[ncolumns]; equal = new char[ncolumns]; for (i = 0; i < ncolumns; i++) equal[i] = 0; entry = new entry_format *[nrows]; for (i = 0; i < nrows; i++) entry[i] = new entry_format[ncolumns]; vline = new char*[nrows]; for (i = 0; i < nrows; i++) { vline[i] = new char[ncolumns+1]; for (int j = 0; j < ncolumns+1; j++) vline[i][j] = 0; }}void format::add_rows(int n){ int i; char **old_vline = vline; vline = new char*[nrows + n]; for (i = 0; i < nrows; i++) vline[i] = old_vline[i]; a_delete old_vline; for (i = 0; i < n; i++) { vline[nrows + i] = new char[ncolumns + 1]; for (int j = 0; j < ncolumns + 1; j++) vline[nrows + i][j] = 0; } entry_format **old_entry = entry; entry = new entry_format *[nrows + n]; for (i = 0; i < nrows; i++) entry[i] = old_entry[i]; a_delete old_entry; for (i = 0; i < n; i++) entry[nrows + i] = new entry_format[ncolumns]; nrows += n;}format::~format(){ a_delete separation; ad_delete(ncolumns) width; a_delete equal; for (int i = 0; i < nrows; i++) { a_delete vline[i]; ad_delete(ncolumns) entry[i]; } a_delete vline; a_delete entry;}struct input_entry_format : entry_format { input_entry_format *next; string width; int separation; int vline; int pre_vline; int last_column; int equal; input_entry_format(format_type, input_entry_format * = 0); ~input_entry_format(); void debug_print();};input_entry_format::input_entry_format(format_type t, input_entry_format *p): entry_format(t), next(p){ separation = -1; last_column = 0; vline = 0; pre_vline = 0; equal = 0;}input_entry_format::~input_entry_format(){}void free_input_entry_format_list(input_entry_format *list){ while (list) { input_entry_format *tem = list; list = list->next; delete tem; }}void input_entry_format::debug_print(){ for (int i = 0; i < pre_vline; i++) putc('|', stderr); entry_format::debug_print(); if (!width.empty()) { putc('w', stderr); putc('(', stderr); put_string(width, stderr); putc(')', stderr); } if (equal) putc('e', stderr); if (separation >= 0) fprintf(stderr, "%d", separation); for (i = 0; i < vline; i++) putc('|', stderr); if (last_column) putc(',', stderr);}// Return zero if we should give up on this table.// If this is a continuation format line, current_format will be the current// format line.format *process_format(table_input &in, options *opt, format *current_format = 0){ input_entry_format *list = 0; int c = in.get(); for (;;) { int pre_vline = 0; int got_format = 0; int got_period = 0; format_type t; for (;;) { if (c == EOF) { error("end of input while processing format"); free_input_entry_format_list(list); return 0; } switch (c) { case 'n': case 'N': t = FORMAT_NUMERIC; got_format = 1; break; case 'a': case 'A': got_format = 1; t = FORMAT_ALPHABETIC; break; case 'c': case 'C': got_format = 1; t = FORMAT_CENTER; break; case 'l': case 'L': got_format = 1; t = FORMAT_LEFT; break; case 'r': case 'R': got_format = 1; t = FORMAT_RIGHT; break; case 's': case 'S': got_format = 1; t = FORMAT_SPAN; break; case '^': got_format = 1; t = FORMAT_VSPAN; break; case '_': got_format = 1; t = FORMAT_HLINE; break; case '=': got_format = 1; t = FORMAT_DOUBLE_HLINE; break; case '.': got_period = 1; break; case '|': pre_vline++; break; case ' ': case '\t': case '\n': break; default: if (c == opt->tab_char) break; error("unrecognised format `%1'", char(c)); free_input_entry_format_list(list); return 0; } if (got_period) break; c = in.get(); if (got_format) break; } if (got_period) break; list = new input_entry_format(t, list); if (pre_vline) list->pre_vline = pre_vline; int success = 1; do { switch (c) { case 't': case 'T': c = in.get(); list->vertical_alignment = entry_modifier::TOP; break; case 'd': case 'D': c = in.get(); list->vertical_alignment = entry_modifier::BOTTOM; break; case 'u': case 'U': c = in.get(); list->stagger = 1; break; case 'z': case 'Z': c = in.get(); list->zero_width = 1; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { int w = 0; do { w = w*10 + (c - '0'); c = in.get(); } while (c != EOF && csdigit(c)); list->separation = w; } break; case 'f': case 'F': do { c = in.get(); } while (c == ' ' || c == '\t'); if (c == EOF) { error("missing font name"); break; } if (c == '(') { for (;;) { c = in.get(); if (c == EOF || c == ' ' || c == '\t') { error("missing `)'"); break; } if (c == ')') { c = in.get(); break; } list->font += char(c); } } else { list->font = c; char cc = c; c = in.get(); if (!csdigit(cc) && c != EOF && c != ' ' && c != '\t' && c != '.' && c != '\n') { list->font += char(c); c = in.get(); } } break; case 'v': case 'V': c = in.get(); list->vertical_spacing.val = 0; list->vertical_spacing.inc = 0; if (c == '+' || c == '-') { list->vertical_spacing.inc = (c == '+' ? 1 : -1); c = in.get(); } if (c == EOF || !csdigit(c)) { error("`v' modifier must be followed by number"); list->vertical_spacing.inc = 0; } else { do { list->vertical_spacing.val *= 10; list->vertical_spacing.val += c - '0'; c = in.get(); } while (c != EOF && csdigit(c)); } if (list->vertical_spacing.val > MAX_VERTICAL_SPACING || list->vertical_spacing.val < -MAX_VERTICAL_SPACING) { error("unreasonable point size"); list->vertical_spacing.val = 0; list->vertical_spacing.inc = 0; } break; case 'p': case 'P': c = in.get(); list->point_size.val = 0; list->point_size.inc = 0; if (c == '+' || c == '-') { list->point_size.inc = (c == '+' ? 1 : -1); c = in.get(); } if (c == EOF || !csdigit(c)) { error("`p' modifier must be followed by number"); list->point_size.inc = 0; } else { do { list->point_size.val *= 10; list->point_size.val += c - '0'; c = in.get(); } while (c != EOF && csdigit(c)); } if (list->point_size.val > MAX_POINT_SIZE || list->point_size.val < -MAX_POINT_SIZE) { error("unreasonable point size"); list->point_size.val = 0; list->point_size.inc = 0; } break; case 'w': case 'W': c = in.get(); while (c == ' ' || c == '\t') c = in.get(); if (c == '(') { list->width = ""; c = in.get(); while (c != ')') { if (c == EOF || c == '\n') { error("missing `)'"); free_input_entry_format_list(list); return 0; } list->width += c; c = in.get(); } c = in.get(); } else { if (c == '+' || c == '-') { list->width = char(c); c = in.get(); } else list->width = ""; if (c == EOF || !csdigit(c)) error("bad argument for `w' modifier"); else { do { list->width += char(c); c = in.get(); } while (c != EOF && csdigit(c)); } } break; case 'e': case 'E': c = in.get(); list->equal++; break; case '|': c = in.get(); list->vline++; break; case 'B': case 'b': c = in.get(); list->font = "B"; break; case 'I': case 'i': c = in.get(); list->font = "I"; break; case ' ': case '\t': c = in.get(); break; default: if (c == opt->tab_char) c = in.get(); else success = 0; break; } } while (success); if (list->vline > 2) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -