Annotation of 42BSD/usr.bin/refer/what4.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)what4.c     4.1 (Berkeley) 5/6/83";
        !             3: #endif
        !             4: 
        !             5: #include "what..c"
        !             6: #define NW 5
        !             7: #define ZIPF 10
        !             8: #define HASHF 3
        !             9: #define WLEN 10
        !            10: #define SAME 0
        !            11: #define TSIZE HASHF*ZIPF*NW
        !            12: #define NF 10
        !            13: 
        !            14: struct wst { 
        !            15:        char *tx; 
        !            16:        int ct; 
        !            17: } 
        !            18: ;
        !            19: int HSIZE;
        !            20: static struct wst word[TSIZE];
        !            21: static char tbuf[NW*ZIPF*WLEN], *tp tbuf;
        !            22: 
        !            23: freqwd ( fn, wd, nin )
        !            24: char *fn[], *wd[];
        !            25: {
        !            26:        FILE *fi[NF];
        !            27:        int nw 0, i, any, nf, j, wexch(), wcomp();
        !            28:        char tw[20];
        !            29:        for(HSIZE=TSIZE; !prime(HSIZE); HSIZE--);
        !            30:        for(nf=0; fn[nf] && nf<NF; nf++)
        !            31:                fi[nf] = fn[nf][0] ? fopen(fn[nf], "r") : NULL;
        !            32:        do {
        !            33:                any=0;
        !            34:                for(i=0; i<nf; i++)
        !            35:                {
        !            36:                        if (fi[i]==NULL) continue;
        !            37:                        if (gw(fi[i], tw)==0)
        !            38:                        {
        !            39:                                fclose(fi[i]);
        !            40:                                fi[i]==NULL;
        !            41:                                continue;
        !            42:                        }
        !            43:                        any=1;
        !            44:                        if (common(tw)) continue;
        !            45:                        if (strlen(tw)<3) continue;
        !            46:                        j = lookup (tw);
        !            47:                        if (j<0 && nw < ZIPF*NW)
        !            48:                        {
        !            49:                                j = -j;
        !            50:                                strcpy (tp, tw);
        !            51:                                word[j].tx = tp;
        !            52:                                while (*tp++);
        !            53:                                _assert (tp < tbuf+NW*ZIPF*WLEN);
        !            54:                                word[j].ct = 1;
        !            55:                                nw++;
        !            56:                        }
        !            57:                        else if (j>0)
        !            58:                                word[j].ct++;
        !            59:                }
        !            60:        } 
        !            61:        while (any>0);
        !            62:        shell ( TSIZE, wcomp, wexch );
        !            63:        for(nw=0; word[nw].ct >0 && nw<TSIZE; nw++)
        !            64:                if (nw>=nin*2 && word[nw].ct != word[0].ct)
        !            65:                        break;
        !            66:        for(i=0; i<nw; i++)
        !            67:                wd[i] = word[i].tx;
        !            68:        return(nw);
        !            69: }
        !            70: 
        !            71: lookup (wt)
        !            72: char *wt;
        !            73: {
        !            74:        int h;
        !            75:        h = hash(wt);
        !            76:        for( h = h%HSIZE; word[h].tx; h = (h+1)%HSIZE)
        !            77:        {
        !            78:                if (h==0) continue;
        !            79:                if (strcmp(wt, word[h].tx) == SAME)
        !            80:                        return (h);
        !            81:        }
        !            82:        return ( -h );
        !            83: }
        !            84: 
        !            85: hash (s)
        !            86: char *s;
        !            87: {
        !            88:        int k 0, c 0, i 0;
        !            89:        while ( c = *s++ )
        !            90:                k ^= (c << (i++%5) );
        !            91:        return (k>0 ? k : -k);
        !            92: }
        !            93: 
        !            94: gw (f, t)
        !            95: char *t;
        !            96: FILE *f;
        !            97: {
        !            98:        int start 1, oldc ' ', c;
        !            99:        if (f==NULL) return (0);
        !           100:        while ( (c=getc(f)) != EOF)
        !           101:        {
        !           102:                if (isupper(c)) c= tolower(c);
        !           103:                if (start==1)
        !           104:                        if (!alphanum(c, oldc))
        !           105:                                continue;
        !           106:                        else
        !           107:                                start=0;
        !           108:                if (start==0)
        !           109:                        if (alphanum(c, oldc))
        !           110:                                *t++ = c;
        !           111:                        else
        !           112:                        {
        !           113:                                *t=0;
        !           114:                                return(1);
        !           115:                        }
        !           116:                oldc=c;
        !           117:        }
        !           118:        return(0);
        !           119: }
        !           120: 
        !           121: alphanum( c, oldc )
        !           122: {
        !           123:        if (isalpha(c) || isdigit(c)) return(1);
        !           124:        if (isalpha(oldc))
        !           125:                if (c== '\'' || c == '-') return(1);
        !           126:        return(0);
        !           127: }
        !           128: 
        !           129: wcomp (n1, n2)
        !           130: {
        !           131:        return (word[n1].ct >= word[n2].ct);
        !           132: }
        !           133: 
        !           134: wexch (n1, n2)
        !           135: {
        !           136:        struct wst tt;
        !           137:        tt.tx = word[n1].tx; 
        !           138:        tt.ct = word[n1].ct;
        !           139:        word[n1].tx = word[n2].tx; 
        !           140:        word[n1].ct = word[n2].ct;
        !           141:        word[n2].tx = tt.tx; 
        !           142:        word[n2].ct = tt.ct;
        !           143: }
        !           144: 
        !           145: prime(n)
        !           146: {
        !           147:        /* only executed once- slow is ok */
        !           148:        int i;
        !           149:        if (n%2==0) return(0);
        !           150:        for(i=3; i*i<=n; i+= 2)
        !           151:                if (n%i ==0 ) return(0);
        !           152:        return(1);
        !           153: }
        !           154: 
        !           155: trimnl(s)
        !           156: char *s;
        !           157: {
        !           158:        while (*s)s++;
        !           159:        if (*--s=='\n') *s=0;
        !           160: }
        !           161: 
        !           162: /* this is the test for what4.c as a standalone prog ... */
        !           163: # ifdef 0
        !           164: main (argc, argv)
        !           165: char *argv[];
        !           166: {
        !           167:        char *ff[10], *wd[20], **ffp ff;
        !           168:        int n, i;
        !           169: 
        !           170:        while (--argc)
        !           171:                *ffp++ = *++argv;
        !           172:        *ffp=0;
        !           173:        n=freqwd(ff,wd);
        !           174:        for(i=0; i<n; i++)
        !           175:                printf("%s\n",wd[i]);
        !           176:        printf("total of %d items\n",n);
        !           177: }
        !           178: # endif 0

unix.superglobalmegacorp.com

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