xref: /original-bsd/old/refer/refer/refer1.c (revision ff2bc52d)
1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)refer1.c	4.6 (Berkeley) 04/18/91";
7 #endif /* not lint */
8 
9 #include <signal.h>
10 #include "refer..c"
11 #include "pathnames.h"
12 
13 main(argc,argv)		/* process command-line arguments */
14 char *argv[];
15 {
16 	char line[BUFSIZ], *s;
17 	int nodeflt = 0;
18 
19 	signals();
20 	while (argv[1][0] == '-') {
21 		switch(argv[1][1]) {
22 		case 'e':
23 			endpush++;
24 			break;
25 		case 's':
26 			sort++;
27 			endpush = 1;
28 			if (argv[1][2])
29 				keystr = argv[1]+2;
30 			break;
31 		case 'l':
32 			labels++;
33 			s = argv[1]+2;
34 			nmlen = atoi(s);
35 			while (*s)
36 				if (*s++ == ',')
37 					break;
38 			dtlen = atoi(s);
39 			break;
40 		case 'k':
41 			keywant = (argv[1][2] ? argv[1][2] : 'L');
42 			labels++;
43 			break;
44 		case 'n':
45 			nodeflt = 1;
46 			break;
47 		case 'p':
48 			argc--;
49 			argv++;
50 			*search++ = argv[1];
51 			if (search-rdata > NSERCH)
52 				err("too many -p options (%d)", NSERCH);
53 			break;
54 		case 'a':
55 			authrev = atoi(argv[1]+2);
56 			if (authrev<=0)
57 				authrev = 1000;
58 			break;
59 		case 'b':
60 			bare = (argv[1][2] == '1') ? 1 : 2;
61 			break;
62 		case 'c':
63 			smallcaps = argv[1]+2;
64 			break;
65 		case 'f':
66 			refnum = atoi(argv[1]+2) - 1;
67 			break;
68 		case 'B':
69 			biblio++;
70 			bare = 2;
71 			if (argv[1][2])
72 				convert = argv[1]+2;
73 			break;
74 		case 'S':
75 			science++;
76 			labels = 1;
77 			break;
78 		case 'P':
79 			postpunct++;
80 			break;
81 		}
82 		argc--;
83 		argv++;
84 	}
85 	if (getenv("REFER") != NULL)
86 		*search++ = getenv("REFER");
87 	else if (nodeflt == 0)
88 		*search++ = _PATH_IND;
89 	if (!labels) {
90 		sprintf(ofile, "%s/rj%db", _PATH_TMP, getpid());
91 		ftemp = fopen(ofile, "w");
92 		if (ftemp == NULL) {
93 			fprintf(stderr, "Can't open scratch file\n");
94 			exit(1);
95 		}
96 	}
97 	if (endpush) {
98 		sprintf(tfile, "%s/rj%da", _PATH_TMP, getpid());
99 		fo = fopen(tfile, "w");
100 		if (fo == NULL) {
101 			fo = ftemp;
102 			fprintf(stderr, "Can't open scratch file");
103 		}
104 		sep = 002; /* separate records without confusing sort..*/
105 	} else
106 		fo = ftemp;
107 	do {
108 		if (argc > 1) {
109 			fclose(in);
110 			Iline = 0;
111 			in = fopen(Ifile = argv[1], "r");
112 			argc--;
113 			argv++;
114 			if (in == NULL) {
115 				err("Can't read %s", Ifile);
116 				continue;
117 			}
118 		}
119 		while (input(line)) {
120 			Iline++;
121 			if (biblio && *line == '\n')
122 				doref(line);
123 			else if (biblio && Iline == 1 && *line == '%')
124 				doref(line);
125 			else if (!prefix(".[", line))
126 				output(line);
127 			else
128 				doref(line);
129 		}
130 	} while (argc > 1);
131 
132 	if (endpush && fo != NULL)
133 		dumpold();
134 	output("");
135 	if (!labels)
136 		recopy(ofile);
137 	clfgrep();
138 	cleanup();
139 	exit(0);
140 }
141 
142 signals()
143 {
144 	void intr();
145 
146 	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
147 		signal(SIGINT, intr);
148 	signal(SIGHUP, intr);
149 	signal(SIGPIPE, intr);
150 	signal(SIGTERM, intr);
151 }
152 
153 void
154 intr()
155 {
156 	signal(SIGINT, SIG_IGN);
157 	cleanup();
158 	exit(1);
159 }
160 
161 cleanup()
162 {
163 	if (tfile[0])
164 		unlink(tfile);
165 	if (gfile[0])
166 		unlink(gfile);
167 	if (ofile[0])
168 		unlink(ofile);
169 	if (hidenam[0])
170 		unlink(hidenam);
171 }
172