+++ /dev/null
-{ Copyright (C) 2005 Bas Steendijk and Peter Green\r
- For conditions of distribution and use, see copyright notice in zlib_license.txt\r
- which is included in the package\r
- ----------------------------------------------------------------------------- }\r
- \r
-{actually a hashtable. it was a tree in earlier versions}\r
-\r
-unit bsearchtree;\r
-\r
-interface\r
-\r
-uses blinklist;\r
-\r
-const\r
- hashtable_size=$4000;\r
-\r
-type\r
- thashitem=class(tlinklist)\r
- hash:integer;\r
- s:string;\r
- p:pointer;\r
- end;\r
- thashtable=array[0..hashtable_size-1] of thashitem;\r
- phashtable=^thashtable;\r
-\r
-{adds "item" to the tree for name "s". the name must not exist (no checking done)}\r
-procedure addtree(t:phashtable;s:string;item:pointer);\r
-\r
-{removes name "s" from the tree. the name must exist (no checking done)}\r
-procedure deltree(t:phashtable;s:string);\r
-\r
-{returns the item pointer for s, or nil if not found}\r
-function findtree(t:phashtable;s:string):pointer;\r
-\r
-implementation\r
-\r
-function makehash(s:string):integer;\r
-const\r
- shifter=6;\r
-var\r
- a,b:integer;\r
-begin\r
- result := 0;\r
- b := length(s);\r
- for a := 1 to b do begin\r
- result := (result shl shifter) xor byte(s[a]);\r
- end;\r
- result := (result xor result shr 16) and (hashtable_size-1);\r
-end;\r
-\r
-procedure addtree(t:phashtable;s:string;item:pointer);\r
-var\r
- hash:integer;\r
- p:thashitem;\r
-begin\r
- hash := makehash(s);\r
- p := thashitem.create;\r
- p.hash := hash;\r
- p.s := s;\r
- p.p := item;\r
- linklistadd(tlinklist(t[hash]),tlinklist(p));\r
-end;\r
-\r
-procedure deltree(t:phashtable;s:string);\r
-var\r
- p,p2:thashitem;\r
- hash:integer;\r
-begin\r
- hash := makehash(s);\r
- p := t[hash];\r
- p2 := nil;\r
- while p <> nil do begin\r
- if p.s = s then begin\r
- p2 := p;\r
- break;\r
- end;\r
- p := thashitem(p.next);\r
- end;\r
- linklistdel(tlinklist(t[hash]),tlinklist(p2));\r
- p2.destroy;\r
-end;\r
-\r
-\r
-function findtree(t:phashtable;s:string):pointer;\r
-var\r
- p:thashitem;\r
- hash:integer;\r
-begin\r
- result := nil;\r
- hash := makehash(s);\r
- p := t[hash];\r
- while p <> nil do begin\r
- if p.s = s then begin\r
- result := p.p;\r
- exit;\r
- end;\r
- p := thashitem(p.next);\r
- end;\r
-end;\r
-\r
-end.\r