Annotation of researchv10no/cmd/ap/apkeys/dread.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.