home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / extra18 / grdlagen / tpstack / tp_stack.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1992-01-28  |  2.9 KB  |  131 lines

  1. (* ------------------------------------------------- *)
  2. (*                  TP_STACK.PAS                     *)
  3. (*  Dynamischer Stack (LIFO-Struktur) zum Zwischen-  *)
  4. (*  speichern von Daten.                             *)
  5. (* ------------------------------------------------- *)
  6. (*  Sprache: Turbo Pascal ab 5.5                     *)
  7. (*         (c) 1991  H.Zorba & DMV-Verlag            *)
  8. (* ------------------------------------------------- *)
  9.  
  10. {$D-}
  11.  
  12. UNIT TP_Stack;
  13.  
  14. INTERFACE
  15.  
  16. TYPE
  17.   DynStack = OBJECT
  18.     SP : Pointer;
  19.                    { Der Stackpointer ist privat... }
  20.     CONSTRUCTOR Init;
  21.        { Initialisiert den Stack }
  22.     DESTRUCTOR Clear;
  23.        { Löscht den gesamten Stack }
  24.     PROCEDURE Push(VAR ThisData; Count : Word);
  25.        { 'ThisData' ('Count' Bytes) --> Stack }
  26.     PROCEDURE Pop(VAR ThisData);
  27.        { Stack --> 'ThisData' }
  28.     PROCEDURE Drop;
  29.        { Letztes Datum entfernen }
  30.     PROCEDURE Dup;
  31.        { Letztes Datum duplizieren }
  32.     PROCEDURE Swap;
  33.        { Letzten beiden Daten vertauschen }
  34.     FUNCTION IsEmpty : BOOLEAN;
  35.        { Ist der Stack leer? }
  36.     FUNCTION TOSSize : WORD;
  37.            { Größe des letzten Datums holen }
  38.   END;
  39.  
  40.  
  41. IMPLEMENTATION
  42.  
  43. TYPE
  44.   DynStackPtr = ^StackEntry;
  45.  
  46.   StackEntry = RECORD
  47.     Data : Pointer;
  48.     Size : Word;
  49.     Next : DynStackPtr
  50.   END;
  51.  
  52. VAR
  53.   tmp : DynStackPtr;
  54.  
  55.  
  56.   CONSTRUCTOR DynStack.Init;
  57.   BEGIN
  58.     SP := NIL;
  59.   END;
  60.  
  61.   DESTRUCTOR DynStack.Clear;
  62.   BEGIN
  63.     WHILE NOT IsEmpty DO Drop;
  64.   END;
  65.  
  66.   PROCEDURE DynStack.Push(VAR ThisData;
  67.                               Count : WORD);
  68.   BEGIN
  69.     New(tmp);
  70.     WITH tmp^ DO BEGIN
  71.       GetMem(Data, Count);
  72.       Move(ThisData, Data^, Count);
  73.       Size := Count;
  74.     END;
  75.     tmp^.Next := SP;
  76.     SP := tmp;
  77.   END;
  78.  
  79.   PROCEDURE DynStack.Pop(VAR ThisData);
  80.   BEGIN
  81.     IF IsEmpty THEN Exit;
  82.     WITH StackEntry(SP^) DO BEGIN
  83.       Move(Data^, ThisData, Size);
  84.       FreeMem(Data, Size)
  85.     END;
  86.     tmp := SP;
  87.     SP := tmp^.Next;
  88.     Dispose(tmp);
  89.   END;
  90.  
  91.   PROCEDURE DynStack.Drop;
  92.   BEGIN
  93.     IF IsEmpty THEN Exit;
  94.     FreeMem(StackEntry(SP^).Data,StackEntry(SP^).Size);
  95.     tmp := SP;
  96.     SP := tmp^.Next;
  97.     Dispose(tmp);
  98.   END;
  99.  
  100.   PROCEDURE DynStack.Dup;
  101.   BEGIN
  102.     Push(StackEntry(SP^).Data^,StackEntry(SP^).Size);
  103.   END;
  104.  
  105.   PROCEDURE DynStack.Swap;
  106.   BEGIN
  107.     IF StackEntry(SP^).Next = NIL THEN Exit;
  108.     tmp := StackEntry(SP^).Next;
  109.     StackEntry(SP^).Next := tmp^.Next;
  110.     tmp^.Next := SP;
  111.     SP := tmp;
  112.   END;
  113.  
  114.   FUNCTION DynStack.IsEmpty : BOOLEAN;
  115.   BEGIN
  116.     IsEmpty := SP = NIL;
  117.   END;
  118.  
  119.   FUNCTION DynStack.TOSSize : WORD;
  120.   BEGIN
  121.     IF NOT IsEmpty THEN
  122.       TOSSize := StackEntry(SP^).Size
  123.     ELSE
  124.       TOSSize := 0;
  125.   END;
  126.  
  127. BEGIN
  128. END.
  129. (* ------------------------------------------------- *)
  130. (*             Ende von TP_STACK.PAS                 *)
  131.