{ REYNIR STEFANSSON Some time ago I wangled myself into a beta testing team For a floppy disk catalogger called FlopiCat. This is a rather BASIC (in more than one way) Program, but works well enough. The built-in sorting routine was a bit quacked, so I wrote my own external sorter, which is both more versatile and faster (by far) than the internal one. Here it is, in Case someone can use the idea (and code): } Program FlopiSrt; { Sorts FlopiCat.Dat. } Const Maximum = 6000; { I don't need that many meself... } FName : String[12] = 'Flopicat.Dat'; Type fEntry = Record n : Array[1..4] of Char; i : Array[1..35] of Char; d : Array[1..39] of Char; end; En1 = Array[1..78] of Char; En2 = Record n : Array[1..4] of Char; f : Array[1..9] of Char; e : Array[1..3] of Char; z : Array[1..8] of Char; t : Array[1..15] of Char; d : Array[1..39] of Char; end; En3 = Record f, d : Array[1..39] of Char; end; pEntry = ^fEntry; Var Entry : Array [1..Maximum] of pEntry; fc : File of fEntry; Rev : Boolean; LoMem : Pointer; i, NumOfEntries : Integer; nfd : Char; s : String; Function ToSwap(i, j : Integer) : Boolean; Var Swop : Boolean; begin Swop := False; Case nfd OF { Sorting by disk number: } 'N' : if Entry[i]^.n > Entry[j]^.n then Swop := True; { Sorting by File information: } 'I' : if Entry[i]^.i > Entry[j]^.i then Swop := True; { Sorting by description: } 'D' : if Entry[i]^.d > Entry[j]^.d then Swop := True; { Sorting by all the String: } 'A' : if En1(Entry[i]^) > En1(Entry[j]^) then Swop := True; { Sorting by File name only: } 'F' : if En2(Entry[i]^).f > En2(Entry[j]^).f then Swop := True; { Sorting by File extension only: } 'E' : if En2(Entry[i]^).e > En2(Entry[j]^).e then Swop := True; { Sorting by File size: } 'Z' : if En2(Entry[i]^).z > En2(Entry[j]^).z then Swop := True; { Sorting by date/time stamp: } 'T' : if En2(Entry[i]^).t > En2(Entry[j]^).t then Swop := True; { Sorting by disk number/File info block: } 'B' : if En3(Entry[i]^).f > En3(Entry[j]^).f then Swop := True; end; ToSwap := Swop xor Rev; end; { if I remember correctly, I settled on using shaker/shuttle sort. } Procedure SortIt; Var i, j, pb, pf, pp, pt : Integer; t : pEntry; Procedure SwapIt(i, j : Integer); begin t := Entry[i]; Entry[i] := Entry[j]; Entry[j] := t; end; begin Write('0 entries processed.'); i := 0; pt := 2; pb := NumOfEntries; pf := 0; Repeat pp := pt; Repeat if ToSwap(pp - 1, pp) then begin SwapIt(pp - 1, pp); pf := pp; end; Inc(pp); Until pp > pb; pb := pf - 1; j := i; i := NumOfEntries - (pb - pt + 2); if (i MOD 10) < (j MOD 10) then Write(#13, i); if pb < pt then Exit; pp := pb; Repeat if ToSwap(pp - 1, pp) then begin SwapIt(pp - 1, pp); pf := pp; end; Dec(pp); Until pp < pt; pt := pf + 1; j := i; i := NumOfEntries - (pb - pt + 2); if (i MOD 10) < (j MOD 10) then Write(#13, i); Until pb < pt; end;