From 3ea7788cbf1f53c6c52194c7db11d7c36bf372c8 Mon Sep 17 00:00:00 2001 From: juha Date: Sun, 10 Jan 2021 19:07:52 +0000 Subject: [PATCH] Optimize CompareFileExt in different ways. Comparison of FPC/Lazarus generated files can be case-sensitive. git-svn-id: trunk@64374 - --- .../buildintf/packagedependencyintf.pas | 2 +- components/codetools/codetoolmanager.pas | 7 +- components/codetools/definetemplates.pas | 25 +++--- components/codetools/directorycacher.pas | 4 +- .../examples/testfpcsrcunitrules.lpr | 6 +- components/codetools/ppugraph.pas | 2 +- components/lazutils/fileutil.inc | 10 ++- components/lazutils/lazfileutils.pas | 78 ++++++++++++------- components/lazutils/translations.pas | 13 ++-- converter/convertdelphi.pas | 4 +- ide/buildmanager.pas | 4 +- ide/checkcompileropts.pas | 14 ++-- ide/codebrowser.pas | 2 +- ide/compileroptions.pp | 2 +- ide/etfpcmsgparser.pas | 2 +- ide/idetranslations.pas | 6 +- ide/imexportcompileropts.pas | 2 +- ide/initialsetupproc.pas | 2 +- ide/inspectchksumchangeddlg.pas | 2 +- ide/lazbuild.lpr | 12 +-- ide/main.pp | 18 ++--- ide/sourceeditor.pp | 16 ++-- ide/sourcefilemanager.pas | 18 ++--- packager/interpkgconflictfiles.pas | 2 +- packager/packagedefs.pas | 10 +-- packager/packagelinks.pas | 4 +- packager/pkgmanager.pas | 5 +- tools/lplupdate.lpr | 4 +- 28 files changed, 149 insertions(+), 127 deletions(-) diff --git a/components/buildintf/packagedependencyintf.pas b/components/buildintf/packagedependencyintf.pas index cf8dcef7d3..d76ca5458d 100644 --- a/components/buildintf/packagedependencyintf.pas +++ b/components/buildintf/packagedependencyintf.pas @@ -121,7 +121,7 @@ var PkgName: String; begin Result:=false; - if CompareFileExt(AFilename,'.lpk',false)<>0 then exit; + if CompareFileExt(AFilename,'lpk',true)<>0 then exit; PkgName:=ExtractFileNameOnly(AFilename); if (PkgName='') or (not IsValidPkgName(PkgName)) then exit; Result:=true; diff --git a/components/codetools/codetoolmanager.pas b/components/codetools/codetoolmanager.pas index 00960153bd..e97a4c7667 100644 --- a/components/codetools/codetoolmanager.pas +++ b/components/codetools/codetoolmanager.pas @@ -5864,8 +5864,7 @@ begin end; procedure TCodeToolManager.DoOnGatherUserIdentifiers( - Sender: TIdentCompletionTool; const ContextFlags: TIdentifierListContextFlags - ); + Sender: TIdentCompletionTool; const ContextFlags: TIdentifierListContextFlags); begin if Assigned(FOnGatherUserIdentifiers) then FOnGatherUserIdentifiers(Sender, ContextFlags); @@ -5874,9 +5873,9 @@ end; function TCodeToolManager.DoOnGetSrcPathForCompiledUnit(Sender: TObject; const AFilename: string): string; begin - if CompareFileExt(AFilename,'.ppu',false)=0 then + if CompareFileExt(AFilename,'ppu',true)=0 then Result:=GetPPUSrcPathForDirectory(ExtractFilePath(AFilename)) - else if CompareFileExt(AFilename,'.dcu',false)=0 then + else if CompareFileExt(AFilename,'dcu')=0 then Result:=GetDCUSrcPathForDirectory(ExtractFilePath(AFilename)) else Result:=''; diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index 9b83e4b1d7..43f542d69a 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -59,7 +59,7 @@ uses CodeToolsStrConsts, ExprEval, DirectoryCacher, BasicCodeTools, CodeToolsStructs, KeywordFuncLists, LinkScanner, FileProcs, // LazUtils - LazStringUtils, LazFileUtils, LazFileCache, + LazStringUtils, LazFileUtils, FileUtil, LazFileCache, LazUTF8, LazUTF8Classes, UTF8Process, LazDbgLog, AvgLvlTree, Laz2_XMLCfg; const @@ -1966,7 +1966,7 @@ begin if (Ext='.pas') or (Ext='.pp') or (Ext='.p') or (Ext='.ppu') then begin File_Name:=ExtractFileNameOnly(Filename); if (not Units.Contains(File_Name)) - or ((Ext<>'.ppu') and (CompareFileExt(Units[File_Name],'ppu',false)=0)) + or ((Ext<>'.ppu') and (CompareFileExt(Units[File_Name],'ppu',true)=0)) then Units[File_Name]:=Filename; end; @@ -2049,7 +2049,7 @@ begin //if Pos('lazmkunit',Filename)>0 then //debugln(['GatherUnitsInFPMSources ===== ',Filename]); AVLNode:=Units.Tree.FindSuccessor(AVLNode); - if CompareFileExt(Filename,'ppu',false)<>0 then continue; + if CompareFileExt(Filename,'ppu',true)<>0 then continue; // check if filename has the form // /something/units///.ppu // and if there is /something/fpmkinst//.fpm @@ -2134,7 +2134,7 @@ function GatherUnitSourcesInDirectory(Directory: string; MaxLevel: integer if faDirectory and Info.Attr>0 then begin if Lvl'' then begin DuplicateFilenames:=UnitToDuplicates[Unit_Name]; @@ -5414,8 +5412,7 @@ begin end; end; -function TDefineTree.GetDCUSrcPathForDirectory(const Directory: string - ): string; +function TDefineTree.GetDCUSrcPathForDirectory(const Directory: string): string; var Evaluator: TExpressionEvaluator; begin Evaluator:=GetDefinesForDirectory(Directory,true); @@ -9118,7 +9115,7 @@ begin end; // check if the system ppu exists HasPPUs:=(Kind=pcFPC) and (Units<>nil) - and (CompareFileExt(Units['system'],'ppu',false)=0); + and (CompareFileExt(Units['system'],'ppu',true)=0); // check compiler version define if (CTConsoleVerbosity>=-1) and (Defines<>nil) then begin case Kind of @@ -10424,7 +10421,7 @@ begin if (ConfigCache.Units<>nil) then begin UnitInFPCPath:=ConfigCache.Units[AnUnitName]; //if Pos('lazmkunit',AnUnitName)>0 then debugln(['TFPCUnitSetCache.GetUnitSrcFile UnitInFPCPath=',UnitInFPCPath]); - if (CompareFileExt(UnitInFPCPath,'ppu',false)=0) then begin + if (CompareFileExt(UnitInFPCPath,'ppu',true)=0) then begin // there is a ppu end else if UnitInFPCPath<>'' then begin // there is a pp or pas in the FPC search path @@ -10476,7 +10473,7 @@ begin if ConfigCache.Units=nil then exit; Result:=ConfigCache.Units[AUnitName]; if Result='' then exit; - if CompareFileExt(Result,'.ppu',false)<>0 then + if CompareFileExt(Result,'ppu',true)<>0 then Result:=''; end; diff --git a/components/codetools/directorycacher.pas b/components/codetools/directorycacher.pas index d425f5384c..027573c79a 100644 --- a/components/codetools/directorycacher.pas +++ b/components/codetools/directorycacher.pas @@ -452,7 +452,7 @@ begin end; // try also different extensions for pe:=Low(TCTPascalExtType) to High(TCTPascalExtType) do begin - if CompareFileExt(Filename,CTPascalExtension[pe],false)<>0 then + if CompareFileExtQuick(Filename,CTPascalExtension[pe])<>0 then begin AliasFilename:=ChangeFileExt(Filename,'.pas'); if FileExistsCached(AliasFilename) then begin @@ -869,7 +869,7 @@ begin end; // try different extensions too for pe:=Low(TCTPascalExtType) to High(TCTPascalExtType) do begin - if CompareFileExt(Result,CTPascalExtension[pe],false)<>0 then + if CompareFileExtQuick(Result,CTPascalExtension[pe])<>0 then begin AliasFilename:=ChangeFileExt(Result,CTPascalExtension[pe]); if FileExistsCached(AliasFilename) then begin diff --git a/components/codetools/examples/testfpcsrcunitrules.lpr b/components/codetools/examples/testfpcsrcunitrules.lpr index a2e4ad3fbc..4756b12255 100644 --- a/components/codetools/examples/testfpcsrcunitrules.lpr +++ b/components/codetools/examples/testfpcsrcunitrules.lpr @@ -340,7 +340,7 @@ begin Item:=PStringToStringItem(Node.Data); aUnitName:=Item^.Name; Filename:=Item^.Value; - if CompareFileExt(Filename,'ppu',false)=0 then begin + if CompareFileExt(Filename,'ppu',true)=0 then begin // a ppu in the PPU search path if UnitToSrc[aUnitName]='' then begin inc(Cnt); @@ -390,7 +390,7 @@ begin aUnitName:=Item^.Name; Files:=Item^.Value; PPUFile:=Units[aUnitName]; - if CompareFileExt(PPUFile,'ppu',false)=0 then begin + if CompareFileExt(PPUFile,'ppu',true)=0 then begin if Cnt=0 then writeln; inc(Cnt); writeln('WARNING: duplicate source file for ppu ',aUnitName,' files=',Files); @@ -437,7 +437,7 @@ begin PPUFile:=ConfigCache.Units[AnUnitName]; if PPUFile='' then writeln(' WARNING: ',AnUnitName,' is not in PPU search path') - else if CompareFileExt(PPUFile,'ppu',false)<>0 then + else if CompareFileExt(PPUFile,'ppu',true)<>0 then writeln(' WARNING: fpc ppu search path has a source and not a ppu for ',AnUnitName,': ',PPUFile) else writeln(' in PPU search path: ',PPUFile); diff --git a/components/codetools/ppugraph.pas b/components/codetools/ppugraph.pas index 96b17e18ec..98ef43f003 100644 --- a/components/codetools/ppugraph.pas +++ b/components/codetools/ppugraph.pas @@ -697,7 +697,7 @@ begin if (FileInfo.Name='.') or (FileInfo.Name='..') or (FileInfo.Name='') then continue; Filename:=FileInfo.Name; - if (CompareFileExt(Filename,'ppu',false)<>0) then continue; + if (CompareFileExt(Filename,'ppu',true)<>0) then continue; AUnitName:=ExtractFileNameOnly(Filename); Filename:=AppendPathDelim(Directory)+Filename; if not LazIsValidIdent(AUnitName,true,true) then begin diff --git a/components/lazutils/fileutil.inc b/components/lazutils/fileutil.inc index cd56d9c5d9..473547aa2e 100644 --- a/components/lazutils/fileutil.inc +++ b/components/lazutils/fileutil.inc @@ -87,10 +87,16 @@ end; function FilenameIsPascalUnit(const Filename: string): boolean; var - i: Integer; + i, FnPos: Integer; + FnExt: String; begin + FnPos := length(Filename); + while (FnPos>=1) and (Filename[FnPos]<>'.') do dec(FnPos); + if FnPos < 1 then + exit(false); // no extension in filename + FnExt := LowerCase(Copy(Filename, FnPos, length(FileName))); for i:=Low(PascalFileExt) to High(PascalFileExt) do - if CompareFileExt(Filename,PascalFileExt[i],false)=0 then + if CompareStr(FnExt,PascalFileExt[i])=0 then exit(true); Result:=false; end; diff --git a/components/lazutils/lazfileutils.pas b/components/lazutils/lazfileutils.pas index 350ed5a12a..e75cedbb38 100644 --- a/components/lazutils/lazfileutils.pas +++ b/components/lazutils/lazfileutils.pas @@ -28,8 +28,9 @@ uses function CompareFilenames(const Filename1, Filename2: string): integer; overload; function CompareFilenamesIgnoreCase(const Filename1, Filename2: string): integer; -function CompareFileExt(const Filename, Ext: string; - CaseSensitive: boolean = False): integer; +function CompareFileExt(const Filename: string; Ext: string; CaseSensitive: boolean): integer; +function CompareFileExt(const Filename, Ext: string): integer; +function CompareFileExtQuick(const Filename: string; LowerExt: string): integer; function CompareFilenameStarts(const Filename1, Filename2: string): integer; function CompareFilenames(Filename1: PChar; Len1: integer; Filename2: PChar; Len2: integer): integer; overload; @@ -262,37 +263,60 @@ begin {$ENDIF} end; -function CompareFileExt(const Filename, Ext: string; CaseSensitive: boolean): integer; +function CompareFileExt(const Filename: string; Ext: string; CaseSensitive: boolean): integer; // Ext can contain a point or not var - n, e : AnsiString; - FileLen, FilePos, ExtLen, ExtPos: integer; + FnExt: String; + FnPos: integer; begin - FileLen := length(Filename); - ExtLen := length(Ext); - FilePos := FileLen; - while (FilePos>=1) and (Filename[FilePos]<>'.') do dec(FilePos); - if FilePos < 1 then begin - // no extension in filename - Result:=1; - exit; - end; - // skip point - inc(FilePos); - ExtPos := 1; - if (ExtPos <= ExtLen) and (Ext[1] = '.') then inc(ExtPos); - + // Filename + FnPos := length(Filename); + while (FnPos>=1) and (Filename[FnPos]<>'.') do dec(FnPos); + if FnPos < 1 then + exit(1); // no extension in filename + FnExt := Copy(Filename, FnPos+1, length(FileName)); // FnPos+1 skips point + // Ext + if (length(Ext) > 1) and (Ext[1] = '.') then + Delete(Ext, 1, 1); // compare extensions - n := Copy(Filename, FilePos, length(FileName)); - e := Copy(Ext, ExtPos, length(Ext)); if CaseSensitive then - Result := CompareStr(n, e) + Result := CompareStr(FnExt, Ext) else - Result := UTF8CompareText(n, e); - if Result < 0 - then Result := -1 - else - if Result > 0 then Result := 1; + Result := UTF8CompareText(FnExt, Ext); + if Result < 0 then + Result := -1 + else if Result > 0 then + Result := 1; +end; + +function CompareFileExt(const Filename, Ext: string): integer; +begin + Result := CompareFileExt(Filename, Ext, + {$IFDEF CaseInsensitiveFilenames} False {$ELSE} True {$ENDIF} ); +end; + +function CompareFileExtQuick(const Filename: string; LowerExt: string): integer; +// Compares case-insensitively but only with ASCII characters. +// LowerExt must be lowercase. It can contain a point or not. +var + FnExt: String; + FnPos: integer; +begin + // Filename + FnPos := length(Filename); + while (FnPos>=1) and (Filename[FnPos]<>'.') do dec(FnPos); + if FnPos < 1 then + exit(1); // no extension in filename + FnExt := LowerCase(Copy(Filename, FnPos+1, length(FileName))); // FnPos+1 skips point + // Ext + if (length(LowerExt) > 1) and (LowerExt[1] = '.') then + Delete(LowerExt, 1, 1); + // compare extensions + Result := CompareStr(FnExt, LowerExt); + if Result < 0 then + Result := -1 + else if Result > 0 then + Result := 1; end; function ExtractFileNameOnly(const AFilename: string): string; diff --git a/components/lazutils/translations.pas b/components/lazutils/translations.pas index 0373a52163..1a29a0eef6 100644 --- a/components/lazutils/translations.pas +++ b/components/lazutils/translations.pas @@ -432,7 +432,7 @@ begin Result:=false; AUnitName:=''; Language:=''; - if CompareFileExt(Filename, '.po', false)=0 then + if CompareFileExtQuick(Filename, 'po')=0 then begin NameWithoutExt:=ExtractFileNameWithoutExt(Filename); Ext:=ExtractFileExt(NameWithoutExt); @@ -514,6 +514,7 @@ var BasePoFile: TPoFile; i: Integer; E: EPOFileError; + ExtLrj: Boolean; begin Result := false; @@ -539,19 +540,19 @@ begin // Update po file with lrj, rst/rsj of RSTFiles for i:=0 to RSTFiles.Count-1 do begin Filename:=RSTFiles[i]; - if (CompareFileExt(Filename,'.lrj')=0) or - (CompareFileExt(Filename,'.rst')=0) or - (CompareFileExt(Filename,'.rsj')=0) then + ExtLrj := (CompareFileExtQuick(Filename,'lrj')=0); + if ExtLrj or (CompareFileExtQuick(Filename,'rst')=0) or + (CompareFileExtQuick(Filename,'rsj')=0) then try //DebugLn(''); //DebugLn(['AddFiles2Po Filename="',Filename,'"']); InputLines.Clear; InputLines.LoadFromFile(FileName); - if CompareFileExt(Filename,'.lrj')=0 then + if ExtLrj then BasePOFile.UpdateStrings(InputLines, stLrj) else - if CompareFileExt(Filename,'.rsj')=0 then + if CompareFileExtQuick(Filename,'rsj')=0 then BasePOFile.UpdateStrings(InputLines, stRsj) else BasePOFile.UpdateStrings(InputLines, stRst); diff --git a/converter/convertdelphi.pas b/converter/convertdelphi.pas index 6cb8bece46..6bf4f708b2 100644 --- a/converter/convertdelphi.pas +++ b/converter/convertdelphi.pas @@ -992,7 +992,7 @@ var StartTime, EndTime: TDateTime; s: string; begin - if CompareFileExt(fSettings.MainFilename,'.dproj',false)=0 then begin + if CompareFileExtQuick(fSettings.MainFilename,'dproj')=0 then begin fErrorMsg := lisConvDprojFileNotSupportedYet; Exit(mrCancel); end; @@ -1010,7 +1010,7 @@ begin fLazPMainFilename:=fSettings.DelphiToLazFilename(fSettings.MainFilename, fLazPMainSuffix, false); // Find Delphi project / package file name - if CompareFileExt(fSettings.MainFilename,fDelphiPSuffix,false)=0 then + if CompareFileExtQuick(fSettings.MainFilename,fDelphiPSuffix)=0 then fDelphiPFilename:=fSettings.MainFilename else fDelphiPFilename:=ChangeFileExt(fSettings.MainFilename,fDelphiPSuffix); diff --git a/ide/buildmanager.pas b/ide/buildmanager.pas index 90c3f8226c..c55b37ec78 100644 --- a/ide/buildmanager.pas +++ b/ide/buildmanager.pas @@ -872,7 +872,7 @@ procedure TBuildManager.RescanCompilerDefines(ResetBuildTarget, if ConfigCache.Units=nil then exit; AFilename:=ConfigCache.Units['system']; if AFilename='' then exit; - if CompareFileExt(AFilename,'.ppu',false)<>0 then exit; + if CompareFileExt(AFilename,'ppu',true)<>0 then exit; Result:=true; end; @@ -1688,7 +1688,7 @@ begin or ((FileInfo.Attr and faDirectory)<>0) then continue; if FilenameIsPascalUnit(FileInfo.Name) then CurUnitTree:=SourceUnitTree - else if (CompareFileExt(FileInfo.Name,CompiledExt,false)=0) then + else if (CompareFileExt(FileInfo.Name,CompiledExt,true)=0) then CurUnitTree:=CompiledUnitTree else continue; diff --git a/ide/checkcompileropts.pas b/ide/checkcompileropts.pas index 7e7eb8d236..6cee50bdb2 100644 --- a/ide/checkcompileropts.pas +++ b/ide/checkcompileropts.pas @@ -456,8 +456,7 @@ begin Result:=mrOk; end; -function TCheckCompilerOptsDlg.FindAllPPUFiles(const AnUnitPath: string - ): TStrings; +function TCheckCompilerOptsDlg.FindAllPPUFiles(const AnUnitPath: string): TStrings; var Directory: String; p: Integer; @@ -476,8 +475,7 @@ begin if (FileInfo.Name='.') or (FileInfo.Name='..') or (FileInfo.Name='') then continue; // check extension - if CompareFileExt(FileInfo.Name,'.ppu', - {$IFDEF MSWINDOWS}false{$ELSE}true{$ENDIF})=0 then + if CompareFileExt(FileInfo.Name,'ppu',true)=0 then Result.Add(Directory+FileInfo.Name); until FindNextUTF8(FileInfo)<>0; end; @@ -626,7 +624,7 @@ begin Node:=CfgCache.Units.Tree.FindLowest; while Node<>nil do begin Item:=PStringToStringItem(Node.Data); - if (Item^.Value<>'') and (CompareFileExt(Item^.Value,'.ppu',false)=0) then + if (Item^.Value<>'') and (CompareFileExt(Item^.Value,'ppu',true)=0) then CheckFileAge(Item^.Value); Node:=CfgCache.Units.Tree.FindSuccessor(Node); end; @@ -805,10 +803,8 @@ begin if (FileInfo.Name='.') or (FileInfo.Name='..') or (FileInfo.Name='') then continue; // check extension - if (CompareFileExt(FileInfo.Name,'.ppu', - {$IFDEF MSWINDOWS}false{$ELSE}true{$ENDIF})<>0) - and (CompareFileExt(FileInfo.Name,'.o', - {$IFDEF MSWINDOWS}false{$ELSE}true{$ENDIF})<>0) + if (CompareFileExt(FileInfo.Name,'ppu',true)<>0) + and (CompareFileExt(FileInfo.Name,'o',true)<>0) then continue; PPUFiles.Add(Directory+FileInfo.Name); diff --git a/ide/codebrowser.pas b/ide/codebrowser.pas index c62621d683..c12fbf1875 100644 --- a/ide/codebrowser.pas +++ b/ide/codebrowser.pas @@ -1387,7 +1387,7 @@ var while Node<>nil do begin Item:=PStringToStringItem(Node.Data); Filename:=Item^.Value; - if (CompareFileExt(Filename,'ppu',false)=0) then begin + if (CompareFileExt(Filename,'ppu',true)=0) then begin // search source in fpc sources Filename:=UnitSet.GetUnitSrcFile(ExtractFileNameOnly(Filename)); end; diff --git a/ide/compileroptions.pp b/ide/compileroptions.pp index 93061cac34..aaca3e1af8 100644 --- a/ide/compileroptions.pp +++ b/ide/compileroptions.pp @@ -1948,7 +1948,7 @@ var begin if ExtractFileName(aFilename)='' then exit; Ext:=GetTargetFileExt; - if (Ext<>'') and (CompareFileExt(aFilename,Ext)<>0) then + if (Ext<>'') and (CompareFileExtQuick(aFilename,Ext)<>0) then aFilename:=aFilename+Ext; //DebugLn('Filename is ',AFilename,' in AppendDefaultExt'); end; diff --git a/ide/etfpcmsgparser.pas b/ide/etfpcmsgparser.pas index f7678c51cf..c624f9a122 100644 --- a/ide/etfpcmsgparser.pas +++ b/ide/etfpcmsgparser.pas @@ -1894,7 +1894,7 @@ begin begin MsgLine.Urgency:=mluVerbose; end else if HideHintsUnitNotUsedInMainSource then begin - if CompareFileExt(MsgLine.Filename, 'lpr', false)=0 then + if CompareFileExt(MsgLine.Filename, 'lpr', true)=0 then // a lpr does not use a unit => not important MsgLine.Urgency:=mluVerbose else if FilenameIsAbsolute(MsgLine.Filename) diff --git a/ide/idetranslations.pas b/ide/idetranslations.pas index 3b783549bc..4ba59b3e7e 100644 --- a/ide/idetranslations.pas +++ b/ide/idetranslations.pas @@ -383,11 +383,11 @@ begin // Update po file with lrj or/and rst/rsj files for i:=0 to SrcFiles.Count-1 do begin Filename:=SrcFiles[i]; - if CompareFileExt(Filename,'.lrj',false)=0 then + if CompareFileExtQuick(Filename,'lrj')=0 then FileType:=stLrj - else if CompareFileExt(Filename,'.rst',false)=0 then + else if CompareFileExtQuick(Filename,'rst')=0 then FileType:=stRst - else if CompareFileExt(Filename,'.rsj',false)=0 then + else if CompareFileExtQuick(Filename,'rsj')=0 then FileType:=stRsj else continue; diff --git a/ide/imexportcompileropts.pas b/ide/imexportcompileropts.pas index 56a1335f6f..ee84c0fb1f 100644 --- a/ide/imexportcompileropts.pas +++ b/ide/imexportcompileropts.pas @@ -204,7 +204,7 @@ begin else begin // default: depending on file type Result:=DefaultCompilerOptPath; - if CompareFileExt(fXMLConfig.Filename,'.lpk',false)=0 then + if CompareFileExt(fXMLConfig.Filename,'lpk',true)=0 then begin try FileVersion:=fXMLConfig.GetValue(PkgVersionPath,2); diff --git a/ide/initialsetupproc.pas b/ide/initialsetupproc.pas index e3f859417f..26533ac118 100644 --- a/ide/initialsetupproc.pas +++ b/ide/initialsetupproc.pas @@ -328,7 +328,7 @@ var function CheckPPU(const AnUnitName: string): boolean; begin if (CfgCache.Units=nil) - or (CompareFileExt(CfgCache.Units[AnUnitName],'ppu',false)<>0) then + or (CompareFileExt(CfgCache.Units[AnUnitName],'ppu',true)<>0) then begin Note:=Format(lisPpuNotFoundCheckYourFpcCfg, [AnUnitName]); Result:=false; diff --git a/ide/inspectchksumchangeddlg.pas b/ide/inspectchksumchangeddlg.pas index 59eec5635b..953e806e5d 100644 --- a/ide/inspectchksumchangeddlg.pas +++ b/ide/inspectchksumchangeddlg.pas @@ -338,7 +338,7 @@ begin FileNode:=nil; for i:=0 to Files.Count-1 do begin aFile:=Files[i]; - if CompareFileExt(aFile.Filename,'.ppu',false)=0 then + if CompareFileExt(aFile.Filename,'ppu',true)=0 then inc(PPUCount) else inc(SrcCount); diff --git a/ide/lazbuild.lpr b/ide/lazbuild.lpr index 684e26f4c8..765be8375e 100644 --- a/ide/lazbuild.lpr +++ b/ide/lazbuild.lpr @@ -387,7 +387,7 @@ begin Package:=TLazPackageLink(LazPackageLinks.FindLinkWithPkgName(OriginalFileName)); if Package=nil then begin // Not found after everything we tried - if CompareFileExt(Filename,'.lpi')=0 then + if CompareFileExt(Filename,'lpi', true)=0 then Error(ErrorFileNotFound,'file not found: '+OriginalFilename) else Error(ErrorFileNotFound,'package not found: '+OriginalFilename); @@ -416,15 +416,15 @@ begin end else begin // File exists: - if CompareFileExt(Filename,'.lpk')=0 then begin + if CompareFileExt(Filename,'lpk',true)=0 then begin case PackageAction of lpaBuild: Result:=BuildPackage(Filename); lpaInstall: Result:=true; // this is handled in AddPackagesToInstallList lpaAddPkgLinks: Result:=true; end; - end else if CompareFileExt(Filename,'.lpi')=0 then + end else if CompareFileExt(Filename,'lpi',true)=0 then Result:=BuildProject(Filename) - else if CompareFileExt(Filename,'.lpr')=0 then begin + else if CompareFileExt(Filename,'lpr',true)=0 then begin Filename:=ChangeFileExt(Filename,'.lpi'); if FileExists(Filename) then Result:=BuildProject(Filename) @@ -1061,7 +1061,7 @@ begin PkgFilename:=''; if pvPkgSearch in fPkgGraphVerbosity then debugln(['Info: (lazarus) [TLazBuildApplication.AddPackagesToInstallList] "',PackageNamesOrFiles[i],'"']); - if CompareFileExt(PackageNamesOrFiles[i],'.lpk')=0 then + if CompareFileExt(PackageNamesOrFiles[i],'lpk',true)=0 then PkgFilename:=ExpandFileNameUTF8(PackageNamesOrFiles[i]) else if IsValidPkgName(PackageNamesOrFiles[i]) then begin PackageLink:=TLazPackageLink(LazPackageLinks.FindLinkWithPkgName(PackageNamesOrFiles[i])); @@ -1122,7 +1122,7 @@ begin begin // Look for package name in all known packages PkgFilename:=PackageNamesOrFiles[i]; - if CompareFileExt(PkgFilename,'.lpk')<>0 then begin + if CompareFileExt(PkgFilename,'lpk',true)<>0 then begin ErrorMsg+=PkgFilename+' is not a package (.lpk), so it is not registered.'+LineEnding; continue; end; diff --git a/ide/main.pp b/ide/main.pp index f1a4d1d80f..5d3e3e30f2 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -2327,10 +2327,10 @@ begin // try command line project if (CmdLineFiles<>nil) and (CmdLineFiles.Count>0) then begin AProjectFilename:=CmdLineFiles[0]; - if (CompareFileExt(AProjectFilename,'.lpr',false)=0) then + if (CompareFileExt(AProjectFilename,'lpr',true)=0) then AProjectFilename:=ChangeFileExt(AProjectFilename,'.lpi'); // only try to load .lpi files, other files are loaded later - if (CompareFileExt(AProjectFilename,'.lpi',false)=0) then begin + if (CompareFileExt(AProjectFilename,'lpi',true)=0) then begin AProjectFilename:=CleanAndExpandFilename(AProjectFilename); if FileExistsUTF8(AProjectFilename) then begin CmdLineFiles.Delete(0); @@ -2416,7 +2416,7 @@ begin // => create a project DoNewProject(ProjectDescriptorEmptyProject); end; - if CompareFileExt(AFilename,'.lpk',false)=0 then begin + if CompareFileExt(AFilename,'lpk',true)=0 then begin if PkgBoss.DoOpenPackageFile(AFilename,[pofAddToRecent,pofMultiOpen],true)=mrAbort then break; @@ -7567,9 +7567,9 @@ procedure TMainIDE.DoExecuteRemoteControl; AProjectFilename:=''; for i:=Files.Count-1 downto 0 do begin AProjectFilename:=Files[0]; - if (CompareFileExt(AProjectFilename,'.lpr',false)=0) then + if (CompareFileExt(AProjectFilename,'lpr',true)=0) then AProjectFilename:=ChangeFileExt(AProjectFilename,'.lpi'); - if (CompareFileExt(AProjectFilename,'.lpi',false)=0) then begin + if (CompareFileExt(AProjectFilename,'lpi',true)=0) then begin // open a project Files.Delete(i); // remove from the list AProjectFilename:=CleanAndExpandFilename(AProjectFilename); @@ -7598,7 +7598,7 @@ procedure TMainIDE.DoExecuteRemoteControl; for i:=0 to Files.Count-1 do begin AFilename:=CleanAndExpandFilename(Files.Strings[i]); DebugLn(['Hint: (lazarus) TMainIDE.DoExecuteRemoteControl.OpenFiles AFilename="',AFilename,'"']); - if CompareFileExt(AFilename,'.lpk',false)=0 then begin + if CompareFileExt(AFilename,'lpk',true)=0 then begin if PkgBoss.DoOpenPackageFile(AFilename,[pofAddToRecent],true)=mrAbort then break; @@ -8904,7 +8904,7 @@ begin if (ActiveUnitInfo.Component=nil) and (ActiveUnitInfo.Source<>nil) then begin - if (CompareFileExt(ActiveUnitInfo.Filename,'.inc',false)=0) then begin + if (CompareFileExtQuick(ActiveUnitInfo.Filename,'inc')=0) then begin // include file => get unit UnitCodeBuf:=CodeToolBoss.GetMainCode(ActiveUnitInfo.Source); if (UnitCodeBuf<>nil) and (UnitCodeBuf<>ActiveUnitInfo.Source) then begin @@ -8918,7 +8918,7 @@ begin end; end; end; - if (CompareFileExt(ActiveUnitInfo.Filename,'.lfm',false)=0) then begin + if (CompareFileExt(ActiveUnitInfo.Filename,'lfm',true)=0) then begin // lfm file => get unit aFilename:=GetUnitFileOfLFM(ActiveUnitInfo.Filename); if aFilename<>'' then begin @@ -12586,7 +12586,7 @@ begin end; end; end - else if CompareFileExt(AnUnitInfo.Filename,'inc',false)=0 then + else if CompareFileExtQuick(AnUnitInfo.Filename,'inc')=0 then OkToAdd:=CheckDirIsInSearchPath(AnUnitInfo,True); if OkToAdd then ; diff --git a/ide/sourceeditor.pp b/ide/sourceeditor.pp index 95a3afa46d..5a3d1aec5f 100644 --- a/ide/sourceeditor.pp +++ b/ide/sourceeditor.pp @@ -6977,7 +6977,7 @@ begin ShortFileName:=ExtractFileName(CurFilename); MainCodeBuf:=nil; if FilenameIsPascalUnit(ShortFileName) - or (CompareFileExt(ShortFileName,'.inc',true)=0) then + or (CompareFileExtQuick(ShortFileName,'inc')=0) then MainCodeBuf:=CodeToolBoss.GetMainCode(ASrcEdit.CodeBuffer) else if FilenameIsPascalSource(ShortFileName) then MainCodeBuf:=ASrcEdit.CodeBuffer; @@ -7000,14 +7000,14 @@ begin MaybeAddPopup('.s'); end; // ToDo: unit resources - if (CompareFileExt(ShortFileName,'.lfm',true)=0) - or (CompareFileExt(ShortFileName,'.dfm',true)=0) then begin + if (CompareFileExt(ShortFileName,'lfm',true)=0) + or (CompareFileExtQuick(ShortFileName,'dfm')=0) then begin MaybeAddPopup('.pas'); MaybeAddPopup('.pp'); MaybeAddPopup('.p'); end; - if (CompareFileExt(ShortFileName,'.lpi',true)=0) - or (CompareFileExt(ShortFileName,'.lpk',true)=0) then begin + if (CompareFileExt(ShortFileName,'lpi',true)=0) + or (CompareFileExt(ShortFileName,'lpk',true)=0) then begin AddContextPopupMenuItem( Format(lisOpenLfm,[ShortFileName]),true,@OnPopupMenuOpenFile); end; @@ -8075,10 +8075,10 @@ begin aFilename:=copy(aFilename,p,length(aFilename)-(length(ResStr)-2)); if not FilenameIsAbsolute(aFilename) then aFilename:=TrimFilename(ExtractFilePath(GetActiveSE.Filename)+aFilename); - if CompareFileExt(aFilename,'.lpi')=0 then + if CompareFileExt(aFilename,'lpi',true)=0 then MainIDEInterface.DoOpenProjectFile(aFilename, [ofOnlyIfExists,ofAddToRecent,ofUseCache]) - else if CompareFileExt(aFilename,'.lpk')=0 then + else if CompareFileExt(aFilename,'lpk',true)=0 then PackageEditingInterface.DoOpenPackageFile(aFilename,[pofAddToRecent],false) else MainIDEInterface.DoOpenEditorFile(aFilename, @@ -10202,7 +10202,7 @@ begin ShortFileName:=ExtractFileName(CurFilename); MainCodeBuf:=nil; if FilenameIsPascalUnit(ShortFileName) - or (CompareFileExt(ShortFileName,'.inc',true)=0) then + or (CompareFileExtQuick(ShortFileName,'inc')=0) then MainCodeBuf:=CodeToolBoss.GetMainCode(SrcEdit.CodeBuffer) else if FilenameIsPascalSource(ShortFileName) then MainCodeBuf:=SrcEdit.CodeBuffer; diff --git a/ide/sourcefilemanager.pas b/ide/sourcefilemanager.pas index d4321c1d37..1525b22c4b 100644 --- a/ide/sourcefilemanager.pas +++ b/ide/sourcefilemanager.pas @@ -1255,7 +1255,7 @@ begin if ([ofRegularFile,ofRevert,ofProjectLoading]*FFlags=[]) and FilenameIsAbsolute(FFilename) and FileExistsCached(FFilename) then begin // check if file is a lazarus project (.lpi) - if (CompareFileExt(FFilename,'.lpi',false)=0) then + if (CompareFileExt(FFilename,'lpi',true)=0) then begin case IDEQuestionDialog(lisOpenProject, Format(lisOpenTheProject, [FFilename]), @@ -1273,7 +1273,7 @@ begin end; // check if file is a lazarus package (.lpk) - if (CompareFileExt(FFilename,'.lpk',false)=0) then + if (CompareFileExt(FFilename,'lpk',true)=0) then begin case IDEQuestionDialog(lisOpenPackage, @@ -1851,7 +1851,7 @@ begin OkToAdd:=True; if FilenameIsPascalUnit(ActiveUnitInfo.Filename) then OkToAdd:=CheckDirIsInSearchPath(ActiveUnitInfo,False) - else if CompareFileExt(ActiveUnitInfo.Filename,'inc',false)=0 then + else if CompareFileExtQuick(ActiveUnitInfo.Filename,'inc')=0 then OkToAdd:=CheckDirIsInSearchPath(ActiveUnitInfo,True); if OkToAdd then begin ActiveUnitInfo.IsPartOfProject:=true; @@ -4143,7 +4143,7 @@ begin +dlgFilterAll+'|'+GetAllFilesMask; if OpenDialog.Execute then begin AFilename:=GetPhysicalFilenameCached(ExpandFileNameUTF8(OpenDialog.Filename),false); - if CompareFileExt(AFilename,'.lpi')<>0 then begin + if CompareFileExt(AFilename,'lpi',true)<>0 then begin // not a lpi file // check if it is a program source @@ -5785,8 +5785,8 @@ begin // check, if a .lfm file is opened in the source editor if (LFMUnitInfo=nil) or - ((CompareFileExt(LFMUnitInfo.Filename,'.lfm',false)<>0) and - (CompareFileExt(LFMUnitInfo.Filename,'.dfm',false)<>0)) then + ((CompareFileExt(LFMUnitInfo.Filename,'lfm',true)<>0) and + (CompareFileExtQuick(LFMUnitInfo.Filename,'dfm')<>0)) then begin if not Quiet then begin @@ -6386,7 +6386,7 @@ begin end; end; try - if (CompareFileExt(LFMFilename,'lfm')<>0) then + if (CompareFileExt(LFMFilename,'lfm',true)<>0) then begin // no lfm format -> keep old info exit(true); @@ -7408,7 +7408,7 @@ begin // Do not care if this fails. A user may have removed the line from source. Project1.RemoveCreateFormFromProjectFile(AnUnitInfo.ComponentName); end; - if CompareFileExt(AnUnitInfo.Filename,'.inc',false)=0 then + if CompareFileExtQuick(AnUnitInfo.Filename,'inc')=0 then // include file if FilenameIsAbsolute(AnUnitInfo.Filename) then ObsoleteIncPaths:=MergeSearchPaths(ObsoleteIncPaths,UnitPath); @@ -7422,7 +7422,7 @@ begin UnitPath:=ChompPathDelim(ExtractFilePath(AnUnitInfo.Filename)); if FilenameIsPascalUnit(AnUnitInfo.Filename) then ObsoleteUnitPaths:=RemoveSearchPaths(ObsoleteUnitPaths,UnitPath); - if CompareFileExt(AnUnitInfo.Filename,'.inc',false)=0 then + if CompareFileExtQuick(AnUnitInfo.Filename,'inc')=0 then ObsoleteIncPaths:=RemoveSearchPaths(ObsoleteIncPaths,UnitPath); end; AnUnitInfo:=AnUnitInfo.NextPartOfProject; diff --git a/packager/interpkgconflictfiles.pas b/packager/interpkgconflictfiles.pas index 3ffbe845a3..a9fd84cf9b 100644 --- a/packager/interpkgconflictfiles.pas +++ b/packager/interpkgconflictfiles.pas @@ -710,7 +710,7 @@ var Node:=Node.Successor; OFile:=TPGInterPkgFile(ONode.Data); if not FilenameIsCompiledSource(OFile.ShortFilename) then continue; - if CompareFileExt(OFile.ShortFilename,'.ppu',false)=0 then continue; + if CompareFileExt(OFile.ShortFilename,'ppu',true)=0 then continue; // search corresponding .ppu PPUFileName:=ChangeFileExt(OFile.FullFilename,'.ppu'); SearchFile:=TPGInterPkgFile.Create(PPUFileName,'',nil); diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index 39014d33ce..06b140314f 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -899,13 +899,13 @@ var begin HasName:=ExtractFileNameOnly(AFilename)<>''; if HasName then begin - if CompareFileExt(AFilename,'.lfm',true)=0 then + if CompareFileExt(AFilename,'lfm',true)=0 then exit(pftLFM) - else if CompareFileExt(AFilename,'.lrs',true)=0 then + else if CompareFileExt(AFilename,'lrs',true)=0 then exit(pftLRS) - else if CompareFileExt(AFilename,'.inc',true)=0 then + else if CompareFileExtQuick(AFilename,'inc')=0 then exit(pftInclude) - else if CompareFileExt(AFilename,'.xml',true)=0 then + else if CompareFileExtQuick(AFilename,'xml')=0 then exit(pftIssues) else if FilenameIsPascalUnit(AFilename) then begin Result:=pftUnit; @@ -2070,7 +2070,7 @@ var begin Result:=''; AFilename:=TrimFilename(DefaultFilename); - if (CompareFileExt(AFilename,'lpk')<>0) + if (CompareFileExt(AFilename,'lpk',true)<>0) or (SysUtils.CompareText(ExtractFileNameOnly(AFilename),PackageName)<>0) then exit; if not FilenameIsAbsolute(AFilename) then begin diff --git a/packager/packagelinks.pas b/packager/packagelinks.pas index 2e80d5a3f9..1d354864fe 100644 --- a/packager/packagelinks.pas +++ b/packager/packagelinks.pas @@ -392,7 +392,7 @@ procedure TLazPackageLinks.UpdateGlobalLinks; begin Result:=false; PkgName:=''; - if CompareFileExt(Filename,'.lpl',false)<>0 then exit; + if CompareFileExt(Filename,'lpl',true)<>0 then exit; StartPos:=1; // parse identifier if (StartPos>length(Filename)) @@ -463,7 +463,7 @@ begin LazDir:=EnvironmentOptions.GetParsedLazarusDirectory; for i:=0 to Files.Count-1 do begin LPLFilename:=GlobalLinksDir+Files[i]; - if CompareFileExt(LPLFilename,'lpl')<>0 then continue; + if CompareFileExt(LPLFilename,'lpl',true)<>0 then continue; if (not ParseFilename(Files[i],NewPkgName,PkgVersion)) then begin DebugLn('Warning: (lazarus) suspicious pkg link file found (name): ',LPLFilename); diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index b25ce86de2..75bf1de96e 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -3530,14 +3530,13 @@ var OpenEditor: Boolean; begin // replace macros - if pofConvertMacros in Flags then begin + if pofConvertMacros in Flags then if not GlobalMacroList.SubstituteStr(AFilename) then exit(mrCancel); - end; AFilename:=GetPhysicalFilenameCached(CleanAndExpandFilename(AFilename),false); // check file extension - if (CompareFileExt(AFilename,'.lpk',false)<>0) + if (CompareFileExt(AFilename,'lpk',true)<>0) and (not (pofRevert in Flags)) then begin DoQuestionDlg(lisPkgMangInvalidFileExtension, Format(lisPkgMangTheFileIsNotALazarusPackage, [AFilename])); diff --git a/tools/lplupdate.lpr b/tools/lplupdate.lpr index 8a189ed5b4..a484da7373 100644 --- a/tools/lplupdate.lpr +++ b/tools/lplupdate.lpr @@ -227,7 +227,7 @@ begin if (FileInfo.Attr and faDirectory)>0 then begin // scan sub directories too ScanPackages(AppendPathDelim(Dir+FileInfo.Name),Packages); - end else if CompareFileExt(FileInfo.Name,'.lpk',false)=0 then begin + end else if CompareFileExt(FileInfo.Name,'lpk',true)=0 then begin ScanPackage(Dir+FileInfo.Name,Packages); end; until FindNextUTF8(FileInfo)<>0; @@ -272,7 +272,7 @@ begin continue; if (FileInfo.Attr and faDirectory)>0 then begin // skip - end else if CompareFileExt(FileInfo.Name,'.lpl',false)=0 then begin + end else if CompareFileExt(FileInfo.Name,'lpl',true)=0 then begin ScanLink(Dir+FileInfo.Name,Links); end; until FindNextUTF8(FileInfo)<>0;