|
|
1.1 root 1: # include "stdio.h"
2: # include "assert.h"
3: # include "key..c"
4: int nseq =0;
5: int nsent=0;
6: int nstory=0;
7: int ndest= -1;
8: extern int destyet;
9: # define NW 2000
10: struct wordstr wds[NW];
11: int nwds = 0;
12: int wseen=0;
13: int final=0;
14: extern char *udir, *uname;
15: mkwrd(w, negfl)
16: char *w;
17: {
18: struct wordstr *wp;
19: wp = &wds[nwds++];
20: wp->wch = w;
21: wp ->seq= nseq;
22: wp->ifneg = negfl;
23: wp->single=0;
24: wp->mask = (1<<wseen);
25: if (!negfl)
26: final |= (1<<wseen);
27: wp->which = SEQ;
28: wseen++;
29: assert(nwds<NW);
30: }
31: int sqseen=0;
32: #define NSEQ 2000
33: struct matchstr seqs[NSEQ];
34: int len[NSEQ];
35: mkseq()
36: {
37: struct matchstr *sp;
38: len[nseq]=wseen;
39: sp = &seqs[nseq++];
40: sp->next = nsent;
41: sp->lim = final;
42: sp->smask = (1<<sqseen);
43: sp->ntype = SENT;
44: assert (nseq<NSEQ);
45: if (wseen == 1)
46: wds[nwds-1].single=1;
47: wseen=final=0;
48: sqseen++;
49: }
50: int snseen=0;
51: #define NSENT 2000
52: struct matchstr sents[NSENT];
53: mksent()
54: {
55: struct matchstr *sp;
56: sp = &sents[nsent++];
57: sp->next = nstory;
58: sp->lim = (1<<sqseen)-1;
59: sp->smask = (1<<snseen);
60: sp->ntype = STORY;
61: assert (nsent<NSENT);
62: sqseen=0;
63: snseen++;
64: }
65: #define NSTORY 900
66: struct matchstr stories[NSTORY];
67: mkstory()
68: {
69: struct matchstr *sp;
70: if (destyet==0) defdest();
71: sp = &stories[nstory++];
72: sp->next = (ndest>0 ? ndest : 0);
73: sp->lim = (1<<snseen)-1;
74: sp->ntype = DEST;
75: assert (nstory<NSTORY);
76: snseen=0;
77: }
78: # define ND 200
79: struct deststr dests[ND];
80: int stuff = 3;
81: svwh(x)
82: char *x;
83: {
84: ndest++;
85: destyet=1;
86: dests[ndest].dstr = x;
87: dests[ndest].sndflg = stuff;
88: dests[ndest].homedir = udir;
89: }
90: optimize()
91: {
92: int i;
93: struct wordstr *wp;
94: struct matchstr *sp, *xp;
95: for(i=0; i<nsent; i++)
96: {
97: xp = &sents[i];
98: sp = &stories[xp->next];
99: if (xp->smask == sp->lim)
100: {
101: xp->next = sp->next;
102: xp->ntype = sp->ntype;
103: xp->smask = sp->smask;
104: sp->ntype=0;
105: }
106: }
107: for(i=0; i<nseq; i++)
108: {
109: xp = &seqs[i];
110: sp = &sents[xp->next];
111: if (xp->smask == sp->lim)
112: {
113: xp->next = sp->next;
114: xp->ntype = sp->ntype;
115: xp->smask = sp->smask;
116: sp->ntype=0;
117: }
118: }
119: for(i=0; i<nwds; i++)
120: {
121: wp = &wds[i];
122: sp = &seqs[wp->seq];
123: if (wp->single)
124: {
125: wp->seq = sp->next;
126: wp->which = sp->ntype;
127: wp->mask = sp->smask;
128: if (wp->ifneg)
129: {
130: switch(wp->which)
131: {
132: case SENT:
133: sents[wp->seq].lim &= (~wp->mask);
134: break;
135: case STORY:
136: stories[wp->seq].lim &= (~wp->mask);
137: break;
138: }
139: }
140: sp->ntype=0;
141: }
142: }
143: }
144: compress()
145: {
146: int i, j, k;
147: struct matchstr *sp, *tp;
148: for(i=0, j=nsent-1; i<j; i++)
149: {
150: if (sents[i].ntype!=0)
151: continue;
152: while (sents[j].ntype==0)
153: j--;
154: if (i>=j) break;
155: sents[i]=sents[j];
156: sents[j].ntype=0;
157: for(k=0; k<nwds; k++)
158: {
159: assert(!(wds[k].which==SENT && wds[k].seq==i));
160: if (wds[k].seq == j && wds[k].which == SENT)
161: wds[k].seq=i;
162: }
163: for(k=0; k<nseq; k++)
164: {
165: assert(!(seqs[k].ntype==SENT && seqs[k].next==i))
166: if (seqs[k].next==j && seqs[k].ntype==SENT)
167: seqs[k].next=i;
168: }
169: }
170: if (sents[i].ntype) i++;
171: nsent = i;
172: for(i=0, j=nseq-1; i<j; i++)
173: {
174: if (seqs[i].ntype!=0)
175: continue;
176: while (seqs[j].ntype==0)
177: j--;
178: if (i>=j) break;
179: seqs[i]=seqs[j];
180: seqs[j].ntype=0;
181: len[i]=len[j];
182: for(k=0; k<nwds; k++)
183: {
184: assert(!(wds[k].which==SEQ && wds[k].seq==i));
185: if (wds[k].seq == j && wds[k].which == SEQ)
186: wds[k].seq=i;
187: }
188: }
189: if (seqs[i].ntype) i++;
190: nseq = i;
191: for(i=0, j=nstory-1; i<j; i++)
192: {
193: if (stories[i].ntype!=0)
194: continue;
195: while (stories[j].ntype==0)
196: j--;
197: if (i>=j) break;
198: stories[i]=stories[j];
199: stories[j].ntype=0;
200: for(k=0; k<nwds; k++)
201: {
202: assert(!(wds[k].which==STORY && wds[k].seq==i));
203: if (wds[k].seq == j && wds[k].which == STORY)
204: wds[k].seq=i;
205: }
206: for(k=0; k<nseq; k++)
207: {
208: assert(!(seqs[k].ntype==STORY && seqs[k].next==i))
209: if (seqs[k].next==j && seqs[k].ntype==STORY)
210: seqs[k].next=i;
211: }
212: for(k=0; k<nsent; k++)
213: {
214: assert(!(sents[k].ntype==STORY && sents[k].next==i))
215: if (sents[k].next==j && sents[k].ntype==STORY)
216: sents[k].next=i;
217: }
218: }
219: if (stories[i].ntype) i++;
220: nstory = i;
221: }
222: dump()
223: {
224: optimize();
225: compress();
226: prvecs();
227: }
228: prvecs()
229: {
230: int i;
231: int comp(), exch();
232: shell (nwds, comp, exch);
233: printf("%d entries in word list; word, seq, negfl, which, mask\n", nwds);
234: for(i=0; i<nwds; i++)
235: printf("%s %d %d %d %d\n", wds[i].wch, wds[i].seq, wds[i].ifneg, wds[i].which, wds[i].mask);
236: printf("%d entries in sequence list; sent, ntype, lim, mask, length\n", nseq);
237: for(i=0; i<nseq; i++)
238: printf("%d %d %d %d %d\n", seqs[i].next, seqs[i].ntype, seqs[i].lim, seqs[i].smask, len[i]);
239: printf("%d entries in sentence list; story, ntype, lim, mask\n", nsent);
240: for(i=0; i<nsent; i++)
241: printf("%d %d %d %d\n", sents[i].next, sents[i].ntype, sents[i].lim, sents[i].smask);
242: printf("%d entries in story list; dest, ntype, lim\n", nstory);
243: for(i=0; i<nstory; i++)
244: printf("%d %d %d\n", stories[i].next, stories[i].ntype, stories[i].lim);
245: printf("%d entries in destination list; level, dest\n", ndest+1);
246: for(i=0; i<=ndest; i++)
247: {
248: char *p, *s;
249: p = dests[i].dstr;
250: while (*p=='>' || *p==' ' || *p=='\t')
251: p++;
252: if (*p=='|' || *p=='/')
253: printf("%d %s\n", dests[i].sndflg, dests[i].dstr);
254: else
255: {
256: printf("%d ", dests[i].sndflg);
257: for(s=dests[i].dstr; s<p; s++)
258: putchar(*s);
259: printf("%s/%s\n", dests[i].homedir, p);
260: }
261: }
262: }
263: svsz(n)
264: {
265: stuff=n;
266: }
267: defdest()
268: {
269: static char dbuff[20];
270: ndest++;
271: sprintf(dbuff, "| mail %s", uname);
272: dests[ndest].dstr = svc(dbuff);
273: dests[ndest].sndflg=3;
274: destyet=1;
275: }
276: comp(i,j) /* compares word list for i and j; true if ok */
277: {
278: return (strcmp (wds[i].wch, wds[j].wch) <= 0);
279: }
280: exch(i,j)
281: {
282: struct wordstr t;
283: t = wds[i];
284: wds[i]=wds[j];
285: wds[j]=t;
286: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.