OPM: Faster string comparison.

git-svn-id: trunk@64462 -
This commit is contained in:
juha 2021-02-05 11:28:02 +00:00
parent d6aedf99e8
commit 64656b41e2
11 changed files with 71 additions and 66 deletions

View File

@ -299,7 +299,7 @@ begin
while Assigned(Node) do while Assigned(Node) do
begin begin
Data := FVST.GetNodeData(Node); Data := FVST.GetNodeData(Node);
if UpperCase(Data^.FName) = UpperCase(AName) then if CompareText(Data^.FName, AName) = 0 then
begin begin
FVST.CheckState[Node] := csCheckedNormal; FVST.CheckState[Node] := csCheckedNormal;
Result := True; Result := True;
@ -331,7 +331,7 @@ begin
Data := FVST.GetNodeData(Node); Data := FVST.GetNodeData(Node);
Data^.FName := Categories[I]; Data^.FName := Categories[I];
Data^.FImageIndex := -1; Data^.FImageIndex := -1;
if UpperCase(CategoriesEng[I]) = 'OTHER' then if CompareText(CategoriesEng[I], 'OTHER') = 0 then
Data^.FType := 1 Data^.FType := 1
else else
Data^.FType := 0; Data^.FType := 0;

View File

@ -33,7 +33,7 @@ uses
// LCL // LCL
Dialogs, Forms, Controls, Dialogs, Forms, Controls,
// LazUtils // LazUtils
LazFileUtils, LazFileUtils, LazLoggerBase,
// IdeIntf // IdeIntf
LazIDEIntf, PackageIntf, LazIDEIntf, PackageIntf,
// OpkMan // OpkMan
@ -298,11 +298,11 @@ var
Result := True; Result := True;
for I := 0 to SLExcludedFolders.Count - 1 do for I := 0 to SLExcludedFolders.Count - 1 do
begin begin
if UpperCase(SLExcludedFolders.Strings[I]) = UpperCase(AName) then if CompareText(SLExcludedFolders.Strings[I], AName) = 0 then
begin begin
Result := False; Result := False;
Break; Break;
end; end;
end; end;
end; end;
@ -317,7 +317,7 @@ var
begin begin
try try
repeat repeat
if (UpperCase(ExtractFileExt(SR.Name)) = UpperCase('.lpk')) then if CompareFileExtQuick(SR.Name, 'lpk') = 0 then
begin begin
PackageData := TPackageData.Create; PackageData := TPackageData.Create;
PackageData.FName := SR.Name; PackageData.FName := SR.Name;
@ -384,7 +384,8 @@ var
begin begin
for I := 0 to SLExcludedFiles.Count - 1 do for I := 0 to SLExcludedFiles.Count - 1 do
begin begin
if UpperCase(SLExcludedFiles.Strings[I]) = UpperCase(ExtractFileExt(AName)) then DebugLn(['OPM IsAllowed: ExcFile=', SLExcludedFiles.Strings[I], ', AName=', AName]);
if CompareFileExt(AName, SLExcludedFiles.Strings[I], False) = 0 then
begin begin
Result := False; Result := False;
Break; Break;
@ -394,11 +395,14 @@ var
else else
begin begin
for I := 0 to SLExcludedFolders.Count - 1 do for I := 0 to SLExcludedFolders.Count - 1 do
if UpperCase(SLExcludedFolders.Strings[I]) = UpperCase(AName) then begin
DebugLn(['OPM IsAllowed: ExcFolder=', SLExcludedFolders.Strings[I], ', AName=', AName]);
if CompareText(SLExcludedFolders.Strings[I], AName) = 0 then
begin begin
Result := False; Result := False;
Break; Break;
end; end;
end;
end; end;
end; end;

View File

