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