Annotation of researchv10no/cmd/ap/apnews/apnews4.c, revision 1.1

1.1     ! root        1: # include "stdio.h"
        !             2: # include "cbt.h"
        !             3: # include "assert.h"
        !             4: # include "ctype.h"
        !             5: # include "time.h"
        !             6: # include "sys/types.h"
        !             7: # include "sys/stat.h"
        !             8: extern int day, yesterday;
        !             9: # define NST 200
        !            10: extern int stc, inolim;
        !            11: extern char storylist[NST][12];
        !            12: extern char nowfile[];
        !            13: extern char *storydir;
        !            14: extern char names[20][14];
        !            15: extern char heads[20][50];
        !            16: char *index();
        !            17: extern int inodes[NST+5];
        !            18: 
        !            19: getkeys(firsen)
        !            20: {
        !            21: # define NWS 50
        !            22: char lb[200], *srchvec[NWS+1], *v[40], *s, *sufstr();
        !            23: char wb[NWS+1][15];
        !            24: int i, n, ng;
        !            25: FILE *f;
        !            26: f = fopen(nowfile, "r");
        !            27: n=0;
        !            28: if (f==NULL) return;
        !            29: while (fgets(lb, 200, f))
        !            30:        {
        !            31:        if (lb[0]=='^') continue;
        !            32:        trimnl(lb);
        !            33:        ng = getargs(lb, v);
        !            34:        for(i=0; i<ng; i++)
        !            35:                {
        !            36:                if (common(v[i])) continue;
        !            37:                s = sufstr(v[i]);
        !            38:                if (strlen(s)>= 14) s[14]=0;
        !            39:                strcpy(srchvec[n]=wb[n], s);
        !            40:                if (n++ >NWS) break;
        !            41:                }
        !            42:        if (n>NWS) break;
        !            43:        }
        !            44: fclose(f);
        !            45: if (n<=0) return;
        !            46: lkkeys( srchvec, n);
        !            47: }
        !            48: wdsearch(s, firsen)
        !            49:        char *s;
        !            50: {
        !            51: char *srchvec[50];
        !            52: int n;
        !            53: n=mksrch (s, srchvec);
        !            54: lkkeys( srchvec, n);
        !            55: if (firsen) printf("----\n");
        !            56: }
        !            57: mksrch (s, v)
        !            58:        char *s, *v[];
        !            59: {
        !            60: char *g[20];
        !            61: int i, n, ng;
        !            62: static char wb[20][20];
        !            63: lcase(s);
        !            64: ng = getargs(s, g);
        !            65: for (n=i=0; i<ng; i++)
        !            66:        {
        !            67:        if (common(g[i])) continue;
        !            68:        strcpy(v[n] = wb[n], sufstr(g[i]));
        !            69:        n++;
        !            70:        }
        !            71: return(n);
        !            72: }
        !            73: bfile *bf=NULL;
        !            74: bfile *bfy=NULL;
        !            75: long ytim = 0L;
        !            76: # define ND 50
        !            77: struct dst {
        !            78:        char dn[6];
        !            79:        int dc;
        !            80:        };
        !            81: struct dst docs[ND];
        !            82: struct dst *pnd = docs;
        !            83: lkkeys (srchvec, n)
        !            84:        char *srchvec[];
        !            85: {
        !            86: mbuf key, rkey, rrec;
        !            87: char ka[100], kb[100], kc[100], *dn;
        !            88: int i;
        !            89: key.mdata =ka; rkey.mdata=kb; rrec.mdata=kc;
        !            90: if (bf==NULL)
        !            91:        {
        !            92:        sprintf(ka, "%s/.I%d", storydir, day);
        !            93:        bf = bopen(ka, 0);
        !            94:        if (bf==NULL) return;
        !            95:        }
        !            96: if (bfy==NULL)
        !            97:        {
        !            98:        sprintf(ka, "%s/.I%d", storydir, yesterday);
        !            99:        bfy = bopen(ka,0);
        !           100:        strcat(ka, ".T");
        !           101:        ytim = filtim(ka);
        !           102:        }
        !           103: pnd = docs;
        !           104: for(i=0; i<n; i++)
        !           105:        {
        !           106:        sprintf(key.mdata, "%s.", srchvec[i]);
        !           107:        key.mlen = strlen(key.mdata);
        !           108:        bseek (bf, key);
        !           109:        while (bread(bf, &rkey, &rrec)==NULL)
        !           110:                {
        !           111:                rkey.mdata[rkey.mlen]=0;
        !           112:                if (strncmp(rkey.mdata, key.mdata, key.mlen)!=0)
        !           113:                        break;
        !           114:                docfnd(index(rkey.mdata, '.'));
        !           115:                }
        !           116:        if (bfy==NULL) continue;
        !           117:        bseek(bfy, key);
        !           118:        while (bread(bfy, &rkey, &rrec)==NULL)
        !           119:                {
        !           120:                rkey.mdata [rkey.mlen]=0;
        !           121:                if (strncmp(rkey.mdata, key.mdata, key.mlen)!=0)
        !           122:                        break;
        !           123:                dn = index(rkey.mdata, '.');
        !           124:                /* check that dn has not been overwritten */
        !           125:                if (dn && filtim(dn+1) <= ytim)
        !           126:                        docfnd(dn);
        !           127:                }
        !           128:        }
        !           129: docsrt();
        !           130: n = pnd-docs;
        !           131: if (n>20) n=20;
        !           132: for(i=0; i<n; i++)
        !           133:        strcpy(names[i], docs[i].dn);
        !           134: for (; i<20; i++)
        !           135:        names[i][0]=0;
        !           136: for(i=0; i<20; i++)
        !           137:        heads[i][0]=0;
        !           138: disprint();
        !           139: }
        !           140: docfnd(s)
        !           141:        char *s;
        !           142: {
        !           143: int i;
        !           144: struct dst *p;
        !           145: if (s==NULL) return;
        !           146: s++;
        !           147: assert(strlen(s)<=5);
        !           148: for(p=docs; p<pnd; p++)
        !           149:        {
        !           150:        if (strcmp(s, p->dn)==0)
        !           151:                break;
        !           152:        }
        !           153: if (p<pnd)
        !           154:        p->dc++;
        !           155: else
        !           156:        {
        !           157:        if (pnd>=docs+ND) return;
        !           158:        strcpy(pnd->dn, s);
        !           159:        pnd->dc=1;
        !           160:        pnd++;
        !           161:        }
        !           162: }
        !           163: docsrt()
        !           164: {
        !           165: int dcmp();
        !           166: struct dst *p;
        !           167: qsort( docs, pnd-docs, sizeof(*pnd), dcmp);
        !           168: }
        !           169: dcmp(p1, p2)
        !           170:        struct dst *p1, *p2;
        !           171: {
        !           172: return (p2->dc - p1->dc);
        !           173: }
        !           174: menu(lc)
        !           175: {
        !           176: char *m;
        !           177: tpos(10,0);
        !           178: if (lc==1)
        !           179:        m="titles";
        !           180: else if (lc==0)
        !           181:        m="of this story";
        !           182: else if (lc==2)
        !           183:        m="first sentences";
        !           184: printf("CR: more %s; t: top titles; m: more titles; t>N: top, rated >= N;\n", m);
        !           185: printf("s: search words; y: search story; c: copy; q: exit\n");
        !           186: }
        !           187: extend(n)
        !           188: {
        !           189: /* make sure we have n stories */
        !           190: int i, ino;
        !           191: FILE *f;
        !           192: char line[20];
        !           193: struct stat stbuff;
        !           194: if (stc>=n) return;
        !           195: for (i=inolim; i<stc; i++)
        !           196:        {
        !           197:        stat (storylist[i], &stbuff);
        !           198:        inodes[i]= stbuff.st_ino;
        !           199:        }
        !           200: if (access("..slist", 04)!=0 || (stc==0 &&
        !           201:        filtim(".") > filtim("..slist")))
        !           202:                {
        !           203:                if (fork()==0)
        !           204:                        {
        !           205:                        close(1);
        !           206:                        assert( creat("..slist", 0666) == 1);
        !           207:                        chmod("..slist", 0666);
        !           208:                        execl("/usr/bin/ls", "ls", "-t", 0);
        !           209:                        execl("/bin/ls", "ls", "-t", 0);
        !           210:                        assert(0);
        !           211:                        }
        !           212:                wait(0);
        !           213:                }
        !           214: f = fopen("..slist", "r");
        !           215: assert(f!=NULL);
        !           216: while (fgets(line, 20, f))
        !           217:        {
        !           218:        trimnl(line);
        !           219:        /* acceptable lines are a9999 or mondy.a9999 */
        !           220:        if (strlen(line)==5 && line[0]=='a')
        !           221:                ;
        !           222:        else
        !           223:        if (strlen(line)==11 && line[6]=='a')
        !           224:                ;
        !           225:        else
        !           226:                continue;
        !           227:        i=stat (line, &stbuff);
        !           228:        if (i!=0) continue;
        !           229:        ino = stbuff.st_ino;
        !           230:        for(i=0; i<stc; i++)
        !           231:                if (ino == inodes[i])
        !           232:                        break;
        !           233:        if (i<stc)
        !           234:                continue;
        !           235:        inodes[inolim=stc]=ino;
        !           236:        strcpy(storylist[stc++], line);
        !           237:        if (stc>=100) break;
        !           238:        }
        !           239: fclose(f);
        !           240: return;
        !           241: }
        !           242: long
        !           243: filtim( f)
        !           244:        char *f;
        !           245: {
        !           246: struct stat stbuff;
        !           247: int k;
        !           248: k = stat (f, &stbuff);
        !           249: if (k!=0) return(0L);
        !           250: return(stbuff.st_mtime);
        !           251: }
        !           252: /* the next routine picks out longest word */
        !           253: pickbig (wv, nw)
        !           254:        char **wv;
        !           255: {
        !           256: int mlen, mat, i, k, c;
        !           257: for(mlen=mat=i=0; i<nw; i++)
        !           258:        {
        !           259:        k = strlen(wv[i]);
        !           260:        if (k>mlen)
        !           261:                {
        !           262:                mlen=k;
        !           263:                mat=i;
        !           264:                }
        !           265:        }
        !           266: c = wv[mat][0];
        !           267: if (islower(c)) wv[mat][0]=toupper(c);
        !           268: return(mat);
        !           269: }
        !           270: lcase(s)
        !           271:        char *s;
        !           272: {
        !           273: for ( ; *s; s++)
        !           274:        {
        !           275:        if (isupper(*s))
        !           276:                *s = tolower(*s);
        !           277:        }
        !           278: }

unix.superglobalmegacorp.com

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