Annotation of 3BSD/cmd/refer/what4.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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