@ -117,7 +117,7 @@ begin
begin begin
for I := 0 to PackageEditingInterface.GetPackageCount - 1 do for I := 0 to PackageEditingInterface.GetPackageCount - 1 do
begin begin
if UpperCase(PackageEditingInterface.GetPackages(I).Filename) = UpperCase(AFileName) then if CompareText(PackageEditingInterface.GetPackages(I).Filename, AFileName) = 0 then
begin begin
Result := PackageEditingInterface.GetPackages(I); Result := PackageEditingInterface.GetPackages(I);
Break; Break;
@ -139,7 +139,7 @@ begin
PkgFileName := Copy(FToInstall.Strings[I], 1, P - 1) PkgFileName := Copy(FToInstall.Strings[I], 1, P - 1)
else else
PkgFileName := FToInstall.Strings[I]; PkgFileName := FToInstall.Strings[I];
if UpperCase(PkgFileName) = UpperCase(AFileName) then if CompareText(PkgFileName, AFileName) = 0 then
begin begin
Result := True; Result := True;
Break; Break;
@ -360,8 +360,9 @@ begin
DependecyPackage := SerializablePackages.FindLazarusPackage(PackageDependency.PkgFileName + '.lpk'); DependecyPackage := SerializablePackages.FindLazarusPackage(PackageDependency.PkgFileName + '.lpk');
if DependecyPackage <> nil then if DependecyPackage <> nil then
begin begin
if UpperCase(DependecyPackage.Name) = UpperCase(TLazarusPackage(FPackageList.Items[I]).Name) then if CompareText(DependecyPackage.Name,
begin TLazarusPackage(FPackageList.Items[I]).Name) = 0
then begin
CanGo := False; CanGo := False;
SPos := I; SPos := I;
EPos := J; EPos := J;

View File

