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

1.1       root        1: /*     @(#)hash.c      1.1     */
                      2: #include "hash.h"
                      3: 
                      4: #define LOCHWIDTH 3
                      5: #define HICHWIDTH 3
                      6: #define CHARWIDTH (LOCHWIDTH+HICHWIDTH)
                      7: #define LOCHMASK ((1<<LOCHWIDTH)-1)
                      8: 
                      9: /* The hash function is first a substitution cipher into 6-bit
                     10:  * characters.  Then the string of 6-bit bytes is interpreted
                     11:  * as a huge integer, and taken mod a big prime (hashsize).
                     12:  * Unhashable trash produces an otherwise impossible value; it
                     13:  * would be prudent not to have that value in the dictionary.
                     14: */
                     15: /* if HASHWIDTH + CHARWIDTH < bitsizeof(long)
                     16:  * one could make LOCHWIDTH=6 and HICHWIDTH=0
                     17:  * and simplify accordingly; the hanky-panky
                     18:  * is to avoid overflow in long multiplication
                     19:  */
                     20: #define NC 30
                     21: 
                     22: long hashsize = HASHSIZE;
                     23: long pow2[NC*2];
                     24: 
                     25: static char hashtab[] = {
                     26: -1,    -1,     -1,     -1,     -1,     -1,     0,      31,     /*  &' */
                     27: -1,    -1,     -1,     -1,     -1,     -1,     -1,     -1,
                     28: 2,     25,     20,     35,     54,     61,     40,     39,     /* 0-7 */
                     29: 42,    33,     -1,     -1,     -1,     -1,     -1,     -1,
                     30: -1,    60,     43,     30,     5,      16,     47,     18,     /* A-G */
                     31: 41,    36,     51,     6,      13,     56,     55,     58,
                     32: 49,    12,     59,     46,     21,     32,     63,     34,
                     33: 57,    52,     3,      -1,     -1,     -1,     -1,     -1,
                     34: -1,    22,     29,     8,      7,      10,     1,      28,     /* a-g */
                     35: 11,    62,     37,     48,     15,     50,     9,      4,
                     36: 19,    38,     45,     24,     23,     26,     17,     44,
                     37: 27,    14,     53,     -1,     -1,     -1,     -1,     -1
                     38: };
                     39: 
                     40: long hash(s)
                     41: char *s;
                     42: {
                     43:        register c;
                     44:        register long *lp;
                     45:        long h = 0;
                     46:        for(lp=pow2; c = *s++&0177; ) {
                     47:                if((c-=' ') >= 0 && (c=hashtab[c]) >= 0
                     48:                   && lp < pow2+(sizeof pow2/sizeof *pow2)) {
                     49:                        h += (c&LOCHMASK) * *lp++;
                     50:                        h += (c>>LOCHWIDTH) * *lp++;
                     51:                        h %= hashsize;
                     52:                } else
                     53:                        return (1L<<HASHWIDTH) - 1;     /*trash value*/
                     54:        }
                     55:        return(h);
                     56: }
                     57: 
                     58: hashinit()
                     59: {
                     60:        register i;
                     61:        if(1L<<(HASHWIDTH+LOCHWIDTH)<=0
                     62:           || 1L<<(HASHWIDTH+HICHWIDTH)<=0)
                     63:                abort();        /* overflow is imminent */
                     64:        pow2[0] = 1L<<(HASHWIDTH-CHARWIDTH-2);
                     65:        for(i=0; i<2*NC-3; i+=2) {
                     66:                pow2[i+1] = (pow2[i]<<LOCHWIDTH) % hashsize;
                     67:                pow2[i+2] = (pow2[i+1]<<HICHWIDTH) % hashsize;
                     68:        }
                     69: }

unix.superglobalmegacorp.com

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