home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* TP_STACK.PAS *)
- (* Dynamischer Stack (LIFO-Struktur) zum Zwischen- *)
- (* speichern von Daten. *)
- (* ------------------------------------------------- *)
- (* Sprache: Turbo Pascal ab 5.5 *)
- (* (c) 1991 H.Zorba & DMV-Verlag *)
- (* ------------------------------------------------- *)
-
- {$D-}
-
- UNIT TP_Stack;
-
- INTERFACE
-
- TYPE
- DynStack = OBJECT
- SP : Pointer;
- { Der Stackpointer ist privat... }
- CONSTRUCTOR Init;
- { Initialisiert den Stack }
- DESTRUCTOR Clear;
- { Löscht den gesamten Stack }
- PROCEDURE Push(VAR ThisData; Count : Word);
- { 'ThisData' ('Count' Bytes) --> Stack }
- PROCEDURE Pop(VAR ThisData);
- { Stack --> 'ThisData' }
- PROCEDURE Drop;
- { Letztes Datum entfernen }
- PROCEDURE Dup;
- { Letztes Datum duplizieren }
- PROCEDURE Swap;
- { Letzten beiden Daten vertauschen }
- FUNCTION IsEmpty : BOOLEAN;
- { Ist der Stack leer? }
- FUNCTION TOSSize : WORD;
- { Größe des letzten Datums holen }
- END;
-
-
- IMPLEMENTATION
-
- TYPE
- DynStackPtr = ^StackEntry;
-
- StackEntry = RECORD
- Data : Pointer;
- Size : Word;
- Next : DynStackPtr
- END;
-
- VAR
- tmp : DynStackPtr;
-
-
- CONSTRUCTOR DynStack.Init;
- BEGIN
- SP := NIL;
- END;
-
- DESTRUCTOR DynStack.Clear;
- BEGIN
- WHILE NOT IsEmpty DO Drop;
- END;
-
- PROCEDURE DynStack.Push(VAR ThisData;
- Count : WORD);
- BEGIN
- New(tmp);
- WITH tmp^ DO BEGIN
- GetMem(Data, Count);
- Move(ThisData, Data^, Count);
- Size := Count;
- END;
- tmp^.Next := SP;
- SP := tmp;
- END;
-
- PROCEDURE DynStack.Pop(VAR ThisData);
- BEGIN
- IF IsEmpty THEN Exit;
- WITH StackEntry(SP^) DO BEGIN
- Move(Data^, ThisData, Size);
- FreeMem(Data, Size)
- END;
- tmp := SP;
- SP := tmp^.Next;
- Dispose(tmp);
- END;
-
- PROCEDURE DynStack.Drop;
- BEGIN
- IF IsEmpty THEN Exit;
- FreeMem(StackEntry(SP^).Data,StackEntry(SP^).Size);
- tmp := SP;
- SP := tmp^.Next;
- Dispose(tmp);
- END;
-
- PROCEDURE DynStack.Dup;
- BEGIN
- Push(StackEntry(SP^).Data^,StackEntry(SP^).Size);
- END;
-
- PROCEDURE DynStack.Swap;
- BEGIN
- IF StackEntry(SP^).Next = NIL THEN Exit;
- tmp := StackEntry(SP^).Next;
- StackEntry(SP^).Next := tmp^.Next;
- tmp^.Next := SP;
- SP := tmp;
- END;
-
- FUNCTION DynStack.IsEmpty : BOOLEAN;
- BEGIN
- IsEmpty := SP = NIL;
- END;
-
- FUNCTION DynStack.TOSSize : WORD;
- BEGIN
- IF NOT IsEmpty THEN
- TOSSize := StackEntry(SP^).Size
- ELSE
- TOSSize := 0;
- END;
-
- BEGIN
- END.
- (* ------------------------------------------------- *)
- (* Ende von TP_STACK.PAS *)
-