@ -180,7 +180,7 @@ begin
for I := 0 to FPackageLinks.Count - 1 do for I := 0 to FPackageLinks.Count - 1 do
begin begin
PackageLink := TPackageLink(FPackageLinks.Items[I]); PackageLink := TPackageLink(FPackageLinks.Items[I]);
if UpperCase(PackageLink.Name) = UpperCase(AName) then if CompareText(PackageLink.Name, AName) = 0 then
begin begin
Result := PackageLink; Result := PackageLink;
Break; Break;
@ -259,7 +259,7 @@ begin
for J := 0 to MetaPackage.LazarusPackages.Count - 1 do for J := 0 to MetaPackage.LazarusPackages.Count - 1 do
begin begin
LazPackage := TLazarusPackage(MetaPackage.LazarusPackages.Items[J]); LazPackage := TLazarusPackage(MetaPackage.LazarusPackages.Items[J]);
if UpperCase(LazPackage.Name) = UpperCase(AName) then if CompareText(LazPackage.Name, AName) = 0 then
begin begin
LazPackage.Checked := True; LazPackage.Checked := True;
MetaPackage.Checked := True; MetaPackage.Checked := True;
@ -282,7 +282,7 @@ begin
for J := 0 to MetaPackage.LazarusPackages.Count - 1 do for J := 0 to MetaPackage.LazarusPackages.Count - 1 do
begin begin
LazPackage := TLazarusPackage(MetaPackage.LazarusPackages.Items[J]); LazPackage := TLazarusPackage(MetaPackage.LazarusPackages.Items[J]);
if UpperCase(LazPackage.Name) = UpperCase(AName) then if CompareText(LazPackage.Name, AName) = 0 then
begin begin
FPackagesToInstall.Add(LazPackage); FPackagesToInstall.Add(LazPackage);
Break; Break;
@ -295,32 +295,35 @@ function TOPMInterfaceEx.ResolveDependencies: TModalResult;
var var
I, J: Integer; I, J: Integer;
PackageList: TObjectList; PackageList: TObjectList;
PkgFileName: String; Msg, LazPkgName, PkgFileName: String;
DependencyPkg: TLazarusPackage; DependencyPkg: TLazarusPackage;
MetaPkg: TMetaPackage; MetaPkg: TMetaPackage;
Msg: String;
begin begin
Result := mrNone; Result := mrNone;
FPackageDependecies.Clear; FPackageDependecies.Clear;
for I := 0 to FPackagesToInstall.Count - 1 do for I := 0 to FPackagesToInstall.Count - 1 do
begin begin
LazPkgName := TLazarusPackage(FPackagesToInstall.Items[I]).Name;
PackageList := TObjectList.Create(True); PackageList := TObjectList.Create(True);
try try
SerializablePackages.GetPackageDependencies(TLazarusPackage(FPackagesToInstall.Items[I]).Name, PackageList, True, True); SerializablePackages.GetPackageDependencies(LazPkgName, PackageList, True, True);
for J := 0 to PackageList.Count - 1 do for J := 0 to PackageList.Count - 1 do
begin begin
PkgFileName := TPackageDependency(PackageList.Items[J]).PkgFileName + '.lpk'; PkgFileName := TPackageDependency(PackageList.Items[J]).PkgFileName + '.lpk';
DependencyPkg := SerializablePackages.FindLazarusPackage(PkgFileName); DependencyPkg := SerializablePackages.FindLazarusPackage(PkgFileName);
if DependencyPkg <> nil then if DependencyPkg <> nil then
begin begin
if (not DependencyPkg.Checked) and if (not DependencyPkg.Checked) and (CompareText(LazPkgName, PkgFileName) <> 0)
(UpperCase(TLazarusPackage(FPackagesToInstall.Items[I]).Name) <> UpperCase(PkgFileName)) and and ((SerializablePackages.IsDependencyOk(TPackageDependency(PackageList.Items[J]), DependencyPkg))
((SerializablePackages.IsDependencyOk(TPackageDependency(PackageList.Items[J]), DependencyPkg)) and and
((not (DependencyPkg.PackageState = psInstalled)) or ((DependencyPkg.PackageState = psInstalled) and (not (SerializablePackages.IsInstalledVersionOk(TPackageDependency(PackageList.Items[J]), DependencyPkg.InstalledFileVersion)))))) then ((not (DependencyPkg.PackageState = psInstalled))
or ((DependencyPkg.PackageState = psInstalled)
and (not (SerializablePackages.IsInstalledVersionOk(
TPackageDependency(PackageList.Items[J]), DependencyPkg.InstalledFileVersion)))))) then
begin begin
if (Result = mrNone) or (Result = mrYes) then if (Result = mrNone) or (Result = mrYes) then
begin begin
Msg := Format(rsMainFrm_rsPackageDependency0, [TLazarusPackage(FPackagesToInstall.Items[I]).Name, DependencyPkg.Name]); Msg := Format(rsMainFrm_rsPackageDependency0, [LazPkgName, DependencyPkg.Name]);
Result := MessageDlgEx(Msg, mtConfirmation, [mbYes, mbYesToAll, mbNo, mbNoToAll, mbCancel], nil); Result := MessageDlgEx(Msg, mtConfirmation, [mbYes, mbYesToAll, mbNo, mbNoToAll, mbCancel], nil);
if Result in [mrNo, mrNoToAll] then if Result in [mrNo, mrNoToAll] then
if MessageDlgEx(rsMainFrm_rsPackageDependency1, mtInformation, [mbYes, mbNo], nil) <> mrYes then if MessageDlgEx(rsMainFrm_rsPackageDependency1, mtInformation, [mbYes, mbNo], nil) <> mrYes then

View File

@ -356,7 +356,7 @@ begin
while Assigned(Node) do while Assigned(Node) do
begin begin
Data := FVST.GetNodeData(Node); Data := FVST.GetNodeData(Node);
if UpperCase(Data^.LazarusPackageName + '.lpk') = UpperCase(AName) then if CompareText(Data^.LazarusPackageName + '.lpk', AName) = 0 then
begin begin
Result := Node^.CheckState = csCheckedNormal; Result := Node^.CheckState = csCheckedNormal;
Break; Break;

View File

