Fixed: hash conflict list
This commit is contained in:
parent
40d0401c95
commit
4d284957d4
@ -32,6 +32,6 @@
|
|||||||
-M
|
-M
|
||||||
-$M16384,1048576
|
-$M16384,1048576
|
||||||
-K$00400000
|
-K$00400000
|
||||||
-LE"c:\program files\borland\delphi6\Projects\Bpl"
|
-LE"c:\delphi6\Projects\Bpl"
|
||||||
-LN"c:\program files\borland\delphi6\Projects\Bpl"
|
-LN"c:\delphi6\Projects\Bpl"
|
||||||
-DmadExcept
|
-DmadExcept
|
||||||
|
@ -56,6 +56,10 @@ HostApplication=
|
|||||||
Launcher=
|
Launcher=
|
||||||
UseLauncher=0
|
UseLauncher=0
|
||||||
DebugCWD=
|
DebugCWD=
|
||||||
|
[Language]
|
||||||
|
ActiveLang=
|
||||||
|
ProjectLang=
|
||||||
|
RootDir=
|
||||||
[Version Info]
|
[Version Info]
|
||||||
IncludeVerInfo=0
|
IncludeVerInfo=0
|
||||||
AutoIncBuild=0
|
AutoIncBuild=0
|
||||||
@ -82,118 +86,11 @@ ProductName=
|
|||||||
ProductVersion=1.0.0.0
|
ProductVersion=1.0.0.0
|
||||||
Comments=
|
Comments=
|
||||||
[Excluded Packages]
|
[Excluded Packages]
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\dclIndyCore60.bpl=Indy 10 Core Design Time
|
c:\delphi6\Projects\Bpl\DIPasDocD6.bpl=DiPasDoc - Designtime
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\dclIndyProtocols60.bpl=Indy 10 Protocols Design Time
|
C:\Program Files\madCollection\madRemote\Delphi 6\madRemote_.bpl=madRemote 1.1b · www.madshi.net
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\P164_D60.bpl=TurboPower OfficePartner 1.64 Design-time package - VCL60
|
C:\Program Files\madCollection\madKernel\Delphi 6\madKernel_.bpl=madKernel 1.3 · www.madshi.net
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\VirtualTreesD6D.bpl=Virtual Treeview
|
C:\Program Files\madCollection\madCodeHook\Delphi 6\madCodeHook_.bpl=madCodeHook 2.1b · www.madshi.net
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\BalloonD6.bpl=Balloon 2.0
|
C:\Program Files\madCollection\madSecurity\Delphi 6\madSecurity_.bpl=madSecurity 1.1n · www.madshi.net
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\SysILS.bpl=(untitled)
|
C:\Program Files\madCollection\madShell\Delphi 6\madShell_.bpl=madShell 1.3k · www.madshi.net
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\DragDropD6.bpl=Drag and Drop Component Suite
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JvCoreD6D.bpl=JVCL Core Components
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\JvStdCtrlsD6D.bpl=JVCL Standard Controls
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCustomD6D.bpl=JVCL Custom Controls
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCtrlsD6D.bpl=JVCL Visual Controls
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvWizardD6D.bpl=JVCL Wizard Design Time Package
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\dclIndy60.bpl=Internet Direct (Indy) for D6 Property and Component Editors
|
|
||||||
c:\program files\borland\delphi6\Bin\dclnet60.bpl=Borland Internet Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclsoap60.bpl=Borland SOAP Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ColorPickerButtonD6.bpl=ColorPickerButton
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\ThreadNameExpert60.bpl=JCL Thread Name IDE expert for Delphi 6
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvDlgsD6D.bpl=JVCL Dialog Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\asqlite.bpl=Aducom Software -- SQLite Design Time Components
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\aSQLitepkg.bpl=Aducom Software -- SQLite RunTime Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvAppFrmD6D.bpl=JVCL Application and Form Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvBandsD6D.bpl=JVCL Band Objects
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCmpD6D.bpl=JVCL Non-Visual Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCryptD6D.bpl=JVCL Encryption and Compression Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvDockingD6D.bpl=JVCL Docking Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvDotNetCtrlsD6D.bpl=JVCL DotNet Controls
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvGlobusD6D.bpl=JVCL Globus Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvHMID6D.bpl=JVCL HMI Controls design time unit
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvInterpreterD6D.bpl=JVCL Interpreter Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvJansD6D.bpl=JVCL Jans Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvManagedThreadsD6D.bpl=JVCL Managed Threads
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvMMD6D.bpl=JVCL Multimedia and Image Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvNetD6D.bpl=JVCL Network Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvPageCompsD6D.bpl=JVCL Page Style Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvPluginD6D.bpl=JVCL Plugin Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvPrintPreviewD6D.bpl=JVCL Print Preview Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvSystemD6D.bpl=JVCL System Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvTimeFrameworkD6D.bpl=JVCL Time Framework
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvValidatorsD6D.bpl=JVCL Validators and Error Provider Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Projects\Bpl\JvXPCtrlsD6D.bpl=JVCL XP Controls
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\GJLSoftwareD5.bpl=GJL Software ExDBGrid Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\FREEREP6.bpl=FreeReport 2.32 Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\PageControlExD6.bpl=PageControlEx
|
|
||||||
F:\Delphi\Components\madCollection\madExcept\Delphi 6\madExceptIde_.bpl=madExceptIde 1.0b · www.madshi.net
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ZCore.bpl=Zeos Core Classes and Intefaces
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ZParse.bpl=Zeos Parsing Classes and Intefaces
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ZParseSql.bpl=Zeos SQL Parsing Classes and Intefaces
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ZPlain.bpl=Zeos Plain Database API
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ZDbc.bpl=Zeos Low Level Database API
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ZComponent.bpl=Zeos Database Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\IconXPD6.bpl=IconXP
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\NLDVDBT_D6D.bpl=NLDVirtualDBTree
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ff2_d60.bpl=TurboPower FlashFiler Designtime Package - VCL60
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\GR32_D6.bpl=Graphics32
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\GR32_DSGN_D6.bpl=Graphics32 Design Time Package
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\PNGImage_D6.bpl=PNGImage
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\tbx_d6.bpl=Toolbar2000 -- TBX Extensions (Alex Denisov)
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\tb2k_d6.bpl=Toolbar2000 Components (Jordan Russell)
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\tbxdsgn_d6.bpl=Toolbar2000 -- TBX Extensions Design Package (Alex Denisov)
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\tb2kdsgn_d6.bpl=Toolbar2000 Design Package (Jordan Russell)
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\SynEdit_D6.bpl=SynEdit component suite
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\DelphiX_for5.bpl=DelphiX - DirectX components for Delphi
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\NLDMBD6D.bpl=NLDMessageBox
|
|
||||||
c:\program files\borland\delphi6\Bin\dcl31w60.bpl=Delphi 1.0 Compatibility Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\NLDTrayIconD6.bpl=NLDTrayIcon donated by SVG_1986
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ServerListD6D.bpl=SOF2Manager - Server List Designtime
|
|
||||||
C:\WINDOWS\System32\ibevnt60.bpl=Borland Interbase Event Alerter Component
|
C:\WINDOWS\System32\ibevnt60.bpl=Borland Interbase Event Alerter Component
|
||||||
F:\Delphi\Components\madCollection\madBasic\Delphi 6\madHelp_.bpl=madHelp 1.1 · www.madshi.net
|
c:\delphi6\Projects\Bpl\PsychoTidyD6.bpl=PsychoTidy IDE Expert
|
||||||
F:\Delphi\Components\madCollection\madRemote\Delphi 6\madRemote_.bpl=madRemote 1.1a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madKernel\Delphi 6\madKernel_.bpl=madKernel 1.2z · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madCodeHook\Delphi 6\madCodeHook_.bpl=madCodeHook 2.0a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madSecurity\Delphi 6\madSecurity_.bpl=madSecurity 1.1n · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madShell\Delphi 6\madShell_.bpl=madShell 1.3i · www.madshi.net
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\BMSpinEditD6.bpl=BMSpinEdit
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\GLScene6.bpl=GLScene - OpenGL 3D library
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\TntUnicodeVcl_D60.bpl=Tnt Unicode Controls
|
|
||||||
c:\program files\borland\delphi6\Bin\dclsmp60.bpl=Borland Sample Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\X2MultiMon_D6D.bpl=X2MultiMon Designtime Package
|
|
||||||
F:\Delphi\Components\ZipForge\Lib\Delphi 6\dclZipForged6.bpl=ZipForge Package
|
|
||||||
c:\program files\borland\delphi6\Bin\dclado60.bpl=Borland ADO DB Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclbde60.bpl=Borland BDE DB Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dbx60.bpl=Borland SQL Explorer UI Package
|
|
||||||
c:\program files\borland\delphi6\Bin\DCLIB60.bpl=InterBase Data Access Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclbdecds60.bpl=Borland Local BDE ClientDataset Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclqrt60.bpl=QuickReport Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcltee60.bpl=TeeChart Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcldss60.bpl=Borland Decision Cube Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcltqr60.bpl=TeeChart for QuickReport Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclclxdb60.bpl=Borland CLX Database Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclclxstd60.bpl=Borland CLX Standard Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclmcn60.bpl=Borland DataSnap Connection Components
|
|
||||||
c:\program files\borland\delphi6\Bin\applet60.bpl=Borland Control Panel Applet Package
|
|
||||||
c:\program files\borland\delphi6\Bin\dclemacsedit60.bpl=Borland Editor Emacs Enhancements
|
|
||||||
c:\program files\borland\delphi6\Bin\dclshlctrls60.bpl=Shell Control Property and Component Editors
|
|
||||||
c:\program files\borland\delphi6\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package
|
|
||||||
c:\program files\borland\delphi6\Bin\dclwbm60.bpl=Borland InternetExpress Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclie60.bpl=Internet Explorer Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclwebsnap60.bpl=Borland WebSnap Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclite60.bpl=Borland Integrated Translation Environment
|
|
||||||
c:\program files\borland\delphi6\Bin\dcldbx60.bpl=Borland dbExpress Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcldbxcds60.bpl=Borland Local DBX ClientDataset Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\v103_d60.bpl=TurboPower VisualPlanIt 1.03 designtime package - VCL60
|
|
||||||
[Included Packages]
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclstd60.bpl=Borland Standard Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclsmpedit60.bpl=Borland Editor Script Enhancements
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dcldb60.bpl=Borland Database Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclact60.bpl=Borland ActionBar Components
|
|
||||||
F:\Delphi\Components\madCollection\madBasic\Delphi 6\madBasic_.bpl=madBasic 1.1f · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madDisAsm\Delphi 6\madDisAsm_.bpl=madDisAsm 2.0a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madExcept\Delphi 6\madExcept_.bpl=madExcept 2.6a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madExcept\Delphi 6\madExceptWizard_.bpl=madExceptWizard 2.6 · www.madshi.net
|
|
||||||
c:\program files\borland\delphi6\Bin\dclcds60.bpl=Borland Base Cached ClientDataset Component
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclmid60.bpl=Borland MyBase DataAccess Components
|
|
||||||
H:\Downloads\commentexpert.bpl=Comment Expert v1.0 Alpha
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\ThemeManager6.bpl=Windows XP Theme Manager
|
|
||||||
|
@ -66,8 +66,8 @@ begin
|
|||||||
|
|
||||||
shData.Reset();
|
shData.Reset();
|
||||||
while shData.Next() do
|
while shData.Next() do
|
||||||
Write(shData.CurrentKey, ': ', shData.CurrentValue, ' (',
|
WriteLn(shData.CurrentKey, ': ', shData.CurrentValue, ' (',
|
||||||
shData[shData.CurrentKey], ')');
|
shData[shData.CurrentKey], ')');
|
||||||
finally
|
finally
|
||||||
FreeAndNil(shData);
|
FreeAndNil(shData);
|
||||||
ReadLn;
|
ReadLn;
|
||||||
|
@ -32,6 +32,5 @@
|
|||||||
-M
|
-M
|
||||||
-$M16384,1048576
|
-$M16384,1048576
|
||||||
-K$00400000
|
-K$00400000
|
||||||
-LE"c:\program files\borland\delphi6\Projects\Bpl"
|
-LE"c:\delphi6\Projects\Bpl"
|
||||||
-LN"c:\program files\borland\delphi6\Projects\Bpl"
|
-LN"c:\delphi6\Projects\Bpl"
|
||||||
-DmadExcept
|
|
||||||
|
@ -46,8 +46,8 @@ UnitOutputDir=
|
|||||||
PackageDLLOutputDir=
|
PackageDLLOutputDir=
|
||||||
PackageDCPOutputDir=
|
PackageDCPOutputDir=
|
||||||
SearchPath=
|
SearchPath=
|
||||||
Packages=vcl;rtl;vclx;Indy60;madBasic_;madDisAsm_;dsnap;dbrtl;xmlrtl;inet;soaprtl
|
Packages=vcl;rtl;vclx;indy;madBasic_;madDisAsm_;dsnap;dbrtl;xmlrtl;inet;soaprtl
|
||||||
Conditionals=madExcept
|
Conditionals=
|
||||||
DebugSourceDirs=
|
DebugSourceDirs=
|
||||||
UsePackages=0
|
UsePackages=0
|
||||||
[Parameters]
|
[Parameters]
|
||||||
@ -56,13 +56,17 @@ HostApplication=
|
|||||||
Launcher=
|
Launcher=
|
||||||
UseLauncher=0
|
UseLauncher=0
|
||||||
DebugCWD=
|
DebugCWD=
|
||||||
|
[Language]
|
||||||
|
ActiveLang=
|
||||||
|
ProjectLang=
|
||||||
|
RootDir=
|
||||||
[Version Info]
|
[Version Info]
|
||||||
IncludeVerInfo=0
|
IncludeVerInfo=0
|
||||||
AutoIncBuild=1
|
AutoIncBuild=1
|
||||||
MajorVer=1
|
MajorVer=1
|
||||||
MinorVer=0
|
MinorVer=0
|
||||||
Release=0
|
Release=0
|
||||||
Build=0
|
Build=1
|
||||||
Debug=0
|
Debug=0
|
||||||
PreRelease=0
|
PreRelease=0
|
||||||
Special=0
|
Special=0
|
||||||
@ -73,7 +77,7 @@ CodePage=1252
|
|||||||
[Version Info Keys]
|
[Version Info Keys]
|
||||||
CompanyName=
|
CompanyName=
|
||||||
FileDescription=
|
FileDescription=
|
||||||
FileVersion=1.0.0.0
|
FileVersion=1.0.0.1
|
||||||
InternalName=
|
InternalName=
|
||||||
LegalCopyright=
|
LegalCopyright=
|
||||||
LegalTrademarks=
|
LegalTrademarks=
|
||||||
@ -82,79 +86,6 @@ ProductName=
|
|||||||
ProductVersion=
|
ProductVersion=
|
||||||
Comments=
|
Comments=
|
||||||
[Excluded Packages]
|
[Excluded Packages]
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\VirtualTreesD6D.bpl=Virtual Treeview
|
c:\delphi6\Projects\Bpl\DIPasDocD6.bpl=DiPasDoc - Designtime
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\ThemeManager6.bpl=Windows XP Theme Manager
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\JVCL200_D60.bpl=JEDI-VCL Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\dclIndy60.bpl=Internet Direct (Indy) for D6 Property and Component Editors
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\BalloonD6.bpl=Balloon 2.0
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\asqlite.bpl=Aducom Software -- SQLite Design Time Components
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\aSQLitepkg.bpl=Aducom Software -- SQLite RunTime Components
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\GR32_D6.bpl=Graphics32
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\GR32_DSGN_D6.bpl=Graphics32 Design Time Package
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\PNGImage_D6.bpl=PNGImage
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\BMSpinEditD6.bpl=BMSpinEdit
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\tbx_d6.bpl=Toolbar2000 -- TBX Extensions (Alex Denisov)
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\tb2k_d6.bpl=Toolbar2000 Components (Jordan Russell)
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\tbxdsgn_d6.bpl=Toolbar2000 -- TBX Extensions Design Package (Alex Denisov)
|
|
||||||
C:\PROGRA~1\Borland\Delphi6\Projects\Bpl\tb2kdsgn_d6.bpl=Toolbar2000 Design Package (Jordan Russell)
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\SynEdit_D6.bpl=SynEdit component suite
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\DelphiX_for5.bpl=DelphiX - DirectX components for Delphi
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\GLScene6.bpl=GLScene - OpenGL 3D library
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\NLDMBD6D.bpl=NLDMessageBox
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\TntUnicodeVcl_D60.bpl=Tnt Unicode Controls
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\PageControlExD6.bpl=PageControlEx
|
|
||||||
c:\program files\borland\delphi6\Bin\dclsmp60.bpl=Borland Sample Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcl31w60.bpl=Delphi 1.0 Compatibility Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\NLDTrayIconD6.bpl=NLDTrayIcon donated by SVG_1986
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ServerListD6D.bpl=SOF2Manager - Server List Designtime
|
|
||||||
C:\WINDOWS\System32\ibevnt60.bpl=Borland Interbase Event Alerter Component
|
C:\WINDOWS\System32\ibevnt60.bpl=Borland Interbase Event Alerter Component
|
||||||
F:\Delphi\Components\madCollection\madBasic\Delphi 6\madHelp_.bpl=madHelp 1.1 · www.madshi.net
|
c:\delphi6\Projects\Bpl\PsychoTidyD6.bpl=PsychoTidy IDE Expert
|
||||||
F:\Delphi\Components\madCollection\madRemote\Delphi 6\madRemote_.bpl=madRemote 1.1a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madKernel\Delphi 6\madKernel_.bpl=madKernel 1.2z · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madCodeHook\Delphi 6\madCodeHook_.bpl=madCodeHook 2.0a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madSecurity\Delphi 6\madSecurity_.bpl=madSecurity 1.1n · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madShell\Delphi 6\madShell_.bpl=madShell 1.3i · www.madshi.net
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\X2MultiMon_D6D.bpl=X2MultiMon Designtime Package
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ff2_d60.bpl=TurboPower FlashFiler Designtime Package - VCL60
|
|
||||||
F:\Delphi\Components\ZipForge\Lib\Delphi 6\dclZipForged6.bpl=ZipForge Package
|
|
||||||
c:\program files\borland\delphi6\Bin\dclado60.bpl=Borland ADO DB Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclbde60.bpl=Borland BDE DB Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dbx60.bpl=Borland SQL Explorer UI Package
|
|
||||||
c:\program files\borland\delphi6\Bin\DCLIB60.bpl=InterBase Data Access Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclcds60.bpl=Borland Base Cached ClientDataset Component
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclmid60.bpl=Borland MyBase DataAccess Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclbdecds60.bpl=Borland Local BDE ClientDataset Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclqrt60.bpl=QuickReport Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcltee60.bpl=TeeChart Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcldss60.bpl=Borland Decision Cube Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcltqr60.bpl=TeeChart for QuickReport Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclclxdb60.bpl=Borland CLX Database Components
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclclxstd60.bpl=Borland CLX Standard Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclmcn60.bpl=Borland DataSnap Connection Components
|
|
||||||
c:\program files\borland\delphi6\Bin\applet60.bpl=Borland Control Panel Applet Package
|
|
||||||
c:\program files\borland\delphi6\Bin\dclemacsedit60.bpl=Borland Editor Emacs Enhancements
|
|
||||||
c:\program files\borland\delphi6\Bin\dclshlctrls60.bpl=Shell Control Property and Component Editors
|
|
||||||
c:\program files\borland\delphi6\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package
|
|
||||||
c:\program files\borland\delphi6\Bin\DCLNMF60.bpl=NetMasters Fastnet Tools
|
|
||||||
c:\program files\borland\delphi6\Bin\dclwbm60.bpl=Borland InternetExpress Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclie60.bpl=Internet Explorer Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclwebsnap60.bpl=Borland WebSnap Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclite60.bpl=Borland Integrated Translation Environment
|
|
||||||
c:\program files\borland\delphi6\Bin\dcldbx60.bpl=Borland dbExpress Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dcldbxcds60.bpl=Borland Local DBX ClientDataset Components
|
|
||||||
[Included Packages]
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclstd60.bpl=Borland Standard Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclsmpedit60.bpl=Borland Editor Script Enhancements
|
|
||||||
F:\Delphi\Components\madCollection\madBasic\Delphi 6\madBasic_.bpl=madBasic 1.1f · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madDisAsm\Delphi 6\madDisAsm_.bpl=madDisAsm 2.0a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madExcept\Delphi 6\madExcept_.bpl=madExcept 2.6a · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madExcept\Delphi 6\madExceptIde_.bpl=madExceptIde 1.0b · www.madshi.net
|
|
||||||
F:\Delphi\Components\madCollection\madExcept\Delphi 6\madExceptWizard_.bpl=madExceptWizard 2.6 · www.madshi.net
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dcldb60.bpl=Borland Database Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclnet60.bpl=Borland Internet Components
|
|
||||||
c:\program files\borland\delphi6\Bin\dclsoap60.bpl=Borland SOAP Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\ColorPickerButtonD6.bpl=ColorPickerButton
|
|
||||||
C:\Program Files\Borland\Delphi6\Bin\dclact60.bpl=Borland ActionBar Components
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\SysILS.bpl=(untitled)
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\videocap5.bpl=(untitled)
|
|
||||||
c:\program files\borland\delphi6\Projects\Bpl\DragDropD6.bpl=Drag and Drop Component Suite
|
|
||||||
|
@ -3,8 +3,6 @@ program X2UtilsSettingsTest;
|
|||||||
{$APPTYPE CONSOLE}
|
{$APPTYPE CONSOLE}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
madExcept,
|
|
||||||
madLinkDisAsm,
|
|
||||||
Classes,
|
Classes,
|
||||||
SysUtils,
|
SysUtils,
|
||||||
Windows,
|
Windows,
|
||||||
@ -98,6 +96,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test for the definitions
|
||||||
|
{
|
||||||
|
Settings.Define('Test', 'Value', 5, [[0, 5], [10, 15]]);
|
||||||
|
Settings.ReadInteger('Test', 'Value');
|
||||||
|
}
|
||||||
|
|
||||||
TraverseSection(Settings, '', 1);
|
TraverseSection(Settings, '', 1);
|
||||||
WriteLn;
|
WriteLn;
|
||||||
finally
|
finally
|
||||||
|
@ -192,12 +192,14 @@ type
|
|||||||
property CurrentValue: String read GetCurrentValue;
|
property CurrentValue: String read GetCurrentValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
resourcestring
|
||||||
|
RSInvalidCursor = 'Cursor is invalid!';
|
||||||
|
RSInvalidDataSize = 'Invalid data size!';
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
resourcestring
|
resourcestring
|
||||||
RSOrphanNode = 'BUG: Node does not seem to belong to it''s parent!';
|
RSOrphanNode = 'BUG: Node does not seem to belong to it''s parent!';
|
||||||
RSInvalidCursor = 'Cursor is invalid!';
|
|
||||||
RSTooManyPops = 'More Pops than Pushes!';
|
RSTooManyPops = 'More Pops than Pushes!';
|
||||||
RSInvalidDataSize = 'Invalid data size!';
|
|
||||||
|
|
||||||
const
|
const
|
||||||
CStackSize = 32;
|
CStackSize = 32;
|
||||||
|
378
X2UtHashes.pas
378
X2UtHashes.pas
@ -18,16 +18,24 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
{
|
{
|
||||||
:$ Internal representation of a hash node
|
:$ Internal representation of a hash item
|
||||||
}
|
}
|
||||||
PX2UtHashNode = ^TX2UtHashNode;
|
PX2UtHashItem = ^TX2UtHashItem;
|
||||||
TX2UtHashNode = record
|
TX2UtHashItem = record
|
||||||
Prev: PX2UtHashNode;
|
Prev: PX2UtHashItem;
|
||||||
Next: PX2UtHashNode;
|
Next: PX2UtHashItem;
|
||||||
Key: String;
|
Key: String;
|
||||||
Value: record end;
|
Value: record end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
|
:$ Internal hash list
|
||||||
|
}
|
||||||
|
PX2UtHashList = ^TX2UtHashList;
|
||||||
|
TX2UtHashList = record
|
||||||
|
Root: PX2UtHashItem;
|
||||||
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
:$ Hash implementation
|
:$ Hash implementation
|
||||||
|
|
||||||
@ -36,31 +44,39 @@ type
|
|||||||
}
|
}
|
||||||
TX2UtCustomHash = class(TX2UtCustomBTree)
|
TX2UtCustomHash = class(TX2UtCustomBTree)
|
||||||
private
|
private
|
||||||
FHashCursor: PX2UtHashNode;
|
FHashCursor: PX2UtHashItem;
|
||||||
FHashDataSize: Cardinal;
|
FHashDataSize: Cardinal;
|
||||||
|
FHashItemSize: Cardinal;
|
||||||
|
|
||||||
function GetCurrentKey(): String;
|
function GetCurrentKey(): String;
|
||||||
|
function GetHashTotalSize(): Cardinal;
|
||||||
protected
|
protected
|
||||||
function Hash(const AValue: String): Cardinal; virtual;
|
function Hash(const AValue: String): Cardinal; virtual;
|
||||||
|
|
||||||
function LookupNode(const AKey: String;
|
function GetItemData(const AItem: PX2UtHashItem): Pointer; virtual;
|
||||||
|
function LookupItem(const AKey: String;
|
||||||
|
out ANode: PX2UtBTreeNode;
|
||||||
const ACanCreate: Boolean = False;
|
const ACanCreate: Boolean = False;
|
||||||
const ASetCursor: Boolean = False): PX2UtBTreeNode;
|
const ASetCursor: Boolean = False): PX2UtHashItem;
|
||||||
|
|
||||||
procedure InitNode(var ANode: PX2UtBTreeNode); override;
|
|
||||||
procedure FreeNode(var ANode: PX2UtBTreeNode); override;
|
procedure FreeNode(var ANode: PX2UtBTreeNode); override;
|
||||||
|
|
||||||
procedure ClearCursor(); override;
|
procedure ClearCursor(); override;
|
||||||
function ValidCursor(const ARaiseError: Boolean = True): Boolean; override;
|
function ValidCursor(const ARaiseError: Boolean = True): Boolean; override;
|
||||||
|
|
||||||
procedure InitHashNode(var ANode: PX2UtHashNode); virtual;
|
procedure InitHashItem(var AItem: PX2UtHashItem); virtual;
|
||||||
procedure FreeHashNode(var ANode: PX2UtHashNode); virtual;
|
procedure FreeHashItem(var AItem: PX2UtHashItem); virtual;
|
||||||
|
|
||||||
|
property HashCursor: PX2UtHashItem read FHashCursor write FHashCursor;
|
||||||
|
property HashItemSize: Cardinal read FHashItemSize;
|
||||||
|
property HashTotalSize: Cardinal read GetHashTotalSize;
|
||||||
property HashDataSize: Cardinal read FHashDataSize write FHashDataSize;
|
property HashDataSize: Cardinal read FHashDataSize write FHashDataSize;
|
||||||
|
|
||||||
//:$ Returns the key at the current cursor location.
|
//:$ Returns the key at the current cursor location.
|
||||||
property CurrentKey: String read GetCurrentKey;
|
property CurrentKey: String read GetCurrentKey;
|
||||||
public
|
public
|
||||||
|
constructor Create(); override;
|
||||||
|
|
||||||
//:$ Deletes an item from the hash.
|
//:$ Deletes an item from the hash.
|
||||||
procedure Delete(const AKey: String);
|
procedure Delete(const AKey: String);
|
||||||
|
|
||||||
@ -93,6 +109,7 @@ type
|
|||||||
//:$ Returns the value at the current cursor location.
|
//:$ Returns the value at the current cursor location.
|
||||||
property CurrentValue: Pointer read GetCurrentValue;
|
property CurrentValue: Pointer read GetCurrentValue;
|
||||||
end;
|
end;
|
||||||
|
*)
|
||||||
|
|
||||||
{
|
{
|
||||||
:$ Hash implementation for string values
|
:$ Hash implementation for string values
|
||||||
@ -104,8 +121,8 @@ type
|
|||||||
|
|
||||||
function GetCurrentValue(): String;
|
function GetCurrentValue(): String;
|
||||||
protected
|
protected
|
||||||
procedure InitNode(var ANode: PX2UtBTreeNode); override;
|
procedure InitHashItem(var AItem: PX2UtHashItem); override;
|
||||||
procedure FreeNode(var ANode: PX2UtBTreeNode); override;
|
procedure FreeHashItem(var AItem: PX2UtHashItem); override;
|
||||||
public
|
public
|
||||||
constructor Create(); override;
|
constructor Create(); override;
|
||||||
property CurrentKey;
|
property CurrentKey;
|
||||||
@ -117,16 +134,166 @@ type
|
|||||||
//:$ Returns the value at the current cursor location.
|
//:$ Returns the value at the current cursor location.
|
||||||
property CurrentValue: String read GetCurrentValue;
|
property CurrentValue: String read GetCurrentValue;
|
||||||
end;
|
end;
|
||||||
*)
|
|
||||||
|
|
||||||
|
|
||||||
|
procedure Mix(var A, B, C: Cardinal);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
resourcestring
|
||||||
|
RSEmptyKey = 'Cannot hash an empty key!';
|
||||||
|
|
||||||
|
|
||||||
|
{======================== TX2UtCustomHash
|
||||||
|
Initialization
|
||||||
|
========================================}
|
||||||
|
constructor TX2UtCustomHash.Create;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
|
||||||
|
FHashItemSize := SizeOf(TX2UtHashItem);
|
||||||
|
DataSize := FHashItemSize;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{======================== TX2UtCustomHash
|
{======================== TX2UtCustomHash
|
||||||
Hashing
|
Hashing
|
||||||
========================================}
|
========================================}
|
||||||
|
procedure Mix(var A, B, C: Cardinal);
|
||||||
|
asm
|
||||||
|
sub A, B; sub A, C; shr C, 13; xor A, C;
|
||||||
|
sub B, C; sub B, A; shl A, 8; xor B, A;
|
||||||
|
sub C, A; sub C, B; shr B, 13; xor C, B;
|
||||||
|
sub A, B; sub A, C; shr C, 12; xor A, C;
|
||||||
|
sub B, C; sub B, A; shl A, 16; xor B, A;
|
||||||
|
sub C, A; sub C, B; shr B, 5; xor C, B;
|
||||||
|
sub A, B; sub A, C; shr C, 3; xor A, C;
|
||||||
|
sub B, C; sub B, A; shl A, 10; xor B, A;
|
||||||
|
sub C, A; sub C, B; shr B, 15; xor C, B;
|
||||||
|
end;
|
||||||
|
|
||||||
function TX2UtCustomHash.Hash;
|
function TX2UtCustomHash.Hash;
|
||||||
begin
|
begin
|
||||||
Result := 0;
|
Result := 0;
|
||||||
|
|
||||||
|
(*
|
||||||
|
ypedef unsigned long int ub4; /* unsigned 4-byte quantities */
|
||||||
|
typedef unsigned char ub1; /* unsigned 1-byte quantities */
|
||||||
|
|
||||||
|
#define hashsize(n) ((ub4)1<<(n))
|
||||||
|
#define hashmask(n) (hashsize(n)-1)
|
||||||
|
|
||||||
|
/*
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
mix -- mix 3 32-bit values reversibly.
|
||||||
|
For every delta with one or two bits set, and the deltas of all three
|
||||||
|
high bits or all three low bits, whether the original value of a,b,c
|
||||||
|
is almost all zero or is uniformly distributed,
|
||||||
|
* If mix() is run forward or backward, at least 32 bits in a,b,c
|
||||||
|
have at least 1/4 probability of changing.
|
||||||
|
* If mix() is run forward, every bit of c will change between 1/3 and
|
||||||
|
2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.)
|
||||||
|
mix() was built out of 36 single-cycle latency instructions in a
|
||||||
|
structure that could supported 2x parallelism, like so:
|
||||||
|
a -= b;
|
||||||
|
a -= c; x = (c>>13);
|
||||||
|
b -= c; a ^= x;
|
||||||
|
b -= a; x = (a<<8);
|
||||||
|
c -= a; b ^= x;
|
||||||
|
c -= b; x = (b>>13);
|
||||||
|
...
|
||||||
|
Unfortunately, superscalar Pentiums and Sparcs can't take advantage
|
||||||
|
of that parallelism. They've also turned some of those single-cycle
|
||||||
|
latency instructions into multi-cycle latency instructions. Still,
|
||||||
|
this is the fastest good hash I could find. There were about 2^^68
|
||||||
|
to choose from. I only looked at a billion or so.
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#define mix(a,b,c) \
|
||||||
|
{ \
|
||||||
|
a -= b; a -= c; a ^= (c>>13); \
|
||||||
|
b -= c; b -= a; b ^= (a<<8); \
|
||||||
|
c -= a; c -= b; c ^= (b>>13); \
|
||||||
|
a -= b; a -= c; a ^= (c>>12); \
|
||||||
|
b -= c; b -= a; b ^= (a<<16); \
|
||||||
|
c -= a; c -= b; c ^= (b>>5); \
|
||||||
|
a -= b; a -= c; a ^= (c>>3); \
|
||||||
|
b -= c; b -= a; b ^= (a<<10); \
|
||||||
|
c -= a; c -= b; c ^= (b>>15); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
hash() -- hash a variable-length key into a 32-bit value
|
||||||
|
k : the key (the unaligned variable-length array of bytes)
|
||||||
|
len : the length of the key, counting by bytes
|
||||||
|
initval : can be any 4-byte value
|
||||||
|
Returns a 32-bit value. Every bit of the key affects every bit of
|
||||||
|
the return value. Every 1-bit and 2-bit delta achieves avalanche.
|
||||||
|
About 6*len+35 instructions.
|
||||||
|
|
||||||
|
The best hash table sizes are powers of 2. There is no need to do
|
||||||
|
mod a prime (mod is sooo slow!). If you need less than 32 bits,
|
||||||
|
use a bitmask. For example, if you need only 10 bits, do
|
||||||
|
h = (h & hashmask(10));
|
||||||
|
In which case, the hash table should have hashsize(10) elements.
|
||||||
|
|
||||||
|
If you are hashing n strings (ub1 ** )k, do it like this:
|
||||||
|
for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h);
|
||||||
|
|
||||||
|
By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this
|
||||||
|
code any way you wish, private, educational, or commercial. It's free.
|
||||||
|
|
||||||
|
See http://burtleburtle.net/bob/hash/evahash.html
|
||||||
|
Use for hash table lookup, or anything where one collision in 2^^32 is
|
||||||
|
acceptable. Do NOT use for cryptographic purposes.
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
ub4 hash( k, length, initval)
|
||||||
|
register ub1 *k; /* the key */
|
||||||
|
register ub4 length; /* the length of the key */
|
||||||
|
register ub4 initval; /* the previous hash, or an arbitrary value */
|
||||||
|
{
|
||||||
|
register ub4 a,b,c,len;
|
||||||
|
|
||||||
|
/* Set up the internal state */
|
||||||
|
len = length;
|
||||||
|
a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */
|
||||||
|
c = initval; /* the previous hash value */
|
||||||
|
|
||||||
|
/*---------------------------------------- handle most of the key */
|
||||||
|
while (len >= 12)
|
||||||
|
{
|
||||||
|
a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24));
|
||||||
|
b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24));
|
||||||
|
c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24));
|
||||||
|
mix(a,b,c);
|
||||||
|
k += 12; len -= 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------- handle the last 11 bytes */
|
||||||
|
c += length;
|
||||||
|
switch(len) /* all the case statements fall through */
|
||||||
|
{
|
||||||
|
case 11: c+=((ub4)k[10]<<24);
|
||||||
|
case 10: c+=((ub4)k[9]<<16);
|
||||||
|
case 9 : c+=((ub4)k[8]<<8);
|
||||||
|
/* the first byte of c is reserved for the length */
|
||||||
|
case 8 : b+=((ub4)k[7]<<24);
|
||||||
|
case 7 : b+=((ub4)k[6]<<16);
|
||||||
|
case 6 : b+=((ub4)k[5]<<8);
|
||||||
|
case 5 : b+=k[4];
|
||||||
|
case 4 : a+=((ub4)k[3]<<24);
|
||||||
|
case 3 : a+=((ub4)k[2]<<16);
|
||||||
|
case 2 : a+=((ub4)k[1]<<8);
|
||||||
|
case 1 : a+=k[0];
|
||||||
|
/* case 0: nothing left to add */
|
||||||
|
}
|
||||||
|
mix(a,b,c);
|
||||||
|
/*-------------------------------------------- report the result */
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
*)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -139,6 +306,10 @@ begin
|
|||||||
Result := inherited ValidCursor(ARaiseError);
|
Result := inherited ValidCursor(ARaiseError);
|
||||||
if Result then
|
if Result then
|
||||||
begin
|
begin
|
||||||
|
Result := Assigned(FHashCursor);
|
||||||
|
|
||||||
|
if (not Result) and (ARaiseError) then
|
||||||
|
raise EX2UtBTreeInvalidCursor.Create(RSInvalidCursor);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -158,7 +329,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
Result := inherited Next();
|
Result := inherited Next();
|
||||||
if Result then
|
if Result then
|
||||||
FHashCursor := GetNodeData(Cursor);
|
FHashCursor := PX2UtHashList(GetNodeData(Cursor))^.Root;
|
||||||
end else
|
end else
|
||||||
Result := True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
@ -167,19 +338,105 @@ end;
|
|||||||
{======================== TX2UtCustomHash
|
{======================== TX2UtCustomHash
|
||||||
Item Management
|
Item Management
|
||||||
========================================}
|
========================================}
|
||||||
function TX2UtCustomHash.LookupNode;
|
function TX2UtCustomHash.GetItemData;
|
||||||
|
begin
|
||||||
|
Assert(HashDataSize > 0, RSInvalidDataSize);
|
||||||
|
Result := Pointer(Cardinal(AItem) + HashItemSize);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TX2UtCustomHash.LookupItem;
|
||||||
var
|
var
|
||||||
iIndex: Integer;
|
iIndex: Integer;
|
||||||
pNode: PX2UtBTreeNode;
|
pData: PX2UtHashList;
|
||||||
|
pFound: PX2UtHashItem;
|
||||||
|
pItem: PX2UtHashItem;
|
||||||
|
pLast: PX2UtHashItem;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
Result := nil;
|
||||||
iIndex := Hash(AKey);
|
iIndex := Hash(AKey);
|
||||||
pNode := inherited LookupNode(iIndex, ACanCreate, ASetCursor);
|
ANode := inherited LookupNode(iIndex, ACanCreate, ASetCursor);
|
||||||
|
|
||||||
|
if Assigned(ANode) then
|
||||||
|
begin
|
||||||
|
pData := PX2UtHashList(GetNodeData(ANode));
|
||||||
|
pItem := pData^.Root;
|
||||||
|
pLast := nil;
|
||||||
|
|
||||||
|
if Assigned(pItem) then
|
||||||
|
begin
|
||||||
|
pFound := nil;
|
||||||
|
|
||||||
|
// Find key
|
||||||
|
repeat
|
||||||
|
if pItem.Key = AKey then
|
||||||
|
begin
|
||||||
|
pFound := pItem;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
pLast := pItem;
|
||||||
|
pItem := pItem^.Next;
|
||||||
|
until not Assigned(pItem);
|
||||||
|
|
||||||
|
pItem := pFound;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Assigned(pItem) then
|
||||||
|
Result := pItem
|
||||||
|
else if ACanCreate then
|
||||||
|
begin
|
||||||
|
InitHashItem(pItem);
|
||||||
|
|
||||||
|
if not Assigned(pData^.Root) then
|
||||||
|
pData^.Root := pItem;
|
||||||
|
|
||||||
|
if Assigned(pLast) then
|
||||||
|
pLast^.Next := pItem;
|
||||||
|
|
||||||
|
pItem^.Prev := pLast;
|
||||||
|
pItem^.Next := nil;
|
||||||
|
pItem^.Key := AKey;
|
||||||
|
Result := pItem;
|
||||||
|
end else
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Assigned(Result) and ASetCursor then
|
||||||
|
FHashCursor := Result;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TX2UtCustomHash.Delete;
|
procedure TX2UtCustomHash.Delete;
|
||||||
|
var
|
||||||
|
bFree: Boolean;
|
||||||
|
pData: PX2UtHashList;
|
||||||
|
pNode: PX2UtBTreeNode;
|
||||||
|
pItem: PX2UtHashItem;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
pItem := LookupItem(AKey, pNode);
|
||||||
|
if Assigned(pItem) then
|
||||||
|
begin
|
||||||
|
pData := GetItemData(pItem);
|
||||||
|
|
||||||
|
if pData^.Root = pItem then
|
||||||
|
begin
|
||||||
|
if Assigned(pItem^.Next) then
|
||||||
|
pData^.Root := pItem^.Next
|
||||||
|
else if Assigned(pItem^.Prev) then
|
||||||
|
pData^.Root := pItem^.Prev
|
||||||
|
else
|
||||||
|
pData^.Root := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
bFree := (not Assigned(pData^.Root));
|
||||||
|
FreeHashItem(pItem);
|
||||||
|
|
||||||
|
if bFree then
|
||||||
|
FreeNode(pNode);
|
||||||
|
end;
|
||||||
|
|
||||||
inherited Delete(Hash(AKey));
|
inherited Delete(Hash(AKey));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -197,6 +454,7 @@ begin
|
|||||||
Result := '';
|
Result := '';
|
||||||
if ValidCursor(True) then
|
if ValidCursor(True) then
|
||||||
begin
|
begin
|
||||||
|
Result := HashCursor^.Key;
|
||||||
{
|
{
|
||||||
pKey := GetNodeInternal(Cursor);
|
pKey := GetNodeInternal(Cursor);
|
||||||
Result := pKey^;
|
Result := pKey^;
|
||||||
@ -205,36 +463,56 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TX2UtCustomHash.InitNode;
|
|
||||||
var
|
|
||||||
pData: PString;
|
|
||||||
|
|
||||||
begin
|
|
||||||
inherited;
|
|
||||||
|
|
||||||
{
|
|
||||||
pData := GetNodeInternal(ANode);
|
|
||||||
Initialize(pData^);
|
|
||||||
}
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TX2UtCustomHash.FreeNode;
|
procedure TX2UtCustomHash.FreeNode;
|
||||||
var
|
var
|
||||||
pData: PString;
|
pData: PX2UtHashItem;
|
||||||
|
pNext: PX2UtHashItem;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{
|
pData := PX2UtHashList(GetNodeData(ANode))^.Root;
|
||||||
pData := GetNodeInternal(ANode);
|
while Assigned(pData) do
|
||||||
Finalize(pData^);
|
begin
|
||||||
}
|
pNext := pData^.Next;
|
||||||
|
FreeHashItem(pData);
|
||||||
|
pData := pNext;
|
||||||
|
end;
|
||||||
|
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TX2UtCustomHash.InitHashItem;
|
||||||
|
begin
|
||||||
|
Assert(HashDataSize > 0, RSInvalidDataSize);
|
||||||
|
GetMem(AItem, HashTotalSize);
|
||||||
|
FillChar(AItem^, HashTotalSize, #0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TX2UtCustomHash.FreeHashItem;
|
||||||
|
begin
|
||||||
|
if Assigned(AItem^.Prev) then
|
||||||
|
AItem^.Prev^.Next := AItem^.Next;
|
||||||
|
|
||||||
|
if Assigned(AItem^.Next) then
|
||||||
|
AItem^.Next^.Prev := AItem^.Prev;
|
||||||
|
|
||||||
|
FreeMem(AItem, HashTotalSize);
|
||||||
|
ClearCursor();
|
||||||
|
|
||||||
|
AItem := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TX2UtCustomHash.GetHashTotalSize;
|
||||||
|
begin
|
||||||
|
Result := FHashItemSize + FHashDataSize;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{============================== TX2UtHash
|
{============================== TX2UtHash
|
||||||
Item Management
|
Item Management
|
||||||
========================================}
|
========================================}
|
||||||
|
(*
|
||||||
constructor TX2UtHash.Create;
|
constructor TX2UtHash.Create;
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
@ -268,6 +546,7 @@ begin
|
|||||||
if ValidCursor(True) then
|
if ValidCursor(True) then
|
||||||
Result := PPointer(GetNodeData(Cursor))^;
|
Result := PPointer(GetNodeData(Cursor))^;
|
||||||
end;
|
end;
|
||||||
|
*)
|
||||||
|
|
||||||
|
|
||||||
{======================== TX2UtStringHash
|
{======================== TX2UtStringHash
|
||||||
@ -277,47 +556,50 @@ constructor TX2UtStringHash.Create;
|
|||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
|
|
||||||
DataSize := SizeOf(PString);
|
HashDataSize := SizeOf(PString);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TX2UtStringHash.GetItem;
|
function TX2UtStringHash.GetItem;
|
||||||
var
|
var
|
||||||
pNode: PX2UtBTreeNode;
|
pNode: PX2UtBTreeNode;
|
||||||
|
pItem: PX2UtHashItem;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
pNode := LookupNode(Key);
|
pItem := LookupItem(Key, pNode);
|
||||||
if Assigned(pNode) then
|
if Assigned(pItem) then
|
||||||
Result := PString(GetNodeData(pNode))^;
|
Result := PString(GetItemData(pItem))^;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TX2UtStringHash.SetItem;
|
procedure TX2UtStringHash.SetItem;
|
||||||
var
|
var
|
||||||
pNode: PX2UtBTreeNode;
|
pNode: PX2UtBTreeNode;
|
||||||
|
pItem: PX2UtHashItem;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
pNode := LookupNode(Key, True);
|
Assert(Length(Key) > 0, RSEmptyKey);
|
||||||
if Assigned(pNode) then
|
pItem := LookupItem(Key, pNode, True);
|
||||||
PString(GetNodeData(pNode))^ := Value;
|
if Assigned(pItem) then
|
||||||
|
PString(GetItemData(pItem))^ := Value;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TX2UtStringHash.InitNode;
|
procedure TX2UtStringHash.InitHashItem;
|
||||||
var
|
var
|
||||||
pData: PString;
|
pData: PString;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
|
|
||||||
pData := GetNodeData(ANode);
|
pData := GetItemData(AItem);
|
||||||
Initialize(pData^);
|
Initialize(pData^);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TX2UtStringHash.FreeNode;
|
procedure TX2UtStringHash.FreeHashItem;
|
||||||
var
|
var
|
||||||
pData: PString;
|
pData: PString;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
pData := GetNodeData(ANode);
|
pData := GetItemData(AItem);
|
||||||
Finalize(pData^);
|
Finalize(pData^);
|
||||||
|
|
||||||
inherited;
|
inherited;
|
||||||
@ -330,7 +612,7 @@ var
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
if ValidCursor() then
|
if ValidCursor() then
|
||||||
Result := PString(GetNodeData(Cursor))^;
|
Result := PString(GetItemData(HashCursor))^;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user