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