Replace obsolete/broken lcoregtklaz with new lcorelazarus
[lcore.git] / bsearchtree.pas
index d9e3ea26523f94a13b1c8819b38301725061e6de..249a6ff3c066e48b9f19b2777a3ae97f4be5c8b3 100644 (file)
@@ -7,6 +7,9 @@
 \r
 unit bsearchtree;\r
 \r
+{$ifdef fpc}\r
+  {$mode delphi}\r
+{$endif}\r
 interface\r
 \r
 uses blinklist;\r
@@ -32,20 +35,26 @@ procedure deltree(t:phashtable;s:ansistring);
 {returns the item pointer for s, or nil if not found}\r
 function findtree(t:phashtable;s:ansistring):pointer;\r
 \r
+{clear a hashtable, deallocating all used resources}\r
+procedure cleartree(t:phashtable);\r
+\r
 implementation\r
 \r
+//FNV-1a hash function\r
 function makehash(s:ansistring):integer;\r
 const\r
   shifter=6;\r
 var\r
   a,b:integer;\r
+  h:longword;\r
 begin\r
   result := 0;\r
   b := length(s);\r
+  h := 216613626;\r
   for a := 1 to b do begin\r
-    result := (result shl shifter) xor byte(s[a]);\r
+    h := (h xor byte(s[a])) * 16777619;\r
   end;\r
-  result := (result xor result shr 16) and (hashtable_size-1);\r
+  result := h and (hashtable_size-1);\r
 end;\r
 \r
 procedure addtree(t:phashtable;s:ansistring;item:pointer);\r
@@ -98,4 +107,20 @@ begin
   end;\r
 end;\r
 \r
+procedure cleartree(t:phashtable);\r
+var\r
+  hash:integer;\r
+  p,p2:thashitem;\r
+begin\r
+  for hash := 0 to hashtable_size-1 do begin\r
+    p := t[hash];\r
+    while p <> nil do begin\r
+      p2 := thashitem(p.next);\r
+      linklistdel(tlinklist(t[hash]),tlinklist(p));\r
+      p.destroy;\r
+      p := thashitem(p2);\r
+    end;\r
+  end;\r
+end;\r
+\r
 end.\r