From ebf2d6a8bf1d0eea4c2180916914dd3377ebc28b Mon Sep 17 00:00:00 2001 From: mattias Date: Wed, 3 Sep 2008 08:16:07 +0000 Subject: [PATCH] codetools: extended directorycacher for darwin filenames git-svn-id: trunk@16384 - --- components/codetools/codetoolsstructs.pas | 86 ++++++++++++++++++++--- components/codetools/directorycacher.pas | 21 +++--- 2 files changed, 90 insertions(+), 17 deletions(-) diff --git a/components/codetools/codetoolsstructs.pas b/components/codetools/codetoolsstructs.pas index 0165737d36..00624e0218 100644 --- a/components/codetools/codetoolsstructs.pas +++ b/components/codetools/codetoolsstructs.pas @@ -107,8 +107,10 @@ type TStringToStringTree = class private + FCompareKeyItemFunc: TListSortCompare; FTree: TAVLTree;// tree of TStringToStringTreeItem FCaseSensitive: boolean; + function GetCompareItemsFunc: TListSortCompare; function GetStrings(const s: string): string; procedure SetStrings(const s: string; const AValue: string); function FindNode(const s: string): TAVLTreeNode; @@ -125,13 +127,31 @@ type property CaseSensitive: boolean read FCaseSensitive; property Tree: TAVLTree read FTree; procedure WriteDebugReport; + property CompareItemsFunc: TListSortCompare read GetCompareItemsFunc; + property CompareKeyItemFunc: TListSortCompare read FCompareKeyItemFunc; + procedure SetCompareFuncs( + const NewCompareItemsFunc, NewCompareKeyItemFunc: TListSortCompare); + end; + + { TFilenameToStringTree } + + TFilenameToStringTree = class(TStringToStringTree) + public + constructor Create(CaseInsensitive: boolean); end; function CompareStringToStringItems(Data1, Data2: Pointer): integer; -function CompareStringToStringItemsI(Data1, Data2: Pointer): integer; function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer; + +function CompareStringToStringItemsI(Data1, Data2: Pointer): integer; function CompareStringAndStringToStringTreeItemI(Key, Data: Pointer): integer; +function CompareFilenameToStringItems(Data1, Data2: Pointer): integer; +function CompareFilenameAndFilenameToStringTreeItem(Key, Data: Pointer): integer; + +function CompareFilenameToStringItemsI(Data1, Data2: Pointer): integer; +function CompareFilenameAndFilenameToStringTreeItemI(Key, Data: Pointer): integer; + implementation @@ -147,6 +167,12 @@ begin PStringToStringTreeItem(Data2)^.Name); end; +function CompareFilenameToStringItems(Data1, Data2: Pointer): integer; +begin + Result:=CompareFilenames(PStringToStringTreeItem(Data1)^.Name, + PStringToStringTreeItem(Data2)^.Name); +end; + function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer; begin Result:=CompareStr(String(Key),PStringToStringTreeItem(Data)^.Name); @@ -157,6 +183,25 @@ begin Result:=CompareText(String(Key),PStringToStringTreeItem(Data)^.Name); end; +function CompareFilenameAndFilenameToStringTreeItem(Key, Data: Pointer + ): integer; +begin + Result:=CompareFilenames(String(Key),PStringToStringTreeItem(Data)^.Name); +end; + +function CompareFilenameToStringItemsI(Data1, Data2: Pointer): integer; +begin + Result:=CompareFilenamesIgnoreCase(PStringToStringTreeItem(Data1)^.Name, + PStringToStringTreeItem(Data2)^.Name); +end; + +function CompareFilenameAndFilenameToStringTreeItemI(Key, Data: Pointer + ): integer; +begin + Result:=CompareFilenamesIgnoreCase(String(Key), + PStringToStringTreeItem(Data)^.Name); +end; + { TCodeXYPositions } function TCodeXYPositions.GetItems(Index: integer): PCodeXYPosition; @@ -322,6 +367,11 @@ begin Result:='' end; +function TStringToStringTree.GetCompareItemsFunc: TListSortCompare; +begin + Result:=Tree.OnCompare; +end; + procedure TStringToStringTree.SetStrings(const s: string; const AValue: string); var Node: TAVLTreeNode; @@ -340,19 +390,19 @@ end; function TStringToStringTree.FindNode(const s: string): TAVLTreeNode; begin - if CaseSensitive then - Result:=FTree.FindKey(Pointer(s),@CompareStringAndStringToStringTreeItem) - else - Result:=FTree.FindKey(Pointer(s),@CompareStringAndStringToStringTreeItemI); + Result:=FTree.FindKey(Pointer(s),FCompareKeyItemFunc) end; constructor TStringToStringTree.Create(TheCaseSensitive: boolean); begin FCaseSensitive:=TheCaseSensitive; - if CaseSensitive then - FTree:=TAVLTree.Create(@CompareStringToStringItems) - else + if CaseSensitive then begin + FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItem; + FTree:=TAVLTree.Create(@CompareStringToStringItems); + end else begin + FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItemI; FTree:=TAVLTree.Create(@CompareStringToStringItemsI); + end; end; destructor TStringToStringTree.Destroy; @@ -441,5 +491,25 @@ begin end; end; +procedure TStringToStringTree.SetCompareFuncs(const NewCompareItemsFunc, + NewCompareKeyItemFunc: TListSortCompare); +begin + FCompareKeyItemFunc:=NewCompareKeyItemFunc; + Tree.OnCompare:=NewCompareItemsFunc; +end; + +{ TFilenameToStringTree } + +constructor TFilenameToStringTree.Create(CaseInsensitive: boolean); +begin + inherited Create(true); + if CaseInsensitive then + SetCompareFuncs(@CompareFilenameToStringItemsI, + @CompareFilenameAndFilenameToStringTreeItemI) + else + SetCompareFuncs(@CompareFilenameToStringItems, + @CompareFilenameAndFilenameToStringTreeItem); +end; + end. diff --git a/components/codetools/directorycacher.pas b/components/codetools/directorycacher.pas index 5a195ed39d..dd3621f875 100644 --- a/components/codetools/directorycacher.pas +++ b/components/codetools/directorycacher.pas @@ -63,8 +63,8 @@ type ctdusUnitNormal, // e.g. unitname (case depends on OS) -> filename ctdusUnitCaseInsensitive, // unitname case insensitive -> filename ctdusInFilenameNormal, // unit 'in' filename -> filename - ctdusInFilenameCaseInsenstive, // unit 'in' filename case insensitive -> filename - ctdusUnitFileNormal, // unitname.ext -> filename + ctdusInFilenameCaseInsensitive, // unit 'in' filename case insensitive -> filename + ctdusUnitFileNormal, // unitname.ext (case depends on OS) -> filename ctdusUnitFileCaseInsensitive // unitname.ext case insensitive -> filename ); @@ -73,7 +73,7 @@ const ctdusInFilenameNormal, ctdusUnitFileNormal]; ctdusCaseInsensitive = [ctdusUnitCaseInsensitive, - ctdusInFilenameCaseInsenstive, + ctdusInFilenameCaseInsensitive, ctdusUnitFileCaseInsensitive]; type @@ -557,11 +557,14 @@ var begin Files:=FUnitSources[UnitSrc].Files; if Files=nil then begin - Files:=TStringToStringTree.Create({$IFDEF CaseInsensitiveFilenames} - false - {$ELSE} - UnitSrc in ctdusCaseNormal - {$ENDIF}); + case UnitSrc of + ctdusUnitNormal: Files:=TStringToStringTree.Create(FilenamesCaseSensitive); + ctdusUnitCaseInsensitive: Files:=TStringToStringTree.Create(false); + ctdusInFilenameNormal: Files:=TFilenameToStringTree.Create(false); + ctdusInFilenameCaseInsensitive:Files:=TFilenameToStringTree.Create(true); + ctdusUnitFileNormal: Files:=TFilenameToStringTree.Create(false); + ctdusUnitFileCaseInsensitive: Files:=TFilenameToStringTree.Create(true); + end; FUnitSources[UnitSrc].Files:=Files; end; Files[Search]:=Filename; @@ -832,7 +835,7 @@ begin // uses IN parameter InFilename:=TrimFilename(SetDirSeparators(InFilename)); if AnyCase then - UnitSrc:=ctdusInFilenameCaseInsenstive + UnitSrc:=ctdusInFilenameCaseInsensitive else UnitSrc:=ctdusInFilenameNormal; if GetUnitSourceCacheValue(UnitSrc,InFilename,Result) then begin