@ -893,7 +893,7 @@ procedure TMainFrm.tbUninstallClick(Sender: TObject);
for I := 0 to PackageEditingInterface.GetPackageCount - 1 do for I := 0 to PackageEditingInterface.GetPackageCount - 1 do
begin begin
IDEPackge := PackageEditingInterface.GetPackages(I); IDEPackge := PackageEditingInterface.GetPackages(I);
if UpperCase(IDEPackge.Filename) = UpperCase(AFileName) then if CompareText(IDEPackge.Filename, AFileName) = 0 then
begin begin
Result := IDEPackge; Result := IDEPackge;
Break; Break;
@ -1290,10 +1290,10 @@ end;
procedure TMainFrm.miLoadClick(Sender: TObject); procedure TMainFrm.miLoadClick(Sender: TObject);
var var
SL: TStringList; SL: TStringList;
I: Integer; TrimmedS: String;
I, CheckCount: Integer;
Node: PVirtualNode; Node: PVirtualNode;
Data: PData; Data: PData;
CheckCount: Integer;
begin begin
if OD.Execute then if OD.Execute then
begin begin
@ -1303,11 +1303,12 @@ begin
SL.LoadFromFile(OD.FileName); SL.LoadFromFile(OD.FileName);
for I := 0 to SL.Count - 1 do for I := 0 to SL.Count - 1 do
begin begin
TrimmedS := Trim(SL.Strings[I]);
Node := VisualTree.VST.GetFirst; Node := VisualTree.VST.GetFirst;
while Node <> nil do while Node <> nil do
begin begin
Data := VisualTree.VST.GetNodeData(Node); Data := VisualTree.VST.GetNodeData(Node);
if UpperCase(Trim(Data^.LazarusPackageName)) = UpperCase(Trim(SL.Strings[I])) then if CompareText(Trim(Data^.LazarusPackageName), TrimmedS) = 0 then
begin begin
VisualTree.VST.CheckState[Node] := csCheckedNormal; VisualTree.VST.CheckState[Node] := csCheckedNormal;
Inc(CheckCount); Inc(CheckCount);

View File

@ -366,7 +366,7 @@ begin
while Assigned(Node) do while Assigned(Node) do
begin begin
Data := FVST.GetNodeData(Node); Data := FVST.GetNodeData(Node);
if (UpperCase(Data^.FAddress) = UpperCase(AAddress)) and (Data^.FUniqueID <> AUniqueID) then if (CompareText(Data^.FAddress, AAddress) = 0) and (Data^.FUniqueID <> AUniqueID) then
begin begin
Result := True; Result := True;
Break; Break;

View File

@ -69,7 +69,7 @@ begin
Result := False; Result := False;
for I := 0 to Options.RemoteRepository.Count - 1 do for I := 0 to Options.RemoteRepository.Count - 1 do
begin begin
if UpperCase(Options.RemoteRepository.Strings[I]) = UpperCase(AAddress) then if CompareText(Options.RemoteRepository.Strings[I], AAddress) = 0 then
begin begin
Result := True; Result := True;
Break; Break;

View File

