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

📄 env.cc

📁 早期freebsd实现
💻 CC
📖 第 1 页 / 共 5 页
字号:
    fatal("font number 1 not a valid font");  if (family->make_definite(1) < 0)    fatal("invalid default family `%1'", default_family.contents());  prev_fontno = fontno;}environment::environment(const environment *e): name(e->name),		// so that eg `.if "\n[.ev]"0"' works  prev_line_length(e->prev_line_length),  line_length(e->line_length),  prev_title_length(e->prev_title_length),  title_length(e->title_length),  prev_size(e->prev_size),  size(e->size),  prev_requested_size(e->prev_requested_size),  requested_size(e->requested_size),  char_height(e->char_height),  char_slant(e->char_slant),  space_size(e->space_size),  sentence_space_size(e->sentence_space_size),  adjust_mode(e->adjust_mode),  fill(e->fill),  interrupted(0),  prev_line_interrupted(0),  center_lines(0),  right_justify_lines(0),  prev_vertical_spacing(e->prev_vertical_spacing),  vertical_spacing(e->vertical_spacing),  prev_line_spacing(e->prev_line_spacing),  line_spacing(e->line_spacing),  prev_indent(e->prev_indent),  indent(e->indent),  have_temporary_indent(0),  temporary_indent(0),  underline_lines(0),  input_trap_count(0),  prev_text_length(e->prev_text_length),  width_total(0),  space_total(0),  input_line_start(0),  control_char(e->control_char),  no_break_control_char(e->no_break_control_char),  hyphen_indicator_char(e->hyphen_indicator_char),  spread_flag(0),  line(0),  pending_lines(0),  discarding(0),  tabs(e->tabs),  current_tab(TAB_NONE),  current_field(0),  margin_character_flags(e->margin_character_flags),  margin_character_node(e->margin_character_node),  margin_character_distance(e->margin_character_distance),  numbering_nodes(0),  number_text_separation(e->number_text_separation),  line_number_multiple(e->line_number_multiple),  line_number_indent(e->line_number_indent),  no_number_count(e->no_number_count),  tab_char(e->tab_char),  leader_char(e->leader_char),  hyphenation_flags(e->hyphenation_flags),  fontno(e->fontno),  prev_fontno(e->prev_fontno),  dummy(1),  family(e->family),  prev_family(e->prev_family),  leader_node(0),#ifdef WIDOW_CONTROL  widow_control(e->widow_control),#endif /* WIDOW_CONTROL */  hyphen_line_max(e->hyphen_line_max),  hyphen_line_count(0),  hyphenation_space(e->hyphenation_space),  hyphenation_margin(e->hyphenation_margin),  composite(0){}environment::~environment(){  delete leader_node;  delete_node_list(line);  delete_node_list(numbering_nodes);}hunits environment::get_input_line_position(){  hunits n;  if (line == 0)    n = -input_line_start;  else    n = width_total - input_line_start;  if (current_tab)    n += tab_width;  return n;}void environment::set_input_line_position(hunits n){  input_line_start = line == 0 ? -n : width_total - n;  if (current_tab)    input_line_start += tab_width;}hunits environment::get_line_length(){  return line_length;}hunits environment::get_saved_line_length(){  if (line)    return target_text_length + saved_indent;  else    return line_length;}vunits environment::get_vertical_spacing(){  return vertical_spacing;}int environment::get_line_spacing(){  return line_spacing;}int environment::get_bold(){  return get_bold_fontno(fontno);}hunits environment::get_digit_width(){  return env_digit_width(this);} int environment::get_adjust_mode(){  return adjust_mode;}int environment::get_fill(){  return fill;}hunits environment::get_indent(){  return indent;}hunits environment::get_saved_indent(){  if (line)    return saved_indent;  else if (have_temporary_indent)    return temporary_indent;  else    return indent;}hunits environment::get_temporary_indent(){  return temporary_indent;}hunits environment::get_title_length(){  return title_length;}node *environment::get_prev_char(){  for (node *n = current_tab ? tab_contents : line; n; n = n->next) {    node *last = n->last_char_node();    if (last)      return last;  }  return 0;}hunits environment::get_prev_char_width(){  node *last = get_prev_char();  if (!last)    return H0;  return last->width();}hunits environment::get_prev_char_skew(){  node *last = get_prev_char();  if (!last)    return H0;  return last->skew();}vunits environment::get_prev_char_height(){  node *last = get_prev_char();  if (!last)    return V0;  vunits min, max;  last->vertical_extent(&min, &max);  return -min;}vunits environment::get_prev_char_depth(){  node *last = get_prev_char();  if (!last)    return V0;  vunits min, max;  last->vertical_extent(&min, &max);  return max;}hunits environment::get_text_length(){  hunits n = line == 0 ? H0 : width_total;  if (current_tab)    n += tab_width;  return n;}hunits environment::get_prev_text_length(){  return prev_text_length;}static int sb_reg_contents = 0;static int st_reg_contents = 0;static int ct_reg_contents = 0;static int rsb_reg_contents = 0;static int rst_reg_contents = 0;static int skw_reg_contents = 0;static int ssc_reg_contents = 0;void environment::width_registers(){  // this is used to implement \w; it sets the st, sb, ct registers  vunits min = 0, max = 0, cur = 0;  int character_type = 0;  ssc_reg_contents = line ? line->subscript_correction().to_units() : 0;  skw_reg_contents = line ? line->skew().to_units() : 0;  line = reverse_node_list(line);  vunits real_min = V0;  vunits real_max = V0;  vunits v1, v2;  for (node *tem = line; tem; tem = tem->next) {    tem->vertical_extent(&v1, &v2);    v1 += cur;    if (v1 < real_min)      real_min = v1;    v2 += cur;    if (v2 > real_max)      real_max = v2;    if ((cur += tem->vertical_width()) < min)      min = cur;    else if (cur > max)      max = cur;    character_type |= tem->character_type();  }  line = reverse_node_list(line);  st_reg_contents = -min.to_units();  sb_reg_contents = -max.to_units();  rst_reg_contents = -real_min.to_units();  rsb_reg_contents = -real_max.to_units();  ct_reg_contents = character_type;}node *environment::extract_output_line(){  if (current_tab)    wrap_up_tab();  node *n = line;  line = 0;  return n;}/* environment related requests */void environment_switch(){  int pop = 0;	// 1 means pop, 2 means pop but no error message on underflow  if (curenv->is_dummy())    error("can't switch environments when current environment is dummy");  else if (!has_arg())    pop = 1;  else {    symbol nm;    if (!tok.delimiter()) {      // It looks like a number.      int n;      if (get_integer(&n)) {	if (n >= 0 && n < NENVIRONMENTS) {	  env_stack = new env_list(curenv, env_stack);	  if (env_table[n] == 0)	    env_table[n] = new environment(itoa(n));	  curenv = env_table[n];	}	else	  nm = itoa(n);      }      else	pop = 2;    }    else {      nm = get_long_name(1);      if (nm.is_null())	pop = 2;    }    if (!nm.is_null()) {      environment *e = (environment *)env_dictionary.lookup(nm);      if (!e) {	e = new environment(nm);	(void)env_dictionary.lookup(nm, e);      }      env_stack = new env_list(curenv, env_stack);      curenv = e;    }  }  if (pop) {    if (env_stack == 0) {      if (pop == 1)	error("environment stack underflow");    }    else {      curenv = env_stack->env;      env_list *tem = env_stack;      env_stack = env_stack->next;      delete tem;    }  }  skip_line();}static symbol P_symbol("P");void font_change(){  symbol s = get_name();  int is_number = 1;  if (s.is_null() || s == P_symbol) {    s = P_symbol;    is_number = 0;  }  else {    for (const char *p = s.contents(); p != 0 && *p != 0; p++)      if (!csdigit(*p)) {	is_number = 0;	break;      }  }  if (is_number)    curenv->set_font(atoi(s.contents()));  else    curenv->set_font(s);  skip_line();}void family_change(){  symbol s = get_name(1);  if (!s.is_null())    curenv->set_family(s);  skip_line();}void point_size(){  int n;  if (has_arg() && get_number(&n, 'z', curenv->get_requested_point_size())) {    if (n <= 0)      n = 1;    curenv->set_size(n);  }  else    curenv->set_size(0);  skip_line();}void space_size(){  int n;  if (get_integer(&n)) {    curenv->space_size = n;    if (has_arg() && get_integer(&n))      curenv->sentence_space_size = n;    else      curenv->sentence_space_size = curenv->space_size;  }  skip_line();}void fill(){  while (!tok.newline() && !tok.eof())    tok.next();  if (break_flag)    curenv->do_break();  curenv->fill = 1;  tok.next();}void no_fill(){  while (!tok.newline() && !tok.eof())    tok.next();  if (break_flag)    curenv->do_break();  curenv->fill = 0;  tok.next();}void center(){  int n;  if (!has_arg() || !get_integer(&n))    n = 1;  else if (n < 0)    n = 0;  while (!tok.newline() && !tok.eof())    tok.next();  if (break_flag)    curenv->do_break();  curenv->right_justify_lines = 0;  curenv->center_lines = n;  tok.next();}void right_justify(){  int n;  if (!has_arg() || !get_integer(&n))    n = 1;  else if (n < 0)    n = 0;  while (!tok.newline() && !tok.eof())    tok.next();  if (break_flag)    curenv->do_break();  curenv->center_lines = 0;  curenv->right_justify_lines = n;  tok.next();}void line_length(){  hunits temp;  if (has_arg() && get_hunits(&temp, 'm', curenv->line_length)) {    if (temp < H0) {      warning(WARN_RANGE, "bad line length %1u", temp.to_units());      temp = H0;    }  }  else    temp = curenv->prev_line_length;  curenv->prev_line_length = curenv->line_length;  curenv->line_length = temp;  skip_line();}void title_length(){  hunits temp;  if (has_arg() && get_hunits(&temp, 'm', curenv->title_length)) {    if (temp < H0) {      warning(WARN_RANGE, "bad title length %1u", temp.to_units());      temp = H0;    }  }  else    temp = curenv->prev_title_length;  curenv->prev_title_length = curenv->title_length;  curenv->title_length = temp;  skip_line();}void vertical_spacing(){  vunits temp;  if (has_arg() && get_vunits(&temp, 'p', curenv->vertical_spacing)) {    if (temp <= V0) {      warning(WARN_RANGE, "vertical spacing must be greater than 0");      temp = vresolution;    }  }  else    temp = curenv->prev_vertical_spacing;  curenv->prev_vertical_spacing = curenv->vertical_spacing;  curenv->vertical_spacing = temp;  skip_line();}void line_spacing(){  int temp;  if (has_arg() && get_integer(&temp)) {    if (temp < 1) {      warning(WARN_RANGE, "value %1 out of range: interpreted as 1", temp);      temp = 1;    }  }  else    temp = curenv->prev_line_spacing;  curenv->prev_line_spacing = curenv->line_spacing;  curenv->line_spacing = temp;  skip_line();}void indent(){  hunits temp;  if (has_arg() && get_hunits(&temp, 'm', curenv->indent)) {    if (temp < H0) {      warning(WARN_RANGE, "indent cannot be negative");      temp = H0;    }  }  else    temp = curenv->prev_indent;  while (!tok.newline() && !tok.eof())    tok.next();  if (break_flag)    curenv->do_break();  curenv->have_temporary_indent = 0;  curenv->prev_indent = curenv->indent;  curenv->indent = temp;  tok.next();}void temporary_indent(){  int err = 0;  hunits temp;  if (!get_hunits(&temp, 'm', curenv->get_indent()))    err = 1;  while (!tok.newline() && !tok.eof())    tok.next();  if (break_flag)    curenv->do_break();  if (temp < H0) {    warning(WARN_RANGE, "total indent cannot be negative");    temp = H0;  }  if (!err) {    curenv->temporary_indent = temp;    curenv->have_temporary_indent = 1;  }  tok.next();}void underline(){  int n;  if (!has_arg() || !get_integer(&n))    n = 1;  if (n <= 0) {    if (curenv->underline_lines > 0) {      curenv->prev_fontno = curenv->fontno;      curenv->fontno = curenv->pre_underline_fontno;    }    curenv->underline_lines = 0;  }  else {    curenv->underline_lines = n;    curenv->pre_underline_fontno = curenv->fontno;    curenv->fontno = get_underline_fontno();  }  skip_line();}void control_char(){  curenv->control_char = '.';  if (has_arg()) {

⌨️ 快捷键说明

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