xref: /csrg-svn/old/refer/hunt/hunt6.c (revision 17679)
112287Stut #ifndef lint
2*17679Sralph static char *sccsid = "@(#)hunt6.c	4.2 (Berkeley) 01/09/85";
312287Stut #endif
412287Stut 
512287Stut #include <stdio.h>
612287Stut #include <assert.h>
712287Stut #define TXTLEN 1000
812287Stut 
912287Stut char *outbuf = 0;
1012287Stut extern char *soutput;
1112287Stut extern int soutlen, iflong;
1212287Stut extern long indexdate;
1312287Stut 
1412287Stut baddrop(master, nf, fc, nitem, qitem, rprog, full)
1512287Stut union ptr {
1612287Stut 	unsigned *a;
1712287Stut 	long *b;
1812287Stut }
1912287Stut master;
2012287Stut FILE *fc;
2112287Stut char *qitem[], *rprog;
2212287Stut {
2312287Stut 	/* checks list of drops for real bad drops; finds items with "deliv" */
2412287Stut 	int i, g, j, need, got, na, len;
2512287Stut 	long lp;
2612287Stut 	char res[100], *ar[50], output[TXTLEN];
2712287Stut 	extern int colevel, reached;
2812287Stut # if D1
2912287Stut 	if (iflong)
3012287Stut 		fprintf(stderr,"in baddrop, nf %d master %ld %ld %ld\n",
3112287Stut 			nf, master.b[0], master.b[1], master.b[2]);
3212287Stut 	else
3312287Stut 		fprintf(stderr,"in baddrop, nf %d master %d %d %d\n",
3412287Stut 			nf, master.a[0], master.a[1], master.a[2]);
3512287Stut # endif
3612287Stut 	for (i=g=0; i<nf; i++)
3712287Stut 	{
3812287Stut 		lp = iflong ? master.b[i] : master.a[i];
3912287Stut # if D1
4012287Stut 		if (iflong)
4112287Stut 			fprintf(stderr, "i %d master %lo lp %lo\n",
4212287Stut 				i, master.b[i], lp);
4312287Stut 		else
4412287Stut 			fprintf(stderr, "i %d master %o lp %lo\n",
4512287Stut 				i, master.a[i], lp);
4612287Stut # endif
4712287Stut 		fseek (fc, lp, 0);
4812287Stut 		fgets( res, 100, fc);
4912287Stut # if D1
5012287Stut 		fprintf(stderr, "tag %s", res);
5112287Stut # endif
5212287Stut 		if (!auxil(res,output))
5312287Stut 		{
5412287Stut 			char *s;
5512287Stut 			int c;
5612287Stut # if D1
5712287Stut 			fprintf(stderr, "not auxil try rprog %c\n",
5812287Stut 				rprog? 'y': 'n');
5912287Stut # endif
6012287Stut 			for(s=res; c= *s; s++)
6112287Stut 				if (c == ';' || c == '\n')
6212287Stut 				{
6312287Stut 					*s=0;
6412287Stut 					break;
6512287Stut 				}
6612287Stut 			len = rprog ?
6712287Stut 			corout (res, output, rprog, 0, TXTLEN) :
6812287Stut 			findline (res, output, TXTLEN, indexdate);
6912287Stut 		}
7012287Stut # if D1
7112287Stut 		_assert (len <TXTLEN);
7212287Stut 		fprintf(stderr,"item %d of %d, tag %s len %d output\n%s\n..\n",
7312287Stut 			i, nf, res, len, output);
7412287Stut # endif
7512287Stut 		if (len==0)
7612287Stut 			continue;
7712287Stut 		need = colevel ? reached : nitem;
7812287Stut 		na=0;
7912287Stut 		ar[na++] = "fgrep";
8012287Stut 		ar[na++] = "-r";
8112287Stut 		ar[na++] = "-n";
82*17679Sralph 		ar[na++] = (char *) need;
8312287Stut 		ar[na++] = "-i";
8412287Stut 		ar[na++] = output;
85*17679Sralph 		ar[na++] = (char *) len;
8612287Stut 		for(j=0; j<nitem; j++)
8712287Stut 			ar[na++] = qitem[j];
8812287Stut # ifdef D1
8912287Stut 		fprintf(stderr, "calling fgrep len %d ar[4] %s %o %d \n",
9012287Stut 			len,ar[4],ar[5],ar[6]);
9112287Stut # endif
9212287Stut 		if (fgrep(na, ar)==0)
9312287Stut 		{
9412287Stut # ifdef D1
9512287Stut 			fprintf(stderr, "fgrep found it\n");
9612287Stut # endif
9712287Stut 			if (iflong)
9812287Stut 				master.b[g++] = master.b[i];
9912287Stut 			else
10012287Stut 				master.a[g++] = master.a[i];
10112287Stut 			if (full >= g)
10212287Stut 				if (soutput==0)
10312287Stut 					fputs(output, stdout);
10412287Stut 				else
10512287Stut 					strcpy (soutput, output);
10612287Stut 		}
10712287Stut # ifdef D1
10812287Stut 		fprintf(stderr, "after fgrep\n");
10912287Stut # endif
11012287Stut 	}
11112287Stut 	return(g);
11212287Stut }
11312287Stut 
11412287Stut auxil( res, output)
11512287Stut char *res, *output;
11612287Stut {
11712287Stut 	extern FILE *fd;
11812287Stut 	long lp, c;
11912287Stut 	int len;
12012287Stut 	if (fd==0)return(0);
12112287Stut 	while (c = *res++)
12212287Stut 	{
12312287Stut 		if (c == ';')
12412287Stut 		{
12512287Stut 			sscanf(res, "%ld,%d", &lp, &len);
12612287Stut 			fseek (fd, lp, 0);
12712287Stut 			fgets(output, len, fd);
12812287Stut 			return(1);
12912287Stut 		}
13012287Stut 	}
13112287Stut 	return(0);
13212287Stut }
133