xref: /original-bsd/old/refer/refer/refer2.c (revision b1c8cee5)
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 
doref(line1)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 
newline(s)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 
choices(buff)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 
control(c)187 control(c)
188 {
189 	if (c == '.')
190 		return(1);
191 	if (c == '%')
192 		return(1);
193 	return(0);
194 }
195