--- gforth/hash.fs 1994/10/18 15:51:18 1.4 +++ gforth/hash.fs 1996/05/13 16:36:58 1.14 @@ -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 @@ -9,8 +27,8 @@ Variable revealed \ Memory handling 10oct94py Variable HashPointer -Variable HashTable Variable HashIndex +0 Value HashTable \ DelFix and NewFix are from bigFORTH 15jul94py @@ -27,72 +45,96 @@ 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 ; +: (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 REPEAT I ! cell +LOOP HashIndex off ; -: rehash clearhash addall ; +: re-hash clearhash addall ; : (rehash) ( addr -- ) - drop revealed @ IF rehash revealed off THEN ; + 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 addall \ Baum aufbauen \ Baumsuche ist installiert. +: hash-cold ( -- ) Defers 'cold + HashPointer off 0 TO HashTable HashIndex off + voclink + BEGIN @ dup @ WHILE + dup cell - @ >r + dup 'initvoc + r> over cell - ! + REPEAT drop ; +' 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 @@ -105,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