xref: /illumos-gate/usr/src/cmd/refer/refer1.c (revision 533affcbc7fc4d0c8132976ea454aaa715fe2307)
1 /*
2  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
7 /*	  All Rights Reserved  	*/
8 
9 /*
10  * Copyright (c) 1980 Regents of the University of California.
11  * All rights reserved. The Berkeley software License Agreement
12  * specifies the terms and conditions for redistribution.
13  */
14 
15 #include <stdlib.h>
16 #include <signal.h>
17 #include <locale.h>
18 #include "refer..c"
19 
20 extern void clfgrep();
21 extern void doref();
22 extern void dumpold();
23 extern void err();
24 extern void output();
25 extern int prefix();
26 extern void recopy();
27 
28 void cleanup(void);
29 void signals(void);
30 
31 int
32 main(int argc, char *argv[])	/* process command-line arguments */
33 {
34 	char line[BUFSIZ], *s;
35 	int nodeflt = 0;
36 
37 	(void) setlocale(LC_ALL, "");
38 #if !defined(TEXT_DOMAIN)
39 #define	TEXT_DOMAIN "SYS_TEST"
40 #endif
41 	(void) textdomain(TEXT_DOMAIN);
42 
43 	signals();
44 	while (argc > 1 && argv[1][0] == '-') {
45 		switch (argv[1][1]) {
46 		case 'e':
47 			endpush++;
48 			break;
49 		case 's':
50 			sort++;
51 			endpush = 1;
52 			if (argv[1][2])
53 				keystr = argv[1]+2;
54 			break;
55 		case 'l':
56 			labels++;
57 			s = argv[1]+2;
58 			nmlen = atoi(s);
59 			while (*s)
60 				if (*s++ == ',')
61 					break;
62 			dtlen = atoi(s);
63 			break;
64 		case 'k':
65 			keywant = (argv[1][2] ? argv[1][2] : 'L');
66 			labels++;
67 			break;
68 		case 'n':
69 			nodeflt = 1;
70 			break;
71 		case 'p':
72 			argc--;
73 			argv++;
74 			*search++ = argv[1];
75 			if (search-rdata > NSERCH)
76 				err(gettext(
77 				    "too many -p options (%d)"), NSERCH);
78 			break;
79 		case 'a':
80 			authrev = atoi(argv[1]+2);
81 			if (authrev <= 0)
82 				authrev = 1000;
83 			break;
84 		case 'b':
85 			bare = (argv[1][2] == '1') ? 1 : 2;
86 			break;
87 		case 'c':
88 			smallcaps = argv[1]+2;
89 			break;
90 		case 'f':
91 			refnum = atoi(argv[1]+2) - 1;
92 			break;
93 		case 'B':
94 			biblio++;
95 			bare = 2;
96 			if (argv[1][2])
97 				convert = argv[1]+2;
98 			break;
99 		case 'S':
100 			science++;
101 			labels = 1;
102 			break;
103 		case 'P':
104 			postpunct++;
105 			break;
106 		}
107 		argc--;
108 		argv++;
109 	}
110 	if (getenv("REFER") != NULL)
111 		*search++ = getenv("REFER");
112 	else if (nodeflt == 0)
113 		*search++ = "/usr/lib/refer/papers/Ind";
114 	if (sort && !labels) {
115 		sprintf(ofile, "/tmp/rj%db", getpid());
116 		ftemp = fopen(ofile, "w");
117 		if (ftemp == NULL) {
118 			fprintf(stderr, gettext("Can't open scratch file\n"));
119 			exit(1);
120 		}
121 	}
122 	if (endpush) {
123 		sprintf(tfile, "/tmp/rj%da", getpid());
124 		fo = fopen(tfile, "w");
125 		if (fo == NULL) {
126 			fo = ftemp;
127 			fprintf(stderr, gettext("Can't open scratch file"));
128 		}
129 		sep = 002; /* separate records without confusing sort.. */
130 	} else
131 		fo = ftemp;
132 	do {
133 		if (argc > 1) {
134 			fclose(in);
135 			Iline = 0;
136 			in = fopen(Ifile = argv[1], "r");
137 			argc--;
138 			argv++;
139 			if (in == NULL) {
140 				err(gettext("Can't read %s"), Ifile);
141 				continue;
142 			}
143 		}
144 		while (input(line)) {
145 			Iline++;
146 			if (biblio && *line == '\n')
147 				doref(line);
148 			else if (biblio && Iline == 1 && *line == '%')
149 				doref(line);
150 			else if (!prefix(".[", line))
151 				output(line);
152 			else
153 				doref(line);
154 		}
155 	} while (argc > 1);
156 
157 	if (endpush && fo != NULL)
158 		dumpold();
159 	output("");
160 	if (sort && !labels)
161 		recopy(ofile);
162 	clfgrep();
163 	cleanup();
164 	return (0);
165 }
166 
167 extern void intr();
168 
169 void
170 signals(void)
171 {
172 	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
173 		signal(SIGINT, intr);
174 	signal(SIGHUP, intr);
175 	signal(SIGPIPE, intr);
176 	signal(SIGTERM, intr);
177 }
178 
179 void
180 intr(void)
181 {
182 	signal(SIGINT, SIG_IGN);
183 	cleanup();
184 	exit(1);
185 }
186 
187 void
188 cleanup(void)
189 {
190 	if (tfile[0])
191 		unlink(tfile);
192 	if (gfile[0])
193 		unlink(gfile);
194 	if (ofile[0])
195 		unlink(ofile);
196 	if (hidenam[0])
197 		unlink(hidenam);
198 }
199