--
-- Linked-list based stack package.
--
package IntStackPkg is
   -- This declares that IntStack is a type, but the contents of the type
   -- are private, and are invisible to clients of the package.  The 
   -- modifier limited additionally forbids the client to copy or compare
   -- stacks.
   type IntStack is limited private;
   -- All the public stack operations.
   procedure Push(S: in out IntStack; I: Integer);
   procedure Pop(S: in out IntStack; I: out Integer);
   function Top(S: IntStack) return Integer;
   function IsEmpty(S: IntStack) return Boolean;
   procedure Clear(S: in out IntStack);
   private
      -- The items here cannot be accessed by clients of the package.
      type StackNode;                          -- There is a node type.
      type IntStack is access all StackNode;   -- Stack is ptr to a list head
      type NodePtr is access all StackNode;    -- Other node pointers.
      type StackNode is record                 -- Nodes are like this.
         Data: Integer;                        -- Content.
         Next: NodePtr;                        -- Link to next node.
      end record;
end IntStackPkg;
--
-- Note: We have no direct way to initialize Stacks when declared.  We
-- depend on the behavior of Ada that pointers are always initialized to
-- null.
--