--- gforth/hash.fs 2001/01/28 16:54:55 1.27 +++ gforth/hash.fs 2003/01/20 17:07:37 1.32 @@ -18,6 +18,10 @@ \ along with this program; if not, write to the Free Software \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. +[IFUNDEF] erase +: erase ( addr len -- ) 0 fill ; +[THEN] + [IFUNDEF] allocate : reserve-mem here swap allot ; \ move to a kernel/memory.fs @@ -32,6 +36,12 @@ \ compute hash key 15jul94py +has? ec [IF] [IFUNDEF] hash +: hash ( addr len -- key ) + over c@ swap 1- IF swap char+ c@ + ELSE nip THEN + [ Hashlen 1- ] literal and ; +[THEN] [THEN] + [IFUNDEF] hash : hash ( addr len -- key ) hashbits (hashkey1) ; @@ -42,12 +52,13 @@ Variable revealed \ Memory handling 10oct94py -Variable HashPointer -Variable HashIndex -0 Value HashTable +AVariable HashPointer +Variable HashIndex \ Number of wordlists +Variable HashPop \ Number of words +0 AValue HashTable \ forward declarations -0 Value hashsearch-map +0 AValue hashsearch-map Defer hash-alloc ( addr -- addr ) \ DelFix and NewFix are from bigFORTH 15jul94py @@ -81,20 +92,20 @@ Defer hash-alloc ( addr -- addr ) ELSE lastlink! THEN - revealed on ; + revealed on 1 HashPop +! 0 hash-alloc drop ; : hash-reveal ( nfa wid -- ) 2dup (reveal) (reveal ; : inithash ( wid -- ) wordlist-extend - insRule @ >r insRule off hash-alloc 3 cells - + insRule @ >r insRule off 1 hash-alloc over ! 3 cells - dup wordlist-id BEGIN @ dup WHILE 2dup swap (reveal REPEAT 2drop r> insRule ! ; : addall ( -- ) - voclink + HashPop off voclink BEGIN @ dup WHILE dup 0 wordlist-link - dup wordlist-map @ reveal-method @ ['] hash-reveal = @@ -134,26 +145,29 @@ Defer hash-alloc ( addr -- addr ) IF inithash ELSE rehashall THEN ; -\ >rom ?! -align here ' hash-find A, ' hash-reveal A, ' (rehash) A, ' (rehash) A, -to hashsearch-map +: hashdouble ( -- ) + HashTable >r clearhash + 1 hashbits 1+ dup to hashbits lshift to hashlen + r> free >r 0 to HashTable + addall r> throw ; + +const Create (hashsearch-map) +' hash-find A, ' hash-reveal A, ' (rehash) A, ' (rehash) A, +(hashsearch-map) to hashsearch-map \ hash allocate and vocabulary initialization 10oct94py -:noname ( addr -- addr ) +:noname ( n+ -- n ) HashTable 0= IF Hashlen cells reserve-mem TO HashTable HashTable Hashlen cells erase THEN - HashIndex @ over ! 1 HashIndex +! + HashIndex @ swap HashIndex +! HashIndex @ Hashlen >= [ [IFUNDEF] allocate ] ABORT" no more space in hashtable" [ [ELSE] ] - IF HashTable >r clearhash - 1 hashbits 1+ dup to hashbits lshift to hashlen - r> free >r 0 to HashTable - addall r> throw - THEN + HashPop @ hashlen 2* >= or + IF hashdouble THEN [ [THEN] ] ; is hash-alloc \ Hash-Find 01jan93py