@ -586,7 +586,7 @@ begin
for I := 0 to FLazarusPackages.Count - 1 do for I := 0 to FLazarusPackages.Count - 1 do
begin begin
Result := TLazarusPackage(FLazarusPackages.Items[I]); Result := TLazarusPackage(FLazarusPackages.Items[I]);
if UpperCase(Result.Name) = UpperCase(APackageName) then if CompareText(Result.Name, APackageName) = 0 then
Exit; Exit;
end; end;
Result := nil; Result := nil;
@ -770,20 +770,17 @@ function TSerializablePackages.FindMetaPackage(const AValue: String;
const AFindPackageBy: TFindPackageBy): TMetaPackage; const AFindPackageBy: TFindPackageBy): TMetaPackage;
var var
I: Integer; I: Integer;
NeedToBreak: Boolean; S: String;
begin begin
Result := nil; Result := nil;
for I := 0 to Count - 1 do for I := 0 to Count - 1 do
begin begin
case AFindPackageBy of case AFindPackageBy of
fpbPackageName: NeedToBreak := UpperCase(Items[I].Name) = UpperCase(AValue); fpbPackageName: S := Items[I].Name;
fpbRepositoryFilename: NeedToBreak := UpperCase(Items[I].RepositoryFileName) = UpperCase(AValue) fpbRepositoryFilename: S := Items[I].RepositoryFileName;
end;
if NeedToBreak then
begin
Result := Items[I];
Break;
end; end;
if CompareText(S, AValue) = 0 then
Exit(Items[I]);
end; end;
end; end;
@ -810,24 +807,20 @@ function TSerializablePackages.FindPackageIndex(const AValue: String;
const AFindPackageBy: TFindPackageBy): Integer; const AFindPackageBy: TFindPackageBy): Integer;
var var
I: Integer; I: Integer;
NeedToBreak: Boolean; S: String;
begin begin
Result := -1; Result := -1;
for I := 0 to Count - 1 do for I := 0 to Count - 1 do
begin begin
case AFindPackageBy of case AFindPackageBy of
fpbPackageName: NeedToBreak := Items[I].Name = AValue; fpbPackageName: S := Items[I].Name;
fpbRepositoryFilename: NeedToBreak := Items[I].RepositoryFileName = AValue fpbRepositoryFilename: S := Items[I].RepositoryFileName;
end;
if NeedToBreak then
begin
Result := I;
Break;
end; end;
if S = AValue then
Exit(I);
end; end;
end; end;
function TSerializablePackages.FindLazarusPackage(const APackageName: String): TLazarusPackage; function TSerializablePackages.FindLazarusPackage(const APackageName: String): TLazarusPackage;
var var
I, J: Integer; I, J: Integer;
@ -837,7 +830,7 @@ begin
begin begin
for J := 0 to Items[I].FLazarusPackages.Count - 1 do for J := 0 to Items[I].FLazarusPackages.Count - 1 do
begin begin
if UpperCase(TLazarusPackage(Items[I].FLazarusPackages.Items[J]).Name) = UpperCase(APackageName) then if CompareText(TLazarusPackage(Items[I].FLazarusPackages.Items[J]).Name, APackageName) = 0 then
begin begin
Result := TLazarusPackage(Items[I].FLazarusPackages.Items[J]); Result := TLazarusPackage(Items[I].FLazarusPackages.Items[J]);
Break; Break;
@ -1399,7 +1392,7 @@ begin
for J := 0 to PackageEditingInterface.GetPackageCount - 1 do for J := 0 to PackageEditingInterface.GetPackageCount - 1 do
begin begin
IDEPackage := PackageEditingInterface.GetPackages(J); IDEPackage := PackageEditingInterface.GetPackages(J);
if UpperCase(ExtractFileName(IDEPackage.Filename)) = UpperCase(PackageName) then if CompareText(ExtractFileName(IDEPackage.Filename), PackageName) = 0 then
begin begin
LazarusPkg := FindLazarusPackage(PackageName); LazarusPkg := FindLazarusPackage(PackageName);
if LazarusPkg <> nil then if LazarusPkg <> nil then

View File

@ -1365,7 +1365,7 @@ begin
begin begin
DependencyPkg := TLazarusPackage(SerializablePackages.Items[DataSearch^.PID].LazarusPackages.Items[DataSearch^.PFID]); DependencyPkg := TLazarusPackage(SerializablePackages.Items[DataSearch^.PID].LazarusPackages.Items[DataSearch^.PFID]);
if (FVST.CheckState[NodeSearch] <> csCheckedNormal) and if (FVST.CheckState[NodeSearch] <> csCheckedNormal) and
(UpperCase(DataSearch^.LazarusPackageName) = UpperCase(PkgFileName)) and (CompareText(DataSearch^.LazarusPackageName, PkgFileName) = 0) and
((SerializablePackages.IsDependencyOk(TPackageDependency(PackageList.Items[I]), DependencyPkg)) and ((SerializablePackages.IsDependencyOk(TPackageDependency(PackageList.Items[I]), DependencyPkg)) and
((not (DependencyPkg.PackageState = psInstalled)) or ((DependencyPkg.PackageState = psInstalled) and (not (SerializablePackages.IsInstalledVersionOk(TPackageDependency(PackageList.Items[I]), DataSearch^.InstalledVersion)))))) then ((not (DependencyPkg.PackageState = psInstalled)) or ((DependencyPkg.PackageState = psInstalled) and (not (SerializablePackages.IsInstalledVersionOk(TPackageDependency(PackageList.Items[I]), DataSearch^.InstalledVersion)))))) then
begin begin

