xref: /titanic_44/usr/src/cmd/refer/refer5.c (revision bd335c6465ddbafe543900df4b03247bfa288eff)
1 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
2 /*	  All Rights Reserved  	*/
3 
4 
5 /*
6  * Copyright (c) 1980 Regents of the University of California.
7  * All rights reserved. The Berkeley software License Agreement
8  * specifies the terms and conditions for redistribution.
9  */
10 
11 /*
12  * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
13  * All Rights Reserved.
14  */
15 
16 #pragma ident	"%Z%%M%	%I%	%E% SMI"
17 
18 #include "refer..c"
19 #define SAME 0
20 #define NFLAB 3000		/* number of bytes to record all labels */
21 #define NLABC 1000		/* max number of labels */
22 
23 static char sig[MXSIG];
24 static char bflab[NFLAB];
25 static char *labtab[NLABC];
26 static char *lbp = bflab;
27 static char labc[NLABC];
28 static char stbuff[50];
29 static int  prevsig;
30 
31 putsig (nf, flds, nref, nstline, endline, toindex)   /* choose signal style */
32 char *flds[], *nstline, *endline;
33 {
34 	char t[100], t1[MXSIG], t2[100], format[10], *sd, *stline;
35 	int addon, another = 0;
36 	static FILE *fhide = 0;
37 	int i;
38 	char tag;
39 
40 	if (labels) {
41 		if (nf == 0)	/* old */
42 			sprintf(t, "%s%c", labtab[nref], labc[nref]);
43 		else {
44 			*t = 0;
45 			if (keywant)
46 				fpar(nf, flds, t, keywant, 1, 0);
47 			if (science && t[0] == 0) {
48 				if (fpar(nf, flds, t, 'A', 1, 0) != 0) {
49 					if (fpar(nf, flds, t2, 'D', 1, 0) != 0) {
50 						strcat(t, ", ");
51 						strcat(t, t2);
52 					}
53 				}
54 			} else if (t[0] == 0) {
55 				sprintf(format,
56 					nmlen>0 ? "%%.%ds%%s" : "%%s%%s",
57 					nmlen);
58 				/* format is %s%s for default labels */
59 				/* or %.3s%s eg if wanted */
60 				if (fpar(nf, flds, t2, 'D', 1, 0)) {
61 					sd = t2;
62 					if (dtlen > 0) {
63 						int n = strlen(sd) - dtlen;
64 						if (n > 0)
65 							sd += n;
66 					}
67 				} else {
68 					sd = "";
69 				}
70 				t1[0] = 0;
71 				fpar(nf, flds, t1, 'A', 1, 0);
72 				sprintf(t, format, t1, sd);
73 			}
74 			if (keywant) {
75 				addon = 0;
76 				for (sd = t; *sd; sd++)
77 					;
78 				if (*--sd == '-') {
79 					addon = 1;
80 					*sd = 0;
81 				}
82 			}
83 			if ((!keywant || addon) && !science) {
84 			    addch(t, keylet(t, nref));
85 			}
86 			else {
87 			    tokeytab (t,nref);
88 			}
89 		}
90 	}
91 	else {
92 		if (sort)
93 			sprintf(t, "%c%d%c", FLAG, nref, FLAG);
94 		else
95 			sprintf(t, "%d", nref);
96 	}
97 	another = (sd = lookat()) ? prefix(".[", sd) : 0;
98 	if (another && (strcmp(".[\n", sd) != SAME))
99 		fprintf(stderr, (char *)gettext("File %s line %d: punctuation ignored from: %s"),
100 			Ifile, Iline, sd);
101 	if ((strlen(sig) + strlen(t)) > MXSIG)
102 		err(gettext("sig overflow (%d)"), MXSIG);
103 	strcat(sig, t);
104 #if EBUG
105 	fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
106 #endif
107 	trimnl(nstline);
108 	trimnl(endline);
109 	stline = stbuff;
110 	if (prevsig == 0) {
111 		strcpy (stline, nstline);
112 		prevsig=1;
113 	}
114 	if (stline[2] || endline[2]) {
115 		stline += 2;
116 		endline += 2;
117 	}
118 	else {
119 		stline  = "\\*([.";
120 		endline = "\\*(.]";
121 	}
122 	if (science) {
123 		stline = " (";
124 		endline = ")";
125 	}
126 	if (bare == 0) {
127 		if (!another) {
128 			sprintf(t1, "%s%s%s\n", stline, sig, endline);
129 			if (strlen(t1) > MXSIG)
130 				err(gettext("t1 overflow (%d)"), MXSIG);
131 			append(t1);
132 			flout();
133 			sig[0] = 0;
134 			prevsig = 0;
135 			if (fo == fhide) {
136 				int ch;
137 				fclose(fhide);
138 				fhide = fopen(hidenam, "r");
139 				fo = ftemp;
140 				while ((ch = getc(fhide)) != EOF)
141 					putc(ch, fo);
142 				fclose(fhide);
143 				unlink(hidenam);
144 			}
145 		}
146 		else {
147 			if (labels) {
148 				strcat(sig, ",\\|");
149 			} else {
150 				/*
151 				 * Seperate reference numbers with AFLAG
152 				 * for later sorting and condensing.
153 				 */
154 				t1[0] = AFLAG;
155 				t1[1] = '\0';
156 				strcat(sig, t1);
157 			}
158 			if (fo == ftemp) {	/* hide if need be */
159 				sprintf(hidenam, "/tmp/rj%dc", getpid());
160 #if EBUG
161 				fprintf(stderr, "hiding in %s\n", hidenam);
162 #endif
163 				fhide = fopen(hidenam, "w");
164 				if (fhide == NULL)
165 					err(gettext("Can't get scratch file %s"),
166 						hidenam);
167 				fo = fhide;
168 			}
169 		}
170 	}
171 	if (bare < 2)
172 		if (nf > 0 && toindex)
173 			fprintf(fo,".ds [F %s%c",t,sep);
174 	if (bare > 0)
175 		flout();
176 #if EBUG
177 	fprintf(stderr, "sig is now %s\n",sig);
178 #endif
179 }
180 
181 char *
182 fpar (nf, flds, out, c, seq, prepend)
183 char *flds[], *out;
184 {
185 	char *p, *s;
186 	int i, fnd = 0;
187 
188 	for(i = 0; i < nf; i++)
189 		if (flds[i][1] == c && ++fnd >= seq) {
190 			/* for titles use first word otherwise last */
191 			if (c == 'T' || c == 'J') {
192 				p = flds[i]+3;
193 				if (prefix("A ", p))
194 					p += 2;
195 				if (prefix("An ", p))
196 					p += 3;
197 				if (prefix("The ", p))
198 					p += 4;
199 				mycpy2(out, p, 20);
200 				return(out);
201 			}
202 			/* if its not 'L' then use just the last word */
203 			s = p = flds[i]+2;
204 			if (c != 'L') {
205 			    for(; *p; p++);
206 			    while (p > s && *p != ' ')
207 				    p--;
208 			}
209 			/* special wart for authors */
210 			if (c == 'A' && (p[-1] == ',' || p[1] =='(')) {
211 				p--;
212 				while (p > s && *p != ' ')
213 					p--;
214 				mycpy(out, p+1);
215 			}
216 			else
217 				strcpy(out, p+1);
218 			if (c == 'A' && prepend)
219 				initadd(out, flds[i]+2, p);
220 			return(out);
221 		}
222 	return(0);
223 }
224 
225 putkey(nf, flds, nref, keystr)
226 char *flds[], *keystr;
227 {
228 	char t1[50], *sf;
229 	int ctype, i, count;
230 
231 	fprintf(fo, ".\\\"");
232 	if (nf <= 0)
233 		fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
234 	else {
235 		while (ctype = *keystr++) {
236 			count = atoi(keystr);
237 			if (*keystr=='+')
238 				count=999;
239 			if (count <= 0)
240 				count = 1;
241 			for(i = 1; i <= count; i++) {
242 				sf = fpar(nf, flds, t1, ctype, i, 1);
243 				if (sf == 0)
244 					break;
245 				sf = artskp(sf);
246 				fprintf(fo, "%s%c", sf, '-');
247 			}
248 		}
249 		fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep);
250 	}
251 }
252 
253 
254 tokeytab (t, nref)
255 char *t;
256 {
257 	strcpy(labtab[nref]=lbp, t);
258 	while (*lbp++)
259 		;
260 }
261 
262 keylet(t, nref)
263 char *t;
264 {
265 	int i;
266 	int x = 'a' - 1;
267 
268 	for(i = 1; i < nref; i++) {
269 		if (strcmp(labtab[i], t) == 0)
270 			x = labc[i];
271 	}
272 	tokeytab (t, nref);
273 	if (lbp-bflab > NFLAB)
274 		err(gettext("bflab overflow (%d)"), NFLAB);
275 	if (nref > NLABC)
276 		err(gettext("nref in labc overflow (%d)"), NLABC);
277 #if EBUG
278 	fprintf(stderr, "lbp up to %d of %d\n", lbp-bflab, NFLAB);
279 #endif
280 	return(labc[nref] = x+1);
281 }
282 
283 mycpy(s, t)
284 char *s, *t;
285 {
286 	while (*t && *t != ',' && *t != ' ')
287 		*s++ = *t++;
288 	*s = 0;
289 }
290 
291 mycpy2(s, t, n)
292 char *s, *t;
293 {
294 	int c;
295 
296 	while (n-- && (c= *t++) > 0) {
297 		if (c == ' ')
298 			c = '-';
299 		*s++ = c;
300 	}
301 	*s = 0;
302 }
303 
304 initadd(to, from, stop)
305 char *to, *from, *stop;
306 {
307 	int c, nalph = 1;
308 
309 	while (*to)
310 		to++;
311 	while (from < stop) {
312 		c = *from++;
313 		if (!isalpha(c)) {
314 			if (nalph)
315 				*to++ = '.';
316 			nalph = 0;
317 			continue;
318 		}
319 		if (nalph++ == 0)
320 			*to++ = c;
321 	}
322 	*to = 0;
323 }
324 
325 static char *articles[] = {
326 	"the ", "an ", "a ", 0
327 };
328 
329 char *
330 artskp(s)	/* skips over initial "a ", "an ", "the " in s */
331 char *s;
332 {
333 
334 	char **p, *r1, *r2;
335 
336 	for (p = articles; *p; p++) {
337 		r2 = s;
338 		for (r1 = *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
339 			r2++;
340 		if (*r1 == 0 && *r2 != 0)
341 			return(r2);
342 	}
343 	return(s);
344 }
345