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

📄 ref.cc

📁 早期freebsd实现
💻 CC
📖 第 1 页 / 共 2 页
字号:
    const token_info *ti = lookup_token(token_start, ptr);    if (need_period) {      if ((ptr - token_start == 1 && *token_start == ' ')	  || (ptr - token_start == 2 && token_start[0] == '\\'	      && token_start[1] == ' '))	continue;      if (ti->is_upper())	result += period_before_initial;      else	result += period_before_other;      need_period = 0;    }    result.append(token_start, ptr - token_start);    if (ti->is_upper()) {      const char *lower_ptr = ptr;      int first_token = 1;      for (;;) {	token_start = ptr;	if (!get_token(&ptr, last_name_start))	  break;	if ((ptr - token_start == 1 && *token_start == ' ')	    || (ptr - token_start == 2 && token_start[0] == '\\'		&& token_start[1] == ' '))	  break;	ti = lookup_token(token_start, ptr);	if (ti->is_hyphen()) {	  const char *ptr1 = ptr;	  if (get_token(&ptr1, last_name_start)) {	    ti = lookup_token(ptr, ptr1);	    if (ti->is_upper()) {	      result += period_before_hyphen;	      result.append(token_start, ptr1 - token_start);	      ptr = ptr1;	    }	  }	}	else if (ti->is_upper()) {	  // MacDougal -> MacD.	  result.append(lower_ptr, ptr - lower_ptr);	  lower_ptr = ptr;	  first_token = 1;	}	else if (first_token && ti->is_accent()) {	  result.append(token_start, ptr - token_start);	  lower_ptr = ptr;	}	first_token = 0;      }      need_period = 1;    }  }  if (need_period)    result += period_before_last_name;  result.append(last_name_start, end - last_name_start);}static void abbreviate_names(string &result){  string str;  str.move(result);  const char *ptr = str.contents();  const char *end = ptr + str.length();  while (ptr < end) {    const char *name_end = (char *)memchr(ptr, FIELD_SEPARATOR, end - ptr);    if (name_end == 0)      name_end = end;    abbreviate_name(ptr, name_end, result);    if (name_end >= end)      break;    ptr = name_end + 1;    result += FIELD_SEPARATOR;  }}void reverse_name(const char *ptr, const char *name_end, string &result){  const char *last_name_end;  const char *last_name_start = find_last_name(ptr, name_end, &last_name_end);  result.append(last_name_start, last_name_end - last_name_start);  while (last_name_start > ptr	 && (last_name_start[-1] == ' ' || last_name_start[-1] == '\n'))    last_name_start--;  if (last_name_start > ptr) {    result += ", ";    result.append(ptr, last_name_start - ptr);  }  if (last_name_end < name_end)    result.append(last_name_end, name_end - last_name_end);}void reverse_names(string &result, int n){  if (n <= 0)    return;  string str;  str.move(result);  const char *ptr = str.contents();  const char *end = ptr + str.length();  while (ptr < end) {    if (--n < 0) {      result.append(ptr, end - ptr);      break;    }    const char *name_end = (char *)memchr(ptr, FIELD_SEPARATOR, end - ptr);    if (name_end == 0)      name_end = end;    reverse_name(ptr, name_end, result);    if (name_end >= end)      break;    ptr = name_end + 1;    result += FIELD_SEPARATOR;  }}// Return number of field separators.int join_fields(string &f){  const char *ptr = f.contents();  int len = f.length();  int nfield_seps = 0;  for (int j = 0; j < len; j++)    if (ptr[j] == FIELD_SEPARATOR)      nfield_seps++;  if (nfield_seps == 0)    return 0;  string temp;  int field_seps_left = nfield_seps;  for (j = 0; j < len; j++) {    if (ptr[j] == FIELD_SEPARATOR) {      if (nfield_seps == 1)	temp += join_authors_exactly_two;      else if (--field_seps_left == 0)	temp += join_authors_last_two;      else	temp += join_authors_default;    }    else      temp += ptr[j];  }  f = temp;  return nfield_seps;}void uppercase(const char *start, const char *end, string &result){  for (;;) {    const char *token_start = start;    if (!get_token(&start, end))      break;    const token_info *ti = lookup_token(token_start, start);    ti->upper_case(token_start, start, result);  }}void lowercase(const char *start, const char *end, string &result){  for (;;) {    const char *token_start = start;    if (!get_token(&start, end))      break;    const token_info *ti = lookup_token(token_start, start);    ti->lower_case(token_start, start, result);  }}void capitalize(const char *ptr, const char *end, string &result){  int in_small_point_size = 0;  for (;;) {    const char *start = ptr;    if (!get_token(&ptr, end))      break;    const token_info *ti = lookup_token(start, ptr);    const char *char_end = ptr;    int is_lower = ti->is_lower();    if ((is_lower || ti->is_upper()) && get_token(&ptr, end)) {      const token_info *ti2 = lookup_token(char_end, ptr);      if (!ti2->is_accent())	ptr = char_end;    }    if (is_lower) {      if (!in_small_point_size) {	result += "\\s-2";	in_small_point_size = 1;      }      ti->upper_case(start, char_end, result);      result.append(char_end, ptr - char_end);    }    else {      if (in_small_point_size) {	result += "\\s+2";	in_small_point_size = 0;      }      result.append(start, ptr - start);    }  }  if (in_small_point_size)    result += "\\s+2";}void capitalize_field(string &str){  string temp;  capitalize(str.contents(), str.contents() + str.length(), temp);  str.move(temp);}int is_terminated(const char *ptr, const char *end){  const char *last_token = end;  for (;;) {    const char *p = ptr;    if (!get_token(&ptr, end))      break;    last_token = p;  }  return end - last_token == 1    && (*last_token == '.' || *last_token == '!' || *last_token == '?');}void reference::output(FILE *fp){  fputs(".]-\n", fp);  for (int i = 0; i < 256; i++)    if (field_index[i] != NULL_FIELD_INDEX && i != annotation_field) {      string &f = field[field_index[i]];      if (!csdigit(i)) {	int j = reverse_fields.search(i);	if (j >= 0) {	  int n;	  int len = reverse_fields.length();	  if (++j < len && csdigit(reverse_fields[j])) {	    n = reverse_fields[j] - '0';	    for (++j; j < len && csdigit(reverse_fields[j]); j++)	      // should check for overflow	      n = n*10 + reverse_fields[j] - '0';	  }	  else 	    n = INT_MAX;	  reverse_names(f, n);	}      }      int is_multiple = join_fields(f) > 0;      if (capitalize_fields.search(i) >= 0)	capitalize_field(f);      if (memchr(f.contents(), '\n', f.length()) == 0) {	fprintf(fp, ".ds [%c ", i);	if (f[0] == ' ' || f[0] == '\\' || f[0] == '"')	  putc('"', fp);	put_string(f, fp);	putc('\n', fp);      }      else {	fprintf(fp, ".de [%c\n", i);	put_string(f, fp);	fputs("..\n", fp);      }      if (i == 'P') {	int multiple_pages = 0;	if (f.length() > 0 && memchr(f.contents(), '-', f.length()) != 0)	  multiple_pages = 1;	fprintf(fp, ".nr [P %d\n", multiple_pages);      }      else if (i == 'E')	fprintf(fp, ".nr [E %d\n", is_multiple);    }  for (const char *p = "TAO"; *p; p++) {    int fi = field_index[(unsigned char)*p];    if (fi != NULL_FIELD_INDEX) {      string &f = field[fi];      fprintf(fp, ".nr [%c %d\n", *p,	      is_terminated(f.contents(), f.contents() + f.length()));    }  }  int t = classify();  fprintf(fp, ".][ %d %s\n", t, reference_types[t]);  if (annotation_macro.length() > 0 && annotation_field >= 0      && field_index[annotation_field] != NULL_FIELD_INDEX) {    putc('.', fp);    put_string(annotation_macro, fp);    putc('\n', fp);    put_string(field[field_index[annotation_field]], fp);  }}void reference::print_sort_key_comment(FILE *fp){  fputs(".\\\"", fp);  put_string(sort_key, fp);  putc('\n', fp);}const char *find_year(const char *start, const char *end, const char **endp){  for (;;) {    while (start < end && !csdigit(*start))      start++;    const char *ptr = start;    if (start == end)      break;    while (ptr < end && csdigit(*ptr))      ptr++;    if (ptr - start == 4 || ptr - start == 3	|| (ptr - start == 2	    && (start[0] >= '4' || (start[0] == '3' && start[1] >= '2')))) {      *endp = ptr;      return start;    }    start = ptr;  }  return 0;}static const char *find_day(const char *start, const char *end,			    const char **endp){  for (;;) {    while (start < end && !csdigit(*start))      start++;    const char *ptr = start;    if (start == end)      break;    while (ptr < end && csdigit(*ptr))      ptr++;    if ((ptr - start == 1 && start[0] != '0')	|| (ptr - start == 2 &&	    (start[0] == '1'	     || start[0] == '2'	     || (start[0] == '3' && start[1] <= '1')	     || (start[0] == '0' && start[1] != '0')))) {      *endp = ptr;      return start;    }    start = ptr;  }  return 0;}static int find_month(const char *start, const char *end){  static const char *months[] = {    "january",    "february",    "march",    "april",    "may",    "june",    "july",    "august",    "september",    "october",    "november",    "december",  };  for (;;) {    while (start < end && !csalpha(*start))      start++;    const char *ptr = start;    if (start == end)      break;    while (ptr < end && csalpha(*ptr))      ptr++;    if (ptr - start >= 3) {      for (int i = 0; i < sizeof(months)/sizeof(months[0]); i++) {	const char *q = months[i];	const char *p = start;	for (; p < ptr; p++, q++)	  if (cmlower(*p) != *q)	    break;	if (p >= ptr)	  return i;      }    }    start = ptr;  }  return -1;}int reference::contains_field(char c) const{  return field_index[(unsigned char)c] != NULL_FIELD_INDEX;}int reference::classify(){  if (contains_field('J'))    return JOURNAL_ARTICLE;  if (contains_field('B'))    return ARTICLE_IN_BOOK;  if (contains_field('G'))    return TECH_REPORT;  if (contains_field('R'))    return TECH_REPORT;  if (contains_field('I'))    return BOOK;  if (contains_field('M'))    return BELL_TM;  return OTHER;}const char *reference::get_year(const char **endp) const{  if (field_index['D'] != NULL_FIELD_INDEX) {    string &date = field[field_index['D']];    const char *start = date.contents();    const char *end = start + date.length();    return find_year(start, end, endp);  }  else    return 0;}const char *reference::get_field(unsigned char c, const char **endp) const{  if (field_index[c] != NULL_FIELD_INDEX) {    string &f = field[field_index[c]];    const char *start = f.contents();    *endp = start + f.length();    return start;  }  else    return 0;}const char *reference::get_date(const char **endp) const{  return get_field('D', endp);}const char *nth_field(int i, const char *start, const char **endp){  while (--i >= 0) {    start = (char *)memchr(start, FIELD_SEPARATOR, *endp - start);    if (!start)      return 0;    start++;  }  const char *e = (char *)memchr(start, FIELD_SEPARATOR, *endp - start);  if (e)    *endp = e;  return start;}const char *reference::get_author(int i, const char **endp) const{  for (const char *f = AUTHOR_FIELDS; *f != '\0'; f++) {    const char *start = get_field(*f, endp);    if (start) {      if (strchr(MULTI_FIELD_NAMES, *f) != 0)	return nth_field(i, start, endp);      else if (i == 0)	return start;      else	return 0;    }  }  return 0;}const char *reference::get_author_last_name(int i, const char **endp) const{  for (const char *f = AUTHOR_FIELDS; *f != '\0'; f++) {    const char *start = get_field(*f, endp);    if (start) {      if (strchr(MULTI_FIELD_NAMES, *f) != 0) {	start = nth_field(i, start, endp);	if (!start)	  return 0;      }      if (*f == 'A')	return find_last_name(start, *endp, endp);      else	return start;    }  }  return 0;}void reference::set_date(string &d){  if (d.length() == 0)    delete_field('D');  else    insert_field('D', d);}int same_year(const reference &r1, const reference &r2){  const char *ye1;  const char *ys1 = r1.get_year(&ye1);  const char *ye2;  const char *ys2 = r2.get_year(&ye2);  if (ys1 == 0) {    if (ys2 == 0)      return same_date(r1, r2);    else      return 0;  }  else if (ys2 == 0)    return 0;  else if (ye1 - ys1 != ye2 - ys2)    return 0;  else    return memcmp(ys1, ys2, ye1 - ys1) == 0;}int same_date(const reference &r1, const reference &r2){  const char *e1;  const char *s1 = r1.get_date(&e1);  const char *e2;  const char *s2 = r2.get_date(&e2);  if (s1 == 0)    return s2 == 0;  else if (s2 == 0)    return 0;  else if (e1 - s1 != e2 - s2)    return 0;  else    return memcmp(s1, s2, e1 - s1) == 0;}const char *reference::get_sort_field(int i, int si, int ssi,				      const char **endp) const{  const char *start = sort_key.contents();  const char *end = start + sort_key.length();  if (i < 0) {    *endp = end;    return start;  }  while (--i >= 0) {    start = (char *)memchr(start, SORT_SEP, end - start);    if (!start)      return 0;    start++;  }  const char *e = (char *)memchr(start, SORT_SEP, end - start);  if (e)    end = e;  if (si < 0) {    *endp = end;    return start;  }  while (--si >= 0) {    start = (char *)memchr(start, SORT_SUB_SEP, end - start);    if (!start)      return 0;    start++;  }  e = (char *)memchr(start, SORT_SUB_SEP, end - start);  if (e)    end = e;  if (ssi < 0) {    *endp = end;    return start;  }  while (--ssi >= 0) {    start = (char *)memchr(start, SORT_SUB_SUB_SEP, end - start);    if (!start)      return 0;    start++;  }  e = (char *)memchr(start, SORT_SUB_SUB_SEP, end - start);  if (e)    end = e;  *endp = end;  return start;}

⌨️ 快捷键说明

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