xref: /illumos-gate/usr/src/cmd/refer/hunt6.c (revision fc910014e8a32a65612105835a10995f2c13d942)
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 <stdio.h>
16 #include <assert.h>
17 #include <string.h>
18 #define	TXTLEN 1000
19 
20 char *outbuf = 0;
21 extern char *soutput;
22 extern int soutlen, iflong;
23 extern long indexdate;
24 union ptr {
25 	unsigned *a;
26 	long *b;
27 };
28 
29 extern int corout();
30 extern int fgrep();
31 extern long findline();
32 
33 static int auxil(char *, char *);
34 
35 int
36 baddrop(unsigned *mptr, int nf, FILE *fc, int nitem,
37 	    char *qitem[], char *rprog, int full)
38 {
39 	/* checks list of drops for real bad drops; finds items with "deliv" */
40 	int i, g, j, need, got, na, len;
41 	long lp;
42 	char res[100], *ar[50], output[TXTLEN], *mput;
43 	union ptr master;
44 	extern int colevel, reached;
45 
46 	if (iflong) {
47 		master.b = (long *)mptr;
48 	} else {
49 		master.a = mptr;
50 	}
51 
52 #if D1
53 	if (iflong)
54 		fprintf(stderr, "in baddrop, nf %d master %ld %ld %ld\n",
55 		    nf, master.b[0], master.b[1], master.b[2]);
56 	else
57 		fprintf(stderr, "in baddrop, nf %d master %d %d %d\n",
58 		    nf, master.a[0], master.a[1], master.a[2]);
59 #endif
60 	for (i = g = 0; i < nf; i++) {
61 		lp = iflong ? master.b[i] : master.a[i];
62 #if D1
63 		if (iflong)
64 			fprintf(stderr, "i %d master %lo lp %lo\n",
65 			    i, master.b[i], lp);
66 		else
67 			fprintf(stderr, "i %d master %o lp %lo\n",
68 			    i, master.a[i], lp);
69 #endif
70 		fseek(fc, lp, 0);
71 		fgets(res, 100, fc);
72 #if D1
73 		fprintf(stderr, "tag %s", res);
74 #endif
75 		if (!auxil(res, output)) {
76 			char *s;
77 			int c;
78 #if D1
79 			fprintf(stderr, "not auxil try rprog %c\n",
80 			    rprog ? 'y': 'n');
81 #endif
82 			for (s = res; c = *s; s++)
83 				if (c == ';' || c == '\n') {
84 					*s = 0;
85 					break;
86 				}
87 
88 			if (rprog)
89 				len = corout(res, output, rprog, "", TXTLEN);
90 			else {
91 				len = findline(res, &mput, TXTLEN, indexdate);
92 				if (len > 0) {	/* copy and free */
93 					strncpy(output, mput, TXTLEN);
94 					free(mput);
95 				} else /* insufficient memory or other... */
96 					len = 0;
97 			}
98 		}
99 #if D1
100 		assert(len < TXTLEN);
101 		fprintf(stderr, "item %d of %d, tag %s len %d output\n%s\n..\n",
102 		    i, nf, res, len, output);
103 #endif
104 		if (len == 0)
105 			continue;
106 		need = colevel ? reached : nitem;
107 		na = 0;
108 		ar[na++] = "fgrep";
109 		ar[na++] = "-r";
110 		ar[na++] = "-n";
111 		ar[na++] = (char *)need;
112 		ar[na++] = "-i";
113 		ar[na++] = output;
114 		ar[na++] = (char *)len;
115 		for (j = 0; j < nitem; j++)
116 			ar[na++] = qitem[j];
117 #ifdef D1
118 		fprintf(stderr, "calling fgrep len %d ar[4] %s %o %d \n",
119 		    len, ar[4], ar[5], ar[6]);
120 #endif
121 		if (fgrep(na, ar) == 0) {
122 #ifdef D1
123 			fprintf(stderr, "fgrep found it\n");
124 #endif
125 			if (iflong)
126 				master.b[g++] = master.b[i];
127 			else
128 				master.a[g++] = master.a[i];
129 			if (full >= g)
130 				if (soutput == 0)
131 					fputs(output, stdout);
132 				else
133 					strcpy(soutput, output);
134 		}
135 #ifdef D1
136 		fprintf(stderr, "after fgrep\n");
137 #endif
138 	}
139 	return (g);
140 }
141 
142 static int
143 auxil(char *res, char *output)
144 {
145 	extern FILE *fd;
146 	long lp, c;
147 	int len;
148 	if (fd == 0)
149 		return (0);
150 	while (c = *res++) {
151 		if (c == ';') {
152 			sscanf(res, "%ld,%d", &lp, &len);
153 			fseek(fd, lp, 0);
154 			fgets(output, len, fd);
155 			return (1);
156 		}
157 	}
158 	return (0);
159 }
160