View File

@ -142,38 +142,41 @@ procedure TPackageUnzipper.Execute;
var var
I: Integer; I: Integer;
DelDir: String; DelDir: String;
MPkg: TMetaPackage;
begin begin
Sleep(50); Sleep(50);
FCnt := 0; FCnt := 0;
FStartTime := GetTickCount64; FStartTime := GetTickCount64;
for I := 0 to SerializablePackages.Count - 1 do for I := 0 to SerializablePackages.Count - 1 do
begin begin
if SerializablePackages.Items[I].IsExtractable then MPkg := SerializablePackages.Items[I];
if MPkg.IsExtractable then
begin begin
if FNeedToBreak then if FNeedToBreak then
Break; Break;
Inc(FCnt); Inc(FCnt);
FCurPos := 0; FCurPos := 0;
FZipFile := SerializablePackages.Items[I].RepositoryFileName; FZipFile := MPkg.RepositoryFileName;
DelDir := FDstDir + SerializablePackages.Items[I].PackageBaseDir; DelDir := FDstDir + MPkg.PackageBaseDir;
if FIsUpdate then if FIsUpdate then
if DirectoryExists(DelDir) then if DirectoryExists(DelDir) then
DeleteDirectory(DelDir, False); DeleteDirectory(DelDir, False);
try try
FUnZipper.Clear; FUnZipper.Clear;
FUnZipper.FileName := FSrcDir + SerializablePackages.Items[I].RepositoryFileName; FUnZipper.FileName := FSrcDir + MPkg.RepositoryFileName;
if SerializablePackages.Items[I].IsDirZipped then if MPkg.IsDirZipped then
FUnZipper.OutputPath := FDstDir FUnZipper.OutputPath := FDstDir
else else
FUnZipper.OutputPath := FDstDir + SerializablePackages.Items[I].PackageBaseDir; FUnZipper.OutputPath := FDstDir + MPkg.PackageBaseDir;
FUnZipper.OnProgressEx := @DoOnProgressEx; FUnZipper.OnProgressEx := @DoOnProgressEx;
FUnZipper.Examine; FUnZipper.Examine;
FUnZipper.UnZipAllFiles; FUnZipper.UnZipAllFiles;
SerializablePackages.Items[I].ChangePackageStates(ctAdd, psExtracted); MPkg.ChangePackageStates(ctAdd, psExtracted);
if (SerializablePackages.Items[I].IsDirZipped ) and (UpperCase(SerializablePackages.Items[I].PackageBaseDir) <> UpperCase(SerializablePackages.Items[I].ZippedBaseDir)) then if (MPkg.IsDirZipped )
and (CompareText(MPkg.PackageBaseDir, MPkg.ZippedBaseDir) <> 0) then
begin begin
CopyDirTree(FUnZipper.OutputPath + SerializablePackages.Items[I].ZippedBaseDir, DelDir, [cffOverwriteFile]); CopyDirTree(FUnZipper.OutputPath + MPkg.ZippedBaseDir, DelDir, [cffOverwriteFile]);
DeleteDirectory(FUnZipper.OutputPath + SerializablePackages.Items[I].ZippedBaseDir, False); DeleteDirectory(FUnZipper.OutputPath + MPkg.ZippedBaseDir, False);
end; end;
Synchronize(@DoOnZipProgress); Synchronize(@DoOnZipProgress);
FTotPos := FTotPos + FCurSize; FTotPos := FTotPos + FCurSize;
@ -181,8 +184,8 @@ begin
on E: Exception do on E: Exception do
begin begin
FErrMsg := E.Message; FErrMsg := E.Message;
SerializablePackages.Items[I].ChangePackageStates(ctRemove, psExtracted); MPkg.ChangePackageStates(ctRemove, psExtracted);
SerializablePackages.Items[I].ChangePackageStates(ctAdd, psError); MPkg.ChangePackageStates(ctAdd, psError);
DeleteDirectory(DelDir, False); DeleteDirectory(DelDir, False);
Synchronize(@DoOnZipError); Synchronize(@DoOnZipError);
end; end;