summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2009-11-29 18:56:33 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2009-11-29 18:56:33 +0100
commit7173061baa4c33584159b681ea300b73cd53f387 (patch)
tree29b09b9c67b4a9a4d216465e0761afb78f0a8e27
parent7c2f3b3ab27e25834974eb656921a0fff4ef5377 (diff)
downloadtuxcmd-7173061baa4c33584159b681ea300b73cd53f387.tar.xz
Sort by inode number by default
-rw-r--r--UCore.pas59
-rw-r--r--UCoreWorkers.pas2
2 files changed, 56 insertions, 5 deletions
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;
diff --git a/UCoreWorkers.pas b/UCoreWorkers.pas
index cf0fc13..218602d 100644
--- a/UCoreWorkers.pas
+++ b/UCoreWorkers.pas
@@ -774,7 +774,7 @@ begin
DeleteAll := False;
SkipToNext := False;
-// DebugWriteListSL(AList);
+ DebugWriteListSL(AList);
if AList.Count = 1 then Fr := 1 else Fr := 100 / (AList.Count - 1);
if AList.Count > 0 then