1: #ifndef lint 2: static char *sccsid = "@(#)refer6.c 4.1 (Berkeley) 5/6/83"; 3: #endif 4: 5: #include "refer..c" 6: #define dsde (macro? "de" : "ds") 7: #define ifnl (macro? sep : ' ') 8: 9: putref(n, tvec) 10: char *tvec[]; 11: { 12: char *s, *tx; 13: char buf1[BUFSIZ], buf2[50]; 14: int nauth = 0, i, lastype = 0, cch, macro = 0, la; 15: int lauth = 0, ltitle = 0, lother = 0; 16: 17: fprintf(fo, ".]-%c", sep); 18: for (i = 0; i < n; i++) { 19: s = tvec[i]; 20: if (*s == 0) 21: continue; 22: if (control(s[0])) { 23: if (lastype && macro) 24: fprintf(fo, "..%c", sep); 25: if (control(s[1])) { 26: cch = s[2]; 27: tx = s+3; 28: macro = 1; 29: } 30: else { 31: cch = s[1]; 32: tx = s+2; 33: macro = 0; 34: } 35: } 36: else { 37: cch = lastype; 38: tx = s; 39: } 40: #if EBUG 41: fprintf(stderr, "smallcaps %s cch %c\n",smallcaps, cch); 42: #endif 43: if (mindex(smallcaps, cch)) 44: tx = caps(tx, buf1); 45: #if EBUG 46: fprintf(stderr, " s %o tx %o %s\n",s,tx,tx); 47: #endif 48: if (!control(s[0])) { /* append to previous item */ 49: if (lastype != 0) { 50: if (macro) 51: fprintf(fo, "%s%c", tx, sep); 52: else 53: fprintf(fo, ".as [%c \" %s%c",lastype,tx,sep); 54: if (lastype == 'T') 55: ltitle = (mindex(".;,?", last(tx))!=0); 56: if (lastype == 'A') 57: lauth = last(tx) == '.'; 58: } 59: continue; 60: } 61: if (mindex("XYZ[]", cch)) { /* skip these */ 62: lastype = 0; 63: continue; 64: } 65: else { 66: if (cch == 'A') { 67: if (nauth < authrev) 68: tx = revauth(tx, buf2); 69: if (nauth++ == 0) 70: if (macro) 71: fprintf(fo, 72: ".de [%c%c%s%c",cch,sep,tx,sep); 73: else 74: fprintf(fo, 75: ".ds [%c%s%c", cch,tx,sep); 76: else { 77: la = (tvec[i+1][1]!='A'); 78: fprintf(fo, ".as [A \""); 79: if (la == 0 || nauth != 2) 80: fprintf(fo, ","); 81: if (la) 82: fprintf(fo,"%s", 83: mindex(smallcaps, 'A') ? " \\s-2AND\\s+2" : " and"); 84: fprintf(fo, "%s%c", tx, sep); 85: } 86: lauth = last(tx) == '.'; 87: } 88: else { 89: if (macro) 90: fprintf(fo, 91: ".de [%c%c%s%c",cch,sep,tx,sep); 92: else 93: fprintf(fo, ".ds [%c%s%c",cch,tx, sep); 94: } 95: } 96: if (cch == 'P') 97: fprintf(fo, ".nr [P %d%c", mindex(s, '-')!=0, sep); 98: lastype = cch; 99: if (cch == 'T') 100: ltitle = (mindex(".;,?", last(tx)) != 0); 101: if (cch == 'O') 102: lother = (mindex(".;,?", last(tx)) != 0); 103: } 104: if (lastype && macro) 105: fprintf(fo, "..%c", sep); 106: fprintf(fo, ".nr [T %d%c", ltitle, sep); 107: fprintf(fo, ".nr [A %d%c", lauth, sep); 108: fprintf(fo, ".nr [O %d%c", lother, sep); 109: fprintf(fo, ".][ %s%c", class(n, tvec), '\n'); 110: } 111: 112: tabs (sv, line) 113: char *sv[], *line; 114: { 115: char *p; 116: int n = 0; 117: 118: sv[n++] = line; 119: for (p = line; *p; p++) { 120: if (*p == '\n') { 121: *p = 0; 122: sv[n++] = p+1; 123: } 124: } 125: return(n-1); 126: } 127: 128: char * 129: class (nt, tv) 130: char *tv[]; 131: { 132: if (hastype (nt, tv, 'J')) 133: return("1 journal-article"); 134: if (hastype (nt, tv, 'B')) 135: return("3 article-in-book"); 136: if (hastype (nt, tv, 'R')) 137: return ("4 tech-report"); 138: if (hastype (nt, tv, 'G')) 139: return ("4 tech-report"); 140: if (hastype (nt, tv, 'I')) 141: return("2 book"); 142: if (hastype (nt, tv,'M')) 143: return ("5 bell-tm"); 144: return("0 other"); 145: } 146: 147: hastype (nt, tv, c) 148: char *tv[]; 149: { 150: int i; 151: for (i = 0; i < nt; i++) 152: if (control(tv[i][0]) && tv[i][1]==c ) 153: return(1); 154: return(0); 155: } 156: 157: char * 158: caps(a, b) 159: char *a, *b; 160: { 161: char *p; 162: int c, alph, this; 163: 164: p = b; 165: alph = 0; 166: while (c = *a++) { 167: this = isalpha(c); 168: if (this && alph == 1) { 169: *b++ = '\\'; 170: *b++ = 's'; 171: *b++ = '-'; 172: *b++ = '2'; 173: } 174: if (!this && alph > 1) { 175: *b++ = '\\'; 176: *b++ = 's'; 177: *b++ = '+'; 178: *b++ = '2'; 179: } 180: if (this) 181: c &= (~040); 182: *b++ = c; 183: alph = this ? alph+1 : 0; 184: } 185: if (alph > 1) { 186: *b++ = '\\'; 187: *b++ = 's'; 188: *b++ = '+'; 189: *b++ = '2'; 190: } 191: *b = 0; 192: return(p); 193: } 194: 195: char * 196: revauth(s, b) 197: char *s, *b; 198: { 199: char *init, *name, *jr, *p, *bcop; 200: 201: bcop = b; 202: init = name = s; 203: while (*name) 204: name++; 205: jr = name; 206: while (name > init && *name!= ' ') 207: name--; 208: if (name[-1] == ',' || name[-1]== '(' ) { 209: jr = --name; 210: while (name>init && *name != ' ') 211: name--; 212: } 213: p = name; 214: while (p < jr) 215: *b++ = *p++; 216: *b++ = ','; 217: while (init < name) 218: *b++ = *init++; 219: if (*jr) 220: jr++; 221: while(*jr) 222: *b++ = *jr++; 223: *b++ = 0; 224: return(bcop); 225: } 226: 227: last(s) 228: char *s; 229: { 230: while (*s) 231: s++; 232: return(*--s); 233: }