Annotation of gforth/hash.fs, revision 1.3
1.1 pazsan 1: \ Hashed dictionaries 15jul94py
2:
1.2 anton 3: 7 value hashbits
4: 1 hashbits lshift Value Hashlen
1.1 pazsan 5:
6: Variable insRule insRule on
7:
8: \ Memory handling 15jul94py
9:
10: Variable HashPointer
11:
12: : hash-alloc ( addr -- addr ) dup @ 0= IF
13: Hashlen cells allocate throw over !
14: dup @ Hashlen cells erase THEN ;
15:
16: \ DelFix and NewFix is from bigFORTH 15jul94py
17:
18: : DelFix ( addr root -- ) dup @ 2 pick ! ! ;
19: : NewFix ( root len # -- addr )
20: BEGIN 2 pick @ ?dup 0= WHILE 2dup * allocate throw
21: over 0 ?DO dup 4 pick DelFix 2 pick + LOOP drop
22: REPEAT >r drop r@ @ rot ! r@ swap erase r> ;
23:
24: \ compute hash key 15jul94py
25:
1.2 anton 26: : hash ( addr len -- key )
27: hashbits (hashkey1) ;
28: \ (hashkey)
29: \ Hashlen 1- and ;
1.1 pazsan 30:
1.2 anton 31:
32: : hash-find ( addr len wordlist -- nfa / false )
33: $C + @ >r
34: 2dup hash cells r> + @ (hashfind) ;
1.1 pazsan 35:
36: \ hash vocabularies 16jul94py
37:
38: : lastlink! ( addr link -- )
39: BEGIN dup @ dup WHILE nip REPEAT drop ! ;
40:
41: : (reveal ( addr voc -- ) $C + dup @ 0< IF 2drop EXIT THEN
42: hash-alloc @ over cell+ count $1F and Hash cells + >r
43: HashPointer 8 $400 NewFix
44: tuck cell+ ! r> insRule @
45: IF dup @ 2 pick ! ! ELSE lastlink! THEN ;
46:
47: : hash-reveal ( -- ) (reveal) last? IF
48: current @ (reveal THEN ;
49:
50: Create hashsearch ' hash-find A, ' hash-reveal A, ' drop A,
51:
1.2 anton 52: : (initvoc ( addr -- )
53: cell+ dup @ 0< IF drop EXIT THEN
54: insRule @ >r insRule off hash-alloc
55: 3 cells - hashsearch over cell+ ! dup
56: BEGIN @ dup WHILE 2dup swap (reveal REPEAT
57: 2drop r> insRule ! ;
1.1 pazsan 58:
59: ' (initvoc IS 'initvoc
60:
1.2 anton 61: : addall ( -- )
62: voclink
63: BEGIN @ dup @ WHILE dup (initvoc REPEAT drop ;
1.1 pazsan 64:
65: \ Hash-Find 01jan93py
66:
67: addall \ Baum aufbauen
68: \ Baumsuche ist installiert.
69:
70: : .words ( -- )
71: base @ >r hex context @ 3 cells + HashLen 0
72: DO cr i 2 .r ." : " dup @ i cells +
73: BEGIN @ dup WHILE
74: dup cell+ @ .name REPEAT drop
75: LOOP drop r> base ! ;
76:
1.2 anton 77: \ \ this stuff is for evaluating the hash function
78: \ : square dup * ;
79:
80: \ : countwl ( -- sum sumsq )
81: \ \ gives the number of words in the current wordlist and the sum of
82: \ \ squares for the sublist lengths
83: \ 0 0
84: \ context @ 3 cells + @ hashlen cells over + swap DO
85: \ 0 i BEGIN
86: \ @ dup WHILE
87: \ swap 1+ swap
88: \ REPEAT
89: \ drop
90: \ swap over square +
91: \ >r + r>
92: \ 1 cells
93: \ +LOOP ;
94:
95: \ : chisq ( -- n )
96: \ \ n should have about the same size as hashlen
97: \ countwl hashlen 2 pick */ swap - ;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>