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

📄 main.cc

📁 早期freebsd实现
💻 CC
📖 第 1 页 / 共 3 页
字号:
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 + -