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
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.

View File

@ -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