diff --git a/Test/X2UtHashesTest.cfg b/Test/X2UtHashesTest.cfg index 18d2c3d..e2e42ce 100644 --- a/Test/X2UtHashesTest.cfg +++ b/Test/X2UtHashesTest.cfg @@ -32,6 +32,6 @@ -M -$M16384,1048576 -K$00400000 --LE"c:\program files\borland\delphi6\Projects\Bpl" --LN"c:\program files\borland\delphi6\Projects\Bpl" +-LE"c:\delphi6\Projects\Bpl" +-LN"c:\delphi6\Projects\Bpl" -DmadExcept diff --git a/Test/X2UtHashesTest.dof b/Test/X2UtHashesTest.dof index 19f8e48..84329b8 100644 --- a/Test/X2UtHashesTest.dof +++ b/Test/X2UtHashesTest.dof @@ -56,6 +56,10 @@ HostApplication= Launcher= UseLauncher=0 DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= [Version Info] IncludeVerInfo=0 AutoIncBuild=0 @@ -82,118 +86,11 @@ ProductName= ProductVersion=1.0.0.0 Comments= [Excluded Packages] -c:\program files\borland\delphi6\Projects\Bpl\dclIndyCore60.bpl=Indy 10 Core Design Time -c:\program files\borland\delphi6\Projects\Bpl\dclIndyProtocols60.bpl=Indy 10 Protocols Design Time -c:\program files\borland\delphi6\Projects\Bpl\P164_D60.bpl=TurboPower OfficePartner 1.64 Design-time package - VCL60 -c:\program files\borland\delphi6\Projects\Bpl\VirtualTreesD6D.bpl=Virtual Treeview -c:\program files\borland\delphi6\Projects\Bpl\BalloonD6.bpl=Balloon 2.0 -c:\program files\borland\delphi6\Projects\Bpl\SysILS.bpl=(untitled) -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:\delphi6\Projects\Bpl\DIPasDocD6.bpl=DiPasDoc - Designtime +C:\Program Files\madCollection\madRemote\Delphi 6\madRemote_.bpl=madRemote 1.1b · www.madshi.net +C:\Program Files\madCollection\madKernel\Delphi 6\madKernel_.bpl=madKernel 1.3 · www.madshi.net +C:\Program Files\madCollection\madCodeHook\Delphi 6\madCodeHook_.bpl=madCodeHook 2.1b · www.madshi.net +C:\Program Files\madCollection\madSecurity\Delphi 6\madSecurity_.bpl=madSecurity 1.1n · www.madshi.net +C:\Program Files\madCollection\madShell\Delphi 6\madShell_.bpl=madShell 1.3k · www.madshi.net 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 -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 +c:\delphi6\Projects\Bpl\PsychoTidyD6.bpl=PsychoTidy IDE Expert diff --git a/Test/X2UtHashesTest.dpr b/Test/X2UtHashesTest.dpr index 05c0c06..e253672 100644 --- a/Test/X2UtHashesTest.dpr +++ b/Test/X2UtHashesTest.dpr @@ -66,8 +66,8 @@ begin shData.Reset(); while shData.Next() do - Write(shData.CurrentKey, ': ', shData.CurrentValue, ' (', - shData[shData.CurrentKey], ')'); + WriteLn(shData.CurrentKey, ': ', shData.CurrentValue, ' (', + shData[shData.CurrentKey], ')'); finally FreeAndNil(shData); ReadLn; diff --git a/Test/X2UtilsSettingsTest.cfg b/Test/X2UtilsSettingsTest.cfg index 17482c8..d55d496 100644 --- a/Test/X2UtilsSettingsTest.cfg +++ b/Test/X2UtilsSettingsTest.cfg @@ -32,6 +32,5 @@ -M -$M16384,1048576 -K$00400000 --LE"c:\program files\borland\delphi6\Projects\Bpl" --LN"c:\program files\borland\delphi6\Projects\Bpl" --DmadExcept +-LE"c:\delphi6\Projects\Bpl" +-LN"c:\delphi6\Projects\Bpl" diff --git a/Test/X2UtilsSettingsTest.dof b/Test/X2UtilsSettingsTest.dof index 541cf39..d5ef746 100644 --- a/Test/X2UtilsSettingsTest.dof +++ b/Test/X2UtilsSettingsTest.dof @@ -46,8 +46,8 @@ UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath= -Packages=vcl;rtl;vclx;Indy60;madBasic_;madDisAsm_;dsnap;dbrtl;xmlrtl;inet;soaprtl -Conditionals=madExcept +Packages=vcl;rtl;vclx;indy;madBasic_;madDisAsm_;dsnap;dbrtl;xmlrtl;inet;soaprtl +Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] @@ -56,13 +56,17 @@ HostApplication= Launcher= UseLauncher=0 DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir= [Version Info] IncludeVerInfo=0 AutoIncBuild=1 MajorVer=1 MinorVer=0 Release=0 -Build=0 +Build=1 Debug=0 PreRelease=0 Special=0 @@ -73,7 +77,7 @@ CodePage=1252 [Version Info Keys] CompanyName= FileDescription= -FileVersion=1.0.0.0 +FileVersion=1.0.0.1 InternalName= LegalCopyright= LegalTrademarks= @@ -82,79 +86,6 @@ ProductName= ProductVersion= Comments= [Excluded Packages] -c:\program files\borland\delphi6\Projects\Bpl\VirtualTreesD6D.bpl=Virtual Treeview -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:\delphi6\Projects\Bpl\DIPasDocD6.bpl=DiPasDoc - Designtime 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 -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 +c:\delphi6\Projects\Bpl\PsychoTidyD6.bpl=PsychoTidy IDE Expert diff --git a/Test/X2UtilsSettingsTest.dpr b/Test/X2UtilsSettingsTest.dpr index 98de5a8..9b45854 100644 --- a/Test/X2UtilsSettingsTest.dpr +++ b/Test/X2UtilsSettingsTest.dpr @@ -3,8 +3,6 @@ program X2UtilsSettingsTest; {$APPTYPE CONSOLE} uses - madExcept, - madLinkDisAsm, Classes, SysUtils, Windows, @@ -98,6 +96,12 @@ begin end; } + // Test for the definitions + { + Settings.Define('Test', 'Value', 5, [[0, 5], [10, 15]]); + Settings.ReadInteger('Test', 'Value'); + } + TraverseSection(Settings, '', 1); WriteLn; finally diff --git a/X2UtBinaryTree.pas b/X2UtBinaryTree.pas index a35c68a..607ecec 100644 --- a/X2UtBinaryTree.pas +++ b/X2UtBinaryTree.pas @@ -192,12 +192,14 @@ type property CurrentValue: String read GetCurrentValue; end; +resourcestring + RSInvalidCursor = 'Cursor is invalid!'; + RSInvalidDataSize = 'Invalid data size!'; + implementation resourcestring RSOrphanNode = 'BUG: Node does not seem to belong to it''s parent!'; - RSInvalidCursor = 'Cursor is invalid!'; RSTooManyPops = 'More Pops than Pushes!'; - RSInvalidDataSize = 'Invalid data size!'; const CStackSize = 32; diff --git a/X2UtHashes.pas b/X2UtHashes.pas index d3a0f5e..1e06c85 100644 --- a/X2UtHashes.pas +++ b/X2UtHashes.pas @@ -18,16 +18,24 @@ uses type { - :$ Internal representation of a hash node + :$ Internal representation of a hash item } - PX2UtHashNode = ^TX2UtHashNode; - TX2UtHashNode = record - Prev: PX2UtHashNode; - Next: PX2UtHashNode; + PX2UtHashItem = ^TX2UtHashItem; + TX2UtHashItem = record + Prev: PX2UtHashItem; + Next: PX2UtHashItem; Key: String; Value: record end; end; + { + :$ Internal hash list + } + PX2UtHashList = ^TX2UtHashList; + TX2UtHashList = record + Root: PX2UtHashItem; + end; + { :$ Hash implementation @@ -36,31 +44,39 @@ type } TX2UtCustomHash = class(TX2UtCustomBTree) private - FHashCursor: PX2UtHashNode; + FHashCursor: PX2UtHashItem; FHashDataSize: Cardinal; + FHashItemSize: Cardinal; function GetCurrentKey(): String; + function GetHashTotalSize(): Cardinal; protected 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 ASetCursor: Boolean = False): PX2UtBTreeNode; + const ASetCursor: Boolean = False): PX2UtHashItem; - procedure InitNode(var ANode: PX2UtBTreeNode); override; procedure FreeNode(var ANode: PX2UtBTreeNode); override; procedure ClearCursor(); override; function ValidCursor(const ARaiseError: Boolean = True): Boolean; override; - procedure InitHashNode(var ANode: PX2UtHashNode); virtual; - procedure FreeHashNode(var ANode: PX2UtHashNode); virtual; + procedure InitHashItem(var AItem: PX2UtHashItem); 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; //:$ Returns the key at the current cursor location. property CurrentKey: String read GetCurrentKey; public + constructor Create(); override; + //:$ Deletes an item from the hash. procedure Delete(const AKey: String); @@ -93,6 +109,7 @@ type //:$ Returns the value at the current cursor location. property CurrentValue: Pointer read GetCurrentValue; end; + *) { :$ Hash implementation for string values @@ -104,8 +121,8 @@ type function GetCurrentValue(): String; protected - procedure InitNode(var ANode: PX2UtBTreeNode); override; - procedure FreeNode(var ANode: PX2UtBTreeNode); override; + procedure InitHashItem(var AItem: PX2UtHashItem); override; + procedure FreeHashItem(var AItem: PX2UtHashItem); override; public constructor Create(); override; property CurrentKey; @@ -117,16 +134,166 @@ type //:$ Returns the value at the current cursor location. property CurrentValue: String read GetCurrentValue; end; - *) + + procedure Mix(var A, B, C: Cardinal); + implementation +resourcestring + RSEmptyKey = 'Cannot hash an empty key!'; + + +{======================== TX2UtCustomHash + Initialization +========================================} +constructor TX2UtCustomHash.Create; +begin + inherited; + + FHashItemSize := SizeOf(TX2UtHashItem); + DataSize := FHashItemSize; +end; + {======================== TX2UtCustomHash 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; begin 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= 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; @@ -139,6 +306,10 @@ begin Result := inherited ValidCursor(ARaiseError); if Result then begin + Result := Assigned(FHashCursor); + + if (not Result) and (ARaiseError) then + raise EX2UtBTreeInvalidCursor.Create(RSInvalidCursor); end; end; @@ -158,7 +329,7 @@ begin begin Result := inherited Next(); if Result then - FHashCursor := GetNodeData(Cursor); + FHashCursor := PX2UtHashList(GetNodeData(Cursor))^.Root; end else Result := True; end; @@ -167,19 +338,105 @@ end; {======================== TX2UtCustomHash Item Management ========================================} -function TX2UtCustomHash.LookupNode; +function TX2UtCustomHash.GetItemData; +begin + Assert(HashDataSize > 0, RSInvalidDataSize); + Result := Pointer(Cardinal(AItem) + HashItemSize); +end; + +function TX2UtCustomHash.LookupItem; var iIndex: Integer; - pNode: PX2UtBTreeNode; + pData: PX2UtHashList; + pFound: PX2UtHashItem; + pItem: PX2UtHashItem; + pLast: PX2UtHashItem; begin + Result := nil; 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; procedure TX2UtCustomHash.Delete; +var + bFree: Boolean; + pData: PX2UtHashList; + pNode: PX2UtBTreeNode; + pItem: PX2UtHashItem; + 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)); end; @@ -197,6 +454,7 @@ begin Result := ''; if ValidCursor(True) then begin + Result := HashCursor^.Key; { pKey := GetNodeInternal(Cursor); Result := pKey^; @@ -205,36 +463,56 @@ begin end; -procedure TX2UtCustomHash.InitNode; -var - pData: PString; - -begin - inherited; - - { - pData := GetNodeInternal(ANode); - Initialize(pData^); - } -end; - procedure TX2UtCustomHash.FreeNode; var - pData: PString; + pData: PX2UtHashItem; + pNext: PX2UtHashItem; begin - { - pData := GetNodeInternal(ANode); - Finalize(pData^); - } + pData := PX2UtHashList(GetNodeData(ANode))^.Root; + while Assigned(pData) do + begin + pNext := pData^.Next; + FreeHashItem(pData); + pData := pNext; + end; inherited; 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 Item Management ========================================} +(* constructor TX2UtHash.Create; begin inherited; @@ -268,6 +546,7 @@ begin if ValidCursor(True) then Result := PPointer(GetNodeData(Cursor))^; end; +*) {======================== TX2UtStringHash @@ -277,47 +556,50 @@ constructor TX2UtStringHash.Create; begin inherited; - DataSize := SizeOf(PString); + HashDataSize := SizeOf(PString); end; function TX2UtStringHash.GetItem; var pNode: PX2UtBTreeNode; + pItem: PX2UtHashItem; begin - pNode := LookupNode(Key); - if Assigned(pNode) then - Result := PString(GetNodeData(pNode))^; + pItem := LookupItem(Key, pNode); + if Assigned(pItem) then + Result := PString(GetItemData(pItem))^; end; procedure TX2UtStringHash.SetItem; var pNode: PX2UtBTreeNode; + pItem: PX2UtHashItem; begin - pNode := LookupNode(Key, True); - if Assigned(pNode) then - PString(GetNodeData(pNode))^ := Value; + Assert(Length(Key) > 0, RSEmptyKey); + pItem := LookupItem(Key, pNode, True); + if Assigned(pItem) then + PString(GetItemData(pItem))^ := Value; end; -procedure TX2UtStringHash.InitNode; +procedure TX2UtStringHash.InitHashItem; var pData: PString; begin inherited; - pData := GetNodeData(ANode); + pData := GetItemData(AItem); Initialize(pData^); end; -procedure TX2UtStringHash.FreeNode; +procedure TX2UtStringHash.FreeHashItem; var pData: PString; begin - pData := GetNodeData(ANode); + pData := GetItemData(AItem); Finalize(pData^); inherited; @@ -330,7 +612,7 @@ var begin if ValidCursor() then - Result := PString(GetNodeData(Cursor))^; + Result := PString(GetItemData(HashCursor))^; end; end.