--- gforth/hash.fs 2001/09/04 09:17:02 1.28 +++ gforth/hash.fs 2007/12/31 19:02:24 1.37 @@ -1,12 +1,12 @@ \ Hashed dictionaries 15jul94py -\ Copyright (C) 1995,1998,2000 Free Software Foundation, Inc. +\ Copyright (C) 1995,1998,2000,2003,2006,2007 Free Software Foundation, Inc. \ This file is part of Gforth. \ Gforth is free software; you can redistribute it and/or \ modify it under the terms of the GNU General Public License -\ as published by the Free Software Foundation; either version 2 +\ as published by the Free Software Foundation, either version 3 \ of the License, or (at your option) any later version. \ This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ \ GNU General Public License for more details. \ You should have received a copy of the GNU General Public License -\ along with this program; if not, write to the Free Software -\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. +\ along with this program. If not, see http://www.gnu.org/licenses/. [IFUNDEF] erase : erase ( addr len -- ) 0 fill ; @@ -53,7 +52,8 @@ Variable revealed \ Memory handling 10oct94py AVariable HashPointer -Variable HashIndex +Variable HashIndex \ Number of wordlists +Variable HashPop \ Number of words 0 AValue HashTable \ forward declarations @@ -91,20 +91,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 = @@ -144,26 +144,29 @@ Defer hash-alloc ( addr -- addr ) IF inithash ELSE rehashall THEN ; +: 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 @@ -189,7 +192,10 @@ has? cross 0= \ REPEAT drop [ has? ec [IF] ] ." Done" cr [ [THEN] ] ; -' hash-cold INIT8 chained +:noname ( -- ) + defers 'cold + hash-cold +; is 'cold : .words ( -- ) base @ >r hex HashTable Hashlen 0