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