Commit | Line | Data |
---|---|---|
2b1a705e TL |
1 | # include "stdio.h" |
2 | # include "assert.h" | |
3 | # define TXTLEN 1000 | |
4 | char *outbuf = 0; | |
5 | extern char *soutput; | |
6 | extern int soutlen, iflong; | |
7 | extern long indexdate; | |
8 | baddrop(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. */ | |
15 | int i, g, j, need, got, na, len; | |
16 | long lp; | |
17 | char res[100], *ar[50], output[TXTLEN]; | |
18 | extern int colevel, reached; | |
19 | # if D1 | |
20 | if (iflong) | |
21 | fprintf(stderr,"in baddrop, nf %d master %ld %ld %ld\n", nf, master.b[0], master.b[1], master.b[2]); | |
22 | else | |
23 | fprintf(stderr,"in baddrop, nf %d master %d %d %d\n", nf, master.a[0], master.a[1], master.a[2]); | |
24 | # endif | |
25 | for (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 | } | |
91 | return(g); | |
92 | } | |
93 | auxil( res, output) | |
94 | char *res, *output; | |
95 | { | |
96 | extern FILE *fd; | |
97 | long lp, c; int len; | |
98 | if (fd==0)return(0); | |
99 | while (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 | } | |
109 | return(0); | |
110 | } |