home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / extra18 / grdlagen / sort / sort1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-01-28  |  5.6 KB  |  211 lines

  1. (* ------------------------------------------------- *)
  2. (*                    SORT1.PAS                      *)
  3. (*             Demonstration zur Unit HRS            *)
  4. (* ------------------------------------------------- *)
  5. PROGRAM Sort1;
  6.  
  7. (*$M 65520,0,655360,R-,S-,I-,V-,B-,O-,A+ *)
  8.  
  9. (* ------------------------------------------------- *)
  10. (* Maximaler Heap und Stack. Die Quicksort-Routine   *)
  11. (* ist rekursiv, deshalb hohe Belastung des Stack.   *)
  12. (* Die Compiler-Optionen sorgen für höchstmögliche   *)
  13. (* Geschwindigkeit des Programms.                    *)
  14. (* ------------------------------------------------- *)
  15.  
  16. USES Dos, Crt, HRS;
  17.  
  18. TYPE
  19.   DirArray  = ARRAY [1..112] Of SearchRec;
  20.   SPtr      = ^SearchRec;
  21.  
  22. CONST
  23.   ESC       = #27;
  24.   Ret       = #13;
  25.  
  26. VAR
  27.   DArray    : DirArray;
  28.   DPtr      : Pointer;
  29.   Direc     : STRING;
  30.   Proc      : SortFunc;
  31.   Size      : WORD;
  32.   C, LT     : CHAR;
  33.  
  34. (*$F+ *)
  35.   FUNCTION Check(P1, P2 : Pointer;
  36.                  Para : WORD) : CompTyp;
  37.   (* Vergleichsroutine für SearchRec-Typ *)
  38.   VAR
  39.      M       : Byte;
  40.      S1, S2  : STRING [12];
  41.      Ext1,
  42.      Ext2    : STRING [4];
  43.      Po1,
  44.      Po2     : BYTE;
  45.      Test    : CompTyp;
  46.   BEGIN
  47.     S1  := SPtr(P1)^.Name;
  48.     S2  := SPtr(P2)^.Name;
  49.     Po1 := Pos('.', S1);
  50.     Po2 := Pos('.', S2);
  51.  
  52.     IF ((Po1 > 0) AND (Po2 > 0)) THEN BEGIN
  53.         (* Erst die Extension *)
  54.       Ext1 := Copy(S1, Succ(Po1), Length(S1) - Po1);
  55.       Ext2 := Copy(S2, Succ(Po2), Length(S2) - Po2);
  56.  
  57.       M    := Min(Length(Ext1), Length(Ext2));
  58.       Test := Equal(Ext1[1], Ext2[1], M);
  59.  
  60.       IF Test = Gleich THEN BEGIN
  61.         IF Length(Ext1) > Length(Ext2) THEN
  62.           Test := Groesser;
  63.         IF Length(Ext1) < Length(Ext2) THEN
  64.           Test := Kleiner;
  65.       END;
  66.  
  67.       IF Test = Gleich THEN BEGIN
  68.           (* Dann der "Vorname" *)
  69.         Delete(S1, Po1,Length(S1) - Succ(Po1));
  70.         Delete(S2, Po2,Length(S2) - Succ(Po2));
  71.         M := Min(Length(S1), Length(S2));
  72.  
  73.         IF M > 0 THEN BEGIN
  74.           Test := Equal(S1[1],S2[1],M);
  75.           IF Test = Gleich THEN BEGIN
  76.             IF Length(S1) > Length(S2) THEN
  77.               Test := Groesser;
  78.             IF Length(S1) < Length(S2) THEN
  79.               Test := Kleiner;
  80.           END;
  81.         END ELSE BEGIN
  82.           IF S1 = '' THEN Test := Kleiner;
  83.           IF S2 = '' THEN Test := Groesser;
  84.           IF (S1 = '') AND (S2 = '') THEN
  85.             Test := Gleich;
  86.         END;
  87.       END;
  88.     END ELSE IF ((Po1 = 0) AND (Po2 = 0)) THEN BEGIN
  89.       (* Nochmal der "Vorname" *)
  90.       M := Min(Length(S1),Length(S2));
  91.       IF M > 0 THEN
  92.         Test := Equal(S1[1], S2[1], M)
  93.       ELSE BEGIN
  94.         IF S1 = '' THEN Test := Kleiner;
  95.         IF S2 = '' THEN Test := Groesser;
  96.         IF (S1 = '') AND (S2 = '') THEN Test := Gleich;
  97.       END;
  98.     END ELSE IF Po1 > 0 THEN
  99.       Test := Groesser
  100.     ELSE IF Po2 > 0 THEN
  101.       Test := Kleiner;
  102.  
  103.       (* Bei Gleichheit nun Vergleich von Größe, Zeit
  104.          und Attribut der Dateien                    *)
  105.  
  106.     IF Test = Gleich THEN
  107.       IF SPtr(P1)^.Size > SPtr(P2)^.Size THEN
  108.         Test := Groesser
  109.       ELSE IF SPtr(P2)^.Size > SPtr(P1)^.Size THEN
  110.         Test := Kleiner
  111.       ELSE Test := Gleich;
  112.  
  113.     IF Test = Gleich THEN
  114.       Test := Equal(SPtr(P1)^.Time,
  115.                     SPtr(P2)^.Time, SizeOf(LongInt));
  116.     IF Test = Gleich THEN
  117.       Test := Equal(SPtr(P1)^.Attr,
  118.                     SPtr(P2)^.Attr, SizeOf(Byte));
  119.  
  120.     (* Reihenfolge umkehren *)
  121.     IF Para = 1 THEN BEGIN
  122.       IF Test = Groesser THEN
  123.         Test := Kleiner
  124.       ELSE IF Test = Kleiner THEN
  125.         Test := Groesser;
  126.     END;
  127.  
  128.     Check := Test;
  129.   END;
  130. (*$F- *)
  131.  
  132.   PROCEDURE MakeArray(    Dir   : STRING;
  133.                       VAR Liste : DirArray;
  134.                       VAR Size  : WORD);
  135.     (* Das Sortierarray wird mit SearchRecs aus dem
  136.        Directory Dir gefüllt        *)
  137.   VAR
  138.     F : SearchRec;
  139.   BEGIN
  140.     Size := 0;
  141.     FindFirst(Dir+'\*.*', AnyFile, F);
  142.  
  143.     WHILE DosError = 0 DO BEGIN
  144.       IF (F.Attr AND VolumeId = 0) AND
  145.          (F.Attr AND Directory = 0) THEN BEGIN
  146.         Inc(Size);
  147.         Liste[Size] := F;
  148.       END;
  149.       FindNext(F);
  150.     END;
  151.   END;
  152.  
  153.   PROCEDURE ShowArray(Liste : DirArray; Size : WORD);
  154.   VAR
  155.     L : WORD;
  156.     D : DateTime;
  157.   BEGIN
  158.     L := 0;
  159.     WHILE L <> Size DO BEGIN
  160.       Inc(L);
  161.       WITH Liste[L] DO BEGIN
  162.         UnPackTime(Time,D);
  163.         Writeln(' ', Name, ' ':13 - Length(Name),
  164.                 '  ', D.Day:2, '.', D.Month:2,
  165.                 '.', D.Year, '  ', D.Hour:2,
  166.                 '.', D.Min:2, ',', D.Sec:2,
  167.                 '  ', Size:8);
  168.       END;
  169.       IF KeyPressed THEN BEGIN
  170.         DummyRead;
  171.         DummyRead;
  172.       END;
  173.     END;
  174.   END;
  175.  
  176. BEGIN
  177.   Proc     := Check;
  178.   DPtr     := @DArray;
  179.   TextAttr := LightGray;
  180.   ClrScr;
  181.   Writeln('      SORTIERTEST');
  182.   Window(2,2,79,24);
  183.   TextAttr := Blue SHL 4;
  184.  
  185.   REPEAT
  186.     ClrScr;
  187.  
  188.     Write(' Directory   : ');
  189.     ReadLn(Direc);
  190.     IF Direc = '' THEN GetDir(0, Direc);
  191.  
  192.     WriteLn(' Aufsteigend :  (1)');
  193.     WriteLn(' Absteigend  :  (2)');
  194.     C := GetChar(['1','2']);
  195.  
  196.     MakeArray(Direc, DArray, Size);
  197.  
  198.     IF C = '1' THEN
  199.       ArraySort(DPtr,Size,SizeOf(SearchRec),Proc,0)
  200.     ELSE
  201.       ArraySort(DPtr,Size,SizeOf(SearchRec),Proc,1);
  202.  
  203.     ShowArray(DArray, Size);
  204.     WriteLn(' Weiter mit <RETURN>   Ende mit <ESC>');
  205.     C := GetChar([Ret, Esc]);
  206.  
  207.   UNTIL C = Esc;
  208. END.
  209. (* ------------------------------------------------- *)
  210. (*                Ende von SORT1.PAS                 *)
  211.