From 7173061baa4c33584159b681ea300b73cd53f387 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 29 Nov 2009 18:56:33 +0100 Subject: Sort by inode number by default --- UCore.pas | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'UCore.pas') diff --git a/UCore.pas b/UCore.pas index 34f8012..2b3e4b1 100644 --- a/UCore.pas +++ b/UCore.pas @@ -350,7 +350,51 @@ end; (********************************************************************************************************************************) procedure FillDirFiles(Engine: TPanelEngine; DestList: TList; InputFiles: TStringList; DoNotRecurse: boolean); - procedure FillDirFilesRecurse(const LocalPath: string; ALevel: integer); + function FillDirFiles_compare_func(Item1, Item2: PDataItem): integer; + begin + // sort by inode number + // also, we want to have directories at the bottom of the list + if Item1^.IsDir and (not Item2^.IsDir) then Result := 1 else + if (not Item1^.IsDir) and Item2^.IsDir then Result := -1 else + if Item1^.inode_no > Item2^.inode_no then Result := 1 else + if Item1^.inode_no < Item2^.inode_no then Result := -1 else + Result := 0; + end; + + procedure QuickSort(FList: TList; L, R : Longint); + var I, J : Longint; + P, Q : Pointer; + begin + repeat + I := L; + J := R; + P := FList[(L + R) div 2]; + repeat + while FillDirFiles_compare_func(P, FList[I]) > 0 do + I := I + 1; + while FillDirFiles_compare_func(P, FList[J]) < 0 do + J := J - 1; + if I <= J then begin + Q := FList[I]; + Flist[I] := FList[J]; + FList[J] := Q; + I := I + 1; + J := J - 1; + end; + until I > J; + if L < J then + QuickSort(FList, L, J); + L := I; + until I >= R; + end; + + procedure FillDirFiles_sort(FList: TList); + begin + if FList.Count < 2 then Exit; + QuickSort(Flist, 0, FList.Count - 1); + end; + + procedure FillDirFiles_Recurse(const LocalPath: string; ALevel: integer); var LocalList: TList; i: integer; Item: PDataItem; @@ -359,6 +403,14 @@ procedure FillDirFiles(Engine: TPanelEngine; DestList: TList; InputFiles: TStrin begin LocalList := TList.Create; if Engine.GetListing(LocalList, LocalPath, True, False, True) = 0 then begin + writeln('before sorting:'); + for i := 0 to LocalList.Count - 1 do + writeln(' ', i, ' [', PDataItem(LocalList[i])^.inode_no, '] ', PDataItem(LocalList[i])^.FName); + FillDirFiles_sort(LocalList); + writeln('after sorting:'); + for i := 0 to LocalList.Count - 1 do + writeln(' ', i, ' [', PDataItem(LocalList[i])^.inode_no, '] ', PDataItem(LocalList[i])^.FName); + for i := 0 to LocalList.Count - 1 do begin Item := LocalList[i]; ItemSL := malloc(sizeof(TDataItemSL)); @@ -373,8 +425,7 @@ procedure FillDirFiles(Engine: TPanelEngine; DestList: TList; InputFiles: TStrin // Recurse to parent ParentDir := IncludeTrailingPathDelimiter(string(Item^.FName)); if Engine.ChangeDir(ParentDir) = 0 then - FillDirFilesRecurse(ParentDir, ALevel + 1); - + FillDirFiles_Recurse(ParentDir, ALevel + 1); // Add end stage ItemSL := DuplicateDataItem(ItemSL); ItemSL^.Stage1 := False; @@ -407,7 +458,7 @@ begin // It's a directory, mark as starting item root^.Stage1 := True; // Recurse to child - FillDirFilesRecurse(InputFiles[i], 2); + FillDirFiles_Recurse(InputFiles[i], 2); // Add ending item root := GetFileInfoSL(Engine, InputFiles[i]); root^.Stage1 := False; -- cgit v1.2.3