Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / fs / find-hash.fs
diff --git a/qemu/roms/SLOF/slof/fs/find-hash.fs b/qemu/roms/SLOF/slof/fs/find-hash.fs
new file mode 100644 (file)
index 0000000..a40ccbd
--- /dev/null
@@ -0,0 +1,77 @@
+\ *****************************************************************************
+\ * 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