codetools: extended directorycacher for darwin filenames

git-svn-id: trunk@16384 -
This commit is contained in:
mattias 2008-09-03 08:16:07 +00:00
parent 35596739bf
commit ebf2d6a8bf
2 changed files with 90 additions and 17 deletions

View File

@ -107,8 +107,10 @@ type
TStringToStringTree = class TStringToStringTree = class
private private
FCompareKeyItemFunc: TListSortCompare;
FTree: TAVLTree;// tree of TStringToStringTreeItem FTree: TAVLTree;// tree of TStringToStringTreeItem
FCaseSensitive: boolean; FCaseSensitive: boolean;
function GetCompareItemsFunc: TListSortCompare;
function GetStrings(const s: string): string; function GetStrings(const s: string): string;
procedure SetStrings(const s: string; const AValue: string); procedure SetStrings(const s: string; const AValue: string);
function FindNode(const s: string): TAVLTreeNode; function FindNode(const s: string): TAVLTreeNode;
@ -125,13 +127,31 @@ type
property CaseSensitive: boolean read FCaseSensitive; property CaseSensitive: boolean read FCaseSensitive;
property Tree: TAVLTree read FTree; property Tree: TAVLTree read FTree;
procedure WriteDebugReport; 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; end;
function CompareStringToStringItems(Data1, Data2: Pointer): integer; function CompareStringToStringItems(Data1, Data2: Pointer): integer;
function CompareStringToStringItemsI(Data1, Data2: Pointer): integer;
function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer; function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer;
function CompareStringToStringItemsI(Data1, Data2: Pointer): integer;
function CompareStringAndStringToStringTreeItemI(Key, Data: 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 implementation
@ -147,6 +167,12 @@ begin
PStringToStringTreeItem(Data2)^.Name); PStringToStringTreeItem(Data2)^.Name);
end; end;
function CompareFilenameToStringItems(Data1, Data2: Pointer): integer;
begin
Result:=CompareFilenames(PStringToStringTreeItem(Data1)^.Name,
PStringToStringTreeItem(Data2)^.Name);
end;
function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer; function CompareStringAndStringToStringTreeItem(Key, Data: Pointer): integer;
begin begin
Result:=CompareStr(String(Key),PStringToStringTreeItem(Data)^.Name); Result:=CompareStr(String(Key),PStringToStringTreeItem(Data)^.Name);
@ -157,6 +183,25 @@ begin
Result:=CompareText(String(Key),PStringToStringTreeItem(Data)^.Name); Result:=CompareText(String(Key),PStringToStringTreeItem(Data)^.Name);
end; 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 } { TCodeXYPositions }
function TCodeXYPositions.GetItems(Index: integer): PCodeXYPosition; function TCodeXYPositions.GetItems(Index: integer): PCodeXYPosition;
@ -322,6 +367,11 @@ begin
Result:='' Result:=''
end; end;
function TStringToStringTree.GetCompareItemsFunc: TListSortCompare;
begin
Result:=Tree.OnCompare;
end;
procedure TStringToStringTree.SetStrings(const s: string; const AValue: string); procedure TStringToStringTree.SetStrings(const s: string; const AValue: string);
var var
Node: TAVLTreeNode; Node: TAVLTreeNode;
@ -340,19 +390,19 @@ end;
function TStringToStringTree.FindNode(const s: string): TAVLTreeNode; function TStringToStringTree.FindNode(const s: string): TAVLTreeNode;
begin begin
if CaseSensitive then Result:=FTree.FindKey(Pointer(s),FCompareKeyItemFunc)
Result:=FTree.FindKey(Pointer(s),@CompareStringAndStringToStringTreeItem)
else
Result:=FTree.FindKey(Pointer(s),@CompareStringAndStringToStringTreeItemI);
end; end;
constructor TStringToStringTree.Create(TheCaseSensitive: boolean); constructor TStringToStringTree.Create(TheCaseSensitive: boolean);
begin begin
FCaseSensitive:=TheCaseSensitive; FCaseSensitive:=TheCaseSensitive;
if CaseSensitive then if CaseSensitive then begin
FTree:=TAVLTree.Create(@CompareStringToStringItems) FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItem;
else FTree:=TAVLTree.Create(@CompareStringToStringItems);
end else begin
FCompareKeyItemFunc:=@CompareStringAndStringToStringTreeItemI;
FTree:=TAVLTree.Create(@CompareStringToStringItemsI); FTree:=TAVLTree.Create(@CompareStringToStringItemsI);
end;
end; end;
destructor TStringToStringTree.Destroy; destructor TStringToStringTree.Destroy;
@ -441,5 +491,25 @@ begin
end; end;
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. end.

