📄 bibargs.c
字号:
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 + -