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

📄 font.cc

📁 早期freebsd实现
💻 CC
📖 第 1 页 / 共 2 页
字号:
    return 0;  while (csspace(*p))    p++;  char *q = strchr(p, '\0');  while (q > p && csspace(q[-1]))    q--;  *q = '\0';  return p;}// If the font can't be found, then if not_found is NULL it will be set// to 1 otherwise a message will be printed.int font::load(int *not_found){  char *path;  FILE *fp;  if ((fp = open_file(name, &path)) == NULL) {    if (not_found)      *not_found = 1;    else      error("can't find font file `%1'", name);    return 0;  }  text_file t(fp, path);  t.skip_comments = 1;  char *p;  for (;;) {    if (!t.next()) {      t.error("missing charset command");      return 0;    }    p = strtok(t.buf, WS);    if (strcmp(p, "name") == 0) {    }    else if (strcmp(p, "spacewidth") == 0) {      p = strtok(0, WS);      int n;      if (p == 0 || sscanf(p, "%d", &n) != 1 || n <= 0) {	t.error("bad argument for spacewidth command");	return 0;      }      space_width = n;    }    else if (strcmp(p, "slant") == 0) {      p = strtok(0, WS);      double n;      if (p == 0 || sscanf(p, "%lf", &n) != 1 || n >= 90.0 || n <= -90.0) {	t.error("bad argument for slant command", p);	return 0;      }      slant = n;    }    else if (strcmp(p, "ligatures") == 0) {      for (;;) {	p = strtok(0, WS);	if (p == 0 || strcmp(p, "0") == 0)	  break;	if (strcmp(p, "ff") == 0)	  ligatures |= LIG_ff;	else if (strcmp(p, "fi") == 0)	  ligatures |= LIG_fi;	else if (strcmp(p, "fl") == 0)	  ligatures |= LIG_fl;	else if (strcmp(p, "ffi") == 0)	  ligatures |= LIG_ffi;	else if (strcmp(p, "ffl") == 0)	  ligatures |= LIG_ffl;	else {	  t.error("unrecognised ligature `%1'", p);	  return 0;	}      }    }    else if (strcmp(p, "internalname") == 0) {      p = strtok(0, WS);      if (!p) {	t.error("`internalname command requires argument");	return 0;      }      internalname = new char[strlen(p) + 1];      strcpy(internalname, p);    }    else if (strcmp(p, "special") == 0) {      special = 1;    }    else if (strcmp(p, "kernpairs") != 0 && strcmp(p, "charset") != 0) {      char *command = p;      p = strtok(0, "\n");      handle_unknown_font_command(command, trim_arg(p), t.path, t.lineno);    }    else      break;  }  char *command = p;  int had_charset = 0;  t.skip_comments = 0;  while (command) {    if (strcmp(command, "kernpairs") == 0) {      for (;;) {	if (!t.next()) {	  command = 0;	  break;	}	char *c1 = strtok(t.buf, WS);	if (c1 == 0)	  continue;	char *c2 = strtok(0, WS);	if (c2 == 0) {	  command = c1;	  break;	}	p = strtok(0, WS);	if (p == 0) {	  t.error("missing kern amount");	  return 0;	}	int n;	if (sscanf(p, "%d", &n) != 1) {	  t.error("bad kern amount `%1'", p);	  return 0;	}	int i1 = name_to_index(c1);	if (i1 < 0) {	  t.error("illegal character `%1'", c1);	  return 0;	}	int i2 = name_to_index(c2);	if (i2 < 0) {	  t.error("illegal character `%1'", c2);	  return 0;	}	add_kern(i1, i2, n);      }    }    else if (strcmp(command, "charset") == 0) {      had_charset = 1;      int last_index = -1;      for (;;) {	if (!t.next()) {	  command = 0;	  break;	}	char *nm = strtok(t.buf, WS);	if (nm == 0)	  continue;			// I dont think this should happen	p = strtok(0, WS);	if (p == 0) {	  command = nm;	  break;	}	if (p[0] == '"') {	  if (last_index == -1) {	    t.error("first charset entry is duplicate");	    return 0;	  }	  if (strcmp(nm, "---") == 0) {	    t.error("unnamed character cannot be duplicate");	    return 0;	  }	  int index = name_to_index(nm);	  if (index < 0) {	    t.error("illegal character `%1'", nm);	    return 0;	  }	  copy_entry(index, last_index);	}	else {	  font_char_metric metric;	  metric.height = 0;	  metric.depth = 0;	  metric.pre_math_space = 0;	  metric.italic_correction = 0;	  metric.subscript_correction = 0;	  int nparms = sscanf(p, "%d,%d,%d,%d,%d,%d",			      &metric.width, &metric.height, &metric.depth,			      &metric.italic_correction,			      &metric.pre_math_space,			      &metric.subscript_correction);	  if (nparms < 1) {	    t.error("bad width for `%1'", nm);	    return 0;	  }	  p = strtok(0, WS);	  if (p == 0) {	    t.error("missing character type for `%1'", nm);	    return 0;	  }	  int type;	  if (sscanf(p, "%d", &type) != 1) {	    t.error("bad character type for `%1'", nm);	    return 0;	  }	  if (type < 0 || type > 255) {	    t.error("character code `%1' out of range", type);	    return 0;	  }	  metric.type = type;	  p = strtok(0, WS);	  if (p == 0) {	    t.error("missing code for `%1'", nm);	    return 0;	  }	  char *ptr;	  metric.code = (int)strtol(p, &ptr, 0);	  if (metric.code == 0 && ptr == p) {	    t.error("bad code `%1' for character `%2'", p, nm);	    return 0;	  }	  if (strcmp(nm, "---") == 0) {	    last_index = number_to_index(metric.code);	    add_entry(last_index, metric);	  }	  else {	    last_index = name_to_index(nm);	    if (last_index < 0) {	      t.error("illegal character `%1'", nm);	      return 0;	    }	    add_entry(last_index, metric);	    copy_entry(number_to_index(metric.code), last_index);	  }	}      }      if (last_index == -1) {	t.error("I didn't seem to find any characters");	return 0;      }    }    else {      t.error("unrecognised command `%1' after `kernpairs' or `charset' command", command);      return 0;    }  }  if (!had_charset) {    t.error("missing charset command");    return 0;  }  if (space_width == 0)    space_width = scale_round(unitwidth, res, 72*3*sizescale);  compact();  return 1;}static struct {  const char *command;  int *ptr;} table[] = {  "res", &font::res,  "hor", &font::hor,  "vert", &font::vert,  "unitwidth", &font::unitwidth,  "paperwidth", &font::paperwidth,  "paperlength", &font::paperlength,  "spare1", &font::biggestfont,  "biggestfont", &font::biggestfont,  "spare2", &font::spare2,  "sizescale", &font::sizescale  };int font::load_desc(){  int nfonts = 0;  FILE *fp;  char *path;  if ((fp = open_file("DESC", &path)) == 0) {    error("can't find `DESC' file");    return 0;  }  text_file t(fp, path);  t.skip_comments = 1;  res = 0;  while (t.next()) {    char *p = strtok(t.buf, WS);    int found = 0;    for (int i = 0; !found && i < sizeof(table)/sizeof(table[0]); i++)      if (strcmp(table[i].command, p) == 0)	found = 1;    if (found) {      char *q = strtok(0, WS);      if (!q) {	t.error("missing value for command `%1'", p);	return 0;      }      //int *ptr = &(this->*(table[i-1].ptr));      int *ptr = table[i-1].ptr;      if (sscanf(q, "%d", ptr) != 1) {	t.error("bad number `%1'", q);	return 0;      }    }    else if (strcmp("tcommand", p) == 0) {      tcommand = 1;    }    else if (strcmp("family", p) == 0) {      p = strtok(0, WS);      if (!p) {	t.error("family command requires an argument");	return 0;      }      char *tem = new char[strlen(p)+1];      strcpy(tem, p);      family = tem;    }    else if (strcmp("fonts", p) == 0) {      p = strtok(0, WS);      if (!p || sscanf(p, "%d", &nfonts) != 1 || nfonts <= 0) {	t.error("bad number of fonts `%1'", p);	return 0;      }      font_name_table = (const char **)new char *[nfonts+1];       for (int i = 0; i < nfonts; i++) {	p = strtok(0, WS);	while (p == 0) {	  if (!t.next()) {	    t.error("end of file while reading list of fonts");	    return 0;	  }	  p = strtok(t.buf, WS);	}	char *temp = new char[strlen(p)+1];	strcpy(temp, p);	font_name_table[i] = temp;      }      p = strtok(0, WS);      if (p != 0) {	t.error("font count does not match number of fonts");	return 0;      }      font_name_table[nfonts] = 0;    }    else if (strcmp("sizes", p) == 0) {      int n = 16;      sizes = new int[n];      int i = 0;      for (;;) {	p = strtok(0, WS);	while (p == 0) {	  if (!t.next()) {	    t.error("list of sizes must be terminated by `0'");	    return 0;	  }	  p = strtok(t.buf, WS);	}	int lower, upper;	switch (sscanf(p, "%d-%d", &lower, &upper)) {	case 1:	  upper = lower;	  // fall through	case 2:	  if (lower <= upper && lower >= 0)	    break;	  // fall through	default:	  t.error("bad size range `%1'", p);	  return 0;	}	if (i + 2 > n) {	  int *old_sizes = sizes;	  sizes = new int[n*2];	  memcpy(sizes, old_sizes, n*sizeof(int));	  n *= 2;	  a_delete old_sizes;	}	sizes[i++] = lower;	if (lower == 0)	  break;	sizes[i++] = upper;      }      if (i == 1) {	t.error("must have some sizes");	return 0;      }    }    else if (strcmp("styles", p) == 0) {      int style_table_size = 5;      style_table = (const char **)new char *[style_table_size];      for (int j = 0; j < style_table_size; j++)	style_table[j] = 0;      int i = 0;      for (;;) {	p = strtok(0, WS);	if (p == 0)	  break;	// leave room for terminating 0	if (i + 1 >= style_table_size) {	  const char **old_style_table = style_table;	  style_table_size *= 2;	  style_table = (const char **)new char*[style_table_size];	  for (j = 0; j < i; j++)	    style_table[j] = old_style_table[j];	  for (; j < style_table_size; j++)	    style_table[j] = 0;	  a_delete old_style_table;	}	char *tem = new char[strlen(p) + 1];	strcpy(tem, p);	style_table[i++] = tem;      }    }    else if (strcmp("charset", p) == 0)      break;    else if (unknown_desc_command_handler) {      char *command = p;      p = strtok(0, "\n");      (*unknown_desc_command_handler)(command, trim_arg(p), t.path, t.lineno);    }  }  if (res == 0) {    t.error("missing `res' command");    return 0;  }  if (unitwidth == 0) {    t.error("missing `unitwidth' command");    return 0;  }  if (font_name_table == 0) {    t.error("missing `fonts' commmand");    return 0;  }  if (sizes == 0) {    t.error("missing `sizes' command");    return 0;  }  if (sizescale < 1) {    t.error("bad `sizescale' value");    return 0;  }  if (hor < 1) {    t.error("bad `hor' value");    return 0;  }  if (vert < 1) {    t.error("bad `vert' value");    return 0;  }  return 1;}      void font::handle_unknown_font_command(const char *, const char *,				       const char *, int){}FONT_COMMAND_HANDLERfont::set_unknown_desc_command_handler(FONT_COMMAND_HANDLER func){  FONT_COMMAND_HANDLER prev = unknown_desc_command_handler;  unknown_desc_command_handler = func;  return prev;}

⌨️ 快捷键说明

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