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