1fbb1e002Stut #ifndef lint 2*41469b71Sbloom static char *sccsid = "@(#)refer2.c 4.3 (Berkeley) 07/29/85"; 3fbb1e002Stut #endif 4fbb1e002Stut 5fbb1e002Stut #include "refer..c" 6fbb1e002Stut #define NFLD 30 7fbb1e002Stut #define TLEN 512 8fbb1e002Stut 9fbb1e002Stut extern FILE *in; 10fbb1e002Stut char one[ANSLEN]; 11fbb1e002Stut int onelen = ANSLEN; 12*41469b71Sbloom extern char usedir[]; 13fbb1e002Stut 14fbb1e002Stut doref(line1) 15fbb1e002Stut char *line1; 16fbb1e002Stut { 17fbb1e002Stut char buff[QLEN], dbuff[3*QLEN]; 18fbb1e002Stut char answer[ANSLEN], temp[TLEN], line[BUFSIZ]; 19fbb1e002Stut char *p, **sr, *flds[NFLD], *r; 20fbb1e002Stut int stat, nf, nr, query = 0, alph, digs; 21fbb1e002Stut 22fbb1e002Stut again: 23fbb1e002Stut buff[0] = dbuff[0] = NULL; 24fbb1e002Stut if (biblio && Iline == 1 && line1[0] == '%') 25fbb1e002Stut strcat(dbuff, line1); 26fbb1e002Stut while (input(line)) { /* get query */ 27fbb1e002Stut Iline++; 28fbb1e002Stut if (prefix(".]", line)) 29fbb1e002Stut break; 30fbb1e002Stut if (biblio && line[0] == '\n') 31fbb1e002Stut break; 32fbb1e002Stut if (biblio && line[0] == '%' && line[1] == *convert) 33fbb1e002Stut break; 34fbb1e002Stut if (control(line[0])) 35fbb1e002Stut query = 1; 36fbb1e002Stut strcat(query ? dbuff : buff, line); 37fbb1e002Stut if (strlen(buff) > QLEN) 38fbb1e002Stut err("query too long (%d)", strlen(buff)); 39fbb1e002Stut if (strlen(dbuff) > 3 * QLEN) 40fbb1e002Stut err("record at line %d too long", Iline-1); 41fbb1e002Stut } 42fbb1e002Stut if (biblio && line[0] == '\n' && feof(in)) 43fbb1e002Stut return; 44fbb1e002Stut if (strcmp(buff, "$LIST$\n")==0) { 45fbb1e002Stut assert (dbuff[0] == 0); 46fbb1e002Stut dumpold(); 47fbb1e002Stut return; 48fbb1e002Stut } 49fbb1e002Stut answer[0] = 0; 50fbb1e002Stut for (p = buff; *p; p++) { 51fbb1e002Stut if (isupper(*p)) 52fbb1e002Stut *p |= 040; 53fbb1e002Stut } 54fbb1e002Stut alph = digs = 0; 55fbb1e002Stut for (p = buff; *p; p++) { 56fbb1e002Stut if (isalpha(*p)) 57fbb1e002Stut alph++; 58fbb1e002Stut else 59fbb1e002Stut if (isdigit(*p)) 60fbb1e002Stut digs++; 61fbb1e002Stut else { 62fbb1e002Stut *p = 0; 63fbb1e002Stut if ((alph+digs < 3) || common(p-alph)) { 64fbb1e002Stut r = p-alph; 65fbb1e002Stut while (r < p) 66fbb1e002Stut *r++ = ' '; 67fbb1e002Stut } 68fbb1e002Stut if (alph == 0 && digs > 0) { 69fbb1e002Stut r = p-digs; 70fbb1e002Stut if (digs != 4 || atoi(r)/100 != 19) { 71fbb1e002Stut while (r < p) 72fbb1e002Stut *r++ = ' '; 73fbb1e002Stut } 74fbb1e002Stut } 75fbb1e002Stut *p = ' '; 76fbb1e002Stut alph = digs = 0; 77fbb1e002Stut } 78fbb1e002Stut } 79fbb1e002Stut one[0] = 0; 80fbb1e002Stut if (buff[0]) { /* do not search if no query */ 81fbb1e002Stut for (sr = rdata; sr < search; sr++) { 82fbb1e002Stut temp[0] = 0; 83fbb1e002Stut corout(buff, temp, "hunt", *sr, TLEN); 84fbb1e002Stut assert(strlen(temp) < TLEN); 85fbb1e002Stut if (strlen(temp)+strlen(answer) > BUFSIZ) 86fbb1e002Stut err("Accumulated answers too large",0); 87fbb1e002Stut strcat(answer, temp); 88fbb1e002Stut if (strlen(answer)>BUFSIZ) 89fbb1e002Stut err("answer too long (%d)", strlen(answer)); 90fbb1e002Stut if (newline(answer) > 0) 91fbb1e002Stut break; 92fbb1e002Stut } 93fbb1e002Stut } 94fbb1e002Stut assert(strlen(one) < ANSLEN); 95fbb1e002Stut assert(strlen(answer) < ANSLEN); 96fbb1e002Stut if (buff[0]) 97fbb1e002Stut switch (newline(answer)) { 98fbb1e002Stut case 0: 99fbb1e002Stut fprintf(stderr, "No such paper: %s\n", buff); 100fbb1e002Stut return; 101fbb1e002Stut default: 102fbb1e002Stut fprintf(stderr, "Too many hits: %s\n", trimnl(buff)); 103fbb1e002Stut choices(answer); 104fbb1e002Stut p = buff; 105fbb1e002Stut while (*p != '\n') 106fbb1e002Stut p++; 107fbb1e002Stut *++p = 0; 108fbb1e002Stut case 1: 109fbb1e002Stut if (endpush) 110fbb1e002Stut if (nr = chkdup(answer)) { 111fbb1e002Stut if (bare < 2) { 112fbb1e002Stut nf = tabs(flds, one); 113fbb1e002Stut nf += tabs(flds+nf, dbuff); 114fbb1e002Stut assert(nf < NFLD); 11562648154Sralph putsig(nf,flds,nr,line1,line,0); 116fbb1e002Stut } 117fbb1e002Stut return; 118fbb1e002Stut } 119fbb1e002Stut if (one[0] == 0) 120*41469b71Sbloom corout(answer, one, "deliv", usedir, QLEN); 121fbb1e002Stut break; 122fbb1e002Stut } 123fbb1e002Stut assert(strlen(buff) < QLEN); 124fbb1e002Stut assert(strlen(one) < ANSLEN); 125fbb1e002Stut nf = tabs(flds, one); 126fbb1e002Stut nf += tabs(flds+nf, dbuff); 127fbb1e002Stut assert(nf < NFLD); 128fbb1e002Stut refnum++; 129fbb1e002Stut if (sort) 130fbb1e002Stut putkey(nf, flds, refnum, keystr); 131fbb1e002Stut if (bare < 2) 13262648154Sralph putsig(nf, flds, refnum, line1, line, 1); 133fbb1e002Stut else 134fbb1e002Stut flout(); 135fbb1e002Stut putref(nf, flds); 136fbb1e002Stut if (biblio && line[0] == '\n') 137fbb1e002Stut goto again; 138fbb1e002Stut if (biblio && line[0] == '%' && line[1] == *convert) 139fbb1e002Stut fprintf(fo, "%s%c%s", convert+1, sep, line+3); 140fbb1e002Stut } 141fbb1e002Stut 142fbb1e002Stut newline(s) 143fbb1e002Stut char *s; 144fbb1e002Stut { 145fbb1e002Stut int k = 0, c; 146fbb1e002Stut 147fbb1e002Stut while (c = *s++) 148fbb1e002Stut if (c == '\n') 149fbb1e002Stut k++; 150fbb1e002Stut return(k); 151fbb1e002Stut } 152fbb1e002Stut 153fbb1e002Stut choices(buff) 154fbb1e002Stut char *buff; 155fbb1e002Stut { 156fbb1e002Stut char ob[BUFSIZ], *p, *r, *q, *t; 157fbb1e002Stut int nl; 158fbb1e002Stut 159fbb1e002Stut for (r = p = buff; *p; p++) { 160fbb1e002Stut if (*p == '\n') { 161fbb1e002Stut *p++ = 0; 162*41469b71Sbloom corout(r, ob, "deliv", usedir, BUFSIZ); 163fbb1e002Stut nl = 1; 164fbb1e002Stut for (q = ob; *q; q++) { 165fbb1e002Stut if (nl && (q[0]=='.'||q[0]=='%') && q[1]=='T') { 166fbb1e002Stut q += 3; 167fbb1e002Stut for (t = q; *t && *t != '\n'; t++) 168fbb1e002Stut ; 169fbb1e002Stut *t = 0; 170fbb1e002Stut fprintf(stderr, "%.70s\n", q); 171fbb1e002Stut q = 0; 172fbb1e002Stut break; 173fbb1e002Stut } 174fbb1e002Stut nl = *q == '\n'; 175fbb1e002Stut } 176fbb1e002Stut if (q) 177fbb1e002Stut fprintf(stderr, "??? at %s\n",r); 178fbb1e002Stut r=p; 179fbb1e002Stut } 180fbb1e002Stut } 181fbb1e002Stut } 182fbb1e002Stut 183fbb1e002Stut control(c) 184fbb1e002Stut { 185fbb1e002Stut if (c == '.') 186fbb1e002Stut return(1); 187fbb1e002Stut if (c == '%') 188fbb1e002Stut return(1); 189fbb1e002Stut return(0); 190fbb1e002Stut } 191