1: /*	@(#)spell.h	4.1	12/18/82	*/
   2: 
   3: #include <stdio.h>
   4: #include <ctype.h>
   5: 
   6: #ifndef unix
   7: #define SHIFT   5
   8: #define TABSIZE (int)(400000/(1<<SHIFT))
   9: int *tab;   /*honeywell loader deficiency*/
  10: #else
  11: #define Tolower(c)  (isupper(c)?tolower(c):c) /* ugh!!! */
  12: #define SHIFT   4
  13: #define TABSIZE 25000   /*(int)(400000/(1<<shift))--pdp11 compiler deficiency*/
  14: short   tab[TABSIZE];
  15: #endif
  16: long    p[] = {
  17:     399871,
  18:     399887,
  19:     399899,
  20:     399911,
  21:     399913,
  22:     399937,
  23:     399941,
  24:     399953,
  25:     399979,
  26:     399983,
  27:     399989,
  28: };
  29: #define NP  (sizeof(p)/sizeof(p[0]))
  30: #define NW  30
  31: 
  32: /*
  33: * Hash table for spelling checker has n bits.
  34: * Each word w is hashed by k different (modular) hash functions, hi.
  35: * The bits hi(w), i=1..k, are set for words in the dictionary.
  36: * Assuming independence, the probability that no word of a d-word
  37: * dictionary sets a particular bit is given by the Poisson formula
  38: * P = exp(-y)*y**0/0!, where y=d*k/n.
  39: * The probability that a random string is recognized as a word is then
  40: * (1-P)**k.  For given n and d this is minimum when y=log(2), P=1/2,
  41: * whence one finds, for example, that a 25000-word dictionary in a
  42: * 400000-bit table works best with k=11.
  43: */
  44: 
  45: long    pow2[NP][NW];
  46: 
  47: prime(argc, argv) register char **argv;
  48: {
  49:     int i, j;
  50:     long h;
  51:     register long *lp;
  52: 
  53: #ifndef unix
  54:     if ((tab = (int *)calloc(sizeof(*tab), TABSIZE)) == NULL)
  55:         return(0);
  56: #endif
  57:     if (argc > 1) {
  58:         FILE *f;
  59:         if ((f = fopen(argv[1], "ri")) == NULL)
  60:             return(0);
  61:         if (fread((char *)tab, sizeof(*tab), TABSIZE, f) != TABSIZE)
  62:             return(0);
  63:         fclose(f);
  64:     }
  65:     for (i=0; i<NP; i++) {
  66:         h = *(lp = pow2[i]) = 1<<14;
  67:         for (j=1; j<NW; j++)
  68:             h = *++lp = (h<<7) % p[i];
  69:     }
  70:     return(1);
  71: }
  72: 
  73: #define get(h)  (tab[h>>SHIFT]&(1<<((int)h&((1<<SHIFT)-1))))
  74: #define set(h)  tab[h>>SHIFT] |= 1<<((int)h&((1<<SHIFT)-1))

Defined functions

Defined variables

p defined in line 16; used 13 times
tab defined in line 14; used 8 times

Defined macros

NW defined in line 30; used 4 times
SHIFT defined in line 12; used 5 times
TABSIZE defined in line 13; used 6 times
Tolower defined in line 11; used 5 times
get defined in line 73; used 2 times
set defined in line 74; used 1 times

Usage of this include

Last modified: 1982-12-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 895
Valid CSS Valid XHTML 1.0 Strict