xref: /original-bsd/old/refer/refer/refer2.c (revision 41469b71)
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