xref: /illumos-gate/usr/src/cmd/refer/glue4.c (revision ed093b41a93e8563e6e1e5dae0768dda2a7bcc27)
1 /*
2  * Copyright 2017 Gary Mills
3  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
4  * Use is subject to license terms.
5  */
6 
7 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
8 /*	  All Rights Reserved  	*/
9 
10 /*
11  * Copyright (c) 1980 Regents of the University of California.
12  * All rights reserved. The Berkeley software License Agreement
13  * specifies the terms and conditions for redistribution.
14  */
15 
16 
17 #include <stdio.h>
18 #include <ctype.h>
19 
20 extern char gfile[];
21 
22 void
23 grepcall(char *in, char *out, char *arg)
24 {
25 	char line[200], *s, argig[100], *cv[50];
26 	char *inp, inb[500];
27 	FILE *qf, *gf;
28 	int c, alph = 0, nv = 0;
29 	int sv0, sv1;
30 	strcpy(argig, arg);
31 	strcat(argig, ".ig");
32 	strcpy(inp = inb, in);
33 	if (gfile[0] == 0)
34 		sprintf(gfile, "/tmp/rj%dg", getpid());
35 	for (cv[nv++] = "fgrep"; c = *inp; inp++) {
36 		if (c == ' ')
37 			c = *inp = 0;
38 		else if (isupper(c))
39 			*inp = tolower(c);
40 		alph = (c == 0) ? 0 : alph+1;
41 		if (alph == 1)
42 			cv[nv++] = inp;
43 		if (alph > 6)
44 			*inp = 0;
45 	}
46 	{
47 		sv0 = dup(0);
48 		close(0);
49 		if (open(argig, 0) != 0)
50 			err("Can't read fgrep index %s", argig);
51 		sv1 = dup(1);
52 		close(1);
53 		if (creat(gfile, 0666) != 1)
54 			err("Can't write fgrep output %s", gfile);
55 		fgrep(nv, cv);
56 		close(0);
57 		dup(sv0);
58 		close(sv0);
59 		close(1);
60 		dup(sv1);
61 		close(sv1);
62 	}
63 
64 	gf = fopen(gfile, "r");
65 	if (gf == NULL)
66 		err("can't read fgrep output %s", gfile);
67 	while (fgets(line, 100, gf) == line) {
68 		line[100] = 0;
69 		for (s = line; *s && (*s != '\t'); s++)
70 			;
71 		if (*s == '\t') {
72 			*s++ = '\n';
73 			*s++ = 0;
74 		}
75 		if (line[0])
76 			strcat(out, line);
77 		while (*s) s++;
78 		if (s[-1] != '\n')
79 			while (!feof(gf) && getc(gf) != '\n')
80 				;
81 	}
82 	fclose(gf);
83 	unlink(gfile);
84 }
85 
86 void
87 clfgrep(void)
88 {
89 	if (gfile[0])
90 		unlink(gfile);
91 }
92