| \ ***************************************************************************** |
| \ * Copyright (c) 2004, 2008 IBM Corporation |
| \ * All rights reserved. |
| \ * This program and the accompanying materials |
| \ * are made available under the terms of the BSD License |
| \ * which accompanies this distribution, and is available at |
| \ * http://www.opensource.org/licenses/bsd-license.php |
| \ * |
| \ * Contributors: |
| \ * IBM Corporation - initial implementation |
| \ ****************************************************************************/ |
| |
| #ifdef HASH_DEBUG |
| 0 value from-hash |
| 0 value not-from-hash |
| 0 value hash-collisions |
| #endif |
| |
| clean-hash |
| |
| : hash-find ( str len head -- 0 | link ) |
| >r 2dup 2dup hash ( str len str len hash R: head ) |
| dup >r @ dup ( str len str len *hash *hash R: head hash ) |
| IF ( str len str len *hash R: head hash ) |
| link>name name>string string=ci ( str len true|false R: head hash ) |
| dup 0= |
| IF |
| #ifdef HASH_DEBUG |
| hash-collisions 1+ |
| to hash-collisions |
| #endif |
| THEN |
| ELSE |
| nip nip ( str len 0 R: head hash ) |
| THEN |
| IF \ hash found |
| 2drop r> @ r> drop ( *hash R: ) |
| #ifdef HASH_DEBUG |
| from-hash 1+ to from-hash |
| #endif |
| exit |
| THEN \ hash not found |
| r> r> swap >r ((find)) ( str len head R: hash=0 ) |
| dup |
| IF |
| #ifdef HASH_DEBUG |
| not-from-hash 1+ |
| to not-from-hash |
| #endif |
| dup r> ! ( link R: ) |
| ELSE |
| r> drop ( 0 R: ) |
| THEN |
| ; |
| |
| : hash-reveal hash off ; |
| |
| ' hash-reveal to (reveal) |
| ' hash-find to (find) |
| |
| #ifdef HASH_DEBUG |
| \ print out all entries in the hash table |
| : dump-hash-table ( -- ) |
| cr |
| hash-table hash-size 0 DO |
| dup @ dup 0<> IF |
| over . s" : " type link>name name>string type cr |
| ELSE |
| drop |
| THEN |
| cell+ |
| LOOP drop |
| s" hash-collisions: " type hash-collisions . cr |
| s" from-hash: " type from-hash . cr |
| s" not-from-hash: " type not-from-hash . cr |
| ; |
| #endif |