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

📄 bibargs.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
            for (fp = field; *fp; )               *cp++ = *fp++;            }         else if (c == '{') {                   /* other information   */            while (*p != '}')               if (*p == 0)                  error("unexpected end of citation template");               else                  *cp++ = *p++;            p++;            }         else if (c == '<') {            while (*p != '>') {               if (*p == 0)                  error("unexpected end of citation template");               else                  *cp++ = *p++;               }            p++;            }         else if (c != '@')            *cp++ = c;         }      }   *cp++ = 0;}/* alternate alphabetic citation style -        if 1 author - first three letters of last name        if 2 authors - first two letters of first, followed by first letter of                                seond        if 3 or more authors - first letter of first three authors */   char *aabet(cp, ref)   char *cp, ref[];{  char field[REFSIZE], temp[100];   reg char *np, *fp;   int j, getname();   if (getname(1, field, temp, ref)) {      np = cp;      fp = field;      for (j = 1; j <= 3; j++)         if (*fp != 0)            *cp++ = *fp++;      if (getname(2, field, temp, ref))         np[2] = field[0];      if (getname(3, field, temp, ref)) {         np[1] = np[2];         np[2] = field[0];         }      }return(cp);}/* alternate alphabetic citation style -	first two characters of last names of all authors	up to max_klen characters.*/   char *fullaabet(cp, ref)   char *cp, ref[];{  char field[REFSIZE], temp[100];   reg char	*fp;   char	*lastcp;   int getname();   int i;   lastcp = cp + max_klen;   for (i= 1; getname(i, field, temp, ref); i++) {      for (fp = field; *fp && (fp < &(field[3])); )	 if (cp > lastcp)	     break;         else if (isalpha(*fp))	     *cp++ = *fp++;	 else	     fp++;   }   return(cp);}/* alternate alphabetic citation style -	entire last name of senior author*/   char *aabetlast(cp, ref)   char *cp, ref[];{  char field[REFSIZE], temp[100];   reg char	*fp;   int getname();   if (getname(1, field, temp, ref)) {      for (fp = field; *fp; )         *cp++ = *fp++;   }   return(cp);}/*   Multiple full authors last names (1, 2 or 3 full names).  If maxauthors<3        if 1 author - last name date        if 2 authors - last name and last name date        if 3 or more authors - last name et al. date  If maxauthors>=3        if 1 author - last name date        if 2 authors - last name and last name date        if 3 authors - last name, last name and last name date        if 4 or more authors - last name et al. date */   char *multfull(cp, ref, maxauthors)   char *cp, ref[];   int maxauthors;{  char name1[100], name2[100], name3[100], temp[100];   reg char *fp;   int getname();   if (getname(1, name1, temp, ref)) {      for (fp = name1; *fp; )         *cp++ = *fp++;      if (((maxauthors >= 3) && (getname(4, name3, temp, ref)))	  || ((maxauthors < 3) && (getname(3, name3, temp, ref)))) {         for (fp = " \\*(e]"; *fp; )            *cp++ = *fp++;         }      else if (getname(2, name2, temp, ref)) {         if (getname(3, name3, temp, ref)) {            for (fp = "\\*(c]"; *fp; )               *cp++ = *fp++;            for (fp = name2; *fp; )               *cp++ = *fp++;            for (fp = "\\*(m]"; *fp; )               *cp++ = *fp++;            for (fp = name3; *fp; )               *cp++ = *fp++;            }         else {            for (fp = "\\*(n]"; *fp; )               *cp++ = *fp++;            for (fp = name2; *fp; )               *cp++ = *fp++;            }         }    }return(cp);}/* getfield - get a single field from reference */   char *getfield(ptr, field, ref)   char *ptr, field[], ref[];{  reg	char *p, *q;   char	temp[100];   int  n, len, i, getname();   field[0] = 0;   if (*ptr == 'A')      getname(1, field, temp, ref);   else      for (p = ref; *p != '\0'; p++)         if (*p == '%' && *(p+1) == *ptr) {            for (p = p + 2; isspace(*p); p++)               ;            for (q = field; (*p != '\n') && (*p != '\0'); )               *q++ = *p++;            *q = 0;            break;            }   n = 0;   len = strlen(field);   if (*++ptr == '-') {      for (ptr++; isdigit(*ptr); ptr++)         n = 10 * n + (*ptr - '0');      if (n > len)         n = 0;      else         n = len - n;      for (i = 0; field[i] = field[i+n]; i++)         ;      }   else if (isdigit(*ptr)) {      for (; isdigit(*ptr); ptr++)         n = 10 * n + (*ptr - '0');      if (n > len)         n = len;      field[n] = 0;      }   if (*ptr == 'u') {      ptr++;      for (p = field; *p; p++)         if (islower(*p))            *p = (*p - 'a') + 'A';      }   else if (*ptr == 'l') {      ptr++;      for (p = field; *p; p++)         if (isupper(*p))            *p = (*p - 'A') + 'a';      }   return(ptr);}/* getname - get the nth name field from reference, breaking into             first and last names */   int getname(n, last, first, ref)   int  n;   char last[], first[], ref[];{  reg char *p;   int  m;   m = n;   for (p = ref; *p; p++)      if (*p == '%' & *(p+1) == 'A') {         n--;         if (n == 0) {            for (p = p + 2; *p == ' '; p++) ;            breakname(p, first, last) ;            return(true);            }         }   if (n == m)          /* no authors, try editors */      for (p = ref; *p; p++)         if (*p == '%' & *(p+1) == 'E') {            n--;            if (n == 0) {               for (p = p + 2; *p == ' '; p++) ;               breakname(p, first, last) ;               return(true);               }            }   if (n == m) {        /* no editors, either, try institution */      first[0] = last[0] = '\0';      getfield("I", last, ref);      if (last[0] != '\0')         return(true);      }   return(false);}/* disambiguate - compare adjacent citation strings, and if equal, add                  single character disambiguators */   disambiguate(){  reg int i, j;	char adstr;   for (i = 0; i < numrefs-1; i = j) {      j = i + 1;      if (strcmp(refinfo[i].ri_cite, refinfo[j].ri_cite)==0) {         adstr = 'a';         for(j = i+1;	     j<numrefs && strcmp(refinfo[i].ri_cite,refinfo[j].ri_cite) == 0;	     j++) {            adstr = 'a' + (j-i);	    refinfo[j].ri_disambig[0] = adstr;            }	 refinfo[i].ri_disambig[0] = 'a';         }     }  for (i = 0; i < numrefs; i++){	strcat(refinfo[i].ri_cite, refinfo[i].ri_disambig);  }}/* bldname - build a name field             doing abbreviations, reversals, and caps/small caps*/   bldname(first, last, name, reverse)   char *first, *last, name[];   int reverse;{   char newfirst[120], newlast[120];   reg char *p, *q, *f, *l;   char *scopy();   int  flag;   if (abbrev) {      p = first;      q = newfirst;      flag = false;      while (*p) {         while (*p == ' ')            p++;         if (*p == 0)            break;         if (isupper(*p)) {            if (flag)           /* between initial gap */               q = scopy(q, "\\*(a]");            flag = true;            *q++ = *p;            q = scopy(q, "\\*(p]");            }         if (*++p == '.')            p++;         else while (*p != 0 && ! isspace(*p))            p++;         }      *q = 0;      f = newfirst;      }   else      f = first;   if (capsmcap) {      p = last;      q = newlast;      flag = 0;  /* 1 - printing cap, 2 - printing small */      while (*p)         if (islower(*p)) {            if (flag != 2)               q = scopy(q, "\\s-2");            flag = 2;            *q++ = (*p++ - 'a') + 'A';            }         else {            if (flag == 2)               q = scopy(q,"\\s+2");            flag = 1;            *q++ = *p++;            }      if (flag == 2)         q = scopy(q, "\\s+2");      *q = 0;      l = newlast;      }   else      l = last;   if (f[0] == 0)      sprintf(name, "%s\n", l);   else if (reverse)      sprintf(name, "%s\\*(b]%s\n", l, f);   else      sprintf(name, "%s %s\n", f, l);}/* prtauth - print author or editor field */   prtauth(c, line, num, max, ofd, abbrev, capsmcap, numrev)   char c, *line;   int  num, max, abbrev, capsmcap, numrev;   FILE *ofd;{  char first[LINELENGTH], last[LINELENGTH];   if (num <= numrev || abbrev || capsmcap) {      breakname(line, first, last);      bldname(first, last, line, num <= numrev);      }   if (num == 1)      fprintf(ofd,".ds [%c %s", c, line);   else if (num < max)      fprintf(ofd,".as [%c \\*(c]%s", c, line);   else if (max == 2)      fprintf(ofd,".as [%c \\*(n]%s", c, line);   else      fprintf(ofd,".as [%c \\*(m]%s", c, line);   if (num == max && index(trailstr, c))      fprintf(ofd,".ds ]%c %c\n", c, line[strlen(line)-2]);}/* doline - actually print out a line of reference information */   doline(c, line, numauths, maxauths, numeds, maxeds, ofd)   char c, *line;   int numauths, maxauths, numeds, maxeds;   FILE *ofd;{   int appending;   switch(c) {      case 'A':          prtauth(c, line, numauths, maxauths, ofd, abbrev, capsmcap, numrev);          break;      case 'E':          prtauth(c, line, numeds, maxeds, ofd, edabbrev, edcapsmcap, ednumrev);          if (numeds == maxeds)             fprintf(ofd,".nr [E %d\n", maxeds);          break;      case 'P':          if (index(line, '-'))             fprintf(ofd,".nr [P 1\n");          else             fprintf(ofd,".nr [P 0\n");          fprintf(ofd,".ds [P %s",line);          if (index(trailstr, 'P'))             fprintf(ofd,".ds ]P %c\n",line[strlen(line)-2]);          break;      case 'F': break;      /* these now accumulate their entries */      /* defined by official bib documentation */      case 'K': case 'O': case 'W':       /* not defined by official bib documentation */      case 'H': case 'L': case 'M': case 'Q': case 'U': case 'X': case 'Y':       case 'Z':	 appending = letterSeen[c];	 letterSeen[c] = true;	 if (appending)	    fprintf(ofd, ".as [%c , %s", c, line);	 else	    fprintf(ofd, ".ds [%c %s", c, line);	 if (index(trailstr, c))	    fprintf(ofd, ".ds ]%c %c\n", c, line[strlen(line) - 2]);	 break;      default:	  if (!isupper(c)) break; /* ignore what you don't understand */          fprintf(ofd,".ds [%c %s", c, line);          if (index(trailstr, c))             fprintf(ofd,".ds ]%c %c\n", c, line[strlen(line)-2]);          }}/* dumpref - dump reference number i */   dumpref(i, ofd)   int i;   FILE *ofd;{  char ref[REFSIZE], line[REFSIZE];   reg char *p, *q;   char *from;   int numauths, maxauths, numeds, maxeds;   int j;   if ( i < 0 ) ref[0] = 0; /* ref not found */   else {	   rdref(&refinfo[i], ref);	   maxauths = maxeds = 0;	   numauths = numeds = 0;	   for (j=0; j < 128; j++) letterSeen[j] = 0;	   for (p = ref; *p; p++)	      if (*p == '%')	         if (*(p+1) == 'A') maxauths++;	         else if (*(p+1) == 'E') maxeds++;	   fprintf(ofd, ".[-\n");	   fprintf(ofd, ".ds [F %s\n", refinfo[i].ri_cite);#ifndef INCORE	   fseek(rfd, (long)refinfo[i].ri_pos, 0);	   while (fgets(line, REFSIZE, rfd) != NULL) {#else INCORE	   for (q = line, from = refinfo[i].ri_ref; *from; /*VOID*/) { /*} */		if (*from == '\n'){			*q++ = '\n';			*q = 0;			q = line;			from++;		} else {			*q++ = *from++;			continue;		}#endif INCORE		switch(line[0]){		case 0:			goto doneref;		case '.':			fprintf(ofd, "%s", line);			break;		case '%':			switch(line[1]){			case 'A':	numauths++;	break;			case 'E':	numeds++;	break;			}			for (p = &line[2]; *p == ' '; p++) /*VOID*/;			doline(line[1], p, numauths, maxauths, numeds, maxeds, ofd);		}	   }	   doneref:;	   fprintf(ofd,".][\n");   }}

⌨️ 快捷键说明

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