--- gforth/hash.fs 1996/01/07 17:22:10 1.11 +++ gforth/hash.fs 1996/05/13 16:36:58 1.14 @@ -27,8 +27,8 @@ Variable revealed \ Memory handling 10oct94py Variable HashPointer -Variable HashTable Variable HashIndex +0 Value HashTable \ DelFix and NewFix are from bigFORTH 15jul94py @@ -45,31 +45,44 @@ Variable HashIndex \ (hashkey) \ Hashlen 1- and ; +: bucket ( addr len wordlist -- bucket-addr ) + \ @var{bucket-addr} is the address of a cell that points to the first + \ element in the list of the bucket for the string @var{addr len} + wordlist-extend @ -rot hash xor ( bucket# ) + cells HashTable + ; : hash-find ( addr len wordlist -- nfa / false ) - [ 3 cells ] Literal + @ >r - 2dup hash r> xor cells HashTable @ + @ (hashfind) ; + >r 2dup r> bucket @ (hashfind) ; \ hash vocabularies 16jul94py : lastlink! ( addr link -- ) BEGIN dup @ dup WHILE nip REPEAT drop ! ; -: (reveal ( addr voc -- ) [ 3 cells ] Literal + dup @ 0< IF 2drop EXIT THEN - @ over name>string Hash xor cells >r - HashPointer 2 Cells $400 NewFix - tuck cell+ ! r> HashTable @ + insRule @ - IF dup @ 2 pick ! ! ELSE lastlink! THEN revealed on ; +: (reveal ( nfa wid -- ) + dup wordlist-extend @ 0< + IF + 2drop EXIT + THEN + over name>string rot bucket >r + HashPointer 2 Cells $400 NewFix + tuck cell+ ! r> insRule @ + IF + dup @ 2 pick ! ! + ELSE + lastlink! + THEN + revealed on ; -: hash-reveal ( -- ) (reveal) last? IF - current @ (reveal THEN ; +: hash-reveal ( nfa wid -- ) + 2dup (reveal) (reveal ; : addall ( -- ) voclink BEGIN @ dup @ WHILE dup 'initvoc REPEAT drop ; : clearhash ( -- ) - HashTable @ Hashlen cells bounds + HashTable Hashlen cells bounds DO I @ BEGIN dup WHILE dup @ swap HashPointer DelFix @@ -80,29 +93,30 @@ Variable HashIndex : (rehash) ( addr -- ) drop revealed @ IF re-hash revealed off THEN ; -Create hashsearch ' hash-find A, ' hash-reveal A, ' (rehash) A, +Create hashsearch-map ( -- wordlist-map ) + ' hash-find A, ' hash-reveal A, ' (rehash) A, \ hash allocate and vocabulary initialization 10oct94py -: hash-alloc ( addr -- addr ) HashTable @ 0= IF - Hashlen cells allocate throw HashTable ! - HashTable @ Hashlen cells erase THEN +: hash-alloc ( addr -- addr ) HashTable 0= IF + Hashlen cells allocate throw TO HashTable + HashTable Hashlen cells erase THEN HashIndex @ over ! 1 HashIndex +! HashIndex @ Hashlen >= IF clearhash 1 hashbits 1+ dup to hashbits lshift to hashlen - HashTable @ free + HashTable free addall THEN ; : (initvoc) ( addr -- ) cell+ dup @ 0< IF drop EXIT THEN insRule @ >r insRule off hash-alloc - 3 cells - hashsearch over cell+ ! dup + 3 cells - hashsearch-map over cell+ ! dup BEGIN @ dup WHILE 2dup swap (reveal REPEAT 2drop r> insRule ! ; -' (initvoc) IS 'initvoc +' (initvoc) ' 'initvoc >body ! \ Hash-Find 01jan93py @@ -110,17 +124,17 @@ addall \ Baum aufbauen \ Baumsuche ist installiert. : hash-cold ( -- ) Defers 'cold - HashPointer off HashTable off HashIndex off + HashPointer off 0 TO HashTable HashIndex off voclink BEGIN @ dup @ WHILE dup cell - @ >r dup 'initvoc r> over cell - ! REPEAT drop ; -' hash-cold IS 'cold +' hash-cold ' 'cold >body ! : .words ( -- ) - base @ >r hex HashTable @ Hashlen 0 + base @ >r hex HashTable Hashlen 0 DO cr i 2 .r ." : " dup i cells + BEGIN @ dup WHILE dup cell+ @ .name REPEAT drop @@ -133,7 +147,7 @@ addall \ Baum aufbauen \ \ gives the number of words in the current wordlist \ \ and the sum of squares for the sublist lengths \ 0 0 -\ hashtable @ Hashlen cells bounds DO +\ hashtable Hashlen cells bounds DO \ 0 i BEGIN \ @ dup WHILE \ swap 1+ swap