X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/055fa6bf18e0733d1bf2f97075d6bb33c76e72b5..HEAD:/bsearchtree.pas?ds=sidebyside

diff --git a/bsearchtree.pas b/bsearchtree.pas
index ad61751..249a6ff 100644
--- a/bsearchtree.pas
+++ b/bsearchtree.pas
@@ -7,6 +7,9 @@
 
 unit bsearchtree;
 
+{$ifdef fpc}
+  {$mode delphi}
+{$endif}
 interface
 
 uses blinklist;
@@ -17,38 +20,44 @@ const
 type
   thashitem=class(tlinklist)
     hash:integer;
-    s:string;
+    s:ansistring;
     p:pointer;
   end;
   thashtable=array[0..hashtable_size-1] of thashitem;
   phashtable=^thashtable;
 
 {adds "item" to the tree for name "s". the name must not exist (no checking done)}
-procedure addtree(t:phashtable;s:string;item:pointer);
+procedure addtree(t:phashtable;s:ansistring;item:pointer);
 
 {removes name "s" from the tree. the name must exist (no checking done)}
-procedure deltree(t:phashtable;s:string);
+procedure deltree(t:phashtable;s:ansistring);
 
 {returns the item pointer for s, or nil if not found}
-function findtree(t:phashtable;s:string):pointer;
+function findtree(t:phashtable;s:ansistring):pointer;
+
+{clear a hashtable, deallocating all used resources}
+procedure cleartree(t:phashtable);
 
 implementation
 
-function makehash(s:string):integer;
+//FNV-1a hash function
+function makehash(s:ansistring):integer;
 const
   shifter=6;
 var
   a,b:integer;
+  h:longword;
 begin
   result := 0;
   b := length(s);
+  h := 216613626;
   for a := 1 to b do begin
-    result := (result shl shifter) xor byte(s[a]);
+    h := (h xor byte(s[a])) * 16777619;
   end;
-  result := (result xor result shr 16) and (hashtable_size-1);
+  result := h and (hashtable_size-1);
 end;
 
-procedure addtree(t:phashtable;s:string;item:pointer);
+procedure addtree(t:phashtable;s:ansistring;item:pointer);
 var
   hash:integer;
   p:thashitem;
@@ -61,7 +70,7 @@ begin
   linklistadd(tlinklist(t[hash]),tlinklist(p));
 end;
 
-procedure deltree(t:phashtable;s:string);
+procedure deltree(t:phashtable;s:ansistring);
 var
   p,p2:thashitem;
   hash:integer;
@@ -81,7 +90,7 @@ begin
 end;
 
 
-function findtree(t:phashtable;s:string):pointer;
+function findtree(t:phashtable;s:ansistring):pointer;
 var
   p:thashitem;
   hash:integer;
@@ -98,4 +107,20 @@ begin
   end;
 end;
 
+procedure cleartree(t:phashtable);
+var
+  hash:integer;
+  p,p2:thashitem;
+begin
+  for hash := 0 to hashtable_size-1 do begin
+    p := t[hash];
+    while p <> nil do begin
+      p2 := thashitem(p.next);
+      linklistdel(tlinklist(t[hash]),tlinklist(p));
+      p.destroy;
+      p := thashitem(p2);
+    end;
+  end;
+end;
+
 end.