xref: /csrg-svn/old/refer/hunt/hunt6.c (revision 12287)
1*12287Stut #ifndef lint
2*12287Stut static char *sccsid = "@(#)hunt6.c	4.1 (Berkeley) 05/06/83";
3*12287Stut #endif
4*12287Stut 
5*12287Stut #include <stdio.h>
6*12287Stut #include <assert.h>
7*12287Stut #define TXTLEN 1000
8*12287Stut 
9*12287Stut char *outbuf = 0;
10*12287Stut extern char *soutput;
11*12287Stut extern int soutlen, iflong;
12*12287Stut extern long indexdate;
13*12287Stut 
14*12287Stut baddrop(master, nf, fc, nitem, qitem, rprog, full)
15*12287Stut union ptr {
16*12287Stut 	unsigned *a;
17*12287Stut 	long *b;
18*12287Stut }
19*12287Stut master;
20*12287Stut FILE *fc;
21*12287Stut char *qitem[], *rprog;
22*12287Stut {
23*12287Stut 	/* checks list of drops for real bad drops; finds items with "deliv" */
24*12287Stut 	int i, g, j, need, got, na, len;
25*12287Stut 	long lp;
26*12287Stut 	char res[100], *ar[50], output[TXTLEN];
27*12287Stut 	extern int colevel, reached;
28*12287Stut # if D1
29*12287Stut 	if (iflong)
30*12287Stut 		fprintf(stderr,"in baddrop, nf %d master %ld %ld %ld\n",
31*12287Stut 			nf, master.b[0], master.b[1], master.b[2]);
32*12287Stut 	else
33*12287Stut 		fprintf(stderr,"in baddrop, nf %d master %d %d %d\n",
34*12287Stut 			nf, master.a[0], master.a[1], master.a[2]);
35*12287Stut # endif
36*12287Stut 	for (i=g=0; i<nf; i++)
37*12287Stut 	{
38*12287Stut 		lp = iflong ? master.b[i] : master.a[i];
39*12287Stut # if D1
40*12287Stut 		if (iflong)
41*12287Stut 			fprintf(stderr, "i %d master %lo lp %lo\n",
42*12287Stut 				i, master.b[i], lp);
43*12287Stut 		else
44*12287Stut 			fprintf(stderr, "i %d master %o lp %lo\n",
45*12287Stut 				i, master.a[i], lp);
46*12287Stut # endif
47*12287Stut 		fseek (fc, lp, 0);
48*12287Stut 		fgets( res, 100, fc);
49*12287Stut # if D1
50*12287Stut 		fprintf(stderr, "tag %s", res);
51*12287Stut # endif
52*12287Stut 		if (!auxil(res,output))
53*12287Stut 		{
54*12287Stut 			char *s;
55*12287Stut 			int c;
56*12287Stut # if D1
57*12287Stut 			fprintf(stderr, "not auxil try rprog %c\n",
58*12287Stut 				rprog? 'y': 'n');
59*12287Stut # endif
60*12287Stut 			for(s=res; c= *s; s++)
61*12287Stut 				if (c == ';' || c == '\n')
62*12287Stut 				{
63*12287Stut 					*s=0;
64*12287Stut 					break;
65*12287Stut 				}
66*12287Stut 			len = rprog ?
67*12287Stut 			corout (res, output, rprog, 0, TXTLEN) :
68*12287Stut 			findline (res, output, TXTLEN, indexdate);
69*12287Stut 		}
70*12287Stut # if D1
71*12287Stut 		_assert (len <TXTLEN);
72*12287Stut 		fprintf(stderr,"item %d of %d, tag %s len %d output\n%s\n..\n",
73*12287Stut 			i, nf, res, len, output);
74*12287Stut # endif
75*12287Stut 		if (len==0)
76*12287Stut 			continue;
77*12287Stut 		need = colevel ? reached : nitem;
78*12287Stut 		na=0;
79*12287Stut 		ar[na++] = "fgrep";
80*12287Stut 		ar[na++] = "-r";
81*12287Stut 		ar[na++] = "-n";
82*12287Stut 		ar[na++] = need;
83*12287Stut 		ar[na++] = "-i";
84*12287Stut 		ar[na++] = output;
85*12287Stut 		ar[na++] = len;
86*12287Stut 		for(j=0; j<nitem; j++)
87*12287Stut 			ar[na++] = qitem[j];
88*12287Stut # ifdef D1
89*12287Stut 		fprintf(stderr, "calling fgrep len %d ar[4] %s %o %d \n",
90*12287Stut 			len,ar[4],ar[5],ar[6]);
91*12287Stut # endif
92*12287Stut 		if (fgrep(na, ar)==0)
93*12287Stut 		{
94*12287Stut # ifdef D1
95*12287Stut 			fprintf(stderr, "fgrep found it\n");
96*12287Stut # endif
97*12287Stut 			if (iflong)
98*12287Stut 				master.b[g++] = master.b[i];
99*12287Stut 			else
100*12287Stut 				master.a[g++] = master.a[i];
101*12287Stut 			if (full >= g)
102*12287Stut 				if (soutput==0)
103*12287Stut 					fputs(output, stdout);
104*12287Stut 				else
105*12287Stut 					strcpy (soutput, output);
106*12287Stut 		}
107*12287Stut # ifdef D1
108*12287Stut 		fprintf(stderr, "after fgrep\n");
109*12287Stut # endif
110*12287Stut 	}
111*12287Stut 	return(g);
112*12287Stut }
113*12287Stut 
114*12287Stut auxil( res, output)
115*12287Stut char *res, *output;
116*12287Stut {
117*12287Stut 	extern FILE *fd;
118*12287Stut 	long lp, c;
119*12287Stut 	int len;
120*12287Stut 	if (fd==0)return(0);
121*12287Stut 	while (c = *res++)
122*12287Stut 	{
123*12287Stut 		if (c == ';')
124*12287Stut 		{
125*12287Stut 			sscanf(res, "%ld,%d", &lp, &len);
126*12287Stut 			fseek (fd, lp, 0);
127*12287Stut 			fgets(output, len, fd);
128*12287Stut 			return(1);
129*12287Stut 		}
130*12287Stut 	}
131*12287Stut 	return(0);
132*12287Stut }
133