View File

@ -63,8 +63,8 @@ type
ctdusUnitNormal, // e.g. unitname (case depends on OS) -> filename ctdusUnitNormal, // e.g. unitname (case depends on OS) -> filename
ctdusUnitCaseInsensitive, // unitname case insensitive -> filename ctdusUnitCaseInsensitive, // unitname case insensitive -> filename
ctdusInFilenameNormal, // unit 'in' filename -> filename ctdusInFilenameNormal, // unit 'in' filename -> filename
ctdusInFilenameCaseInsenstive, // unit 'in' filename case insensitive -> filename ctdusInFilenameCaseInsensitive, // unit 'in' filename case insensitive -> filename
ctdusUnitFileNormal, // unitname.ext -> filename ctdusUnitFileNormal, // unitname.ext (case depends on OS) -> filename
ctdusUnitFileCaseInsensitive // unitname.ext case insensitive -> filename ctdusUnitFileCaseInsensitive // unitname.ext case insensitive -> filename
); );
@ -73,7 +73,7 @@ const
ctdusInFilenameNormal, ctdusInFilenameNormal,
ctdusUnitFileNormal]; ctdusUnitFileNormal];
ctdusCaseInsensitive = [ctdusUnitCaseInsensitive, ctdusCaseInsensitive = [ctdusUnitCaseInsensitive,
ctdusInFilenameCaseInsenstive, ctdusInFilenameCaseInsensitive,
ctdusUnitFileCaseInsensitive]; ctdusUnitFileCaseInsensitive];
type type
@ -557,11 +557,14 @@ var
begin begin
Files:=FUnitSources[UnitSrc].Files; Files:=FUnitSources[UnitSrc].Files;
if Files=nil then begin if Files=nil then begin
Files:=TStringToStringTree.Create({$IFDEF CaseInsensitiveFilenames} case UnitSrc of
false ctdusUnitNormal: Files:=TStringToStringTree.Create(FilenamesCaseSensitive);
{$ELSE} ctdusUnitCaseInsensitive: Files:=TStringToStringTree.Create(false);
UnitSrc in ctdusCaseNormal ctdusInFilenameNormal: Files:=TFilenameToStringTree.Create(false);
{$ENDIF}); ctdusInFilenameCaseInsensitive:Files:=TFilenameToStringTree.Create(true);
ctdusUnitFileNormal: Files:=TFilenameToStringTree.Create(false);
ctdusUnitFileCaseInsensitive: Files:=TFilenameToStringTree.Create(true);
end;
FUnitSources[UnitSrc].Files:=Files; FUnitSources[UnitSrc].Files:=Files;
end; end;
Files[Search]:=Filename; Files[Search]:=Filename;
@ -832,7 +835,7 @@ begin
// uses IN parameter // uses IN parameter
InFilename:=TrimFilename(SetDirSeparators(InFilename)); InFilename:=TrimFilename(SetDirSeparators(InFilename));
if AnyCase then if AnyCase then
UnitSrc:=ctdusInFilenameCaseInsenstive UnitSrc:=ctdusInFilenameCaseInsensitive
else else
UnitSrc:=ctdusInFilenameNormal; UnitSrc:=ctdusInFilenameNormal;
if GetUnitSourceCacheValue(UnitSrc,InFilename,Result) then begin if GetUnitSourceCacheValue(UnitSrc,InFilename,Result) then begin