--- gforth/hash.fs 1994/12/21 14:26:24 1.7 +++ gforth/hash.fs 1996/05/06 12:39:00 1.12 @@ -1,6 +1,24 @@ \ Hashed dictionaries 15jul94py -9 value hashbits +\ Copyright (C) 1995 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 +\ of the License, or (at your option) any later version. + +\ This program is distributed in the hope that it will be useful, +\ but WITHOUT ANY WARRANTY; without even the implied warranty of +\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +\ 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +11 value hashbits 1 hashbits lshift Value Hashlen Variable insRule insRule on @@ -27,24 +45,40 @@ 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 ) - $C + @ >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 -- ) $C + dup @ 0< IF 2drop EXIT THEN - @ over cell+ count $1F and Hash xor cells >r - HashPointer 8 $400 NewFix - tuck cell+ ! r> HashTable @ + insRule @ - IF dup @ 2 pick ! ! ELSE lastlink! THEN revealed on ; - -: hash-reveal ( -- ) (reveal) last? IF - current @ (reveal THEN ; +: (reveal ( addr voc -- ) + 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 ; : addall ( -- ) voclink @@ -62,7 +96,8 @@ 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 @@ -80,7 +115,7 @@ Create hashsearch ' hash-find A, ' hash : (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 ! ;