--
-- This is the body of the linked integer stack package.
--
-- This is needed for the memory free operation.
with Ada.Unchecked_Deallocation;
use Ada;
package body IntStackPkg is
   -- Here's the deallocation function for nodes.
   procedure Free is new Unchecked_Deallocation(StackNode, NodePtr);
   -- Push onto the stack.
   procedure Push(S: in out IntStack; I: Integer) is
      begin
         S := new StackNode'(I, NodePtr(S));
      end Push;
   -- Remove from the stack.
   procedure Pop(S: in out IntStack; I: out Integer) is
      OldTop: NodePtr;
      begin
         if S /= null then
            -- Unlink the top node.
            OldTop := NodePtr(S);
            S := IntStack(S.Next);
            -- Get the data out of it.
            I := OldTop.Data;
            -- Say bye, little node.
            Free(OldTop);
         end if;
      end Pop;
   -- Find out what's on the top.
   function Top(S: IntStack) return Integer is
      begin
         if S = null then
            return 0;
         else
            return S.Data;
         end if;
      end Top;
   -- So, are we empty yet?
   function IsEmpty(S: IntStack) return Boolean is
      begin
         return S = null;
      end IsEmpty;
   -- Remove all memory from the stack.
   procedure Clear(S: in out IntStack) is
      Zombie,                   -- Ptr to node about to be deleted.
        Scan: NodePtr;          -- List scanner.
      begin
         Scan := NodePtr(S);
         while Scan /= null loop
            -- Advance the pointer and delete the old node.
            Zombie := Scan;
            Scan := Scan.Next;
            Free(Zombie);
         end loop;
      
         S := null;
      end Clear;
end IntStackPkg;