# include "refer.h" static char seenstr[60]; static int etal(char *); static int seen(int); void putref(int n, char *tvec[]) { char *s, *tx, *sq; char buf1[LLINE], buf2[50]; int nauth = 0, ned = 0, edrev = authrev, i, lastype = 0, cch, macro = 0, la, le; int lauth = 0, led = 0, ltitle = 0, lother = 0; # if D1 fprintf(stderr, "in putref, fo is %o\n", fo); #endif if (!preserve) fprintf(fo, ".]-%c", sep); else fprintf(fo, ".[%c", sep); # define dsde (macro? "de" : "ds") # define ifnl (macro? sep : ' ') seenstr[0] = 0; for (i = 0; i < n; i++) { s = tvec[i]; if (*s == 0) continue; if (control(s[0]) ) { if (lastype && macro) fprintf(fo, "..%c", sep); if (control(s[1])) { cch = s[2]; tx = s + 3; macro = 1; } else { cch = s[1]; tx = s + 2; macro = 0; } } else { cch = lastype; tx = s; } # if D1 fprintf(stderr, "smallcaps %s cch %c\n", smallcaps, cch); #endif if (preserve) { fprintf(fo, "%s%c", s, sep); continue; } if (mindex (smallcaps, cch)) tx = caps(tx, buf1); # if D1 fprintf(stderr, " s %o tx %o %s\n", s, tx, tx); #endif if (!control(s[0]) || (s[1] != 'A' && s[1] != 'E' && mindex(appfld, s[1]) && seen(s[1]))) /* append to previous item */ { if (control(s[0])) lastype = s[1]; if (lastype != 0) { if (macro) fprintf(fo, "%s%c", tx, sep); else fprintf(fo, ".as [%c \" %s%c", lastype, tx, sep); if (lastype == 'T') ltitle = (mindex(".;,?", last(tx)) != 0); if (lastype == 'O') lother = (mindex(".;,?", last(tx)) != 0); } continue; } if (mindex(ignfld, cch)) /* skip XYZ[] */ { lastype = 0; continue; } else if (cch == 'A') { if (nauth < authrev) tx = revname(tx, buf2); if (nauth++ == 0) if (macro) fprintf(fo, ".de [%c%c%s%c", cch, sep, tx, sep); else fprintf(fo, ".ds [%c%s%c", cch, tx, sep); else { la = (tvec[i+1][1] != cch); fprintf(fo, ".as [%c \"", cch); if (!la) fprintf(fo, ","); if (la && !etal(tx)) { if (strncmp(tx, " others", 7) != 0) fprintf(fo, "%s", mindex(smallcaps, cch) ? " \\s-2\\*([z\\s+2" : "\\*([a"); else fprintf(fo, "%s", mindex(smallcaps, cch) ? " \\s-2AND\\s+2" : " and"); } fprintf(fo, "%s%c", tx, sep); } lauth = last(tx) == '.'; } else if (cch == 'E') { if (ned < edrev) tx = revname(tx, buf2); if (ned++ == 0) if (macro) fprintf(fo, ".de [%c%c%s%c", cch, sep, tx, sep); else fprintf(fo, ".ds [%c%s%c", cch, tx, sep); else { le = (tvec[i+1][1] != cch); fprintf(fo, ".as [%c \"", cch); if (!le) fprintf(fo, ","); if (le && !etal(tx)) { if (strncmp(tx, " others", 7) != 0) fprintf(fo, "%s", mindex(smallcaps, cch) ? " \\s-2\\*([z\\s+2" : " \\*([a"); else fprintf(fo, "%s", mindex(smallcaps, cch) ? " \\s-2AND\\s+2" : " and"); } fprintf(fo, "%s%c", tx, sep); } led = last(tx) == '.'; } else { if (cch == 'D' && yearonly) { sq = tx + strlen(tx); while (*--sq != ' ' && sq > tx) ; if (sq > tx) tx = sq; } if (macro) fprintf(fo, ".de [%c%c%s%c", cch, sep, tx, sep); else fprintf(fo, ".ds [%c%s%c", cch, tx, sep); } if (cch == 'P') fprintf(fo, ".nr [P %d%c", mindex(s, '-') != 0, sep); lastype = cch; if (cch == 'T') ltitle = (mindex(".;,?", last(tx)) != 0); if (cch == 'O') lother = (mindex(".;,?", last(tx)) != 0); } if (lastype && macro) fprintf(fo, "..%c", sep); if (!preserve) { fprintf(fo, ".nr [T %d%c", ltitle, sep); fprintf(fo, ".nr [A %d%c", lauth, sep); fprintf(fo, ".nr [E %d%c", led, sep); fprintf(fo, ".nr [O %d%c", lother, sep); fprintf (fo, ".][ %s%c", class(n, tvec), '\n'); } else fprintf(fo, ".]\n"); } int tabs(char *sv[], char *line, int nf) { char *p; int n = 0; if (n >= nf) return -1; sv[n++] = line; for ( p = line; *p; p++) { if (*p == '\n') { *p = 0; if (n >= nf) return -1; sv[n++] = p + 1; } } return n - 1; } char*class(int nt, char *tv[]) { if (hastype (nt, tv, 'J')) return "1 journal-article"; if (hastype (nt, tv, 'B')) return "3 article-in-book"; if (hastype (nt, tv, 'R')) return "4 tech-report"; if (hastype (nt, tv, 'G')) return "4 tech-report"; if (hastype (nt, tv, 'I')) return "2 book"; if (hastype (nt, tv, 'M')) return "5 bell-tm"; return "0 other"; } int hastype(int nt, char *tv[], int c) { int i; for (i = 0; i < nt; i++) if ( control(tv[i][0]) && tv[i][1] == c ) return 1; return 0; } char *caps(char *a, char *b) { char *p; int c, alph, this; p = b; alph = 0; while (c = *a++) { this = isalpha(c); if (this && alph == 1) { *b++ = '\\'; *b++ = 's'; *b++ = '-'; *b++ = '2'; } if (!this && alph > 1) { *b++ = '\\'; *b++ = 's'; *b++ = '+'; *b++ = '2'; } if (this) c &= (~040); *b++ = c; alph = this ? alph + 1 : 0; } if (alph > 1) { *b++ = '\\'; *b++ = 's'; *b++ = '+'; *b++ = '2'; } *b = 0; return p; } char *revname(char *s, char *b) { char *init, *name, *jr, *p, *bcop; if (etal(s)) return s; bcop = b; init = name = s; while (*name) name++; jr = name; while (name > init && *name != ' ') name--; if (name[-1] == ',' || name[-1] == '(' ) { jr = --name; while (name > init && *name != ' ') name--; } p = name; while (p < jr) *b++ = *p++; if (init < name && nocomma == 0) *b++ = ','; while (init < name) *b++ = *init++; if (*jr) jr++; while (*jr) *b++ = *jr++; *b = 0; return bcop; } int last(char *s) { while (*s) s++; return *--s; } static int seen(int c) { char *s; s = mindex(seenstr, c); if (s != NULL) return 1; for (s = seenstr; *s; s++) ; *s++ = c; *s = 0; return 0; } static int etal(char *s) { return strncmp(s, " et al", 6) == 0 || strncmp(s, " et. al.", 8) == 0; }