Annotation of researchv8dc/cmd/spell/hashlook.c, revision 1.1.1.1

1.1       root        1: /*     @(#)hashlook.c  1.4     */
                      2: #include <stdio.h>
                      3: #include "hash.h"
                      4: #include "huff.h"
                      5: 
                      6: unsigned *table;
                      7: unsigned short index[NI];
                      8: 
                      9: #define B (BYTE*sizeof(unsigned))
                     10: #define L (BYTE*sizeof(long)-1)
                     11: #define MASK (~(1L<<L))
                     12: 
                     13: #ifdef pdp11   /*sizeof(unsigned)==sizeof(long)/2 */
                     14: #define fetch(wp,bp)\
                     15:        (((((long)wp[0]<<B)|wp[1])<<(B-bp))|(wp[2]>>bp))
                     16: #else          /*sizeof(unsigned)==sizeof(long)*/
                     17: #define fetch(wp,bp) (bp==B?wp[0]:((wp[0]<<(B-bp))|(wp[1]>>bp)))
                     18: #endif
                     19: 
                     20: hashlook(s)
                     21: char *s;
                     22: {
                     23:        long h;
                     24:        long t;
                     25:        register bp;
                     26:        register unsigned *wp;
                     27:        int i;
                     28:        long sum;
                     29:        unsigned *tp;
                     30: 
                     31:        h = hash(s);
                     32:        t = h>>(HASHWIDTH-INDEXWIDTH);
                     33:        wp = &table[index[t]];
                     34:        tp = &table[index[t+1]];
                     35:        bp = B;
                     36:        sum = (long)t<<(HASHWIDTH-INDEXWIDTH);
                     37:        for(;;) {
                     38:                {/*     this block is equivalent to
                     39:                         bp -= decode((fetch(wp,bp)>>1)&MASK, &t);*/
                     40:                        long y;
                     41:                        long v;
                     42:                        y = (fetch(wp,bp)>>1) & MASK;
                     43:                        if(y < cs) {
                     44:                                t = y >> (L+1-w);
                     45:                                bp -= w-1;
                     46:                        }
                     47:                        else {
                     48:                                for(bp-=w,v=v0; y>=qcs; y=(y<<1)&MASK,v+=n)
                     49:                                        bp -= 1;
                     50:                                t = v + (y>>(L-w));
                     51:                        }
                     52:                }
                     53:                while(bp<=0) {
                     54:                        bp += B;
                     55:                        wp++;
                     56:                }
                     57:                if(wp>=tp&&(wp>tp||bp<B))
                     58:                        return(0);
                     59:                sum += t;
                     60:                if(sum<h)
                     61:                        continue;
                     62:                return(sum==h);
                     63:        }
                     64: }
                     65: 
                     66: 
                     67: prime(argc,argv)
                     68: char **argv;
                     69: {
                     70:        register FILE *f;
                     71:        register fd;
                     72:        extern char *malloc();
                     73:        if(argc <= 1)
                     74:                return(0);
                     75: #ifndef pdp11
                     76:        if(sizeof(long) > sizeof(unsigned))
                     77:                abort();        /*wrong fetch macro*/
                     78: #endif
                     79: #ifdef pdp11   /* because of insufficient address space for buffers*/
                     80:        fd = dup(0);
                     81:        close(0);
                     82:        if(open(argv[1], 0) != 0)
                     83:                return(0);
                     84:        f = stdin;
                     85:        if(rhuff(f)==0
                     86:        || read(fileno(f), (char *)index, NI*sizeof(*index)) != NI*sizeof(*index)
                     87:        || (table = (unsigned*)malloc(index[NI-1]*sizeof(*table))) == 0
                     88:        || read(fileno(f), (char*)table, sizeof(*table)*index[NI-1])
                     89:           != index[NI-1]*sizeof(*table))
                     90:                return(0);
                     91:        close(0);
                     92:        if(dup(fd) != 0)
                     93:                return(0);
                     94:        close(fd);
                     95: #else
                     96:        if((f = fopen(argv[1], "ri")) == NULL)
                     97:                return(0);
                     98:        if(rhuff(f)==0
                     99:        || fread((char*)index, sizeof(*index),  NI, f) != NI
                    100:        || (table = (unsigned*)malloc(index[NI-1]*sizeof(*table))) == 0
                    101:        || fread((char*)table, sizeof(*table), index[NI-1], f)
                    102:           != index[NI-1])
                    103:                return(0);
                    104:        fclose(f);
                    105: #endif
                    106:        hashinit();
                    107:        return(1);
                    108: }

unix.superglobalmegacorp.com

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