|
|
1.1 root 1: # include "stdio.h"
2: # include "assert.h"
3: # include "key..c"
4: # include "sys/types.h"
5: # include "sys/stat.h"
6: int nseq =0;
7: int nsent=0;
8: int nstory=0;
9: int ndest= -1;
10: struct wordstr *wds;
11: int nwds = 0;
12: struct matchstr *seqs;
13: int *ok, *len, *wseen;
14: struct matchstr *sents;
15: struct matchstr *stories;
16: struct deststr *dests;
17: FILE * zfopen();
18: extern FILE *yyin;
19: extern char today[];
20: stread()
21: {
22: char line[400], *calloc(), buff[400];
23: int i, a, b, c, d, e;
24: gets(line);
25: nwds= atoi(line);
26: wds = (struct wordstr *)calloc(nwds+1, sizeof (*wds));
27: assert(wds!=0);
28: for(i=0; i<nwds; i++)
29: {
30: gets(line);
31: sscanf(line, "%s %d %d %d %d", buff, &a, &b, &c, &d);
32: wds[i].wch = svc(buff);
33: wds[i].seq = a;
34: wds[i].ifneg = b;
35: wds[i].which = c;
36: wds[i].mask = d;
37: }
38: gets(line);
39: nseq=atoi(line);
40: seqs = (struct matchstr *)calloc(nseq+1, sizeof(*seqs));
41: ok = (int *)calloc(nseq+1, sizeof(*ok));
42: len = (int *)calloc(nseq+1, sizeof(*len));
43: wseen = (int *)calloc(nseq+1, sizeof(*wseen));
44: assert(seqs!=0);
45: for(i=0; i<nseq; i++)
46: {
47: gets(line);
48: sscanf(line, "%d %d %d %d %d", &a, &b, &c, &d, &e);
49: seqs[i].next = a;
50: seqs[i].ntype = b;
51: seqs[i].lim = c;
52: seqs[i].smask = d;
53: len[i]=e;
54: }
55: gets(line);
56: nsent=atoi(line);
57: sents = (struct matchstr *)calloc(nsent+1, sizeof(*sents));
58: assert(sents!=0);
59: for(i=0; i<nsent; i++)
60: {
61: gets(line);
62: sscanf(line, "%d %d %d %d", &a, &b, &c, &d);
63: sents[i].next = a;
64: sents[i].ntype = b;
65: sents[i].lim =c;
66: sents[i].smask=d;
67: }
68: gets(line);
69: nstory=atoi(line);
70: stories = (struct matchstr *)calloc(nstory+1, sizeof(*stories));
71: assert(stories!=0);
72: for(i=0; i<nstory; i++)
73: {
74: gets(line);
75: sscanf(line, "%d %d %d", &a, &b, &c);
76: stories[i].next = a;
77: stories[i].ntype = b;
78: stories[i].lim = c;
79: }
80: gets(line);
81: ndest=atoi(line);
82: dests = (struct deststr *)calloc(ndest+1, sizeof(*dests));
83: assert(dests!=0);
84: for(i=0; i<ndest; i++)
85: {
86: gets(line);
87: dests[i].sndflg = atoi(line);
88: assert(strlen(line+2)<400);
89: dests[i].dstr = svc(line+2);
90: }
91: fprintf(stderr, "nwds %d nseq %d nsent %d sents %o\n",nwds,nseq,nsent, sents);
92: fprintf(stderr, "nstory %d ndests %d dests %o\n",nstory, ndest, dests);
93: fprintf(stderr, "about to exit stread\n");
94: }
95: char *yylval;
96: # define WORD 1
97: # define DOT 2
98: extern char *fname;
99: process()
100: {
101: int k, i, j;
102: yylval= (char *) calloc(10,1); /* get it set up */
103: for(i=0; i<nseq; i++)
104: seqs[i].ct=ok[i]=wseen[i]=0;
105: for(i=0; i<nsent; i++)
106: sents[i].ct=0;
107: for(i=0; i<nstory; i++)
108: stories[i].ct=0;
109: yyunput('#');
110: while (k = yylex())
111: {
112: switch(k)
113: {
114: case WORD:
115: i = search(yylval);
116: while (i<nwds && strcmp(wds[i].wch, yylval)==0)
117: hit(i++);
118: break;
119: case DOT:
120: senthits();
121: for(i=0; i<nsent; i++)
122: sents[i].ct=0;
123: break;
124: }
125: for(i=0; i<nseq; i++)
126: {
127: if (wseen[i] ==len[i] && seqs[i].ct==seqs[i].lim)
128: seqhit(i);
129: if (wseen[i]>0 && missing(i, wseen[i])) wseen[i]++;
130: else
131: if (ok[i]==0 || (seqs[i].ct==0) || (wseen[i]>len[i]))
132: seqs[i].ct=wseen[i]=0;
133: ok[i]=0;
134: }
135: }
136: storyhits();
137: }
138: hit(i)
139: {
140: int j, m, n, ms;
141: j = wds[i].seq;
142: ms = wds[i].mask;
143: switch(wds[i].which)
144: {
145: case SEQ:
146: ok[j]=1;
147: while (missing(j, wseen[j])) wseen[j]++; /* anything we didn't see */
148: wseen[j]++;
149: seqs[j].ct |= ms;
150: if (wseen[j]==len[j] && seqs[j].ct== seqs[j].lim)
151: {
152: seqhit(j);
153: wseen[j]=0;
154: }
155: return;
156: case SENT:
157: sents[j].ct |= ms;
158: return;
159: case STORY:
160: stories[j].ct |= ms;
161: return;
162: case DEST:
163: if (wds[i].ifneg==0)
164: found(j);
165: return;
166: }
167: }
168: seqhit(j)
169: {
170: int m, ms;
171: m = seqs[j].next;
172: ms = seqs[j].smask;
173: switch(seqs[j].ntype)
174: {
175: case SENT:
176: sents[m].ct |= ms;
177: break;
178: case STORY:
179: stories[m].ct |= ms;
180: break;
181: case DEST:
182: found(m);
183: break;
184: }
185: }
186: senthits()
187: {
188: int m,n;
189: for(m=0; m<nsent; m++)
190: if (sents[m].ct==sents[m].lim)
191: {
192: n = sents[m].next;
193: switch(sents[m].ntype)
194: {
195: case STORY:
196: stories[n].ct |= sents[m].smask;
197: continue;
198: case DEST:
199: found(n);
200: continue;
201: }
202: }
203: }
204: storyhits()
205: {
206: int n;
207: for(n=0; n<nstory; n++)
208: if (stories[n].ct==stories[n].lim)
209: found(stories[n].next);
210: }
211: int tosend[400];
212: int nts=0;
213: found(nx)
214: {
215: int i;
216: for(i=0; i<nts; i++)
217: if (tosend[i]==nx)
218: return;
219: tosend[nts++]=nx;
220: assert(nts<400);
221: }
222: extern int debug;
223: deliver()
224: {
225: char *d, sline[300];
226: int nx, para, i, sendf;
227: int gate;
228: FILE *fi, *fo;
229: for(i=0; i<nts; i++)
230: {
231: nx = tosend[i];
232: d = dests[nx].dstr;
233: if (debug) printf("Send %s to %s\n", fname, d);
234: if (d[0]=='*')
235: {
236: printf("deliver %d to :%s:\n",nx,d+1);
237: continue;
238: }
239: if (d[0]=='|')
240: {
241: pipeto(d+1, fname, dests[nx].sndflg);
242: continue;
243: }
244: if (d[0]=='>' && d[1]=='>')
245: fo = zfopen(d+2, "a");
246: else if (d[0]=='>')
247: fo = zfopen(d+1, "w");
248: if (fo==NULL) /* may be a directory */
249: {
250: char temp[400];
251: while (*d=='>' || *d==' ') d++;
252: sprintf(temp, "%s/%s.%s", d, today, fname);
253: fo = zfopen(temp, "a");
254: }
255: if (fo==NULL) continue;
256: sendf = dests[nx].sndflg;
257: fi = fopen(fname, "r");
258: para=0;
259: gate = debug ? 1 : 0; /* pass on first line */
260: while (fgets(sline, 300, fi))
261: {
262: if (strncmp(sline, "\t ", 4)==0) para++;
263: if (para==2 && sendf==2) break;
264: fputs(sline, fo);
265: if (gate>0)
266: {
267: printf("%s", sline);
268: gate=0;
269: }
270: if (sendf==1) break;
271: }
272: fclose(fo); fclose(fi);
273: }
274: nts=0;
275: }
276: pipeto( command, file, sendf)
277: char *command, *file;
278: {
279: int fp[2], fr, fw, para, gate;
280: char sline[300];
281: FILE *fi, *fo;
282: assert(pipe(fp)!= -1);
283: fr = fp[0]; fw = fp[1];
284: if (fork()==0)
285: {
286: close(fw);
287: close(0);
288: assert(dup(fr)==0);
289: system(command);
290: exit(0);
291: }
292: close(fr);
293: fi = fopen(file, "r");
294: fo = fopen("/dev/null", "w");
295: assert(fi!=NULL);
296: assert(fo!=NULL);
297: close(fo->_file);
298: fo->_file = fw;
299: para=0;
300: gate = debug ? 1 : 0;
301: fprintf(fo, "(%s) ", file);
302: while (fgets(sline, 300, fi))
303: {
304: if (strncmp(sline, "\t ", 4)==0) para++;
305: if (para==2 && sendf == 2) break;
306: fputs(sline, fo);
307: if (gate>0)
308: {
309: printf("%s", sline);
310: gate=0;
311: }
312: if (sendf==1) break;
313: }
314: fclose(fo);
315: fclose(fi);
316: wait(0);
317: return;
318: }
319: search(s)
320: char *s;
321: {
322: /* binarysearch from 1 to nwds thru wds[].wch */
323: /* find x such that [x-1]is <s and x big as possible */
324: int i, j, low, hi, lv, hv;
325: low=0; hi=nwds-1; i= -10;
326: while (low+1 < hi)
327: {
328: i = (low+hi)/2;
329: j = strcmp (wds[i].wch, s);
330: if (j>=0)
331: {
332: hi=i;
333: continue;
334: }
335: low=i;
336: }
337: if (i==hi)
338: {
339: hv = j;
340: lv = strcmp(wds[low].wch, s);
341: }
342: else if (i==low)
343: {
344: lv = j;
345: hv = strcmp(wds[hi].wch, s);
346: }
347: else
348: {
349: lv = strcmp(wds[low].wch, s);
350: hv = strcmp(wds[hi].wch, s);
351: }
352: if (lv==0) return(low);
353: if (hv==0) return(hi);
354: return(low);
355: }
356: missing( i, lni )
357: {
358: /* checks whether the next item in a sequence is deliberately missing */
359: if (lni<0) return(0);
360: if ((seqs[i].lim & (1<<lni))==0) return(1);
361: return(0);
362: }
363: FILE *
364: zfopen( fnam, w)
365: char *fnam, *w;
366: {
367: /* this opens file fnam and if successful, tries to donate
368: to the user who owns the including directory */
369: char td[100];
370: FILE *f;
371: struct stat buf;
372: char *x;
373: while (*fnam==' ') fnam++;
374: f = fopen(fnam, w);
375: if (f==NULL) return(NULL);
376: strcpy(td, fnam);
377: for (x=td; *x; x++);
378: while (x>td && *x!='/') x--;
379: *x=0;
380: if (x<=td) return(f);
381: stat (td, &buf);
382: chown (fnam, buf.st_uid, buf.st_gid);
383: return(f);
384: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.